NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 팁 앤 테크
  • 매뉴얼

    팁과 테크니컬 노하우를 확인하세요.

    팁 앤 테크

    팁과 테크니컬 노하우를 확인하세요.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    스크립트 서브 스크립트에 대한 이해와 효율적인 스크립트 구성 방법.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 오늘은 좀 어려운 내용인 서브 스크립트에 대해 알아보도록 하겠습니다. 서브 스크립트와 스크립트 실행, 스케줄러, 예약과 같은 액션은 전부 스레드 방식으로 동작됩니다. 여러분들도 스레드란 용어는 많이 접해봤을겁니다. 컴퓨터를 구매할 때 2코어 4스레드, 4코어 12스레드와 같은 말들이죠^^; 프로그래밍의 스레드와는 약간 다르긴 하지만 의미는 같습니다. 아무튼, 2코어 4스레드는 물리적인 연산 처리 장치가 2개이고 논리적인 연산 처리 장치는 4개라는 뜻입니다. 하이퍼스레딩 기술이 나오면서 물리적인 장치가 분산처리할 수 있게 된거죠. 물론, OS 영역이라서 엄밀히 기계적으로 같다고 할 수 없는 부분도 있습니다. 이제 OS입장에서 보면, 코어는 물리적인 연산 장치이고 스레드는 연산 장치를 논리적으로 나눈 작업 단위입니다.

    2010053919_1587087064.0479.gif

     

     

    뭔가 장황하게 말한거 같은데... 결국은 코어수와 스레드수가 많은수록 연산 속도는 높아진다는 뜻입니다. 1코어 1스레드와 1코어 2스레드는 머리는 하난데 손이 1개냐 2개냐의 차이입니다. 이상하게도 기계는 100의 일을 처리할 때 1코어 1스레드는 100만큼 시간이 소요됩니다. 1코어 2스레드는 양손으로 일하기 때문에 50만큼의 시간이 소요되겠죠? 이론상 그렇지만... 50보다는 좀 더 많은 시간을 소비합니다. 어떻게 분배해야 하고, 일이 끝나면 다시 분배해서 일을 할당하는 작업들이 필요하기 때문입니다. 아무튼... 사전 지식은 이정도만 알고 있으면 될거 같구요^^; 엔지엠의 서브 스크립트(스크립트 실행, 스케줄러등등...)는 동기와 비동기를 지원합니다. 동기와 비동기가 무엇인지는 아래 글에서 확인할 수 있습니다.

    http://ngmsoftware.com/bbs/board.php?bo_table=tip_and_tech&wr_id=54

    2010053919_1587087874.393.gif

     

     

    서브 스크립트에 대한 내용도 설명이 있습니다. 아래 내용도 참고하시면 도움이 될거 같네요.

    http://ngmsoftware.com/bbs/board.php?bo_table=youtube&wr_id=15

     

     

    이제 본론으로 들어가서, 스레드로 동작하는 서브 스크립트에 대해 알아봐야합니다. 위에 하이퍼스레딩과는 별도로 프로그래밍의 스레드가 있습니다. 1코어라도 멀티 스레드처럼 동작시키는 방법을 제공하는데요. 0000과 1111을 계산하는 프로그램이 있다고 가정합시다. 하나의 스레드를 사용하는 프로그램인 0000 1111과 같이 동작합니다. 멀티 스레드 프로그램은 01010101과 같이 동작하죠. 중요한 차이점은 0000이 끝나기 전에 다른 작업을 할 수 없다는 것입니다. 작업이 완료되는 시간은 동일할지라도 동시에 2가지 작업을 할 수 있다는 차이점이 있습니다. UI가 없는 프로그램이라면 사용자 입장에서는 큰 차이를 느끼지 못할수도 있습니다. 하지만, 윈도우와 같은 환경에서는 화면을 그리는 스레드와 연산을 처리하는 스레드가 분리되면 더 좋은 사용자 경험을 제공해줄 수 있습니다. 쉽게 말해서 프로그램을 실행한 후 작업이 완료될 때까지 프로그램이 멈춰있는 것들이 있습니다. 이는 스레드를 하나만 사용하기 때문에 작업이 완료될때까지 화면을 그리거나 사용자의 입력을 받을 수 없기 때문입니다.

     

    멀티 스레드를 사용하면, 내부적으로 작업이 진행하면서 사용자는 다른 작업을 병행할 수 있게됩니다. 엔지엠에서 스크립트를 실행하고, 실행중인 상태에서 다른 스크립트를 열어서 실행할 수 있는것도 UI를 그리는 스레드와는 별도로 스크립트를 실행하는 스레드가 생성되어 동작하기 때문입니다. 그렇기 때문에 엔지엠에서 여러개의 스크립트를 열어놓고 동시에 실행해도 사용자는 다른 작업을 이어서 진행할 수 있게되는 겁니다. 하지만, 모든 프로그램이 그렇듯이 멀티로 작업하는데는 한계점이 존재합니다. 여러가지 요인이 작용하겠지만, 일반적으로는 컴퓨터의 성능(코어수, 스레드수)에 영향을 많이 받습니다. 또한, 쉬지않고 다수의 스레드가 작업한다면 점점 느려질수도 있습니다. 그래서 엔지엠 에디터와 플레이어는 CPU가 잠시 쉴 수 있도록 성능 조절 옵션을 제공하고 있죠^^;

     

    스크립트를 구성할 때 적당한 서브 스크립트 사용은 여러가지 장점이 있습니다. 하지만, 너무 많은 서브 스크립트는 성능을 저해하기도 하고 문제를 발생시키기도 합니다. 충분히 검증해보고 사용하는게 가장 좋겠지만 구성 또는 설계 단계에서 이런 부분들을 파악하기는 쉽지 않습니다. 만약, 아래와 같은 구성을 가지고 있다면 상호 관계와 공유하는 자원들(이미지, 문서, 데이타베이스, 연결등등...)이 교착 또는 경합 상태에 빠지지 않는지도 꼼꼼히 체크해야 합니다.

    2010053919_1587089979.1323.png

     

     

    엔지엠에서 서브 스크립트와 멀티 스레드는 갯수의 제한이 없습니다. 사용자 컴퓨터의 성능에 맡기는 부분이고, 구성 방법도 자유입니다. 하지만, 부하를 분산하려면 스레드를 순차적으로 처리하는게 좋습니다. 더 좋은 방법은 오버헤드가 발생할만한 부분에 지연을 줘서 잠시 쉬고 다른 작업이 시작할 수 있게 해야 합니다. 스레드가 일하고 있을때는 명령을 줘서 중지할 수 있지만, 스레드가 쉬고 있을때는 명령을 줄 수 없습니다. 그래서 스레드가 다 쉬고 난 다음 명령을 수행할 수 있죠. 이런 부분 때문에 지연 시간이 길면 스크립트를 중지하더라도 딜레이가 발생될 수도 있습니다. 쉬운 예로 사냥하면서 물약 체크하고, 게임창이 멈추거나 비정상 종료되는 것을 감지해야 한다면 총 3개의 스레드가 필요합니다. 그리고 서로간에 영향을 주게 되겠죠. 게임창이 종료되면 사냥과 물약 체크 스레드를 잠시 중단하고 게임에 접속되면 사냥과 물약 체크 스레드도 다시 실행해야 합니다. 아래 그림은 엔지엠 플레이어를 2시간 정도 실행하면서 메모리 트렌드를 보여줍니다.

    2010053919_1587091016.5603.png

     

     

    2시간 동안 개체와 힙 크기가 오르락 내리락하면서 변동은 있지만 계속해서 증가하는 추세는 아닙니다. 안정적으로 프로그램을 사용할 수 있을텐데요. 그렇더라도 에디터와 플레이어에서 메모리가 증가하는 추세를 보이는 경우도 있습니다. 이런 경우는 서브 스크립트가 완료되기 전 매인 또는 상위 스크립트에서 다시 호출하거나 하는 경우일수도 있습니다. 또한, 스크립트를 중지하고 실행하더라도 정상적으로 중지되지 않을수도 있습니다. 이유는 간단합니다. 스크립트는 하위 스크립트를 가질 수 있는데요. 자신의 하위 스크립트가 모두 중지가 되어야 자신이 중지됩니다. 그렇기 때문에 많은 하위 스크립트를 가지는 스크립트를 중지하려면 충분한 시간이 필요합니다. 윈도우 시스템이 바쁠수록 중지되는데 더 많은 시간이 소요되고 오버헤드가 발생됩니다. 특히나, 게임과 같이 많은 리소스를 사용하는 경우에는 더 신중하게 서브 스크립트를 실행, 중지해야 합니다. 

     

    많은 서브 스크립트 또는 스레드를 만드는 경우에 안정적으로 운영하려면... 한번 실행된 스레드는 중지하지 않는게 좋습니다. 만약, 중지해야 한다면 프로세스를 다시 실행하는게 좋습니다. 여기서 말하는 프로세스는 엔지엠 에디터 또는 엔지엠 플레이어입니다. 서버급 머신이 아니기 때문에 수많은 스레드가 동시에 수행되면 문제가 발생되고, 이런 문제들은 분석 및 처리하기가 매우 까다롭습니다. 물론, 원인을 파악하기도 어렵죠^^; 엔지엠은 내부적으로도 알게 모르게 여러개의 스레드가 동작되고 있습니다. UI가 없는 서버 프로그래밍은 스레딩이 좀 더 쉬운편이고, 윈도우와 같은 환경에서는 그래픽 처리 때문에 복잡하고 귀찮은 것들이 많습니다. 결론은~ 가능하면 실행과 중지가 반복되지 않도록 만드는게 안정적이라는 겁니다. 스크립트가 10개의 작업을 해야 한다면 지속시켜주고, 중지해야 한다면 프로세스를 다시 실행하는게 가장 좋은 방법입니다^^

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천1 비추천0

    댓글목록

    profile_image

    거너스님의 댓글

    no_profile 거너스 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일 Date

    서브스크립트에 대해 이해가 좀 되었습니가 감사합니다