소켓 생성시 default 모드는 blocking socket이다.
non-blocking 용어에 대해 처음 접한다면 생소한 용어이겠지만 일반적으로 소켓 프로그래밍에 사용되는 함수들은 처리될때까지 소켓의 진행을 막을 수 (block) 있는 시스템 콜이기 때문에 비동기적인 작업 수행이 불가능 하게 된다.
하지만 Non-Blocking Socket으로 선언시 네트워크 시스템이 즉시 응답할 수 없는 경우에도 OS는 작업의 완료 여부와 상관없이 응답을 해준다. 이는 시스템 콜을 받자마자 제어권을 다시 유저에게 넘겨 준다는 것이기에, 유저 프로세스는 IO 가 완료 되기 전에도 다른 작업을 수행할 수 있음을 의미한다.
+) 물론 일반적인 send,recv 함수 입장에서는 멈추어 있어야 할 소켓이 사용자의 명령에 의해 바로 제어권이 넘어갔기 때문에 에러 코드를 남긴다. 이러한 케이스를 구분하기 위해 소켓 프로그래밍 단에서는 EWOULDBLOCK에 대한 선별을 수행해 주어야 한다.
if (::WSAGetLastError() == WSAEWOULDBLOCK)
continue;
그렇다면 Non-Blocking은 Asynchronus와 같은 의미일까?
굉장히 유사한 의미고 처음 IO 모델을 배우던 나의 입장에서도 차이점을 쉽게 알 수 없었다.
다만 최근 듣고 있는 강의에서도 이를 명확히 해소해 주지는 못했다. 다만 IBM 의 article 분류에서 이를 명확히 이해할 수 있었다. 요약하자면 blocking - non-blokcking은 응답을 즉시 받을 수 있는지 여부를 판별하고 sync - async는 완료 여부를 누가 알려주는지를 더 중요하게 여긴다.
non-blocking: 작업을 요청하면 즉시 응답을 받을 수 있다.
비동기(async): 작업을 요청 받은 측에서 작업의 완료 여부를 알려줌
두 개념의 차이만큼 해당 속성들을 적용한 다양한 조합이 가능하다고 한다.
세부 출처
https://developer.ibm.com/articles/l-async/
'Network' 카테고리의 다른 글
Socket Programming 간단한 실습 (0) | 2021.12.27 |
---|