본문 바로가기
일상,취미

[TIL 37일차] 비동기

by 진득한진드기 2024. 8. 25.


동기와 비동기에 대한 이해


동기 입출력은 

전송 시작       전송 완료        수신 시작     수신완료

send 호출     send 반환        recv호출     recv 반환

TCP애서는 send로 출력버퍼에 데이터를 다 보내면 데이터가 전송이 되었다는 가정이 들어가 있다. 이는 TCP의 특성 때문에 그렇다.

recv는 반환이 될때에 수신이 완료되었다고 판단한다.

입출력 함수의 호출 및 반환의 시기가 데이터 전송 시작 및 완료의 시기와 일치하는 방식의 함수호출, 따라서 함수가 호출된 동안에는 다른 작업을 할 수가 없다.

비동기 입출력은


전송 시작        전송 완료        수신 시작      수신 완료


send 호출 및 반환                         recv 호출 및 반환

 

와 같은 순서로 진행된다. 


입출력 함수의 호출 시점이 데이터의 송수신 시작되는 시기이다. 그러나 호출된 함수는 이내 반환을 하고, 내부적으로는 계속해서 입출력이 진행되는 방식의 호출이다. 따라서 동기 입출력이 지니는 단점의 대안이 된다.


동기 Norification이란?


- 입출력의 Notification이 동기적으로 이루어지는 것
- select 함수는 입출력이 완료 또는 가능한 상태가 되었을 때 반환을 하므로, select 함수가 동기 Notification 모델의 대표적인 예이다.


비동기 Notification 이란?


- 입출력의 Notification이 비동기적으로 이루어지는 것
- select 함수의 비동기 버전이 WSAEventSelect 함수이다.
- WSAEventSelect 함수는 입출력의 완료에 상관없이 무조건 반환을 한다. 따라서 입출력의 완료를 확인하기 위한 별도의 과정을 거쳐야 한다.
- WSAEventSelect 함수를 이용하면, IO의 상태변화를 명령한 다음, 이후에 기타 작업을 진행한 다음에 IO 상태변화를 확인할 수 있다.

동기는 완료가 되면 알림이 오는 것이고, 비동기는 수행하면 바로 반환이 된다.

즉, 비동기는 우리가 원하는 타이밍에 다시 확인을 하는 방식이다.