IOCP
- Windows 커널이 제공하는 비동기 I/O 완료 통지 시스템
- 비동기로 요청된 I/O 가 끝났을 때 커널이 결과를 큐에 넣고, 스레드가 그 큐를 꺼내 처리하는 구조
- 수천 개의 연결도 블로킹 없이, 스레드 낭비 없이 처리 가능
=> I/O 완료 알림을 효율적으로 전달하는 커널 객체
=> 비동기 I/O + 스레드 폴링을 결합한 모델
- 핵심 구성요소
`Completion Port (완료 포트)` : 커널 내부의 I/O 완료 큐
`I/O Handle (파일, 소켓 등)` : 비동기 작업 대상
`Overlapped 구조체` : 각 I/O 요청의 상태 정보
`Worker Thread Pool` : 완료된 I/O를 처리할 사용자 스레드
`I/O Manager (커널)` : 모든 I/O 요청과 완료를 관리하는 핵심 모듈
- 커널 내부의 IOCP 처리 흐름
1. 비동기 I/O 요청 발생 (User > Kernel)
i. `I/O Manager` 가 IRP (I/O Request Packet) 생성
ii. IRP 를 해당 디바이스 드라이버로 전달 (ex. NTFS, TCP/IP Stack 등)
iii. 디바이스 드라이버는 하드웨어에 실제 요청을 보냄 (ex. 디스크 읽기, 패킷 전송 등)
iv. 커널은 즉시 반환되고 호출 스레드는 Block 되지 않음
=> 요청만 보내고 돌아오는 `Non-blocking` 단계
2. 커널 내부 비동기 처리 (Kernel Background)
i. 하드웨어가 작업 수행 중 (ex. 디스크 읽기, 네트워크 수신 등)
ii. 완료되면 `Interrupt (하드웨어 인터럽트)` 발생
iii. 커널의 ISP (Interrupt Service Routine) 이 감지
: IRP 상태를 "완료됨"으로 갱신
: 해당 Completion Port(IOCP) 에 완료 정보 등록
=> 커널은 모든 비동기 I/O 를 `이벤트 기반`으로 관리
3. IOCP 큐에 Completion Packet 추가
i. 커널이 ICOP 객체를 찾아 다음 정보를 큐에 추가
: [Completion Key, Overlapped 구조체 포인터, 전송된 바이트 수, 상태코드] (= Completion Packet)
4. Worker Thread 가 큐에서 완료 이벤트 수신
i. IOCP 큐에서 완료 패킷을 기다리는 대기 함수 사용
: GetQueuedCompletionStatus(hIOCP, &bytes, &key, &overlapped, INFINITE);
: 해당 I/O 가 끝나면 커널이 스레드를 깨워 큐에서 결과를 꺼내줌
=> 커널은 비동기 I/O 가 끝나면 스레드 하나를 깨워서 결과를 처리하도록 함
5. 스레드 폴링 (Tread Pooling)
i. IOCP 는 세마포어 기반으로 스레드 수를 자동으로 조절
ii. 커널은 CPU 코어 개수와 부하를 보고 깨울 스레드 수를 결정
iii. 작업이 끝난 스레드는 다시 대기 상태로 돌아감
=> 새 스레드 생성/종료 오버헤드 없이 항상 최적 개수의 스레드만 가동
┌──────────────────────────────────────────────────────────────┐
│ [ User Space - 응용 프로그램 ] │
│──────────────────────────────────────────────────────────────│
│ 1️⃣ 비동기 요청 발생 (ex. ReadFileEx, WSARecv) │
│ │ │
│ ▼ │
│ 2️⃣ 커널로 I/O 요청 전달 (System Call) │
└───┬──────────────────────────────────────────────────────────┘
│
▼
┌───┴──────────────────────────────────────────────────────────┐
│ [ Kernel Space - 커널 영역 ] │
│──────────────────────────────────────────────────────────────│
│ 3️⃣ I/O Manager: IRP (I/O Request Packet) 생성 │
│ │ │
│ 4️⃣ IRP를 Device Driver로 전달 (파일/소켓/디스크 등) │
│ │ │
│ 5️⃣ 디바이스 드라이버가 하드웨어에 실제 I/O 명령 전송 │
│ │ │
│ ▼ │
│─────── 하드웨어에서 작업 진행 (ex. 디스크 읽기, 패킷 수신) ────────│
│ │ │
│ 6️⃣ 하드웨어 완료 시 → Interrupt 발생 (CPU 인터럽트 라인) │
│ │ │
│ 7️⃣ 커널 ISR(Interrupt Service Routine)이 인터럽트 처리 │
│ │ │
│ 8️⃣ IRP 상태를 “완료됨”으로 표시 │
│ │ │
│ 9️⃣ I/O Completion Packet을 IOCP 큐에 등록 │
│ (Completion Key, Overlapped*, 전송 바이트 수 등) │
└───┬──────────────────────────────────────────────────────────┘
│
▼
┌───┴──────────────────────────────────────────────────────────┐
│ [ Worker Thread Pool - 스레드 풀 ] │
│──────────────────────────────────────────────────────────────│
│ 🔟 스레드들이 IOCP 큐에서 대기 │
│ GetQueuedCompletionStatus() 호출 중 │
│ │ │
│ 11️⃣ 완료 이벤트 발생 시 커널이 스레드 중 하나를 깨움 │
│ │ │
│ 12️⃣ 스레드가 IOCP 큐에서 완료 데이터 꺼내 처리 │
│ │ │
│ 13️⃣ 처리 완료 후 다시 대기 (재사용됨) │
└──────────────────────────────────────────────────────────────┘
'💠기타 > 컴퓨터 과학 (CS)' 카테고리의 다른 글
| [HTTP] 쿠키와 세션은 무엇일까 ?? (3) | 2025.03.05 |
|---|---|
| [HTTP] HTTP 헤더는 어떠한 것들이 있을까? (0) | 2025.03.04 |
| [HTTP] 상태 코드 특징과 리다이렉션(PRG)에 대하여 (0) | 2025.03.04 |
| [HTTP] 데이터를 전송하는 방법과 URI 설계 개념 (컬렉션/스토어, 컨트롤 URI) (1) | 2025.03.03 |
| [HTTP] 무상태 프로토콜, HTTP 메시지 구조, HTTP 메서드에 대하여 ! (0) | 2025.03.03 |