소켓 프로그래밍 6 - IOCP(1)

프로그래밍 2022. 6. 26. 13:00

아주 오래전에 IOCP에 관해 자료를 찾고 구현을 해보았는데... 그당시에는 자료가 정말 없었습니다. 그런데 이번에 생각이 나서 다시 써보려구 검색을 해보니 꽤 자료가 많네요.

오늘도 역시 누구나 이해가 되도록 쉽게 설명 하는것이 목표입니다. 어려워 보이는 것들도 개념이 확실하게 잡히면 쉬워 지니까요. 그래도 어려운 것을 쉽게 풀어나가는 것은 정말 쉽지는 않네요.

 

IOCP 는 IO Completion Port입니다. Microsoft의 Windows에서 제공하는 기능입니다.

도대체 이건 뭘까요? 그리고 왜 소켓에서 많이 쓰는 걸까요?

 

HDD를 사용하면서

컴퓨터를 사용하면 Input/Output 동작이 가장 많이 발생하는 장치 중에 하나가 대표적으로 HDD일 것입니다.

HDD를 주로 사용하던 시절에는 IOCP가 매우 유용한 도구 였습니다. 물론 IOCP가 HDD만을 위한 도구가 아니지만 가장 설명하기 쉬운 예제이긴 합니다.

 

HDD와 File

IOCP에 대한 쉬운 설명을 위해 HDD에 대한 예를 들겠습니다.

아래 그림은 HDD를 의미하고 하나의 파일이 A, B, C, D 의  offset 순서로 기록되어 있다고 가정합니다.

HDD와 파일

HDD 상에서 일반적으로 하나의 File은 위 그림과 같이 여러 조각으로 나누어 집니다. 그리고 HDD가 플래터에 파일을 기록하기 위해서는 플래터가 끊임없이 돌아가고 Arm이 계속 움직이며 Head가 플래터에 기록을 합니다. 

 

예를 들어 위 그림처럼 하나의 파일이 A, B, C, D의 조각으로 나뉘어 있고 이 파일을 Arm과 Head가 움직이면서 기록한다고 생각해 봅시다.

일반적인 방법은 IO가 요청된 순서에 따라 파일의 0 offset 부터 파일의 끝까지 A -> B -> C -> D 순서로 기록됩니다.

 

그런데 위 그림에서 보면 A, B, D 가 일직선 상에 있기 때문에 ARM이 A->B 로 움직이기 전에 D에 쓸 수가 있으면 어떨까요.  즉, A -> D -> B 의 순서로 쓸수 있으면 A->B->C->D 의 순서로 쓸 때 보다 플래터의 회전도 적고 ARM도 한번만 움직일 수 있으니 훨씬 효율적일 것이고 시간도 단축 되겠죠. 이것을 하는 방법이 IO 관련 함수에 OVERLAPPED 방식으로 요청하는 것입니다.

 

일반적인 IO의 요청은 Application 자체에 의해 순서가 결정되기 때문에 위의 순서가 어쩔 수 없고 이것은 IOCP외의 다른 Asynchronous I/O도 마찬가지 입니다. 물론 IOCP도 Asynchronous I/O의 하나로 포함되죠..

 

요약하면 IOCP는

1. 이러한 IO작업들을 OS(kernel) 에게 위임하고 대신 IO에 대한 순서를 보장받지 못하는 것입니다.

2. OS가 IO작업을 처리해 주고 Application입장에선 IO가 끝났다는 상태 통보를 받아야 하는데 그 통로가 IO Completion Port 입니다.

3. IO의 상태 변화가 일어나면 IOCP를 통해서 내가 만들어 놓은 Worker Thread를 알아서 깨워주도록 되어 있습니다.

4. 그리고 IO 데이터의 순서가 보장되지 않으니 완료 통보를 받았을 때에, 요청한 IO 작업 중에 뭐가 완료 되었는지 알아야 합니다.

   그러기 위해서는 처음에 요청한 IO 작업에 대한 detail한 정보를 구조체에 넣어 두고 OS에게 작업을 맡기는 겁니다. IOCP 통지로 돌려 받은 구조체 정보를 확인해서 완료된 IO가 무엇인지 확인하는 것이지요.

 

 

위의 파일의 예와 같이 OS에게 IO작업에 대한 완료 통지를 위임하면 성능 향상에 도움이 되는 device가 여럿 있습니다. 그렇기 때문에 고성능이 필요한 부분에 IOCP를 사용하게 됩니다.

 

 

TO BE CONTINUED...

728x90
반응형

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

SSL 인증서  (0) 2023.03.07
인증서 - RootCA  (0) 2023.03.06
소켓 프로그래밍 5 - Sliding Window  (0) 2022.06.24
Network Byte Ordering  (0) 2022.06.23
소켓 프로그래밍 4 - Data Boundary  (0) 2022.06.23
admin