overlapped io / iocp

22
Information & Database Systems Laboratory Overlapped I/O 와 IOCP IT융합응용공학과 조현철

Upload: -

Post on 18-Dec-2014

762 views

Category:

Software


7 download

DESCRIPTION

Information Database System Lab Seminar in Pukyong National University

TRANSCRIPT

Page 1: Overlapped io / IOCP

Information & Database Systems Laboratory

Overlapped I/O 와 IOCP

IT융합응용공학과 조현철

Page 2: Overlapped io / IOCP

보통 게임을 만드려면…

Page 3: Overlapped io / IOCP

보통 게임을 만드려면…

전통적인 소켓 입출력 방식으론 가능할 것

같지 않은데?

Page 4: Overlapped io / IOCP

Read/Write Read/Write (O_NONBLOCK)

I/O Multiplexing (select/poll) AIO

Synchronous

Asynchronous

Blocking Non-Blocking

Socket I/O Model의 종류

Page 5: Overlapped io / IOCP

Typical flow of the synchronous blocking I/O model

이 모델로는 하나의 쓰레드에서 두 개 이상의 소켓을 다루기가 힘들다. 이 모델을 바꾸지 않고 두개 이상의 소켓을 처리하려면 "멀티 쓰레드" 기술을 함께 사용하는 수 밖에 없다.

1.read함수를 호출하면, 커널 모드로 요청이 가고 입력을 기다린다. 2.애플리케이션은 데이터 입력이 있기 까지 봉쇄된다. 3.데이터가 입력되면, 커널 모드에서 유저모드로 데이터가 복사된다.

Page 6: Overlapped io / IOCP

Typical flow of the synchronous non-blocking I/O model

1.read함수는 바로 반환한다. 데이터가 준비되지 않았다면, errno는 EAGAIN으로 설정된다.

2.이를 반복한다. 3.만약 데이터가 준비되어 있다면, 데이터를 읽는다.

데이터가 준비되기 전까지 바쁘게 순환해야 하는 busy wait 상태에 놓일 수 있다.

Page 7: Overlapped io / IOCP

Typical flow of the asynchronous blocking I/O model (select)

1. 동기 비 봉쇄 모델은 계속 read함수를 호출하기 때문에 busy wait 상태에 놓일 수 있다는 단점이 있다. 2. 비 동기 봉쇄 모델은 입출력 함수 호출전에 입출력 데이터가 있는지를 검사하는 함수(select 혹은 poll)를 미리 배치한다. 3. 입출력 데이터가 없을 때는 봉쇄된다. 4. 입출력 데이터가 있으면, 비로서 입출력 함수를 호출한다. 입출력 함수는 봉쇄 모드로 작동한다.

그래도 작업이 끝날때까지 다른일을 할 수 없다!

Page 8: Overlapped io / IOCP

Typical flow of the asynchronous non-blocking I/O model

1.aio_read함수를 호출한다. 2.다른 일을 한다. 3.읽을 데이터가 발생하면, 콜백 함수 혹은 시그널 핸들러로 데이터를 처리한다.

Page 9: Overlapped io / IOCP

Overlapped I/O

입력 시작 입력 완료

중첩

시간 진행

Page 10: Overlapped io / IOCP

리눅스의 입출력 다중화나 리얼 타임 시그널등 비동기 입출력 기술들은 소켓으로 데이

터가 입력되는 시점에서 커널 데이터를 유저 데이터로 복사한다. 이말은 커널로 부터

데이터의 복사가 끝날 때까지 몇 번이나 입출력 함수를 호출 할 수도 있음을 의미한다.

이에 반해, 윈도의 Overlapped I/O모델은 데이터 입출력이 완료된 시점에서 이벤트

를 발생한다. 이로 인해 얻을 수 있는 이점은 다음과 같다.

1. 모드 변환이 발생하지 않는다. (여러번의 데이터 복사가 발생하지 않는다.)

2. 데이터 입출력이 진행되는 동안 다른 일도 할 수 있다.

Overlapped I/O와 리눅스 비동기 입출력과의 차이

Page 11: Overlapped io / IOCP

IOCP?

IOCP는 Input/Ouptput Completion Port의 약자. 입력과 출력의 완료를 담당할 포트를 지정해서 처리하겠다는 의미다. 입력과 출력의 완료시점에서의 통지는 overlapped(중첩 입출력)에서 처리가 되므로, 이 기술은 윈도의 중첩 입출력 기술을 확장시킨 것으로 볼 수 있다. !포트는 작업 혹은 서비스를 전담하기 위해서 만들어지는 객체다. 소켓의 포트가 특정 서비스로 데이터 입출력을 전달하기 위한 객체임을 상기하면 이해가 쉬울 것이다. 이러한 포트의 특징을 이해하면, 입출력 완료 시점에서 이에 대한 통지를 전담할 포트를 만들어서 데이터를 처리하는 방식도 충분히 생각해 볼 수 있을 것이다.

Page 12: Overlapped io / IOCP

IOCP가 하는 일

1. 재사용이 가능한 쓰레드 풀 유지

Thread Pool

풀 내에서 대기하는 쓰레드들

미리 쓰레드를 생성하여 만들둬서, 오버헤드를 줄인다.

Page 13: Overlapped io / IOCP

IOCP가 하는 일

2. CPU에 DISPATCH 되는 스레드를 조절

- 스레드가 많으면 Thread Context Switching의 오버

헤드가 커진다.

- IOCP에서 돌아가는 스레드의 수를 제한하여, 이런 상

황을 미연에 방지.

Page 14: Overlapped io / IOCP

IOCP의 생성 절차

1. 디바이스와 관련된 핸들을 연다.

2. IOCP 커널 객체를 생성한다.

SOCKET s;

3. 디바이스 핸들과 IOCP 커널 개체를

연결시키자.

HANDLE hIOCP = CreateIoCompletionPort (INVALID_HANDLE_VALUE, ..)

4. 완료 이벤트들을 받을 쓰레드들을 만들어

쓰레드 풀을 생성

5. 쓰레드에서 IO가 완료되기를 기다림

completionKey

IOCP Worker Threads

CreateThread()

IOCP Worker Threads

Waiting!!!

hDevice dwCompetionKeyDevice List

Page 15: Overlapped io / IOCP

IO Completion Queue

dwBytesTransferred dwCompletionKey pOverlapped dwError

I/O Completion Queue (FIFO)I/O가 완료되면 그 관련 정보를 저장하는 자료구조.

dwBytesTransferred : 얼마만큼 전송이 되었는지를 나타냄. 즉 IO가 이

루어진 바이트 수가 얼마인가를 말함.

dwCompletionKey : 어떤 소켓에서 완료가 되었는지 알 수 있음.

pOverlapped : Overlapped 구조체

dwError : 에러에 대한 내용

!PostQueuedCompletionStatus를 통해 어떤 레코드가 IOCP 큐에 들어

오면, IOCP Worker Thread 중 하나가 이 레코드를 큐에서 꺼내어 처리

한다.

Page 16: Overlapped io / IOCP

Waiting Thread Queue

- 아까 그림에서 봤던 Thread Pool이라고 보면 됨. - IOCP Worker Thread들이 생성되면 WTQ에 저장. - GetQueuedCompletionStatus 함수 : 큐에서 I/O Completion이 오

면 이 함수가 리턴되어 레코드의 정보가 함수의 인자로 나옴.

IOCP Worker Threads

… GetQueuedCompletionStatus()

서버 시작 시 생성

쓰레드들이 GQCS함수를 부르면서 차곡차곡 WTQ에 쌓인다.

Waiting Thread Queue

WTQ로 들어올 때 1) 쓰레드함수가 GQCS를 불렀을 때 2) GQCS 함수가 리턴되어 IO 완료

레코드를 처리하고 다시 GQCS를 불렀을 때

WTQ에서 나갈때 IO 완료 큐가 비어있지 않고 Release Thread List에 있는 쓰레드 수가 지정해준 Concurrent Thread 수를 넘지 않았을 때

(LIFO 구조)

Page 17: Overlapped io / IOCP

RTL / PTL

Released Thread List - 돌아가고 있는 쓰레드. 추가(생성) : 1) IOCP가 WTQ에서 쓰레드를 깨울 때 2) Paused Thread가 깨어날 때 제거 : 1) 쓰레드가 다시 GQCS 함수를 부를 때 2) 쓰레드가 스스로 Suspend 될 때 !Paused Thread List - 정지된 쓰레드. 추가(생성) : Released 쓰레드가 스스로 멈출 때 제거 : Suspend된 스레드가 깨어날 때

Page 18: Overlapped io / IOCP

WTQ - RTL - PTL 간의 쓰레드 흐름도

WTQ

IOCP 큐에 내용이 있고 Concurrent Thread 수를 넘어서지 않을 때 IOCP가 쓰레드를 깨우고 GQCS함수를 리턴

RTL PTL

쓰레드가 블러킹 함수를 불러서 스스로 Suspend 될 때 !ex) Sleep, WaitForSingleObject, WaitForMultipleObjects and etc

쓰레드가 GQCS함수에서 리턴된 레코드에 대한 모든 처리를 끝내고 다시 GQCS함

수를 부를 때

쓰레드가 이벤트를 처리하고 스스로 깨어났 을 때

Page 19: Overlapped io / IOCP

정리

Overlapped I/O – 1) 여러 입출력이 중첩되어 병렬적으로 처리한다. 2) 디바이스로 읽어온 데이터를 중간 버퍼에서 복사하는 과정 없이 직접

사용자 버퍼로 데이터를 들어오게 함으로써 버퍼링 오버헤드가 줄어든다.

!IOCP – 1) IOCP를 이용하면 작업 스레드(2~3개)가 작업이 주어질 경우에만 작동

하므로 스레드 전환 시간이 거의 없다. 2) 멀티스레드 보다 사용하는 스레드의 개수가 적기 때문에 메모리 자원

을 절약할 수 있다. 3) 많은 수의 클라이언트 접속시 메모리 풀을 이용하여 메모리 할당과 해

제를 하기 때문에 메모리 단편화가 발생하지 않는다.

Page 20: Overlapped io / IOCP

정리

Page 21: Overlapped io / IOCP

참고문헌

• Overlapped I/O 와 IOCP 이야기, 이기탁 • Network Programming for Microsoft Windows,

Anthony Jones • UNIX Network Programming, W. Richard Stevens • 온라인 게임 서버 프로그래밍, 한동훈 • 윤성우의 열혈 TCP/IP 소켓 프로그래밍, 윤성우

Page 22: Overlapped io / IOCP

Q&A?