작성 배경
- 42서울 Webserv 과제 진행 중 i/o의 종류와 관련된 내용을 정리한 글입니다.
- Blocking, Non-blocking, I/O multiplexing (select, epoll, kqueue) 각각의 방식의 차이점과 장단점, Signal driven I/O의 내용을 다루고 있습니다.
미리 알아두어야할 지식
Socket을 통한 입출력 과정
- Socket을 통해 입출력을 하는 과정은 크게 두과지 과정을 통해 이루어진다.
- 1과정:Socket의 데이터가 read할 수 있는 ready상태인지 체크하는 과정
- UDP/TCP 프로토콜에 따라 달라질 수 있음.
- TCP의 경우는 SYN/ACK신호를 통해 재 전송 하는 경우가 생길 수 있기 때문에 이 부분이 길어질 수 있음.
- 2과정:ready상태라면 socket으로부터 데이터를 application에 복제하여 읽어오는 과정.
Blocking I/O

- tomcat등의 웹서버에서 많이 사용되는 방식으로 보통 multi thread를 활용하여 구현합니다.
- 1, 2과정 모두에서 application의 thread는 실행을 멈춥니다. 따라서 multi thread방식으로 구현할 필요가 있습니다.
- 장점
- 단점
- recvfrom호출시 커널모드로 전환되어 application code가 실행될 수 없습니다.
- 각 입출력(client로부터의 request)에 맞추어 thread를 생성하는 multithread 방식을 활용하면 각 request의 i/o에 대해서 하나의 스레드만 블로킹되게 할 수 있지만, 이렇게 할 경우 thread간의 context switching overhead가 증가할 수 있습니다.
Non-Blocking I/O

- 1과정에서 recvfrom을 호출 했을 때 ready상태가 아니면 blocking 되는 것이 아니라 에러를 리턴하도록 합니다(이렇게 되기 위해서는 소켓을 non-blocking으로 생성해야합니다.).
- 반복문으로 recvfrom을 호출(polling)하여 준비된 상태인지 체크합니다.
- 2과정에서는 application 로직이 실행되지않고 kernel mode로 전환됩니다.
- 장점
- 하나의 함수를 대상으로 동작하는 프로그램일 경우 효율적일 수 있습니다.