티스토리 뷰

socket 개발자들은 오랜시간 다수의 클라이언트의 요청을 효율적으로 처리하기 위한 방법들을 연구해왔다. 그 결과 수많은 해결책들이 개발되었고, 아직도 더 효율적인 방법을 찾으려 노력중인 부분이다.


다중 클라이언트 요청을 처리하는 해결책

    • 입출력 다중화
    • epoll
    • 리얼 타임 시그널
    • 멀티 스레드
    • 멀티 프로세스
    • IOCP

그 중 현재까지 가장 빠르고 효율적인 방법으로 사용되는 방법이 바로 IOCP(Input/Output Completion Port)다.

IOCP는 멀티 스레드와 같이 사용되는 방법으로 사용할 thread를 미리 만들어 놓고 socket에서의 input 또는 output이 완료(completion)되었을 때 잠들어있는 thread를 깨워서 처리하는 방식이다. 보통 가장 최적화 할 수 있는 thread의 수는 프로세서 수의 2배정도가 적당하다고 알려져있다.




IOCP가 어떤식으로 thread들을 관리하는지 알아보자.

IOCP는 thread를 관리하기 위해 1개의 thread 큐(queue)와 2개의 thread list, 1개의 작업 queue 를 사용하며 당연하게도 각 thread는 3개의 queue중 하나의 queue에만 존재할 수 있다.


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로 보내지 않고 대기한다.



참고자료


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함