epoll ()은 O (1)에서 작동합니까?
Wikipedia 말한다
O (n)에서 작동하는 이전 시스템 호출과 달리 epoll은 O (1) [2])에서 작동합니다.
http://en.wikipedia.org/wiki/Epoll
그러나 Linux-2.6.38의 fs / eventpoll.c에있는 소스 코드는 검색 용 RB 트리로 구현 된 것 같습니다. 여기에는 O (logN)가 있습니다.
/*
* Search the file inside the eventpoll tree. The RB tree operations
* are protected by the "mtx" mutex, and ep_find() must be called with
* "mtx" held.
*/
static struct epitem *ep_find(struct eventpoll *ep, struct file *file, int fd)
{
사실 epoll ()의 복잡성이 O (1)이라는 맨 페이지를 볼 수 없었습니다. O (1)로 알려진 이유는 무엇입니까?
을 찾으면 의미가 있습니다 ep_find
. 난 단지 그것으로 몇 분 시간에 나는 참조 ep_find
만에 의해 호출됩니다 epoll_ctl
.
따라서 실제로 설명자 ( EPOLL_CTL_ADD
)를 추가하면 비용이 많이 드는 작업이 수행됩니다. 그러나 실제 작업 ( epoll_wait
)을 수행 할 때는 그렇지 않습니다. 설명자는 처음에만 추가합니다.
결론적으로 시스템 호출 epoll
이 없기 때문에 의 복잡성을 묻는 것만으로는 충분하지 않습니다 epoll
. 당신의 개별 복잡성 원하는 epoll_ctl
, epoll_wait
등
다른 것들
피하고 select
사용 하는 다른 이유가 있습니다 epoll
. select를 사용할 때 얼마나 많은 설명자가주의가 필요한지 알 수 없습니다. 따라서 가장 큰 것을 추적하고 반복해야합니다.
rc = select(...);
/* check rc */
for (s = 0; s <= maxfd; s++) {
if (FD_ISSET(s)) {
/* ... */
}
}
이제 epoll
훨씬 더 깨끗해졌습니다.
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
/* check nfds */
for (n = 0; n < nfds; ++n) {
/* events[n].data.fd needs attention */
}
참조 URL : https://stackoverflow.com/questions/6474602/does-epoll-do-its-job-in-o1
'Nice programing' 카테고리의 다른 글
Quartz로 iOS에서 PDF 하이퍼 링크 받기 (0) | 2021.01.08 |
---|---|
HTML5와 호환되는 HTML 필터 (0) | 2021.01.08 |
TaskCanceledException이 발생하는 이유는 무엇입니까? (0) | 2021.01.08 |
Codecademy for Java와 같은 것이 있습니까? (0) | 2021.01.08 |
시간 기반 UUID를 생성하는 방법은 무엇입니까? (0) | 2021.01.08 |