갑자기 IOCP? 중간은 다 어디갔어?
그렇게 됐습니다
0. iocp가 뭘까
Input Output Completion Port의 약자로, 윈도우에서 제공하는, 여러 비동기 I/O 요청을 처리하기 위한 멀티스레딩 모델이다. 비동이 I/O요청 처리를 위한 다양한 기술이 접목되었다.
1. 비동기
I/O는 마우스나 키보드의 입력, 모니터의 출력, 파일 입출력뿐만 아니라 네트워크 통신도 포함된다. 만약 웹페이지를 방문했는데 관련된 html이나 이미지를 다운받는 동안 컴퓨터가 멈춘다면 불편할 것이다. 컴퓨터는 I/O 요청을 처리하는 동안 다른 작업도 할 수 있어야 한다. 이렇게 한 작업을 하는 동안 다른 작업을 동시에 진행하는 것을 비동기라고 한다.
2. Overlapped I/O
Overlapped I/O는 Non-Blocking 모드로 동작하며 비동기적으로 I/O 요청을 처리하기 위한 방법이다.
Overlapped I/O의 작동방식은 이렇게 된다.
- I/O 작업을 요청한다.
- WSASend( ... , IpOverlapped) 함수를 호출 (이 함수는 데이터를 전송하는 역할을 담당하며 Overlapped IO 구조체를 파라미터로 전달한다.)하고 바로 리턴한다.
- 비동기적으로, I/O 작업을 요청했다는 정보를 Device Driver(IO 장치와 연결된 Driver)에게 전송함. I/O 작업을 Driver에게 전송한 쓰레드는 더이상 I/O작업을 신경쓰지 않는다.
- Device Driver는 IO 작업이 끝날 때까지 감시한다. 그리고 I/O가 끝나면 끝났음을 알려준다.
4번까지의 과정을 요약하면 I/O처리 요청을 쓰레드에서 디바이스 드라이버에 위임하고, I/O 작업이 종료될때까지 해당 쓰레드는 다른 작업을 수행한다.
- I/O처리가 끝나면 Overlapped I/O는 WSASend() 함수의 파라미터로 전달한 overlapped 구조체에 이벤트 커널 오브젝트를 등록하고, 등록된 이벤트 객체를 signaled 상태로 변경해 I/O의 완료 여부를 알린다.
- 쓰레드는 WSAGetOverlappedResult 함수를 호출하면서 IO의 완료 및 결과를 기다린다.
이 방식은 IO를 요청한 쓰레드에서 IO 작업이 완료되었는지 계속 확인해야 한다는 단점이 있다. 해당 쓰레드는 WSAWaitForMultipleEvents 함수를 호출하며 쓰레드를 정지시키고 다른 쓰레드에 실행 기회를 양도하게 된다. 이 경우 비동기 처리의 장점을 효과적으로 사용할 수 없으며 성능이 저한되는 문제도 발생한다.
3. IOCP
IOCP는 IO처리 완료 신호를 받는 객체를 따로 생성한다. 이를 완료 포트(Completion Port)라고 한다. 미리 쓰레드 풀을 만들어 쓰레드를 대기시켜 놓았다가, CP의 신호가 있으면 풀에서 쓰레드 하나를 깨워 작업을 처리한다.
IO요청을 하는 쓰레드와 작업을 하는 쓰레드가 다르기 때문에, IO요청을 한 쓰레드는 IO의 결과를 기다릴 필요 없이 곧바로 다른 작업을 수행할 수 있다. 구조는 다소 복잡하지만 Overlapped IO의 단점을 극복할 수 있다.
'일기' 카테고리의 다른 글
(JavaScript) 달리기 경주 (0) | 2024.12.25 |
---|---|
OSI 4계층: 전송 계층 (0) | 2024.12.24 |
Socket.io를 활용한 통신 프로젝트 (0) | 2024.12.20 |
(JavaScript) 바탕화면 정리 (0) | 2024.12.18 |
라우팅 (0) | 2024.12.16 |