C++ 개념 정리

23. IOCP

CE : 하랑 2026. 1. 31. 17:47

 IOCP -> 쓰레드 로드 -> 쓰레드 풀 만들어서 구현 공부는 해놓기

(1)  쓰레드가 현재 실행중인지 아닌지를 알수 있는 함수는 존재하지 않아.

-> 하지만 쓰레드를 관리해주는 시스템을 window가 제공하는데 이를 iocp라고 합니다.

 

(2) Iocp의 의미는  I/O completion port 로서 Input Output을 의미한다.

(3) Window입장에서는 파일입출력 == 서버통신은 동일한 개념에 가깝게 본다.

(4) 컴퓨터및 주변장치(하드)에 데이터를 전송하는 것을 말해요.

(5) 하드에 있는 파일에 데이터를 전송해서 파일의 크기를 늘리거나 줄이거나 쓰거나 데이터를 가져오거나 할수 있다.

(6) Input output 다른 컴퓨터에서 날아온 데이터를 쓰거나 읽거나 늘이거나 줄이거나 하는걸 서버 통신이라고 합니다.

(7) IOCP의 역할
- 각각 입출력 데이터를 처리하는 일들이 어느쪽이 여유가 있는지 확인해주고 몰려드는 데이터의 버퍼역할도 수행

 

(8) 작동 원리 -> CS 지식도 필요 -> 구현 해보기

IOCompletionQueue

FIFO Queue.입출력이 완료된 작업들이 들어간다. thread들은 이 queue에서 작업을 꺼내서 수행한다.

 

WaitingThreadQueue

LIFO Queue.(왜 이름이 queue지) 작업 대기중인 thread들이 들어있다. 만약 IO가 완료되었다면 이 queue에서 thread를 하나 꺼내서 사용한다.

 

ReleaseThreadList

현재 작업을 수행하고 있는 thread들이 들어간다. 

만약 실행중인 thread가 정지해야 한다면 해당 thread를 PauseThreadList로 보내고 WaitingThreadQueue에서 새로운 thread를 하나 꺼내와서 사용한다. 이 때문에 프로세서의 수보다 많은 thread를 미리 만들어 놓는 것.

 

PauseThreadList

어떤 원인(임계 구역 등)으로 인해 일시정지된 thread들이 들어간다. 

만약 일시정지가 풀리더라도 ReleaseThreadList가 꽉 차있다면 바로 ReleaseThreadList로 보내지 않고 대기한다.

 

(9) 쓰레드가 일을 하기 위해서 뭔가 준비를 하는 작업을 컨텍스트 스위칭이라고 합니다
- 컨텍스트 스위칭이 일어나지 않은 쓰레드를 busy쓰레드라고 합니다.
 
(10) 쓰레드가 자신이 붙잡고 있던 쓰레드를 놓게 되면 당연히 캐쉬에서 메모리도 비우고 그 cpu를 다른 쓰레드와 일할수 있는 상태로 만들어 놓을거에요.

 

(11) IOCP 사용 이유 (라운드 로빈과 같은 효과 기대-> 균등한 일 분배)

- 효율적으로 사용해 적은 수의 스레드 사용으로 CPU점유율도 낮으며, Context switching 비용도 적다

- 윈도우 OS가 직접 스레드 풀링을 관리하기 때문

- 동시에 수행되는 스레드의 상한을 설정해서 CPU의 자원을 최대한 효율적으로 사용하게 하는 것입니다.

 

(12) window 기반 플랫폼에서만 사용이 가능하다.

 

'C++ 개념 정리' 카테고리의 다른 글

34. C++ 곱셈 연산 나눗셈 연산 차이  (0) 2026.02.08
24. 정수  (0) 2026.02.01
22. Thread  (0) 2026.01.31
21. class  (0) 2026.01.31
20. Serializer(직렬화)  (0) 2026.01.31