Programming - cpueblo.com

[강좌] 초급 IOCP


글쓴이 : 유광희 날짜 : 2002-12-17 (화) 19:48 조회 : 10284

안녕하세요~!


첫번째 자료를 올리고서 시간이 무지하게 많이 지났네요~ ^^

이래서 게으르면...ㅡ.,ㅡ......

이번에는 Windows 2000 Server 기반에서의 IOCP 사용에 대해서 정리를 해봅니다.

IOCP를 어떤 플랫폼 기반에서 설명을 한다~ 라는 뜻이 아니라,

IOCP의 기본적인...(제가 아는^^a) 내용을 정리하고 Win2000 Server에서 제공하는

API로 구현을 해본다는 의미입니다~ ^o^/

Pattern 관련 서적 중....(아....제목이 @.@) 을 보면 IOCP에 대해서 기술하였는데,

제게 책이 없는 관계로 그 부분은 정리하지 못하겠네요..ㅠㅜ

어쨌든, 서두절미하구~ 시작해볼까요?











1. About IOCP


IOCP는 Input/Output Completion Port의 약자입니다. 단어 그대로 '입출력 완료 포트'라고도 하지요.

즉, 입/출력에 대한 작업을 대신해서 관리하고 완료 결과를 통보하는 기법입니다. 예를 들어, File

Handle을 IOCP에 걸어놓고 Read를 걸어놓으면 IOCP는 '해당 Handle에서 n Bytes 작업이 완료됨'을

보고합니다. 물론 Asynchronous로 작동하게 되지요. 그렇다고 모든 I/O Handle이 적용되는 것은 아닙니다.

해당 I/O Handle이 비동기 작업이 가능해야한다는 조건이 붙기 때문이죠. MSDN 문서에서는 이렇게

적어놓았네요.




Handle to a file opened for overlapped I/O completion.

You must specify the FILE_FLAG_OVERLAPPED flag when using the CreateFile function to obtain the handle.




Handle이 Asynchronous I/O 작업을 갖고있어야 한다는 것이죠~!

조금 자세히 설명을 해보겠습니다.

Completion Port(이하 CP)를 하나 생성합니다. 그리고 비동기 I/O Handle을 CP에 등록합니다. 그리고,

CP의 반응을 검사하는 Thread를 생성해서 감시하게 합니다. 여기서 CP의 완료 보고를 받게 되는 것이죠.

Thread에서 완료 보고를 받게 되면 그에 해당하는 작업을 수행합니다.

여기까지가 IOCP의 전반적인 작업이랍니다~



2. Worker Thread


IOCP가 어떤 방식으로 동작하는지는 나중에 알아보기로 하구요. 일단, 전반적인 흐름을 그려야 겠죠?

위에서 CP로부터 완료를 보고받고 처리하는 Thread가 있어야 한다고 했습니다. 바로 그 Thread를 보통

Worker Thread라 부르죠. 작업을 하는 Thread라는 의미입니다.





Figure 2.1 Running worker thread


위의 그림에서 Object는 Handle에 대해서 실제적인 작업을 하는 객체를 의미합니다. CP에 Handle을 등록할때

Completion Key라는 값을 하나 더 두게 되는데, 여기서 Key 값으로 실제 작업할 객체넣게되면 WorkerThread에서 해당

Object를 찾아 dispatch할 수 있죠. 여기서 Worker Thread는 dispatch하는 과정 동안 Blocking이 됩니다. 즉, 다음

IOCP가 아무리 빠르게 동작하더라도 처리하는 시간이 Worker thread에 의존하게 되는 것이죠. 처리 속도를 높이기 위해

서 Worker thread를 좀 더 늘리게 된다면 dispatch되는 시간을 커버할 수 있습니다.(여기에 대한 내용은 아래에서 다룹니다.)

'그럼 Worker thread를 충분히 많이 돌리면 되지 않겠느냐?'할 수도 있습니다. 여기서 주의할 점은 '충분히'라는 말이

되겠네요. Thread가 아무리 많이 돌고 있다고 해도 실제적으로 CPU 1개에서는 그 순간에 1개의 작업만을 처리합니다.

O/S에서는 CPU의 처리 시간을 분배하여 여러 Thread가 순차적으로 동작하게끔 하는데요.



Thread1 -> Thread2 -> Thread3 -> Thread1 -> Thread2 -> Thread3 ...


처럼 말이죠. 여기에서 하나의 작업을 마치고 다른 Thread를 돌리기 전에 현재의 정보를 stack에 저장합니다. 그리고

다음에 동작할 Thread의 정보를 읽어오는데, 이 부분을 Context switching이라고 합니다. Thread의 수가 많아지면 O/S에서

처리해야하는 Context switching 작업도 증가하겠죠. Thread가 너무 많아지면 Context switching 작업에 빼앗기는 시간이

비례하여 증가하기 때문에, 어느 정도를 넘어서면 오히려 성능이 저하되게 됩니다. 그래서 무조건 많은 Thread가 좋은게

아닌 것이죠~





Figure 2.2 Running multi-worker thread

예전에 얼핏 Worker thread의 적정 수 = CPU * 2 or CPU * 4 라는 말을 보았는데요. 아마 이런 이유에서 나온 공식일 거라

생각합니다. 하지만, 각 작업의 특성에 맞게 조절을 해야하므로 그리 신경쓰지 않아도 되는 부분이니 착오 없으시길 바랍니다.




3. Using IOCP in Windows 2000 server


1) Create IOCP



HANDLE CreateIoCompletionPort (HANDLE FileHandle, HANDLE ExistingCompletionPort, DWORD CompletionKey, DWORD NumberOfConcurrentThreads);




Parameters


FileHandle


Overlapped I/O 로 열려진 File Handle. CreateFile 등의 함수를 사용할 때 FILE_FLAG_OVERLAPPED를 꼭 사용하야한다.


만일 File Handle이 INVALID_HANDLE_VALUE 라면, CreateIoCompletionPort는 file과 연관이 없는 I/O Completion port를 생성한다. 이 경우,


ExistingCompletionPort 인자는 꼭 NULL 값이어야 하며 CompletionKey 인자는 무시된다.



ExistingCompletionPort


I/O completion port의 Handle이다. 만일 여기 인자 값이 존재하는 completion port라면, 이 함수는 FileHandle 인자와 연관된 file과 연관을 짓게 된다.


이 함수는 이미 존재하는 completion port의 Handle값을 반환하며, I/O completion port를 새로 생성하지 않는다.



만일 여기 인자 값이 NULL 이라면, 함수는 새로운 I/O completion port를 생성하고, FileHandle에 입력된 Handle값의 file과 연관을 갖게된다. 이 때


함수는 새로 생성된 I/O completion port의 Handle값을 반환한다.



CompletionKey


<역주: 이 값은 IOCP가 FileHandle에 대한 작업 완료를 보고할 때 쓰이는 값으로, 프로그래머가 임의로 사용하는 값이다.>



NumberOfConcurrentThreads


동시에 실행하는 Thread의 허용 수치이다.


만약 하나의 Thread가 대기 상태로 들어갔다면, 다른 하나의 Thread에 작업 진행을 허용한다.



NumberOfConcurrentThreads


동시에 실행되는 Thread의 허용 수치이다.


만일 하나의 Thread가 대기 상태에 들어갔다면, 다른 1개의 Thread에게 진행이 허용된다. 활성화된 Thread의 수가 증가할때 작업 시간은(작업중인 Thread의) 짧아질 것이다. 하지만


O/S는 곧 수치를 줄인다.



이 인자의 값이 0이 된다면, System은 Processor의 수만큼 많은 Thread를 할당할 수 있다.







헥헥....^^ 언제나 생각하는데, 역시 번역은 어렵네요..ㅎㅎ 비록 내용은 짧지만, 겨우 쓴거랍니다..ㅠㅠ

회사일이 좀 여유로워지면 좋겠네요. 내용이 여기서 끝난게 아니랍니다~ 계속해서 올릴거구요.

IOCP를 처음 사용하시는 분들에게 조금이나마 도움이 되었으면 합니다.

Downloads

  • WorkerThread.bmp
  • WorkerThread2.bmp

  •