더북(TheBook)

모든 소켓에 대한 select() 대신 epoll에서 이벤트를 꺼내 오는 함수를 호출합시다. 이 함수는 사용자가 원하는 시간까지만 블로킹되며, 그 전에 이벤트가 생기는 순간 즉시 리턴합니다. 출력 값에는 꺼내 온 이벤트들이 있습니다.

각 이벤트에 대해 루프를 돌며 이벤트가 가리키는 소켓 객체와 사용자 정의 값을 꺼내 옵니다.

그러고 나서 원하는 처리를 하면 됩니다.

이렇게 select()를 썼다면 모든 소켓에서 루프를 돌아야 합니다. 하지만 epoll을 쓰면 I/O 가능인 상태의 소켓에서만 루프를 돌면 됩니다. 이상적으로 보이지만 현실은 또 다릅니다. 현실에서는 소켓의 송신 버퍼가 빈 공간이 없는 순간을 유지하는 시간이 상대적으로 짧습니다. 거의 대부분은 송신 가능입니다.

이러한 특징 때문에 지금까지 설명한 방식으로 만들면 필요 이상의 루프를 돌아야 해서 불필요한 CPU 연산 낭비가 일어납니다. 이 문제를 해결하려면 레벨 트리거(level trigger) 대신 에지 트리거(edge trigger)를 써야 합니다.

레벨 트리거와 에지 트리거는 전자공학에서 나온 용어로 추정됩니다. 전기 회로에서 레벨(level)은 전압 자체가 있음을 의미하고, 에지(edge)는 전압의 변화가 있음을 의미합니다.

p177

▲ 그림 3-19 레벨 트리거와 에지 트리거

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.