소켓프로그래밍#6 : 멀티 프로세스

kkado·2022년 6월 4일
0

다중 접속 서버

다중 접속 서버란 둘 이상의 클라이언트에게 동시에 접속을 허용하여 동시에 둘 이상의 클라이언트에게 서비스를 제공하는 서버를 의미한다.

  • 멀티프로세스 기반 서버 : 다수의 프로세스를 생성
  • 멀티플렉싱 기반 서버 : 입출력 대상을 묶어서 관리
  • 멀티쓰레딩 기반 서버 : 클라이언트 수 만큼 쓰레드 생성

이 중에서 멀티프로세스 기반 서버에 대해 다룬다.

프로세스와 fork()

프로세스란

간단하게 말하자면 실행 중인 프로그램 이라 할 수 있다.
좀 더 엄밀히는 실행중인 프로그램에 관련된 메모리, 리소스 등을 총칭한다.
각각의 프로세스는 모두 자신만의 고유한 Process ID(이하 pid)를 가진다.

fork()

#include <unistd.h>

pid_t fork(void);

fork 함수가 호출되면, 그 프로세스가 복사되어 똑같은 프로세스가 두 개가 된다.
이 때 복사된 프로세스를 자식 프로세스, 기존 프로세스를 부모 프로세스라 한다.

fork 함수의 리턴값을 이용해 두 프로세스를 구분할 수 있다.

먼저 부모 프로세스의 경우, 자식 프로세스의 pid를 리턴값으로 가진다.
자식 프로세스의 경우, 0을 리턴값으로 가진다.

즉 같은 코드를 실행하더라도 fork 값에 따라 조건문을 분기함으로써 서로 다른 부분을 실행하게끔 할 수 있다.

프로세스 기반 다중 접속 서버의 구현

서버는 클라이언트가 연결을 요청할 때마다 이를 수락함과 동시에 자식 프로세스를 생성하여 일을 처리하게끔 한다. 서버의 자식 프로세스는 넘겨받은 파일 디스크립터와 같은 정보를 바탕으로 일을 처리한다.

파일 디스크립터 관리

서버 부모 프로세스는 두 개의 파일 디스크립터를 갖고 있다. 하나는 자신이 생성한 소켓의 파일 디스크립터, 하나는 클라이언트에 연결된 파일 디스크립터.

이 때, 서버 부모 프로세스는 클라이언트와 연결된 디스크립터가 필요가 없고, 자식 프로세스는 자기 자신의 소켓 파일 디스크립터가 필요 없다.

하나의 소켓에 두 개의 파일 디스크립터가 존재하는 경우 두 파일 디스크립터 모두 종료되어야 해당 소켓이 소멸한다. 즉 fork 후, 각자에게 필요 없는 파일 디스크립터는 애초부터 종료해 준다.

입출력 루틴의 분할

프로세스를 분리시켜서 각각을 입력 받는 프로세스, 출력 하는 프로세스로 분리하면 보내고-받고 따로 할 필요 없이 동시에 진행이 가능하다.

다만 받은 정보를 바탕으로 어떤 작업을 하여 보내야 하는 인터랙티브한 방식의 경우에는 이러한 방식이 큰 효과를 보지 못할 것이다.

profile
베이비 게임 개발자

0개의 댓글