블록킹 소켓 vs 논 블록킹 소켓

Posted by epicdev Archive : 2011. 9. 21. 15:19
출처: http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=125630325

- 블록킹 소켓에 대한 설명

블록킹 소켓을 사용하면 한 타임에 하나의 접속만 처리가 가능 합니다.

예를들어, 블록킹 소켓을 사용한 서버라고 가정하는 경우 서버의 역할상 동시다발적으로 복수의 클라이언트가 접속을 하여 서비스를 이용하게 되는데 블록킹 소켓을 사용하면 순차적으로 클라이언트의 접속을 받아들여 작업하고 해당 작업이 완료 돼야 다음 접속에 대한 작업을 진행하게 됩니다.

 

즉, 10개의 클라이언트가 동시에 1개 서버에 접속을 한 경우 1번째 클라이언트에 대한 작업이 완료되면 2번째 클라이언트에 대한 작업을 진행하고 완료되면, 3번째 클라이언트 작업 완료되면, 4번째 클라이언트 작업.... 이렇게 순차적으로 작업을 진행하게 되며 최종 10번째로 접속한 클라이언트는 앞에 9개의 클라이언트에 대한 작업이 끝날때 까지 대기를 해야 하는 형태가 됩니다. 거기다 각 클라이언트에 대한 작업시간이 언제끝날지 모른다면 뒤에 대기중인 클라이언트들은 한없이 대기할수 밖에 없는 상태가 되지요.

 

- 블록킹 소켓 + 멀티스레드 방식 설명

그래서 이러한 현상을 극복하기 위해 스레드를 사용하였습니다. 각 클라이언트들이 접속시 1개 클라이언트당 1개의 스레드를 생성하여 멀티스레드 방식으로 운용을 하게 됩니다. 스레드는 동시에(정확히는 아니지만..) 작업이 가능 하므로 클라이언트가 10개가 들어오던 20개가 들어오던 거의 동시에 작업이 이루어지게 되고 블록킹 소켓을 사용하지만 스레드의 장점을 활용한 방법이라 볼수 있습니다.

 

하지만, 이 방법도 완전한 방법이 아닙니다. 운영체제마다 스레드의 갯수가 제한(설정가능..)되어 있는데 만약, 제한된 스레드의 갯수보다 많은 클라이언트들이 접속해야 한다면 문제가 발생하게 됩니다. (가용성 부재)

뿐만 아니라, 스레드가 작동되기 위해 컨텍스트 스위칭이 계속적으로 발생하게 되는데 스레드가 많은면 많을수록 성능이 하락되어 최종에는 스레드를 사용하는 의미가 사라지게 됩니다. (성능하락)

 

- 논-블록킹 소켓 설명

위와 같은 문제점을 극복하기 위해 한개 스레드에서 여러 클라이언트의 작업을 번갈아가면서 작업을 하기 위한 모델을 만들었는데 그게 바로 논-블록킹 모델 입니다.

논-블록킹 소켓을 사용하면 접속한 클라이언트의 갯수와 상관없이 한개의 스레드에서 번갈아가면서 작업을 하게 되며 이벤트 방식과 흡사한 방식으로 작동됩니다.

 

3개의 클라이언트가 서버에 접속해 작업을 하는 경우 1번째 클라이언트가 보낸 데이터가 있다면 데이터를 받고 3번째 클라이언트에게 데이터를 전송할수 있는 상황인 경우 데이터를 전송하는 형태가 됩니다.

 

2. 그리고 클라이언트가 보통 30개 정도 붙고 끈임없이 데이터를 주고 받아야 한다면 둘중 어느게 안정적이고 빠른가요?

블록킹 소켓 + 멀티스레드 방식의 경우 스레드 갯수와 컨텍스트 스위칭과 관련된 단점이 있는 반면에 프로그램 제작하기가 상대적으로 쉽습니다. 클라이언트가 30개라면 스레드가 30개 정도 생성된다고 봐야 하는데 개인적으로 스레드 30개정도는 문제될 부분이 많지 않다고 생각됩니다. 만약, 30개보다 더 많은 클라이언트의 갯수가 접속해야 한다면 가용성이나 성능 부분을 위해 논-블록킹으로 작업해야 될겁니다.

논-블록킹 모델은 많은 장점이 있는데 불구하고 단점은 상대적으로 프로그램 작성하기가 힘듭니다.

그리고, 논-블록킹 모델의 경우도 분명 병목현상이 발생되는 지점이 있기에 서비스와 관련된 부분에 스레드를 사용해야하는등 신경써줘야 하는 부분들이 더 많습니다.

선택은 본인이 하겠지만 저라면 블록킹 소켓 + 멀티스레드로 가겠습니다.

아. 참고로 더 말씀드리지만 논-블록킹은 블록킹보다 상대적으로 가용성이 높지만 속도가 빠른것은 아닙니다. 서버가 대량의 클라이언트를 받아들이고 안정적인 서비스를 하고자 하는 경우 논-블록킹의 선택하는게 현명하지 않나 생각됩니다.