Concurrency Strategies

동시 접속 처리 모델은 격리와 비용의 균형을 고르는 일이다

한 연결을 처리하는 동안 accept 루프가 막히면 다음 클라이언트가 기다린다. 그래서 프로세스, 스레드, 이벤트 루프 같은 분리 전략이 필요하다.

fork는 격리가 좋지만 프로세스 비용이 크다.
thread는 코드가 직관적이지만 공유 자원 동기화가 필요하다.
select/poll/epoll은 적은 실행 흐름으로 많은 fd를 감시한다.
blocking 단일 클라이언트 accept 후 recv 루프에 들어가면 다른 연결이 기다린다.
확장성 낮음
fork 연결마다 프로세스 메모리 공간이 분리되어 안전하지만 생성 비용이 크다.
격리 강함
thread 연결마다 스레드 프로세스보다 가볍지만 락과 레이스를 관리해야 한다.
코드 직관적
event loop I/O 멀티플렉싱 많은 fd를 감시하고 준비된 소켓만 처리한다.
대규모 연결에 유리
CPU-bound가 아님 대부분의 시간은 네트워크 I/O 대기에서 흐른다.
fd가 작업 단위 각 연결은 connected socket fd로 구분된다.
병목은 모델마다 다름 프로세스 수, 스레드 수, 이벤트 루프 처리량을 본다.