-       Blocking mode

소켓 프로그래밍 책을 보다 보면 read, write 함수를 가장 쉽게 보게 됩니다. 리눅스에서 read, write는 소켓 프로그래밍에서 패킷을 보내거나 받을 때 사용하는 함수입니다. 이 함수는 소켓이 blocking인가, non-blocking인가 에 따라 작동방식이 조금 다릅니다. 소켓이 blocking일 경우 Server Client의 메시지 요청을 받기 위해 read에서 기다릴 수가 있습니다Client write하기 전에는 read에서 빠져 나오지를 못하는 것이라고 할 수 있습니다.

Blocking I/O 모델에서의 작동 방식 : 어플리케이션(프로그램)에서 recvfrom(read)를 호출 할 때, 커널은 데이터가 들어올 때까지 봉쇄(blocking)를 시킵니다. 데이터가 들어오면 recvfrom(read)함수는 return이 되고, 프로그램 흐름은 어플리케이션(프로그램)으로 돌아오게 됩니다.

-       Non- blocking mode

위와 같이 blocking 형태의 프로그래밍을 하다보면 서버 프로그램 입장에서는 여러 클라이언트의 처리가 어렵게 됩니다. 그래서 나온 방법이 클라이언트 접속 별로 쓰레드를 생성하여 클라이언트 별 read 함수를 호출 하는 것인데하지만 이 방법도 대규모 처리를 하기 위해서는 Context switching에 발생하는 비용이 만만치 않아 프로그램의 성능을 떨어뜨리게 됩니다. 이러한 방법을 피할 수 있는 방법이 비봉쇄(non-blocking) 방법입니다. non-blocking은 위의 그림처럼 시스템 함수 호출 후 멈출 필요가 없이, 읽을 데이터가 있으면 읽고, 없으면 넘어가게 되는 방법입니다.

Non-blocking I/O 모델에서의 작동 방식 : 어플리케이션(프로그램)에서 recvfrom(read)를 호출 할 때, 커널은 읽을 데이터가 없으면 EWOULDBLOCK (또는 EAGAIN, 둘의 의미는 같음.)을 return 합니다. 위의 그림과 같이 소켓에 읽을 데이터가 있는지 없는지 recvfrom(read)을 Loop를 돌면서 계속 호출해주어야 합니다.

-    Synchronous

동기는 사실상 blocking과 차이점이 없다고 보면 됩니다. 내(어플리케이션)가 당신(커널)의 작업(recvfrom)이 끝날 때 까지 기다려 줄게, 또는 시간을 맞춰줄게, 또는 동기화 해줄게. 라고 생각하시면 됩니다. 어플리케이션이 커널에 작업을 요청하고 커널에서 작업이 끝날때 까지 어플리케이션이 기다려 주는 것으로, 즉 동기화 하기 위해서 봉쇄(blocking)을 하는 것입니다.

-       Asynchronous

비동기의 간단한 개념을 따지자면 비동기 read함수를 호출하면 바로 return이 됩니다

비동기 함수를 호출할 때는 작업이 완료가 될 때 알려줄 수 있는 event나 callback함수를 설정하게 되는, 즉 어플리케이션이 커널에게 '읽을게 있으면 나에게 알려주거나, (event)callback함수를 호출해' 라고 하는 것입니다.

즉, 비동기 프로그래밍은 non-blocking처럼 지속적인 관찰이 필요한 프로그래밍이 아니라 일단 작업을 걸어두고 다른 작업을 진행하다가 어떠한 신호나 작업이 들어올 경우 걸어둔 작업을 진행한다. 라고 생각하면 좀 더 수월해 질 것입니다.

Asyncronous I/O 모델에서의 작동 방식 : 어플리케이션(프로그램)에서 IO_read를 호출 할 때, 커널은 읽을 데이터가 있던 없던 return을 하게 되며, 읽을 데이터가 발생하게 되면 event를 발생하거나 callback함수를 호출하게 됩니다.

'Network' 카테고리의 다른 글

DHCP란?  (0) 2016.04.19
채널화의 종류  (0) 2016.04.19
ARP/RARP Protocol, 동작 방법  (0) 2016.04.19
OSI 7계층(OSI 7 Layer)  (2) 2016.04.19
NAT란?  (0) 2016.04.19

WRITTEN BY
SiriusJ

,