<aside> 💡 참조링크
</aside>

IBM에서 정리한 그림을 보면 블로킹이면 반드시 동기가 아니고, 논블로킹이면 반드시 비동기가 아니라는 점이다. 따라서 블로킹/논블로킹 과 동기/비동기는 다른 개념이라는 것이다.
**블로킹(Blocking)**과 **논블로킹(Non-Blocking)**은 입출력(IO) 작업에 대한 처리 방식을 나타내는 용어이다.
블로킹과 논블로킹은 A 함수가 B 함수를 호출했을 때, 제어권을 어떻게 처리하느냐에 따라 달라진다.
블로킹은 입출력 작업이 완료될 때까지 대기하는 방식이다.
A 함수가 B 함수를 호출할 때의 제어권의 흐름을 보면, B 함수는 자신의 작업이 종료되기 전까지 A 함수에게 제어권을 돌려주지 않는다.
즉, 호출된 함수가 입출력 작업을 수행하는 동안 제어권이 호출된 함수에게 있으므로 호출자는 대기 상태(=블로킹 상태)가 된다.

그림을 보면 애플리케이션에서 Read() 함수를 호출해 커널에 read I/O를 요청하면, read가 끝날 때 까지 block 상태가 되어 다른 작업을 하지 못한다.
이는 read I/O가 수행이 완료되기 전까지는 애플리케이션이 다른 작업을 수행할 수 없다는 것을 의미한다.
논블로킹은 입출력 작업이 완료될 때까지 대기하지 않고 즉시 반환되는 방식이다. 논블로킹 상태에서는 입출력 작업이 완료될 때까지 대기하지 않고 다른 작업을 수행할 수 있다.
A 함수가 B 함수를 호출할 때의 제어권의 흐름을 보면, A 함수와 B 함수간에 번갈아가며 전달이 된다. 즉, 입출력 작업이 시작되면 호출자는 대기 상태가 되지 않고, 호출된 함수가 입출력 작업을 수행하는 동안 다른 작업을 수행할 수 있다.
논블로킹 상태에서는 입출력 작업의 완료 여부를 확인하기 위해 주기적으로 확인해야 한다. 입출력 작업이 완료되지 않았을 경우, 호출된 함수는 바로 반환하고, 호출자는 다른 작업을 수행할 수 있게 된다.
