동기와 비동기 IO
동기(Synchronous)
요청을 보내면, 요청을 처리할 떄까지 대기한다.
즉, sender가 데이터를 보내는 시간과 receiver가 데이터를 수신하는 시간이 같아야 한다.
이 경우 모든 처리가 끝날 때까지 sender와 receiver가 기다려야 하기 때문에 비효율적이다.
비동기(Asynchronous)
요청을 처리할 때까지 기다리지 않고, 바로 다음 작업으로 넘어간다.
sender가 데이터를 보내는 시간과 receiver가 데이터를 수신하는 시간이 같지 않다.
sender가 처리를 요청하기 위해 함수를 호출했을 때, 호출된 함수는 바로 응답한다. 이떄의 응답은 결과에 대한 답이 아니라 확인을 했다는 결과를 리턴하는 것이다.
그 다음, 호출된 함수가 작업을 끝내면 callback으로 요청한 함수를 호출하여 결과를 전달한다.
Blocking과 Non-blocking
Blocking
함수를 호출하면, 호출받은 함수가 제어권을 가지고 있다. 따라서 호출받은 함수의 처리가 끝날 때까지 호출한 함수는 대기하고 있어야 한다.
위 그림은 synchronous blocking I/O의 모델인데, blocking의 특징은 Application에서 Kernel을 호출했을 때, Kernel이 Read response를 할 때까지 Application blocked되어서 아무런 동작을 수행하지 않는다는 것이다.
만약 Asynchronous blocking I/O면 다음과 같이 나타난다.
이 경우에도 kernel에서 response를 반환할 때까지 application이 blocked 상태인 걸 볼 수 있다. 이 경우에는 Asynchronous로 동작하는 데에서 얻는 이점을 거의 잃게 된다. 따라서 비효율적인 방법이다.
Non-blocking
non-blocking 방법은 blocking과 반대로 바로 제어권을 넘겨주는 방식이다.
synchronous non-blocking I/O model은 다음과 같다.
Asynchronous non-blocking I/O model은 다음과 같다.
자원의 활용 측면에서 지금까지 있었던 모든 방식 중 가장 효율적인 방식이다.
즉, 동기/비동기 방식은 호출하는 함수가 호출된 함수를 기다리느냐 그렇지 않느냐에 대한 것이고,
Blocking, Non-blocking 방식은 호출된 함수가 제어권을 반환하느냐 그렇지 않느냐에 대한 것이다.
이를 2by2 matrix로 표현하면 다음과 같다.
따라서 Asynchronous Non-blocking I/O model을 만드려면, linux용 AIO API를 활용하면 된다.
'CS > Network' 카테고리의 다른 글
[Computer Network] Transport Layer (0) | 2022.10.07 |
---|---|
[Computer Network] Application Layer (0) | 2022.10.07 |
[Computer Network] Introduction (0) | 2022.10.07 |
[Network] REST API (0) | 2021.09.27 |
Multi-NIC System의 설정 (0) | 2021.01.24 |