input/output, 데이터 입출력
network(socket), file, pipe, device 등
네트워크 통신은 socket을 통해 데이터 입출력
컴퓨터의 실행되는 각 프로세스가 데이터 주고 받으려면 프로세스가 소켓을 열고 소켓을 통해 주고 받는다.
네트워크 상의 요청자들과 각각 소켓을 열고 통신한다.
I/O 작업을 요청한 프로세스, 스레드는 요청이 완료될 때까지 block
서버의 소켓이 read로 기다리고 있는데 해당하는 클라이언트의 소켓은 데이터를 보내지 않고 있다. 그러나 나머지 클라이언트들이 서버에 요청을 한다. 그러나 스레드는 저 소켓에 block이 되어 아무것도 처리하지 못하고 묶여있는 상태가 된다.
따라서 다른 쪽 소켓의 데이터가 들어왔다고 하더라도 처리하지 못한다. 그래서 소켓에 blocking 모드로 처리할 수 없다.
프로세스/스레드를 block 시키지 않고 요청에 대한 현재 상태를 즉시 리턴
블락되지 않고 즉시 리턴하기 때문에 스레드가 다른 작업을 수행할 수 있다.
I/O 작업 완료를 어떻게 확인 할 수 있는가??
완료됐는지 반복적으로 처리(앞의 그림과 동일)
단점 1> 완료된 시간과 완료를 확인한 시간 사이의 갭으로 인해 처리 속도가 느려질 수 있음
단점2> 완료 됐는지 반복적으로 확인하는 것은 비효율적이며 CPU 낭비가 발생.
해결 방법
관심있는 I/O 작업들을 동시에 모니터링하고 그 중에 완료된 I/O 작업들을 한번에 알려준다.
I/O멀티플렉싱을 사용해서 System Call을 요청한다.
-> 두개의 소켓에 대해 non-blocking 모드로 읽으려고 하니 새로 들어오는 데이터가 있는지 알려주라.
한번의 시스템 콜로 여러 소켓들로부터 이벤트가 발생하면 한번에 처리할 수 있다.
select
poll
epoll(리눅스에서 사용)
kqueue(Mac OS에서 사용)
IOCP(I/O completion port)(윈도우에서 사용)
select와 poll은 성능면에서 좋지 않아 잘 쓰이지 않는다.
IO 멀티플렉싱은 네트워크 통신에 많이 사용
추가
참고