한 연결을 끝까지 처리
구현은 가장 단순하지만 처리 중인 클라이언트가 느리면 다음 accept로 돌아가는 시간이 늦어진다.
TCP concurrency models
단일 서버 루프는 연결을 받은 뒤 한 클라이언트의 recv/send 처리에 머물면 새 accept로 돌아오지 못한다. 여러 클라이언트를 다루려면 연결 처리 흐름을 프로세스, 스레드, 풀, 이벤트 루프 중 어디로 분리할지 결정해야 한다.
listen socket은 계속 새 연결을 받아야 하고, accepted socket fd는 별도의 실행 주체나 이벤트 루프가 짧게 처리해야 병목을 피한다.
구현은 가장 단순하지만 처리 중인 클라이언트가 느리면 다음 accept로 돌아가는 시간이 늦어진다.
주소 공간과 장애 격리에 유리하다. 다만 프로세스 생성, 스케줄링, fd 정리, 자식 회수 비용이 생긴다.
코드 흐름은 직관적이다. 대신 스택 메모리, wake-up 빈도, 락 경합, 공유 상태 동기화를 관리해야 한다.
폭주는 막지만 블로킹 장기 연결이 worker를 점유하면 새 작업이 밀린다. 요청 단위 작업에 더 잘 맞는다.
적은 실행 흐름이 많은 fd를 감시한다. 소켓은 non-blocking으로 두고 짧게 읽고 쓰며 backpressure를 처리한다.