epoll 서버 예제

이 것을 보여 주듯이, epoll의 성능 이점은 10개의 설명자만으로도 영향을 미칠 만큼 충분히 괜찮습니다. 설명자 수가 증가함에 따라 일반 poll() 또는 select()를 사용하면 epoll()에 비해 매우 매력적이지 않은 옵션이 됩니다. [ 표준 유닉스 API의 유서 깊은 부분] 선택 시스템 호출은 휴대용(POSIX)이다. 단일 스레드가 불필요하게 폴링 루프에서 회전하지 않고 변경에 대한 파일 설명자 [4]의 사소한 수를 “감시”할 수 있도록 – 이전 섹션의 끝으로 설명 된 문제에 대해 정확하게 설계되었습니다. 나는이 게시물에서 선택을위한 포괄적 인 자습서를 포함 할 계획이 없습니다 – 많은 웹 사이트와 책 장이 있습니다 – 그러나 나는 우리가 해결하려고하는 문제의 맥락에서 API를 설명하고 상당히 완전한 예를 제시 할 것입니다. 대답은 : 그것은 당신의 관점에 따라 달라집니다. 동기는 종종 차단의 동의어로 사용되며, 선택하는 호출은 실제로 차단입니다. 1부와 2부에서 제공되는 순차 및 스레드 서버에서 보내고 recv에 대한 호출도 마찬가지입니다. 따라서 선택이 동기 API라고 말하는 것이 공평합니다. 그러나 select를 사용하여 나타나는 서버 디자인은 실제로 비동기적이거나 콜백 기반 또는 이벤트 기반입니다. 이 게시물에 표시되는 on_peer_* 함수는 콜백입니다. 네트워크 이벤트로 인해 차단해서는 안 되며 호출됩니다. 부분 데이터를 얻을 수 있으며 호출 사이에 일관된 상태를 유지해야 합니다.

먼저 epoll 인스턴스를 만들고 닫는 과정을 살펴보겠습니다. 먼저 epoll_ctl호출로 대엽을 구성합니다. 이 경우, 구성은 우리를 위해 보고 있는 설명자 epoll에 청취 소켓을 추가하는 양이다. 그런 다음 수정을 위해 epoll에 전달할 준비 된 이벤트의 버퍼를 할당합니다. 메인 루프에서 epoll_wait에 대한 호출은 마법이 있는 곳입니다. 감시된 설명자 중 하나가 준비될 때까지(또는 시간 시간이 만료될 때까지) 차단하고 준비된 설명자 수를 반환합니다. 그러나 이번에는 모든 시청된 집합을 맹목적으로 반복하는 대신 epoll_write가 0에서 nready-1까지 준비된 이벤트로 전달된 이벤트 버퍼를 채웠다는 것을 알고 있으므로 엄격하게 필요한 횟수만 반복합니다. tcp 서버를 구현하는 일반적인 방법은 “연결당 하나의 스레드/프로세스”입니다. 그러나 높은 부하에서이 방법은 그렇게 효율적이지 않을 수 있으며 다른 연결 처리 패턴을 사용해야합니다. 이 문서에서는 Linux 2.6의 epoll() 시스템 호출을 사용하여 처리하는 동기 연결로 tcp-server를 구현하는 방법을 설명합니다. 커널. 여기에 몇 가지 새로운 변수를 추가하여 내가 하고있는 일을 지원하고 노출했습니다.

또한 그들 중 하나가 `중지`라고 할 때까지 감시되는 파일 설명자에서 계속 읽는 while 루프를 추가했습니다. epoll_wait()를 사용하여 epoll 인스턴스에서 이벤트가 발생할 때까지 기다렸다가 결과는 30초의 시간 으로 MAX_EVENTS까지 이벤트 배열에 저장됩니다. epoll_wait()의 반환 값은 이벤트 배열의 멤버 수를 이벤트 데이터로 채웠음을 나타냅니다. 그 외에도 그냥 가지고있는 것을 인쇄하고 일을 닫기 위해 몇 가지 기본 논리를하고 있습니다! 지금, 그냥 로컬 호스트에 포트 9999에 텔넷을 통해 연결. 클라이언트에서 제출된 텍스트가 서버의 화면에 인쇄됩니다: 전체 예제에서는 select를 사용하는 동시 서버에서 프로토콜을 다시 구현했습니다. 전체 코드는 여기; 다음은 설명과 함께 코드의 몇 가지 하이라이트입니다. 경고: 이 코드 샘플은 상당히 실질적이기 때문에 시간이 부족하다면 첫 번째 읽기에서 건너 뛸 수 있습니다. 파일 설명자 크기부터 살펴보겠습니다. FD_SETSIZE는 현대 시스템에서 일반적으로 1024와 동일한 컴파일 타임 상수입니다.