Epoll () yok, O işini(1)?
Wikipedia diyor
eski sistem çağrıları, aksine O(n) de çalışır, epoll arasında çalışır Ç(1) [2]).
http://en.wikipedia.org/wiki/Epoll
Ancak, fs/adresinden kaynak kodu eventpoll.c Linux-2.6.38, (logN) O hangi arama için RB bir ağaç ile gerçekleştirilir görünüyor
/*
* 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)
{
Aslında, herhangi bir adam sayfa epoll karmaşıklığı söyleyerek göremedim (O) (1). Neden O(1) olarak bilinir.
CEVAP
Bu ep_find
için bir kez uygulaması yapar. Ben sadece birkaç dakika geçirdim ve ep_find
epoll_ctl
olarak görüyorum.
Tanımlayıcıları (EPOLL_CTL_ADD
) eklediğinizde, bu yüzden gerçekten, bu pahalı işlem yapılır. AMA ne zamanasıl iş(epoll_wait
) değil. Sadece başlangıçta tanımlayıcıları ekleyin.
Sonuç olarak, epoll
sistem çağrısı yok beri epoll
, karmaşıklığı sormak yeterli değil. epoll_ctl
, epoll_wait
vb bireysel karmaşıklığı istiyorum.
Diğer şeyler
select
önlemek epoll
kullanmak için başka sebepler de var. Kullanarak seçin, birçok tanımlayıcıları dikkat edilmesi gereken bilmiyorsun. En büyük parça ve döngü tutmak gerekir.
rc = select(...);
/* check rc */
for (s = 0; s <= maxfd; s ) {
if (FD_ISSET(s)) {
/* ... */
}
}
Şimdi epoll
ile çok daha temiz
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
/* check nfds */
for (n = 0; n < nfds; n) {
/* events[n].data.fd needs attention */
}
Seç/uyarılar, Twisted vs epoll reaktör...
Fark epoll, anket, havuzu arasındaki n...