요약
- I/O 멀티 플렉싱은 여러 채널 감시 문제를 해결함, 이벤트 루프 구조를 이해하는데 도움을 줌
본문
- 여러 소켓을 처리하는 방법은 크게 두가지임
- blocking I/O + 스레드/프로세스 per connection
- 소켓마다 전담 스레드를 붙여서 read()에서 block되게 둔다.
- 문제: 연결이 수천~수만 개가 되면 스레드 수가 그만큼 늘어나고 각 스레드의 스택 메모리와 context switching 비용이 커진다.(Dan Kegel 1991 C10K Problem)
- non blocking I/O + busy polling
- 각 소켓을 non-blocking으로 설정하고 루프에서 하나씩 read()를 시도하면서 EAGAIN이면 다음으로 넘어감
- 문제: 데이터가 없어도 계속 syscall을 호출하므로 CPU를 낭비함
이 둘을 해결하는게 I/O multi plexing
- epoll_wait() 같은 단일 syscall로 여러 fd를 등록해 두고 block함
- epoll_wait:
- 어떤 fd든 그때 깨어나서 해당 fd만 처리함