Sync/Async, Blocking/Non-blocking
Sync/Async, Blocking/Non-blocking 개념을 정리한다.
1. Sync/Async, Blocking/Non-blocking
1.1. Sync/Async
Sync, Async는 요청 결과를 요청이 완료된 시점에 얻을수 있는지 없는지에 따라서 결정된다.
- Sync - 요청 결과를 요청이 완료된 시점에 얻을수 있다.
- Async - 요청 결과를 요청이 완료된 시점에 얻을수 없다. 이후의 별도의 Action 수행 또는 Event 수신을 통해서 요청 결과를 확인할 수 있다.
1.2. Blocking/Non-blocking
Blocking, Non-blocking은 요청을 전송한 주체가 요청 결과를 받을때 까지 다른 일을 할수 있는지, 없는지에 따라 결정된다.
- Blocking - 요청 결과를 받을때까지 요청을 전송한 주체는 다른일을 하지 못한다.
- Non-blocking - 요청 결과를 받지 않아도 다른일을 수행할 수 있다.
1.3. Cases
Linux I/O 관련 함수들은 Sync/Async, Blocking/Non-blocking 인지에 따라서 4가지로 분류할 수 있다.
Sync + Blocking
- I/O 함수 - read(), write() without O-NONBLOCK
- I/O 처리 결과를 I/O 함수 호출이 완료되면 얻을 수 있으며, I/O 처리가 완료될때까지 I/O 함수를 호출한 Thread는 다른일을 수행하지 못한다.
Sync + Non-blocking
- I/O 함수 - read(), write() with O-NONBLOCK
- I/O 처리 결과를 I/O 함수 호출이 완료되면 얻을 수 있으며, I/O 처리가 완료되지 않더라도 I/O 함수를 호출한 Thread는 다른일을 수행할 수 있다.
- I/O 함수를 호출한 Thread는 I/O 처리가 완료될 때까지 계속 I/O 함수를 다시 호출해야 한다.
Async + Blocking
- I/O 함수 - select(), epoll() (Multiplexing) with read(), write() and O-NONBLOCK
- I/O 처리 결과를 I/O 함수 호출이 완료되어도 얻을 수 없으며, I/O 처리가 완료될때까지 I/O 함수를 호출한 Thread는 다른일을 수행하지 못한다.
- I/O 함수를 호출하고 Mutiplexing 함수를 호출하여 I/O 처리 완료 Event가 발생할 때까지 Blocking 한다.
Async + Non-blocking
- I/O 함수 - aio()
- I/O 처리 결과를 I/O 함수 호출이 완료되어도 얻을 수 없으며, I/O 처리가 완료되지 않더라도 I/O 함수를 호출한 Thread는 다른일을 수행할 수 있다.