비동기 소켓 통신에 대해서 간략히 글을 써볼까 하고 — 차이점이라거나, 어떻게 생각해야하는가 라거나 — 예전에 읽었던 글들을 읽는데, 내가 이쪽의 프로그래밍을 시작하게 했던 글[1] 을 다시 읽게 되었다.
The C10K problem 이란 페이지인데, 기본적인 시스템/네트웍 프로그래밍을 해봤다고 가정하고 대규모 I/O를 처리할만한 방법 5가지에 대해서 논하고 있다 — 일종의 survery paper 비슷한 느낌으로 읽히는 글이기도 하다. C10K란 말 자체가 client 10k(=1만)개를 처리하려면 어떤 방법을 써야하는지에 관해 서술한다. 가장 먼저 10k 개의 연결에 쓸 수 있는 자원을 간략히 설명하고 현존하는 I/O 전략들에 관해 설명해준다.
즉, 다음의 5가지를 주요 OS 별로 사용할 수 있는 시스템 콜들과 제안된 사항, 라이브러리들을 기반으로 풀어놓고 있다.
- Serve many clients with each thread, and use nonblocking I/O and level-triggered readiness notification — select, poll, kqueue(2도 됨) 같은 시스템 콜을 쓰는 것
- Serve many clients with each thread, and use nonblocking I/O and readiness change notification – 글에서도 설명하는 것 처럼 edge-triggered logic이고(1과 상반되게), epoll, kqueue, linux 2.6 kernel의 NAIO …
- Serve many clients with each server thread, and use asynchronous I/O — AIO함수들
- Serve one client with each server thread, and use blocking I/O
- Build the server code into the kernel
내가 저 글을 읽기 전까지 해본 게 1과 4 였는데, 2, 3 에 관해 흥미를 얻게 되었고,[2] 지금 서버 프로그래밍을 하고 있는 것 같다. 이 글 다시 한 번 읽고나서 간단한 예제를 하나 짜봐야겠다.
비동기 네트웍 I/O에 흥미가 있다면 약간 시간이 지난 글이긴 하지만 (어느정도 업데이트 되긴했지만) 이런게 있다는걸 최소한 알고 시작하는 의미로라도 괜찮은 것 같다.