Synchronous(동기)와 Blocking(블로킹)은 무언가를 기다리게 하고, Asynchronous(비동기)와 Nonblocking(논블로킹)은 기다리지 않고 바로 바로 처리된다. 하지만, 분명한 차이점이 존재한다.
Blocking/NonBlocking(블로킹/논블로킹)
Blocking/NonBlocking은 호출되는 함수가 바로 리턴을 하느냐 마느냐가 관심사이다
- Nonblocking : 호출되는 함수가 바로 리턴한다.
- 호출되는 함수가 제어권을 바로 호출하는 함수에게 넘겨주어 다른 일을 할 수 있도록 한다.
- 제어권은 호출하는 함수에게 있다.
- Blocking : 호출되는 함수가 자신의 작업을 완료할 때까지 리턴하지 않는다.
- 호출되는 함수는 자신의 작업을 완료하면, 호출하는 함수에게 제어권을 넘겨주므로 호출하는 함수는 다른 일을 하지 않고 대기한다.
- 제어권은 호출되는 함수에게 있다.
Block은 막다, Nonblock은 막지않는다로 해석하면 이해하기 쉽다.
이미지를 전달하는 API를 호출했다고 치면,
Blocking의 경우 해당 API로 이미지를 전달하는 시작점부터 이미지 응답이 오는 시점까지 사용자가 아무 행동도 못하게 되는 것이다. 곧 제어권을 뺏긴다고 말할 수 있다.
반대로 Non-Blocking은 이미지 전달 API가 시작될때, 바로 제어권을 다시 호출한 주체한테 주는것이다. 그렇기 때문에 바로 이어서 이미지를 보내는 API의 나머지 서비스 로직 코드를 실행할 수 있는 것이다.
Synchronous/Asynchronous(동기/비동기)
Synchronous/Asynchronous는 호출하는 함수가 호출되는 함수의 작업 완료 여부를 신경쓰냐 마냐가 관심사이다.
- Synchronous : 호출하는 함수가 호출되는 함수의 작업 완료 여부를 확인한다.
- 호출하는 함수는 호출되는 함수의 작업 완료 여부 또는 작업 완료 후 리턴을 기다리고 있다.
- 또는 주기적으로 계속 물어본다.
- Asynchronous : 호출하는 함수가 호출되는 함수의 작업 완료 여부를 신경 쓰지 않는다.
- 호출하는 함수에게 Callback을 전달해서 작업을 완료하면 실행하도록 한다.
- 기다리지도, 물어보지도 않는다.
- Asynchronous를 구현하기 위해 호출된 함수의 작업은 별도의 thread로 빼서 실행하며 완료되면, 호출한 함수에게 알려준다.
Synchronous 동기는 요청한 작업에 대해 완료 여부를 신경 써서 작업을 순차적으로 진행하고,
Asynchronous 비동기는 요청한 작업에 대해 완료 여부를 따지지 않고, 다음 작업을 바로 진행한다.
위 그림에서 동기는 순차적으로 점원이 주문을 받고, 아래의 비동기는 작업이 동시에 진행되는 것을 확인할 수 있다.
Sync-Blocking & Async-Nonblocking
Sync-Blocking
- Synchronous + Blocking
- 호출하는 함수는 호출된 함수의 작업 완료/리턴을 계속 기다린다.
- 호출된 함수는 자신의 작업이 완료되면 리턴한다.
따라서 호출한 함수는 함수를 호출한 후, 리턴을 받기 전까지 다른 일을 하지 않고 대기한다.
Async-Nonblocking
- Asynchronous + Nonblocking
- 호출하는 함수는 호출된 함수의 작업 완료 및 리턴을 기다리지 않는다.
- 호출된 함수는 호출되면 바로 리턴한다.
Sync-Nonblocking
- Synchronous + Nonblocking
- 호출하는 함수는 호출된 함수의 작업 완료 및 리턴을 끝났는지 계속 기다린다.
- 호출된 함수는 호출되면 바로 리턴한다.
따라서 호출한 함수는 호출 이후 제어권을 바로 받기 때문에 작업을 계속하면서, 호출했던 함수의 작업 완료는 주기적으로 확인한다.
Async-Blocking
- Asynchronous + Blocking
- 호출하는 함수는 호출된 함수의 작업 완료 및 리턴을 기다리지 않는다.
- 호출된 함수는 자신의 작업이 완료되면 리턴한다.
호출한 함수는 호출한 함수의 리턴을 기다리지 않지만, 호출된 함수는 자신의 작업이 끝날 때까지 제어권을 넘겨 주지 않기 때문에 호출된 함수의 작업이 완료될 때까지 대기하게 된다. 즉, Sync-Blocking과 유사하게 동작하며, 이 방식에 비해 별다른 이점이 없다.
정리
동기/비동기, Blocking/Non-blocking은 경계를 딱 나누기 어렵다.
하지만, 기준 차이에서 보면
동기/비동기는 작업의 순서의 관점이고, Blocking/Non-blocking는 작업의 제어의 관점이다.
동기+Blocking/비동기+Non-Blocking 의 조합으로 사용하는 게 일반적이고, 각각의 경우를 위처럼 조합해서 사용할 수도 있다.
'CS 공부 > 네트워크' 카테고리의 다른 글
HTTP&HTTPS (2) | 2022.09.11 |
---|---|
로드 밸런싱(Load Balancing) (0) | 2022.07.03 |
[TCP] 흐름제어/혼잡제어 (0) | 2022.06.26 |
[TCP] 3 way handshake & 4 way handshake (0) | 2022.06.26 |