모든 내용은 [윤성우 저, "열혈강의 TCP/IP 소켓 프로그래밍", 오렌지미디어] 를 기반으로 제 나름대로 이해하여 정리한 것입니다. 다소 부정확한 내용이 있을수도 있으니 이를 유념하고 봐주세요!
01. 비동기 Notification IO 모델과 Overlapped IO 모델 사이에서 비동기로 처리되는 영역이 어떻게 차이가 나는지 설명해보자.
- 비동기 Notification IO 모델 : IO 관련 이벤트의 발생을 알리는 과정이 비동기로 처리됨
- Overlapped IO 모델 : IO가 완료된 상황을 확인하는 과정이 비동기로 처리됨
02. 넌-블로킹 IO, 비동기 IO 그리고 Overlapped IO의 관계를 하나의 문장으로 연결해서 설명해보자.
- IO가 완료된 상황을 확인하는 과정이 비동기로 처리되는 것이 비동기 IO이다.
- 비동기 IO가 가능하려면, 입출력 함수가 바로 반환되어야 하기 때문에 넌-블로킹 IO로 동작해야 한다.
- 넌-블로킹 IO 동작으로 인해 비동기 IO가 가능한 상태에서, 여러 IO가 중첩된 모델이 Overlapped IO이다.
03. 다음 코드의 일부를 보면서 문제점이 있다면 어떠한 문제가 있는지 지적해 보자. 그리고 이에 대한 해결책도 함께 제시해보자.
while(1)
{
hRecvSock=accept(hLisnSock,(SOCKADDR*)&recvAdr,&recvAdrSz);
evObj=WSACreateEvent();
memset(&overlapped,0,sizeof(overlapped));
overlapped.hEvent=evObj;
dataBuf.len=BUF_SIZE;
dataBuf.buf=buf;
WSARecv(hRecvSock,&dataBuf,1,&recvBytes,&flags,&overlapped,NULL);
}
- WSARecv 함수호출 시, 인자로 OVERLAPPED 구조체 변수의 주소 값을 전달해야 하는데, 이 때 한번의 함수호출 당 WSAOVERLAPPED 구조체 변수를 "각각 별도로" 구성해서 전달해야 한다. WSAOVERLAPPED 구조체 변수가 Overlapped IO의 진행과정에서 운영체제에 의해 참조되기 때문이다.
- 따라서 while 반복문 안에서 동일한 OVERLAPPED 구조체 변수의 주소값을 WSARecv 함수에 전달하는 것에 문제가 있다. 해결책으로는 반복문 안에서 OVERLAPPED 구조체 변수를 동적할당하는 방법이 있다.
04. WSASend 함수호출 이후에 IO가 Pending된 상황과 그렇지 않은 상황을 확인하는 방법에 대해서 소스코드 수준에서 설명해보자.
- WSASend 함수호출의 반환값이 SOCKET_ERROR을 반환하지 않으면 데이터 송수신이 완료된 상황
- WSASend 함수호출의 반환값이 SOCKET_ERROR이고, WSAGetLastError 함수의 반환값이 WSA_IO_PENDING인 경우는
데이터의 송수신이 완료되지는 않았지만 계속해서 진행중인 상태
05. 쓰레드의 alertable wait 상태는 어떠한 상태를 의미하는가? 그리고 쓰레드를 이 상태가 되도록 하는 함수들 중 두 가지만 말해보자.
- "alertable wait 상태" : 운영체제가 전달하는 메시지의 수신을 대기하는 쓰레드의 상태.
다음 함수가 호출된 상황에서 쓰레드는 alertable wait 상태가 됨.
1) WaitForSingleObjectEx
2) WaitFOrMultipleObjectsEx
3) WSAWaitForMultipleEvents
4) SleepEx
[출처] : 윤성우 저, "열혈강의 TCP/IP 소켓 프로그래밍", 오렌지미디어
'Programming > 열혈 TCP, IP 소켓 프로그래밍(저자 윤성우)' 카테고리의 다른 글
Ch 23. IOCP(Input Output Completion Port) (0) | 2020.08.16 |
---|---|
Ch 21. 내용 확인문제 (0) | 2020.08.15 |
Ch 22. Overlapped IO 모델 (0) | 2020.08.15 |
Ch 21. Asynchronous Notification IO 모델 (0) | 2020.08.15 |
Ch 20. 내용 확인문제 (0) | 2020.08.15 |