I/O 모델에서 시스템 콜을 기다리는 동기 모델과 시스템 콜을 기다리지 않고 다음 코드를 수행하는 비동기 모델 두 가지가 있다.
Blocking Socket
유저레벨에서 I/O 작업을 수행할 수 없다. 커널레벨에서 I/O 작업을 요청하고 return 이 오기까지 대기하는 것이 Blocking Socket 의 방법이다. 따라서 유저프로세스는 커널의 응답이 오기까지 Block 상태로 있는데 이럴 경우 CPU를 효율적으로 사용하지 못하게 된다. 또한 Block되어 클라이언트의 요청이 동시에 올 경우 빠르게 처리할 수 없게 된다. 그래서 멀티스레드를 통해 각 유저별로 스레드를 할당하여 처리하는 방법이 사용된다. 그러나 이런 방법을 사용하게되면 Context Switching이 빈번하게 일어나게 된다는 문제가 있다.
Non-Blocking Socket
I/O 요청을 보내고 유저 레벨 프로세스를 중단시키지 않는 방식이다. 커널에게 I/O 요청을 보내고 작업을 이어서 수행할 수 있다. 즉 멀티스레드를 사용하지 않고도 다른 작업을 할 수 있다. 다만, 커널에 system call을 한 번만 하는 것이 아니라 주기적으로 커널 메모리를 확인하여 받은 데이터를 확인하고 데이터가 있다면 복사하여 가져오는 방식이다.
[Reference : https://www.codeblogbt.com/archives/303473]