IOCP 정리

2015. 5. 14. 17:10프로그래밍/서버

728x90
728x90

IOCP

IOCP는 Overlapped I/O에 스레드 풀링(Thread pooling)과 큐(Queue)라는 매커니즘을 동시에 접목시킨 기술


Overlapped I/O와 차이는?

CreateCompletionPort() 함수를 통해 소캣과 컴플리션 키를 관리하는 디바이스 리스트 자료구조 사용, 디바이스 리스트는 컴플리션포트 객체에 등록된 디바이스를 관리한다.

IOCP 큐 자료구조 : Overlapped는 모델을 요청하면 작업이 완료되는 순간 이벤트나 콜백함수로 결과를 돌려줬다. IOCP는 커널이 프로그래머가 요청한 Overlapped 작업이 완료되었을 때 곧바로 사용자에게 알리는 것이 아니라 완료된 작업 결과를 IOCP 큐에 넣은 후 컴플리션 객체를 이용해 사용자에게 알린다. 커널 스레드 풀링을 통해 IOCP 큐에서 완료된 Overlapped IO 작업을 가져와 처리한다.


스레드 풀링

스레드를 생성하고 사용 후 이 스레드를 소멸시키지 않고 대기 상태로 바꾸어 다시 풀에 넣어준다. 사용 시점에는 생성할 필요 없이 다시 대기 상태인 큐를 활성화하는 기법이다.

스레드 풀링이 왜 좋나요?
스레드를 자주 생성하고 파괴하지 않기 때문에 할당된 CPU의 시간을 낭비하지 않고 다른 일을 할 수 있다.
실행중인 스레드에서 다른 스레드로 작업전환을 할 때는 컨텍스트 스위칭이 발생한다. CPU 소모가 많은 작업이기 때문에 성능이 떨어진다. 스레드 풀은 이 컨텍스트 스위칭을 피할 수 있어 성능 향상에 도움이 된다.

그림으로 배우는 IOCP


IOCP Queue

WatingThreadQueue(LIFO)

완료된 작업이 있을 때 까지 스레드가 대기 상태로 있는 곳

ReleaseThreadQueue

IOCP Queue에서 완료된 작업결과를 가져와 처리하기 위한 실행 상태 스레드가 있는 곳

PauseThread List

처리 도중 대기 작업에 의한 대기 상태로 바뀐 스레드가 있는 곳


짚고 넘어가야 할 세 가지

첫 번째
WaitingThreadQueue가 LIFO
컨텍스트 스위칭을 피하기 위한 기법이다.
예) 실행 상태 A 스레드가 처리를 마치고 큐에 있다가 새로운 요청이 왔을 때,
LIFO : A실행 -> A대기 -> A실행
FIFO : A실행 -> A대기 -> B실행 (컨텍스트 스위칭)

두 번째
커널은 실행 상태에 있는 스레드의 개수를 조절하고 있다. 스레드 최대 허용 개수를 정해두고 부족하면 대기 상태의 스레드를 깨운다.

세 번째
WaitingThreadQueue에 대기 중인 스레드가 충분히 있어야 한다. 실행 상태에 있는 스레드가 대기 요청을 받으면 PauseThread List에 들어가게 되는데 대기 시간이 길거나 알 수 없는 작업이 있다면 최악의 경우 실행 중인 스레드가 모두 대기함수를 호출해 실행 상태에 있는 스레드가 없는 상황이 생긴다. 스레드가 없으면 IO 뒤처리를 해주지 못한다.

구현 시 중요한 세 가지 함수
CreateIoCompletionPort()
CompletionPort 커널 객체를 생성
커널 객체와 소켓을 연결시키는 역할

GetQueuecompletionStatus()

CompletionPort 커널 객체를 이용하여 시스템 내부적으로 사용자에게 스레드 풀링 및 IOCP Queue를 지원한다.

PostQueuedCompletionStatus()
사용자가 직접 입력한 정보를 IOCP Queue에 추가할 수 있다. 일반적으로 IOCP 모델을 이용한 서버 프로그램을 종료 할 때 스레드를 깨워 정상 종료하기 위한 용도로 자주 쓰인다.


728x90
반응형

'프로그래밍 > 서버' 카테고리의 다른 글

동기화  (0) 2015.07.23
Thread  (0) 2015.07.23
Blocking vs Non-Blocking  (0) 2015.07.12
[서버] 데드 레커닝(Dead Reckoning)  (1) 2015.05.23
Overlapped I/O 모델  (0) 2015.05.17
TCP/IP 프로토콜 개요  (1) 2015.04.27
메모리 풀(Memory Pool)  (0) 2015.03.18