• 현대 운영체제는 대부분 I/O multiplexing 이라는 이벤트 알림 하위 시스템이 갖춰져 있음
  • 이 하위 시스템은 감시 대상 자원에서 발생하는 입출력 이벤트 수집하고 큐에 넣은 후 사용자 애플리케이션에서 해당 이벤트를 처리할 준비가 될 때까지 대기시키는 역할
    • 덕분에, 사용자 애플리케이션은 별도의 처리가 필요한 입출력 관련 이벤트의 발생여부를 간단히 확인 가능!
  • 입출력 멀티플렉싱 쓰면 바쁜 대기 방식처럼 모든 소켓 다 안봐도 됨!
    • 운영체제가 ‘어떤 소켓에 이런 이벤트가 발생했다’라고 알려주기 때문
    • 애플리케이션이 운영체제에 특정 소켓 감시하다가 이벤트 발생하면 큐에 넣고 데이터가 준비될때까지 대기시켜달라고 요청하면됨
      • 오래된 시스템 콜인 select 로 제공됨
  • select 시스템 콜 사용시 이게 지정됭 소켓에 일어난 이벤트(예를 들면 데이터가 도착해서 읽어 들일 준비 됨)을 알려주기에 매번 소켓을 직접 확인하지않아도됨.
  • 가장 큰 장점
    • 한 스레드 안에서 여러 소켓의 입출력 요청을 처리할 수 있는 점
    • 소켓을 여러개 등록해놓고 통지되는 이벤트만 확인하면 됨
  • 소켓이 준비된 상태에서 select 콜하면 제어권이 곧장 이벤트 반복문으로 돌아옴. 그렇지 않을 때는 등록된 소켓중 준비된 소켓 생길때까지 블록상태됨.
  • 새로운 read 이벤트가 발생하거나 쓰기 연산이 가능한 소켓 생기면 select 콜은 새로운 이벤트 반환하고 이 이벤트를 이벤트 큐에 추가한 다음, 제어권을 이벤트 반복문에 돌려준다.
  • 이런식으로 애플리케이션이 기존 요청 처리하는 중에도 새로운 요청 받을수있음
  • 기존의 처리중인 요청을 블록하지 않고도 새로운 요청 처리할수있도록 제어권을 이벤트 반복문으로 빠르게 찾아올수있음 입출력 멀티플렉싱 사용하면 모든 이벤트에 일일이 폴링하지 않으면서 실행 스레드 하나로 여러 입출력 연산을 서로 다른 소켓에서 동시에 수행 가능

발생되는 이벤트를 관리하고 필요에따라 애플리케이션에 알려주는 역할은 운영체제가 맡아줌

select 자체는 블록이 발생하지만, 바쁜 대기 방식처럼 데이터 기다리거나 이벤트 폴링에 CPU 낭비 안함