epoll의 에지 트리거 옵션의 목적은 무엇입니까?
epoll의 man 페이지에서 :
epoll is a variant of poll(2) that can be used either as an edge-triggered
or a level-triggered interface
에지 트리거 옵션은 언제 사용합니까? 매뉴얼 페이지는 그것을 사용하는 예제를 제공하지만 예제에서 왜 필요한지 모르겠습니다.
FD가 읽기 또는 쓰기 준비가되었을 때 모든 데이터를 즉시 읽거나 쓸 필요는 없습니다.
Level-triggered epoll은 FD가 준비되어있는 한 계속 잔소리를하는 반면, edge-triggered는 다음에 얻을 때까지 당신을 다시 괴롭히지 않을 EAGAIN
것입니다. 해야합니다).
리소스에서 FD로 글을 쓰고 있다고 가정 해 보겠습니다. 레벨 트리거로 쓰기 준비가되는 해당 FD에 대한 관심을 등록하면 FD가 아직 쓰기 준비가되어 있다는 지속적인 알림을 받게됩니다. 리소스를 아직 사용할 수없는 경우에는 더 이상 쓸 수 없기 때문에 깨어 난 낭비입니다.
대신 에지 트리거로 추가하면 FD가 한 번 쓰기 준비되었다는 알림이 표시되고 다른 리소스가 준비되면 최대한 많이 작성합니다. 그런 다음을 write(2)
반환 EAGAIN
하면 쓰기를 중지하고 다음 알림을 기다립니다.
읽기에도 똑같이 적용됩니다. 왜냐하면 당신이 원하는 것을 할 준비가되기 전에 모든 데이터를 사용자 공간으로 끌어 들이고 싶지 않을 수도 있기 때문입니다 (따라서 그것을 버퍼링해야하는 등). edge-triggered epoll을 사용하면 읽을 준비가되었을 때 알림을받은 다음이를 기억하고 "언제대로"실제 읽기를 수행 할 수 있습니다.
내 실험에서 ET는 종종 하나의 스레드 만 깨어나지 만 하나의 스레드 만 깨어나는 것을 보장하지 않습니다. EPOLLONESHOT 플래그는이를위한 것입니다.
참조 URL : https://stackoverflow.com/questions/9162712/what-is-the-purpose-of-epolls-edge-triggered-option
'programing' 카테고리의 다른 글
gcc가 함수를 인라인하도록 어떻게 강제합니까? (0) | 2021.01.19 |
---|---|
stdout과 stderr을 쉘 스크립트의 두 가지 다른 프로세스로 파이프합니까? (0) | 2021.01.19 |
Jenkins는 어떤 셸을 사용합니까? (0) | 2021.01.19 |
for 루프에서 오류 건너 뛰기 (0) | 2021.01.19 |
Android Gradle 빌드 전에 작업을 실행 하시겠습니까? (0) | 2021.01.19 |