epoll_wait 예제

예시적인 예제를 통해 에지 트리거 알림이 epoll에서 작동하는 방식을 더 잘 이해할 수 있습니다. 프로세스에서 epoll 인스턴스에 4개의 설명자를 등록한 이전에 사용한 예제를 사용해 보겠습니다. fd3가 소켓이라고 가정해 봅시다. 2.6.37 이전의 커널에서 약 LONG_MAX/HZ 밀리초보다 큰 시간 초과 값은 -1(즉, 무한대)으로 처리됩니다. 따라서 예를 들어 sizeof(long)가 4이고 커널 HZ 값이 1000인 시스템에서는 35.79분을 초과하는 시간 초과가 무한대로 처리됩니다. 다음으로 해야 할 일은 어떤 파일 설명자가 시청해야 하는지, 어떤 종류의 이벤트를 시청해야 하는지 에폴링에게 말하는 것입니다. 이 예제에서는 리눅스에서 내가 가장 좋아하는 파일 설명자 중 하나를 사용합니다, 좋은 ol`파일 설명자 0 (표준 입력이라고도 함). epoll은 기본 파일 설명을 모니터링하므로 열려 있는 파일 설명이 I/O에 대해 준비될 때마다 epoll_wait를 호출하는 프로세스를 기다리지 않고 준비 목록에 추가합니다. 프로세스가 epoll_wait를 호출하면 해당 시점에 커널은 호출에 응답하기 위해 추가 작업을 수행할 필요가 없지만 대신 유지 관리된 준비 목록에 대한 모든 정보를 반환합니다. epoll을 사용하면 epoll_ctl 호출을 사용하여 epoll 인스턴스의 관심 목록에 파일 설명기를 추가한 다음 epoll_waitin을 미래에 호출할 때 이후에 준비 정보를 찾으려는 파일 설명기를 전달할 필요가 없습니다.

커널은 다시 I/O에 사용할 수 있는 설명자에 대한 정보만 반환하며, 커널이 전달된 모든 설명자에 대한 정보를 반환하는 선택/폴링 모델과는 대조적입니다. 그런 다음 example.com 대한 2 개의 DNS 쿼리를 만듭니다 (왜 2? nelhage sugests 중 하나는 A 레코드에 대해 쿼리하고 AAAA 레코드에 대해 쿼리합니다!), epoll_wait를 사용하여 응답을 기다립니다 시스템 호출의 epoll 그룹 (epoll_create, epoll_ctl, epoll_wait)은 Linux에 제공합니다. epoll_wait 시스템 호출을 호출하여 epoll 인스턴스의 epoll 집합/관심 집합에서 발생한 이벤트에 대해 스레드가 알림을 받을 수 있는지 여부에 대한 업데이트를 추적하고 요청하는 파일 설명자 목록을 커널링합니다. I/O에 대한 준비가 됩니다. 기본적으로 epoll은 레벨 트리거 알림을 제공합니다. epoll_wait에 대한 모든 호출은 준비된 관심 목록에 속한 파일 설명자의 하위 집합만 반환합니다. 따라서 4개의 파일 설명자(fd1, fd2, fd3 및 fd4)가 등록되어 있고 epoll_wait를 호출할 때 두 개의 파일(fd2 및 fd3)만 준비된 경우 이 두 설명자에 대한 정보만 반환됩니다. 포크 후, 프로세스 A가 epoll_ctl을 통해 해당 전자 조사 관심 목록에 새 설명자 fd8 (프로세스 B에서 중복되지 않음)을 만드는 경우 epoll_wait() 호출 할 때 fd8의 이벤트에 대한 알림을 받는 프로세스 A가 아닙니다. 리눅스에서 설문 조사를 사용하는 프로그램! epoll 인스턴스와 연결된 파일 설명자는 close() 시스템 호출을 사용하여 해제해야 합니다. 예를 들어 EPOLL_CLOEXEC 플래그가 없는 포크가 자식 프로세스의 epoll 인스턴스에 설명기를 복제하기 때문에 여러 프로세스가 동일한 epoll 인스턴스에 설명기를 보유할 수 있습니다. 이러한 모든 프로세스가 epoll 인스턴스에 대한 설명기를 포기하면(close() 호출하거나 종료하여 커널은 epoll 인스턴스를 파괴합니다. 때로는 준비 여부에 관계없이 관심 목록에 있는 설명자(예: fd1)의 상태를 찾으려고 할 수 있습니다.

epoll을 사용하면 에지 트리거 알림을 지원하여 특정 파일 설명자(epoll_wait 호출 시 준비가 되지 않은 경우에도)에서 I/O가 가능한지 여부를 확인할 수 있습니다.

This entry was posted in Geen categorie. Bookmark the permalink.

Comments are closed.