epoll
: 소켓이 I/O 가능 상태가 되면 이를 감지해서 사용자에게 알림을 해주는 역할을 한다
어떤 소켓이 I/O 가능 상태인지 알려준다
논블록 소켓을 대량으로 갖고 있을 때 효율적으로 처리해 주는 API이다.
레벨 트리거
: 소켓이 I/O 가능하다를 의미한다
에지 트리거
: 소켓이 I/O 가능이 아니었는데, 이제 I/O 가능이 되었다를 의미한다
에지 트리거를 사용할 때
I/O 호출을 한 번만 하지 말고 would block이 발생할 때까지 반복해야 한다
소켓은 논블록으로 미리 설정되어 있어야 한다
IOCP(I/O Completion Port)
: 소켓의 Overlapped I/O가 완료되면 이를 감지해서 사용자에게 알려주는 역할을 한다
epoll과 IOCP의 차이점
epoll은 I/O 가능인 것을 알려 주지만, IOCP는 I/O 완료인 것을 알려 준다
어떤 소켓에 대해 Overlapped I/O를 하지 않는 이상 그 소켓에 대한 완료 신호는 전혀 발생하지 않는다
->소켓 하나에 대한 완료 신호를 스레드 하나만 처리할 수 있게 보장된다
IOCP 하나를 여러 스레드가 기다리도록 구현하기가 쉽다
많은 소켓에 대한 I/O 처리를 동시다발적으로 수행할 때, 여러 스레드가 완료 신호 처리를 골고루 나누어서 처리할 수 있다
IOCP epoll
블로킹을 없애는 수단 Overlapped I/O 논블록 소켓
블로킹 없는 처리 순서 1. Overlapped I/O를 건다 1. I/O 이벤트를 꺼낸다
2. 완료 신호를 꺼낸다 2. 꺼낸 이벤트에 대응하는 소켓에 대한
3. 완료 신호에 대한 나머지 처리를 논블록 I/O를 실행한다
한다
4. 끝나고 나서 다시 Overlapped I/O
를 건다
지원 플랫폼 윈도에서만 사용 가능 리눅스, 안드로이드에서 사용 가능
epoll을 쓰는 리눅스에서는 TCP 소켓으로 수신을 한 후에 데이터 수신을 하려면 소켓 수신 함수(recv)를 이어서 호출해 주어야 한다
IOCP를 쓰는 윈도 서버에서는 연결 받기와 수신을 소켓 함수 호출 한 번으로 끝낼 수 있다
'프로그래밍 > 서버' 카테고리의 다른 글
분산 서버 구조 1 (0) | 2019.10.04 |
---|---|
게임 서버와 클라이언트 (0) | 2019.09.30 |
소켓 프로그래밍 2 (0) | 2019.09.25 |
소켓 프로그래밍 1 (0) | 2019.09.23 |
컴퓨터 네트워크 2 (0) | 2019.09.20 |