원문 윤상배 교정과정교정 프로세스간 전달추가교정 함수설명추가교정 최초문서작성 년 월 일 시 년 월 일 시 년 월 일 시 차례 절 소개 절 을이용한이벤트통지 절 의인터페이스 절 의문제점 절 절 란 절 와표준시그널 과의비교 절 대기열의크기 절 와 과의비교 절 지원확인 절 를이용한네트워크입출력처리 절 네트워크예제작성 절 프로세스간신호전달 절 결론 절 소개 이사이트의네트워크프로그래밍관련문서들을몇개읽어보았다면분명 이하 에대해서들어보았을것이다 지금까지의네트워크프로그래밍에서사용되었던기술들은 기반이였다 즉메시지가도착하기를계속체크하는방식으로입출력을처리하는방식이다 이러한입출력방식 주로 와 을응용한 으로도대부분의네트워크입출력을처리하기에는충분하지만최근인터넷상에서처리해야할데이터의양이늘어남에따라몇몇경우에있어서고전적인방법으로한계를드러내게되었다 그래서제안된방법이 를이용한시그널기반의입출력처리기법이다 는시그널의확장판이다 기존의시그널이큐잉이되지않으며 전달되었을때아무런정보를알려주지않는반면 는시그널처럼 거의 실시간에전달되며입출력데어터의원할한처리를위한필요한정보들까지
함께전달한다 게다가시그널의대기열 큐 를유지해서여러개의시그널이짧은시간에도착하더라도시그널을잃어버리는문제를해결했다 이문서는 에대한개념소개와응용을담고있다 특성상 와같은함수와자주비교될것이다 절 을이용한이벤트통지 절 의인터페이스 네트워크상에서의많은클라이언트로부터의데이터의처리를위해서사용되는전통적인방법은 나 을이용해서소켓파일로부터의이벤트를검사하는방법이다다음은 의일반적인인터페이스이다 대략적인작동방식은 에등록된파일 소켓 에어떤이벤트가있는지검사를해서 이벤트가발생되었다면이를리턴하는식이다 자세한내용은다중연결서버만들기 를참고하기바란다 절 의문제점 함수는다음과같은몇가지의단점을가지게되고 이러한단점들때문에동시에많은수의클라이언트를다루는데비효율이라는문제점을가지게된다 시스템콜은이벤트를받기위해서커널스페이스에서유저스페이스로이벤트를복사한다 그리고업데이트된이벤트리스트를유저스페이스에서커널스페이스로다시복사한다 즉하나의이벤트를전달받기위해서 번의복사가발생한다 일반적으로복사는상당히많은자원을소모한다 커널과어플리케이션양쪽모두이벤트가발생한소켓을검사하기위해서열린소켓모두를검사해야한다 보통연결된소켓중에서단 에서 만이활동하고있는소켓이다 은이 에서 의활성화된소켓 그중에서도단지몇개의이벤트발생한소켓을찾아내기위해서수십혹
은수백개의소켓을뒤지는작업을반복해야한다 절 이러한 과 의문제를해결하기위해서몇가지새로운방법들이제안되었다 와 와같이이벤트가발생한소켓을등록하고되돌려주는함수 커널과유저사이의데이터복사를줄이는방식으로 을좀더향상시킨 등이만들어져있다 그리고 운영체제의 와같은것들이있다 은 보다성능적으로향상되어있지만여전히커널레벨에서모든열린소켓을뒤져야한다는문제점을가지고있다 는 에서발생할수있는성능저하문제를해결하면서도 가가지는사용상의어려움까지해결한 쉽게사용할수있는 매우매력적인도구이다 안타깝게도현재리눅스정식커널 에서는 를지원하지않고있다 그러나이미관련된패치가나오고있으니아마 에서는정식으로지원할것같다 이문서에서는현재정식으로지원되고있는 만을설명할것이다 이하 란 를칭한다 절 란 는비동기 이벤트를전달하기위한목적으로만들어졌으며 주로네트워크애플리케이션작성시소켓이벤트를통보하기위해서사용한다 는네트워크입출력에있어서 에비해월등한성능향상을보장해준다 시그널의장점인실시간성을유지하면서단점인대기열부재의문제를해결한향상된시그널도구라고이해할수있다 절 와표준시그널 과의비교 는다음의두가지점에있어서유닉스표준시그널과크게다르다 유닉스표준시그널은시그널발생시단지시그널이전달되었다는사실과전달된시그널의번호만을알수있다 반면 는 구조체에시그널에관련된여러가지정보까지함께전달된다
위의구조체를보면시그널번호는물론이고 어떤소켓에서이벤트를발생시켰는지에관한기타여러가지정보들을가지고있음을알수있다 를사용하면시그널과함께이러한부가정보들까지함께전달받는다 다음은 멤버들에대한상세설명이다 시그널번호이다 이시그널번호는시그널핸들러에도동일하게전달된다 값 시그널을받았을때어떤이유로시그널이발생했는지관련된값이다 표 종류 값 설명 소켓으로비동기입출력이벤트발생 가장관심있어하는시그널이다 함수를통한시그널발생 시간초과 함수등에의한시그널발생 시그널을발생시킨프로세스의아이디 시그널을발생시킨프로세스의 로 가 일경우에만값이설정된다 자식프로세스에서 시그널이발생시키고종료했을경우자식프로세스의종료값 함수를이용해서시그널을발생시킬경우사용자가보낸값이저장되어있다
메모리참조주소의포인터를포함한다 이것은 등이발생했을때만적용된다 이벤트를발생시킨파일지정자 표준시그널은시그널의대기열을유지할수없다 만약시그널핸들러가리턴되기전에여러개의동일한시그널이전달된다면그중하나의시그널만전달될뿐이다 나머지시그널은잃어버린다 반면 는시그널의대기열을유지할수있으므로 동시에여러개의시그널이전달된다고하더라도이들을대기열에담아둘수있다 절 대기열의크기 아직테스트해보진않았지만이론적으로나마 는대기열을가질수있다고배웠다 그렇다면 대기열의크기가어느정도인지궁금할것이다 만약 대기열의크기가충분히크지않다면 바쁜서버의경우빠른시간에대기열이가득차버리는문제가발생할수도있기때문이다 이러한문제에대해서는다음기사에서다루도록하겠다 절 와 과의비교 앞장에서 에대해서간단히살펴보았다 과 모두이벤트를받아서처리한다는점에서는매우비슷하지만성능에서는많은차이가난다 에서는빈번한데이터복사가일어나며이벤트가발생한파일을찾기위해서열린파일을모두검사해야하기때문이다 열린파일이열몇개정도라면별문제없겠지만수백에서천에육박하게되면이벤트가발생한파일을찾는데드는비용도결코무시할수없게된다 는이벤트통지시어떤파일에이벤트가발생했는지에대한정보까지되돌려주므로부가적인작업없이해당파일을통한작업이가능하다 그림 과 에서의파일이벤트체크
절 지원확인 최신의대부분의유닉스운영체제들은 를지원한다를지원하는지확인하는가장확실한방법은 명령을이용해서커널에서지원하는시그널목록을확인하는방법이다 까지는유닉스표준시그널을위해예약된영역이며 번부터 번까지가 를위해예약된영역이다 를위해예약된시그널의갯수는운영체제마다약간씩틀리다 를사용하기원한다면이들준비된시그널중하나를사용하면된다 절 를이용한네트워크입출력처리 그럼 를이용해서소켓에서발생한이벤트를통지받는방법에대해서알아보도록하자 가장먼저해야할일은소켓파일이 에반응하도록설정하는일이다이것은파일특성조작함수인 을통해서이루어진다함수를이용해당소켓을논블럭비동기모드로작동하도록세팅한후시그널번호가 보다클경우해당소켓으로전달되도록세팅한다 소켓을논블럭 비동기로설정한다 보다더큰 시그널이전달되도록한다 시그널을보낼프로세스 를설정한다 여기에서는자기프로세스로보내도록했다 소켓에 가통지되도록했다면소켓에 가통지되었을때필요한작업을하도록코드를추가하면된다 일단은 가통지되었는지확인하는함수가필요할것이다 유닉스는 와 함수를제공하며 이함수들을이용해서 통지를확인할수있다
은기다릴시그널정보가설정되는구조체이며시그널이통지되면해당정보가 에복사된다 는기다리는시간을설정할수있다는점을제외하고는 와완전히동일하다다음은이들함수를통해서시그널을받고필요한일을처리하는전형적인코드의모습을보여준다 와 를이용해서필요한작업을한다 다른프로세스로 시그널을보내기위해서 을사용할수있는것처럼 를다른프로세스로보낼수있는데 이때사용하는함수가 이다 보내는측에서는 번째인자인 를통해서부가적인정보까지함께전송할수있다 이점을이용하면 용도로도사용가능할것이다 절에서자세히다루고있으니참고하기바란다 절 네트워크예제작성 그럼 예제를만들어보도록하겠다 지금까지는 의장점에대해서만얘기했었는데 에도한가지단점이있는데 그것은제대로다루려면꽤복잡한코딩과정을거쳐야한다는점이다 이런이유로제대로된 응용프로그램을작성하려면꽤나많은신경써야할것들이존재한다 이번예제는이러한복잡한과정을제외하고 의기능을맛보고테스트할수있는간단한응용으로할것이다 만들고자하는프로그램은 프로그래밍의기초에서다루었던덧셈연산서버프로그램을 를이용해서작동하도록재작성하도록할것이다 클라이언트프로그램은그대로재사용하도록하겠다 다만여기서제작하는서버는 의특성을확인하기위해서 개의포트를만들것이다 그러므로클라이언트프로그램역시서로다른포트로접근할수있도록약간의수정을해주어야한다 포트번호를인자로받아서처리하도록수정해주기바란다 코드는단순하지만제대로이해하기위해서는시그널과네트워크프로그래밍에대한기본적으로이해하고있어야한다 이런기본적인내용은이해하고있다고가정하고대부분의설명은주석으로대신하도록하겠다 예제
의이용을위해서 를디파인한다 클라이언트와통신에사용할데이터 인자로주어진파일지정자에대허서 비봉쇄 비동기 로지정하고 리얼타임시그널 에대응하도록작업한다 에대한포장함수 해당포트를이용해서
소켓을작성하고 소켓지정자를리턴한다 리얼타임시그널에대해서 로 작동하도록설정한다 포트번호 로 개의 소켓을 만들고이들소켓이 에대응하도록한다
를기다린다 만약 가도착했다면 구조체의값을검사해서어느소켓으로부터 데이터가왔는지확인하고 해당소켓을통해 클라이언트와통신한다 를쓰지않고도이벤트가발생한 소켓을알아낼수있다 디버깅용 필요에따라주석을풀고테스트해본다 에서 를사용하도록세팅한다 를이용해서 를대응하도록설정한다 그후 를이용해서동일한 가들어왔을경우인터럽트가걸리지않고블럭되도록설정한다 만약 를이용해서 를블럭하지않는다면 가호출되어서 를기다리기전에 가프로세스로전달될경우프로세스에인터럽트가걸리고프로세스는종료되어버릴것이다 유닉스표준시그널에서는시그널이블럭될경우하나의시그널만유지하고나머지시그널은모두잃어버리지만 는블럭되더라도시그널의열을유지한다 실제유지되는지는잠시후에테스트해보도록하겠다 에서 개의 소켓을만들어서각각의소켓에대해서 를이용해서 에대응하도록만들었다 파일에대한 대응에는 이매우중요한역할을한다 에서 를이용해서 를기다린다 만약 소켓에이벤트가발생하면 가전달되고 는리턴하게된다 리턴할때 번째인자인 를채워주게되는데 에는이벤트발생한파일과이벤트정보등이담겨져있다 에서 구조체의내용을이용해서어느소켓으로어떤이벤트가발생했는지확인할수있으며 함수를이용해서데이터통신을하면된다 는디버깅용이다 를걸어놓고 초사이에 번이상클라이언트를이용해서데이터통신테스트를해보면시그널정보가대기열에쌓이는것을확실히확인할수있을것이다
절 프로세스간신호전달 는파일에대한이벤트전달을위한좋은도구이며 실제로거의대부분네트워크프로그래밍을위한도구로사용되지만프로세스간신호전달을위한목적으로도사용할수있다 프로세스간신호전달용으로사용할때얻을수있는장점은시그널이대기열에쌓이므로잃어버릴염려가없다는점과부가적인정보를전달할수도있다는점이다 다른프로세스로의 전달은 함수를이용한다 부가적인정보의전달은 구조체의 를통해서이루어진다는다음과같은멤버를가진다 는 형값을전달하기위해서사용된다 메뉴얼을보면 의경우주소값을전달하기위해서사용한다고되어있는데 실제어디에사용가능한지확인할수없었다 아는사람이있으면댓글을달아주기바란다 에대응하도록애플리케이션을만드는방법은일반유닉스표준시그널을다루는프로그램과크게다를바없다 의 를 로설정하고적당한시그널핸들러를등록하기만하면된다 그리고 가전달되었을경우 가 인지를확인하고원하는작업을하면된다 인지를확인하는이유는 가아닌표준시그널이도착할수있고 이를구별해서작업해야할필요가있기때문이다 다음은 에반응하는애플리케이션이다 예제 시그널핸들러 가 인지를확인한후원하는작업을한다 일경우 형식으로전달된시그널이며 그렇지않을경우표준유닉스시그널이다 시그널이큐잉되는지확인하기위한코드 등을이용해서표준유닉스시그널을보냈을경우 실행되는루틴
를 로설정하고 시그널핸들러를등록한다 시그널에대한핸들러를설치한다 다음은 를발생시키는예제프로그램이다 예제 은보내고자하는프로세스의 는보내고자하는값이다 을 로전송한다 이제 를띄우고나서 로테스트해보기바란다 로테스트했을경우 를받는걸확인할수있다 에서키보드입력이없다면 에서블럭될건데 이때 를여러번실행하면시그널이대기열에쌓이는특성도확인할수있다 그렇지않고 을이용해서표준유닉스시그널을보낼수도있는데 그럴경우표준유닉스시그널처리루틴으로넘어가는걸확인할수있을것이다
절 결론 이상 에대해서간단히알아보았다 여기에서다룬내용은말그대로 의개념이해를위한맛보기일뿐이다 실제 를응용한네트워크프로그래밍의작성에는신경써줘야할많은문제들이있다 이러한내용들은다음문서를통해다루도록할것이다