[운영체제] 커널 내부에서 IOCP가 어떻게 동작하는가?

728x90

 

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️⃣ 처리 완료 후 다시 대기 (재사용됨)                            │
└──────────────────────────────────────────────────────────────┘

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90