ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로세스가 fork 되면
    2012. 1. 22. comments

    프로세스 fork가 일어나게 되면, 프로세스가 가지고 있는 명령어 셋과 fd(file descriptor)들은 그대로 함께 복제 되어 진다.\

    또한, 부모 프로세스가 가지고 있던 memory lock, mutex, timer등은 복제되지 않는다.

    이러한 이야기를 하게 되는 이유는 최근  서버 클라이언트의 통신 구조에서 클라이언트가 재 시작되는데, 서버에서는 해당 클라이언트가 연결 종료됨을 인지 못하는 문제점에 만난적이 있다. 문제의 원인을 파악하기 위하여 검증을 해보다가 어느 순간에만 연결 종료를 인지하지 못하게 되었다. 클라이언트 프로그램에서 exec 함수를 호출할 때(exec함수는 내부적으로 fork를 합니다) 해당 문제점이 발생하였다.

    문제의 원인으로 fork를 통해서 socket을 가리키는 파일 디스크립터들은 모두 복사되었기 때문에 원래 클라이언트 프로그램에서 사용중인 파일 디스크립터들을 close를 하더라도 시스템에서는 해당 socket에 접근하고 있는 파일 디스크립터들이 남아 있기 때문에 socket 리소스를 해제하지 않았고 그로 인하여 실제로 연결이 종료되지 않았던 문제점이었다. (socket을 가리키는 파일 디스크립터들이 모두 close되야 시스템에서 socket 리소스를 해제한다)

    프로세스에 대한 이해와 탐구 정신이 있었다면 쉽게 원인을 찾았을 것인데, 그 부분을 파악하지 못해 꽤나 오래 걸렸던 사건이었다.

    반응형

    댓글

Designed by Tistory.