본문 바로가기

스터디/Server

Overlapped IO 모델

개인적인 생각.

IOCP모델 공부하기 전에 흔히들 먼저 책에서 권하는 단계. 서버 공부하다보니 이 부분부터가 약간의 분기점이 되지 않나 싶다. 기존까지는 Send/Recv 함수를 그냥 써줬다면, 여기서부터 WSASend/WSARecv를 써주기 때문이다. 소켓 생성 역시 마찬가지로 socket 함수를 기존까지 썼다면, OverlappedIO모델부터는 WSASocket 함수를 사용해서 소켓을 생성한다.


기존까지의 방식과 차이점.

TCP/IP 통신의 특성상, 보내려는, 혹은 받으려는 정보를 정상적으로 받을 때 까지 통신이 이루어지는 걸로 알고있다. 따라서 정상적으로 송수신이 처리되었는지 '결과'를 받는 과정이 필요한데, 기존까지는 Send/Recv 함수의 리턴이 이러한 과정이었다. 따라서 프로그램은 이 함수들이 반환될 때 까지 강제로 대기 상태에 빠져야 했다. 쓰레드를 여러개 돌리면 될 문제라고는 하나, 반환 시점을 알 수가 없는데 그러게 쓰레드를 여러개 쓰면 되네. 


아무튼 그래서 좀 더 나아진 형태가 Overlapped IO모델.

방식은 Event커널 오브젝트 기반이 있고 Completion Routines기반. 이렇게 두가지가 있다. 내가 보는 두 방식의 차이점은 잘 모르겠고 그냥 코드 방식의 차이가 아닐까..? 싶다. Event 커널 오브젝트 방식은 결과 완료 확인을 WSAGetOverlappedResult 함수를 사용하고, Completion Routines 기반은 WSASend/WSARecv 시 가장 마지막 인자에 넣어준 값(함수)에서 확인하고. 


결과 완료 확인을 하려면 두 방식 모두 공통적으로 쓰레드의 상태가 어떤가... 를 확인해야한다. 그러니까, IO를 요청한 Thread가 Alert Wait상태일때 결과 완료 확인이 가능해진다는 뜻.


쓰레드를 Alert Wait 상태로 만들고 싶다면 아래 함수들을 호출하면 된다.

아래 함수들의 가장 마지막 인자에 True를 넣어준다면, 이 함수가 실행되는 Thread는 Alert Wait 상태로 있을 수 있다.

* WaitForSingleObjectEx

* WaitForMultiObjectEx

* WSAWaitForMultiEvents

* SleepEx



내가 이해를 한건지 책을 그냥 외운건지.... ㅋㅋㅋ


참. 책에서는 Alert Wait 상태로 만들기 위해 SleepEx를 사용했고, 웹에서 본 강좌에서는 WSAWaitForMultiEvents를 사용함. WSAWaitForMultiEvents를 사용할 때는 형식적으로라도 WSACreateEvent로 이벤트를 만들어 둔 상태여야 함.


책에서 설명하기로는, (책에서야 SleepEx를 사용했으니) SleepEx를 사용하는 문제도 있고 성능 문제도 있고 .. 해서 IOCP가 필요하다고 함. 그래서 지금은 IOCP 공부중. 


'스터디 > Server' 카테고리의 다른 글

AcceptEX 개객기야  (0) 2016.07.05
일단 IOCP 채팅서버 만드는 건 끝!  (0) 2016.06.28
Notification IO Model  (0) 2016.04.13
서버 라이브러리 구조  (0) 2016.04.13
주소 할당  (0) 2016.01.28