졸업 작품/서버

C++ IOCP 서버 1. 동기 비동기

장형이 2019. 5. 10. 18:05

* 아직 배우고 있는 학생이라 틀린 내용이 있을 수도 있습니다. 틀린 내용이 있다면 알려주시면 감사하겠습니다.

 

 

소켓 프로그래밍에서 사용하는 함수는 기본적으로 블로킹(Blocking) 함수이다.

Send(), Recv(), Connect() 등.. 소켓 함수로 요청을 하면 동기적으로 처리가 된다.

 

여기서 동기적이란?

"흐름이 하나로 진행(동기화)된다"고 이해하면 편하다.

보통 동기적이라고 하면 동시에 무슨 일이 일어난다고 이해하기 쉬운데 프로그래밍에서는 반대인 듯하다.

 

 

동기 함수

 

반대로 비동기는 흐름이 넘어가지 않고 진행된다.

 

 

비동기

 

비동기가 동기보다 당연히 더 좋지 않을까? 싶었지만 생각해보면 여러 가지 고민할 것이 많아진다.

 

첫 번째로, Recv 완료 통지를 결국 어디선가는 받아야 한다. 그럼 Recv를 하는 부분이 아닌 다른 곳에서 또 완료 로직을 심어서 소스가 보기 힘들어지기가 쉽다.

두 번째로, CallBack으로 완료 처리를 한다면 결국 다른 스레드에서 함수가 실행되므로 공유자원의 문제가 생길 수가 있다.

 

하지만 이 두 개를 견뎌낼 만큼 논 블로킹은 매력적이다.

수신받기 위해서 멍하니 보고 있는 건 너무 비효율적이니까...

 

이에 대한 해답은 여러 가지가 있는데 나는 IOCP를 사용하기로 했다.

최소한의 쓰레드로 최대한의 효율을 낼 수 있기 때문이다.

IOCP의 단점이라고 한다면 디버깅이 힘들다 정도라고 한다.

다음 포스팅은 본격적으로 IOCP에 대해서 기록해야겠다.

 

논 블로킹 소켓에 대해서 잘 설명되어있는 사이트 : https://ozt88.tistory.com/22