2014년 2월 5일 수요일

[개념확립]네트워크 프로그래밍에서의 Blocking, Non-Blocking, Synchronous, Asynchronous

서론.
 시작하기에 앞서 본 글에서의 용어 번역은 다음과 같다. 이 외의 것은 IT 용어 원어의 통상적인 번역어휘를 사용한다.

 Blocking : 차단, 봉쇄
 Non-Blocking : 비차단, 비봉쇄
 Synchronous : 동기식의
 Asynchronous : 비동기식의

또한 본 글에 사용된 이미지, 이미지 설명, 글 등은 다음 URL에서 상당량 참고하였음을 출처로 밝혀 둔다.
http://devsw.tistory.com/142
-------------------------------------------------------------------------------------------

 TCP/IP 를 기반으로 둔, 네트워크 프로그래밍을 초기에 접하는 사람들에게 상기 언급한 개념은 한 번 이상 나타난 개념이다. 이를 정리한다.

 소켓 프로그래밍에서의 차단, 봉쇄

  이 개념은 소켓 통신을 이용하여 데이터를 주고받을 때, 수신자는 송신자가 데이터를 보내기 전까지는 어떠한 코드의 흐름을 따를 수 없는 상태를 두고 발생하는 현상을 이르는 것이다.

구글이 이미지를 지워서 아래로 대체함

[그림 1] 차단, 봉쇄의 개념도
Blocking I/O 모델에서의 작동 방식 : 어플리케이션(프로그램)에서 수신을 위한 함수(recvfrom 등)를 호출할 때, 커널은 데이터가 들어올 때까지 봉쇄, 차단을 시킨다. 데이터가 들어오면 수신을 위한 함수는 리턴하며 프로그램의 흐름은 순차적으로 진행된다.

소켓 프로그래밍에서의 비차단, 비봉쇄

  이 개념은 전술한 차단, 봉쇄 개념에서 서버가 수많은 클라이언트들의 요청 처리를 하는데 있어서 크나큰 부담을 느끼기 때문에 이 부담을 덜고자 고안한 개념으로 이전까지는 종종 쓰레드를 생성하여 처리를 나누곤 하였으나 문맥 전환에 상당한 비용이 들어가는 대규모 처리에서는 성능에 역효과를 봤기에 수신대기 함수를 호출하여도 코드의 흐름이 멈추지 않도록 한 처리 방식이다.

구글이 이미지를 지워서 아래 이미지로 대체함

[그림 2] 비차단, 비봉쇄의 개념도
Non-Blocking I/O 모델에서의 작동 방식 : 어플리케이션(프로그램)에서 수신용 함수를 호출할 때, 커널은 읽을 데이터가 없으면 EWOULDBLOCK을 리턴한다.

  [그림 2]에서 확인할 수 있듯이 이 개념에서는 소켓에 데이터가 있는지 없는지를 지속적으로 확인해 주어야 한다. 용어로 busy-waiting을 사용하며 무한루프가 계속 도는 것을 의미한다고 보면 된다.



  결국 큰 차이는 수신 관련 함수에서 데이터가 올 때까지 기다리면서 코드의 흐름을 중단하느냐 그렇지 않고 다음 흐름으로 분기하느냐에 있다. 보통 비봉쇄에서는 데이터가 없을 경우 -1과 같은 값을 리턴하고 이와 같은 값이 리턴되었을 때, 특정 에러 코드를 확인하거나 혹은 예외를 보고 소켓이 처한(?) 상황을 파악해야 하기에 예외처리가 만만하지 않다는 단점이 있다. 그러나 이를 완전히 수행하였을 때 빈틈이 없어진다는 장점을 가진다.

 동기의
 동기 개념은 차단, 봉쇄와 실질적인 차이가 없다. 쌍방간의 데이터 처리를 서로 기다려 주기 위하여 흐름을 멈추는 것이므로 결국 차단을 하게 되기 때문이다. 반드시 어떠한 작업이 완수되고 난 뒤에야 온전한 실행을 보장하는 코드의 흐름이 존재한다면 이와 같은 개념이 필요하다.

 비동기의
 비동기 개념은 비차단, 비봉쇄와 그 차이가 너무도 크다. 공통점을 완전히 배제할 수는 없으나 내부적으로 작동하는 방식에 차이가 있다. 이는 주의하여 살펴볼 내용으로 개념이 비슷하여 이를 교묘히 비차단, 비봉쇄에 이용하는 경우가 있기 때문에 비차단, 비봉쇄와 혼동할 수 있다. 비동기 작업에서는 함수 호출은 즉시 리턴되며 대신 작업이 완료되었을 때 이를 통지하여 주는 이벤트 혹은 콜백 시스템이 존재한다.

구글이 이미지를 지워서 아래 이미지로 대체함. 하 거 왜 지워가지고.. 사람 고생하게 해

[그림 3] 비동기의 개념도
Asynchronous I/O 모델에서의 작동 방식 : 어플리케이션(프로그램)에서 aio_read는 호출될 때, 읽을 데이터가 있던지 없던지 간에 즉시 리턴을 하게 되며, 읽을 데이터가 발생한 경우 이벤트를 유발시키거나 지정된 콜백 시스템을 사용한다.

  이로써 정리를 끝낸다. 빈약하지만 이 사실은 글쓴이만 몰랐을 가능성이 농후하기에 정리하였다. 또한 사실상 이후 추가될 글을 이해하는데 필요할 것 같아 간단히 언급하고 넘어가는 정도로 이해하여 주길 바란다.

참고 : FTFTIF - 이 문구는 무려 F가 3번, T가 3번이 나오는 문구이다.

댓글 없음:

댓글 쓰기