다중 접속 서버란 둘 이상의 클라이언트에게 동시에 접속을 허용하여 동시에 둘 이상의 클라이언트에게 서비스를 제공하는 서버를 의미한다.
이 중에서 멀티프로세스 기반 서버에 대해 다룬다.
간단하게 말하자면 실행 중인 프로그램
이라 할 수 있다.
좀 더 엄밀히는 실행중인 프로그램에 관련된 메모리, 리소스 등을 총칭한다.
각각의 프로세스는 모두 자신만의 고유한 Process ID(이하 pid)를 가진다.
#include <unistd.h>
pid_t fork(void);
fork 함수가 호출되면, 그 프로세스가 복사되어 똑같은 프로세스가 두 개가 된다.
이 때 복사된 프로세스를 자식 프로세스, 기존 프로세스를 부모 프로세스라 한다.
fork 함수의 리턴값을 이용해 두 프로세스를 구분할 수 있다.
먼저 부모 프로세스의 경우, 자식 프로세스의 pid를 리턴값으로 가진다.
자식 프로세스의 경우, 0을 리턴값으로 가진다.
즉 같은 코드를 실행하더라도 fork 값에 따라 조건문을 분기함으로써 서로 다른 부분을 실행하게끔 할 수 있다.
서버는 클라이언트가 연결을 요청할 때마다 이를 수락함과 동시에 자식 프로세스를 생성하여 일을 처리하게끔 한다. 서버의 자식 프로세스는 넘겨받은 파일 디스크립터와 같은 정보를 바탕으로 일을 처리한다.
서버 부모 프로세스는 두 개의 파일 디스크립터를 갖고 있다. 하나는 자신이 생성한 소켓의 파일 디스크립터, 하나는 클라이언트에 연결된 파일 디스크립터.
이 때, 서버 부모 프로세스는 클라이언트와 연결된 디스크립터가 필요가 없고, 자식 프로세스는 자기 자신의 소켓 파일 디스크립터가 필요 없다.
하나의 소켓에 두 개의 파일 디스크립터가 존재하는 경우 두 파일 디스크립터 모두 종료되어야 해당 소켓이 소멸한다. 즉 fork 후, 각자에게 필요 없는 파일 디스크립터는 애초부터 종료해 준다.
프로세스를 분리시켜서 각각을 입력 받는 프로세스, 출력 하는 프로세스로 분리하면 보내고-받고 따로 할 필요 없이 동시에 진행이 가능하다.
다만 받은 정보를 바탕으로 어떤 작업을 하여 보내야 하는 인터랙티브한 방식의 경우에는 이러한 방식이 큰 효과를 보지 못할 것이다.