8.Blocking I/O, Non-Blocking I/O
∙Blocking I/O
∘Process(Thread)가 Kernel에게 I/O를 요청하는 함수를 호출하여 Kernel이 작업을 완료하면 결과를
반환 받음
-I/O 작업이 진행되는 동안 user process(thread)는 자신의 작업을 중단한 채 대기한다.
-Resource 낭비가 심하다.
-여러 클라이언트가 접속하는 경우 클라이언트별로 thread를 생성해서 context switching이
증가한다.
∙Non-Blocking I/O
∘I/O 작업이 진행되는 동안 user process의 작업을 중단하지 않음
➀user process가 recvfrom 함수를 호출하여 커널에게 해당 socket의 data를 요청
➁커널은 곧바로 recvBuffer을 채우지는 못하고 EWOULDBLOCK을 return
➂user process는 다른 작업을 진행할 수 있음
➃revBuffer에 user가 요청한 데이터가 있는 경우에는 데이터를 복사하여 받아옴
➄recvfrom 함수가 data를 복사하여 data의 길이와 함께 반환
-여러 클라이언트가 접속하는 경우 클라이언트별로 thread를 생성해서 context switching이
증가한다.
∙Asynchronous(비동기) I/O
∘I/O 처리가 완료되면 결과를 회신하여 I/O 작업이 진행되는 동안 user process의 작업을 중단하지
않음
-내부에 큐를 생성하여 완료된 소켓의 정보를 담아 큐 하나만 확인한다.(중첩된 입출력)
-사용자가 설정한 제한된 스레드를 사용하며 context switching을 줄인다.
∙IOCP(Input Output Completion Port)
∘중첩된 입출력을 지원하는 포트
-중첩된 입출력을 사용해서 I/O를 비동기식으로 처리한다.
-사용자가 설정한 제한된 스레드를 사용하며 context switching을 줄인다.
출처