[네트워크 프로그래밍] 열혈 TCP/IP 10장 정리
Ch 10은 멀티프로세스 기반의 서버 구현이라는 제목을 가지고 있습니다.
리눅스 기반인데, 여기서 멀티 프로세스를 생성하는 방법을 알려주고, 그에대한 에러 대처 등을 학습합니다.
프로세스 : 메모리 공간을 차지한 상태에서 실행중인 프로그램 입니다. 이 프로세스는 고유한 PID를 가지고 있습니다.
fork(); 함수를 사용해서 자식프로세스를 생성할 수 있습니다.
좀비 프로세스 : 자식 프로세스 생성후 자식 프로세스는 자동으로 종료되지 않습니다. 종료(exit 이나 return)를 호출해도, 바로 없어지는게 아닌 운영체제가 판단 후 종료해줍니다. 운영체제의 판단 근거는, 부모 프로세스가 함수를 따로 불러주는 것 입니다. 불러주지 않는다면, 좀비가 됩니다.
좀비 프로세스의 소멸방법 :
1. wait 함수의 사용. wait()을 통해 자식 프로세스가 종료 되었는지 알 수 있습니다. 하지만
blocking 함수라는 단점이 있습니다.
2. waitpid 함수의 사용. 이 함수는 블로킹 함수가 아니며, while문의 조건으로서 매번 체크
해 주어야 하는 단점이 있습니다.
위 두가지 방법은 매번 체크해 줘야 하는 불편함. 즉 다른 코드는 실행하지 못한다는 커다란 단점이 존재합니다. 따라서 '시그널 핸들링'이라는 방법을 학습합니다.
시그널 핸들링이란, 자식 프로세스가 소멸되었는지 판단하는 과정을 부모 프로세스가 아닌 운영체제가 대신하는 것 입니다. 소멸 되었다면 운영체제는 부모 프로세스에게 알리는 것입니다. 이 과정을 위해, 사전에 부모 프로세스에서 운영체제에 특정 함수(자식이 종료되었다면 불릴 함수)를 등록합니다. 그것은 signal() 혹은 sigaction() 이라는 함수에 의해 이루어 집니다.
위에서 배웠던 과정으로 서버에서 새로운 클라이언트가 접속 요청을 할 때 새로운 자식 프로세스를 생성하는 것으로 다중 접속 서버를 생성할 수 있습니다. 하지만 여기서, fork()를 했을때 '소켓'이 복사되는 것이 아닌 '파일디스크립터'가 복사되는 것을 유의해야 합니다. 즉, 한개의 소켓에 2개 이상의 파일디스크립터가 할당되어 있으므로, 자식 프로세스에서는, 덩달아 복사된 부모의 서버소켓을 닫아주어야 하고, 서버 입장에서는 자식에게 할당된 클라이언트 소켓을 닫아주어야 합니다(자식 프로세스와 부모 둘다 동일한 소켓을 갖고 있고, 사용할 프로세스는 자식 이므로 자식만 가지도록 닫아줌.).
마찬가지로, 입출력 루틴을 분할할 수 있습니다. 원리는, 부모는 읽기를, 자식은 쓰기를 담당하는 것 입니다.
[참고] 윤성우의 열혈 TCP/IP 소켓 프로그래밍
댓글
댓글 쓰기