서버/클라이언트를 구축하기 위해선 다양한 모델들을 사용할 수 있다. 

각 모델별 장-단점을 나열해보는 시간을 가져보자.

 

(Linux & Windows 공통)

1. 멀티프로세스 (Multi Process)

* 프로세스란 실행중인 프로그램의 메모리,리소스 등을 총칭하는 의미이다.

- 설명 : fork 함수를 통해 또 하나의 프로세스를 만든다.

- 장점 : 다른 모델과 비교했을 때 크게 장점이 없다. 자식프로세스에서 서비스를 제공하고, 부모프로세스에서는 소켓을 수락하는 역할(Listen 및 Accept)을 한다.

- 단점 : 프로그램이 너무 무거워진다. 프로세스가 여러개가 될 수록 CPU의 짐이 늘어남.

2. 멀티 쓰레드 (Multi Thread)

- 설명 : 멀티 프로세스는 프로세스가 많아질수록 CPU의 과부하가 일어날 수 있다. 멀티 쓰레드 모델은 그런 단점을 보완해줄 수 있는 모델로 클라이언트가 접속할 때마다 쓰레드를 생성하여 쓰레드가 Read/Write를 처리한다.

- 장점 : 멀티프로세스 모델에 비해, CPU 과부하가 적다. 하나의 프로세스에서 여러개의 쓰레드를 활용하는 것이기 때문이다.

- 단점 : 쓰레드가 여러 개 만들어지면, 임계영역에 대한 동기화 등의 방법으로 보호를 해야하고, 복잡성이 생긴다.

3. Select (멀티 플렉싱 I/O 모델)

* 멀티플렉싱이란 ?

- 하나의 프로세스로 여러개의 소켓을 핸들링하는 방법

 

- 설명 : 멀티플렉싱의 대표적인 모델이다. 하나의 프로세스로 최대 1024개의 FD를 관리할 수 있다.(커널 값을 커스텀하면 더 많은 FD 관리도 가능하다.) 

- 장점 : 하나의 프로세스로 여러 소켓을 효율적으로 핸들링 가능하다, 다양한 OS에서 사용 가능한 I/O 모델이다.

- 단점 : 각 FD 이벤트 확인 유무를 전체 For문을 통해 확인해야하기 때문에 비효율적이다. 시간복잡도 : O(n)

 

(Only Linux)

4. Epoll (멀티 플렉싱 I/O 모델) (poll 상위호환)

- 설명 : Select 모델보다 더 발전된 형태로, 다수의 클라이언트를 받아들일 수 있으며,

이벤트가 발생한 FD만 For문으로 체크하면 되기 때문에, 더욱 효율적이다. (시간복잡도 : O(1))

- 장점 : 다수의 클라이언트 수용 가능, 엣지트리거와 레벨트리거로 이벤트발생시점 조절 가능 

- 단점 : 딱히 없는 것 같다. 비교할려면 Windows I/O 모델인 IOCP와 누가 최고의 모델인가 생각해볼만 할 것 같다.

 

(Only Window)

5. WSA (Windows Socket Architecture) 기반 I/O 모델

소켓 I/O 모델 이벤트 통보방식 스레드 수의 제약 여부 Overlapped 구조체 사용 여부
Select FD_SET 제한없음 사용안함
AsyncSelect 윈도우즈 메세지 제한없음 사용안함
EventSelect 이벤트 객체 스레드당 최대 64개 이벤트 처리 제한 사용안함
Overlapped I/O 이밴트 객체/ 커널에서 호출 스레드당 최대 64개 이벤트 처리 제한 사용함
IOCP (Input Output Completion Port) Completion Port 객체 제한 없음 사용함

 

+ Recent posts