본문 바로가기

프로그래밍/서버

소켓 프로그래밍 3

epoll

 : 소켓이 I/O 가능 상태가 되면 이를 감지해서 사용자에게 알림을 해주는 역할을 한다

 어떤 소켓이 I/O 가능 상태인지 알려준다

논블록 소켓을 대량으로 갖고 있을 때 효율적으로 처리해 주는 API이다.

 

레벨 트리거

 : 소켓이 I/O 가능하다를 의미한다

 

에지 트리거

 : 소켓이 I/O 가능이 아니었는데, 이제 I/O 가능이 되었다를 의미한다

 

에지 트리거를 사용할 때

 I/O 호출을 한 번만 하지 말고 would block이 발생할 때까지 반복해야 한다

소켓은 논블록으로 미리 설정되어 있어야 한다

 

IOCP(I/O Completion Port)

 : 소켓의 Overlapped I/O가 완료되면 이를 감지해서 사용자에게 알려주는 역할을 한다

 

epollIOCP의 차이점

epollI/O 가능인 것을 알려 주지만, IOCPI/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