개인적인 생각.
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 |