티스토리 뷰
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로 보내지 않고 대기한다.
참고자료
- IOCP 기본 구조 이해 - 남현욱
- 뇌를 자극하는 TCP/IP
'Non-Programming > Computer' 카테고리의 다른 글
프로세스 스케줄링 방식의 종류 (0) | 2017.02.23 |
---|---|
오류 검출 코드 - 해밍코드(Hamming Code) (16) | 2017.02.19 |
OS : 가상 메모리(virtual memory) (0) | 2015.06.15 |
OS : 기억장치 관리(memory management) (0) | 2015.06.14 |
OS : 교착상태(dead lock) (0) | 2015.06.14 |
- Total
- Today
- Yesterday
- game
- SHADER
- ue4
- JSP
- Spring
- machine learing
- mongoDB
- SOCKET
- scala
- ios
- 드라마
- OS
- Java
- DesignPattern
- 자료구조
- C/C++
- SwiftUI
- C
- 데이터베이스
- 수학
- Git
- rxswift
- database
- C++
- 알고리즘
- swift
- 국내여행
- 운영체제
- Cocos2d-x
- winsock
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |