개발자공부일기
IOCP 본문
IOCP (Input/Output Completion Port) 상세 설명
IOCP(Input/Output Completion Port)는 논 블로킹 프로세스로 Windows 환경에서 비동기 I/O 작업을 효율적으로 관리하기 위해 제공되는 고성능 I/O 관리 기법입니다. 비동기 프로세스와 최소한의 스레드로 최대한의 성능을 끌어내는 것이 주요 목표입니다. 이를 위한 스레드 풀링이나 비동기 처리등을 운영체제에서 관리해주기 때문에 사용자는 IOCP를 이용해서 쉽고 빠르게 고성능의 입출력 처리가 가능해집니다.이는 네트워크 서버, 데이터베이스 서버, 파일 서버 등 높은 동시성을 요구하는 애플리케이션에서 널리 사용됩니다.
논블로킹 프로세스란?
설명 보기/숨기기
다른 작업이 완료되기를 기다리지 않고, 즉시 다음 작업을 수행할 수 있는 프로세스 내용 추가 예정1. IOCP의 핵심 개념
IOCP는 비동기적으로 수행된 I/O 작업의 완료 상태를 관리하기 위한 완료 포트(Completion Port)를 중심으로 설계된 모델입니다. 이를 통해 서버 애플리케이션은 클라이언트의 연결 수와 상관없이 효율적으로 작업을 수행할 수 있습니다.
주요 특징
- 비동기 처리: IOCP는 I/O 작업 요청과 완료를 비동기적으로 처리하여 작업 대기 시간을 최소화합니다.
- 스레드 풀 관리: IOCP는 스레드 풀을 통해 CPU 사용률과 작업 부하를 최적화합니다.
- 작업 큐: 완료된 작업을 큐(queue)에 저장하여 순차적으로 처리할 수 있습니다.
I/O란 무엇인가?
설명 보기/숨기기
I/O(Input/Output)는 컴퓨터 시스템에서 데이터를 입력하고 출력하는 작업을 의미합니다. 입력은 키보드, 마우스, 네트워크로부터 데이터를 받아들이는 작업이고, 출력은 화면 표시, 파일 저장, 네트워크 전송 등을 포함합니다. IOCP에서 I/O 작업은 네트워크 소켓이나 파일 핸들에 대한 데이터 송수신 요청을 포함하며, 이러한 작업은 비동기적으로 처리됩니다.2. IOCP의 구성 요소
2.1 Completion Port
- 완료 포트는 I/O 작업이 완료되었을 때 작업 결과를 애플리케이션에 전달하기 위한 큐입니다.
- 애플리케이션은 GetQueuedCompletionStatus API를 통해 작업 완료 상태를 비동기적으로 확인합니다.
2.2 Overlapped I/O
- IOCP는 비동기 I/O 작업을 처리하기 위해 Overlapped 구조체를 사용합니다.
- Overlapped 구조체는 다음과 같은 필드를 포함합니다: 이 구조체를 통해 작업의 상태와 데이터를 관리하며, I/O 작업 요청 시 운영 체제에 전달됩니다.
typedef struct _OVERLAPPED {
ULONG_PTR Internal; // 작업의 상태를 나타내는 내부용 필드
ULONG_PTR InternalHigh; // 전송된 바이트 수 또는 작업의 추가 상태 정보
union {
struct {
DWORD Offset; // 읽기/쓰기 작업의 시작 위치 (하위 32비트)
DWORD OffsetHigh; // 읽기/쓰기 작업의 시작 위치 (상위 32비트)
};
PVOID Pointer; // 대체 사용을 위한 포인터
};
HANDLE hEvent; // 비동기 작업 완료를 신호로 알려주는 이벤트 핸들
} OVERLAPPED, *LPOVERLAPPED;
2.3 Worker Threads
- IOCP는 스레드 풀을 통해 작업을 병렬로 처리합니다.
- Worker Thread는 IOCP에서 작업 완료 알림을 받아 후속 처리를 수행하는 스레드입니다.
Worker Thread의 활성화 조건
1. 완료된 작업이 큐에 추가될 때
- I/O 작업이 완료되어 IOCP의 큐에 작업 완료 통지가 들어오면, 대기 중이던 Worker Thread가 활성화됩니다.
- 예를 들어:
- 클라이언트가 데이터를 보내거나 받는 작업이 완료된 경우.
- 파일 읽기/쓰기 작업이 완료된 경우.
2. 큐에 작업이 대기 중일 때
- Worker Thread는 기본적으로 GetQueuedCompletionStatus 함수 호출을 통해 큐에서 작업을 기다립니다.
- 큐에 처리할 작업이 없는 경우 Worker Thread는 대기 상태로 전환됩니다.
- 작업이 큐에 추가되면 즉시 활성화되어 이를 처리합니다.
3. 멀티플 I/O 작업이 동시에 완료되었을 때
- 여러 I/O 작업이 거의 동시에 완료되었다면, Worker Thread 풀에서 필요한 만큼의 스레드가 활성화됩니다.
- 하지만 IOCP는 과도한 스레드 활성화를 방지하기 위해 스레드 풀의 크기를 제한하고, CPU 사용률에 따라 활성화되는 스레드 수를 동적으로 조정합니다.
4. CPU가 놀고 있는 경우
- Worker Thread는 CPU 리소스를 최대한 활용하도록 설계되었습니다.
- CPU가 다른 작업으로 바쁘지 않고, 큐에 처리할 작업이 있다면 추가 Worker Thread를 활성화합니다.
2.4 스레드 풀
- 스레드 풀은 운영 체제가 관리하는 스레드의 모음으로, IOCP는 이를 사용하여 CPU 리소스를 효율적으로 활용합니다.
- 필요 이상으로 많은 스레드를 생성하지 않음으로써 과도한 컨텍스트 전환을 방지합니다.
2.5 Client Handles
- 소켓, 파일 핸들 등의 I/O 리소스가 Completion Port에 연결됩니다.
- 이를 통해 특정 리소스의 작업 완료 알림이 완료 포트로 전달됩니다.
3. IOCP의 작동 과정
3.1 Completion Port 생성
- 서버는 CreateIoCompletionPort API를 호출하여 IOCP 객체를 생성합니다.
- 생성된 포트는 작업 완료 정보를 전달받는 큐 역할을 합니다.
3.2 핸들 등록
- 소켓이나 파일 핸들을 IOCP에 연결하여 해당 리소스의 작업 완료 알림을 IOCP에서 관리하도록 설정합니다.
3.3 비동기 작업 요청
- 서버는 ReadFile이나 WSARecv와 같은 비동기 I/O API를 호출하여 작업을 요청합니다.
- 요청 시 Overlapped 구조체를 통해 작업 세부 정보를 설정합니다.
3.4 작업 완료 및 알림
- 작업이 완료되면 운영 체제는 IOCP에 작업 완료 정보를 전달합니다.
- 완료된 작업은 IOCP의 큐에 저장됩니다.
3.5 Worker Thread 처리
- Worker Thread는 GetQueuedCompletionStatus를 호출하여 큐에 있는 작업을 대기합니다.
- 작업을 받으면 후속 처리를 수행하고, 완료되면 다음 작업을 대기합니다.
4. IOCP의 장점
- IOCP는 CPU 코어와 스레드 자원을 최적화하여 대규모 I/O 작업을 효율적으로 처리합니다.
- Worker Thread는 필요한 경우에만 활성화되므로, 불필요한 리소스 소비를 방지합니다.
- IOCP는 소켓, 파일, 파이프 등 다양한 I/O 리소스와 함께 사용할 수 있습니다.
- 다수의 클라이언트 연결을 처리하는 서버 애플리케이션에서 뛰어난 확장성을 제공합니다.
5. IOCP의 단점
- IOCP는 초기 설정 및 작업 처리 과정이 복잡하여 구현과 디버깅이 어렵습니다.
- IOCP는 Windows 운영 체제에서만 사용할 수 있습니다.
- 스레드 풀 크기를 적절히 설정하지 않으면 성능 저하를 초래할 수 있습니다.
6. IOCP의 활용 사례
- 웹 서버, 채팅 서버, 게임 서버 등 다수의 클라이언트를 처리해야 하는 애플리케이션에서 IOCP가 자주 사용됩니다.
- 대량의 데이터 입출력을 처리하는 데이터베이스 서버에서 IOCP는 I/O 작업 속도를 크게 향상시킬 수 있습니다.
7. 파일 서버
- 파일 읽기/쓰기 작업을 비동기적으로 처리하여 처리량을 극대화합니다.
'TIL(Today I Learned)' 카테고리의 다른 글
운영체제 (Operating System)란? (0) | 2024.12.24 |
---|---|
인덱스 (0) | 2024.12.20 |
OSI전송 계층 (0) | 2024.12.18 |
OSI 네트워크 계층 (0) | 2024.12.17 |
라우터와 라우팅 (0) | 2024.12.13 |