Ãâó : http://www.linux.or.jp/JM/html/LDP_man-pages/man4/epoll.4.html
¹ø¿ª :
EPOLL
Section: Linux Programmer's Manual (4)
Updated:
Index JM Home Page roff page
À̸§
¼½Ä
#include <sys/epoll.h>
¼³¸í
epollÀº pollÀÇ ÀÏÁ¾À̸ç edge trigger ÀÎÅÍÆäÀ̽º
¶Ç´Â level trigger ÀÎÅÍÆäÀ̽º·Î¼ »ç¿ëÇÏ´Â °ÍÀÌ °¡´ÉÇÏ°í °¨½ÃÇÏ´Â ÆÄÀÏ µð½ºÅ©¸³ÅÍÀÇ ¼ö°¡
¸¹Àº °æ¿ì¿¡µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. epoll
¼¼Æ®¸¦ ¼³Á¤Çϰųª Á¦¾îÇϰųª Çϱâ À§Çؼ ´ÙÀ½ÀÇ 3°³ÀÇ ½Ã½ºÅÛ ÄÝÀÌ Á¦°øµÇ°í ÀÖ´Ù: epoll_create, epoll_ctl, epoll_wait
epoll ¼¼Æ®´Â epoll_create À¸·Î ÀÛ¼ºµÇ´Â ÆÄÀÏ µð½ºÅ©¸³ÅÍ¿¡ Á¢¼ÓµÈ´Ù. ±×¸®°í ƯÁ¤ÀÇ ÆÄÀÏ µð½ºÅ©¸³ÅÍ¿¡
´ëÇÑ °ü½É (¿ªÁÖ: ¾î¶² À̺¥Æ®¸¦ °¨½ÃÇÒ±î µî)À» epoll_ctl ·Î µî·ÏÇÑ´Ù. ¸¶Áö¸·¿¡ epoll_wait ·Î
½ÇÁ¦ÀÇ À̺¥Æ® ´ë±â¸¦ °³½ÃÇÑ´Ù.
ÁÖÀÇ
epoll À̺¥Æ® ¹è¼Û (distribution) ÀÎÅÍÆäÀ̽º´Â edge trigger (ET) ¶ó°í
ÇØµµ level trigger (LT) ¶ó°í ÇØµµ µ¿ÀÛ½Ãų ¼ö°¡ ÀÖ´Ù.
ET À̺¥Æ® ¹è¼Û ±â±¸¿Í LT À̺¥Æ® ¹è¼Û ±â±¸ÀÇ Â÷ÀÌ´Â ´ÙÀ½°ú °°ÀÌ ¼³¸íÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ
½Ã³ª¸®¿À°¡ ÀϾ´Ù°í ÇÏÀÚ:
1
ÆÄÀÌÇÁÀÇ Àбâ ÃøÀ» ³ªÅ¸³»´Â ÆÄÀÏ µð½ºÅ©¸³ÅÍ
(RFD) °¡ epoll µð¹ÙÀ̽ºÀÇ
³»ºÎ¿¡ Ãß°¡µÈ´Ù.
2
ÆÄÀÌÇÁ¿¡ ¾²±â¸¦ ÇÏ´Â ÇÁ·Î±×·¥ÀÌ 2Kb ÀÇ
µ¥ÀÌÅ͸¦ ÆÄÀÌÇÁÀÇ ¾²±âÃø¿¡ ±âÀÔÇÑ´Ù.
3
epoll_wait ¸¦ È£ÃâÇϸé Àб⠰¡´É(ready)ÀÎ ÆÄÀÏ µð½ºÅ©¸³Åͷνá RFD°¡ µ¹¾Æ°£´Ù.
4
ÆÄÀÌÇÁ·ÎºÎÅÍ Àо´Â ÇÁ·Î±×·¥ÀÌ 1Kb ÀÇ
µ¥ÀÌÅ͸¦ RFD·ÎºÎÅÍ Àо´Ù.
5
epoll_waitÀÇ È£ÃâÀ» ÇÑ´Ù.
RFD ÆÄÀÏ µð½ºÅ©¸³ÅͰ¡
EPOLLET Ç÷¡±×¸¦ »ç¿ëÇØ epoll Ãß°¡µÇ°í ÀÖÀ¸¸é ÀÌ¿ë °¡´ÉÇÑ µ¥ÀÌÅͰ¡ ÆÄÀÏ ÀÔ·Â ¹öÆÛ¿¡
¾ÆÁ÷ Á¸ÀçÇØ ¸®¸ðÆ®ÀÇ Á¢¼Óó(peer)°¡ ÀÌ¹Ì º¸³»Áø µ¥ÀÌÅÍ¿¡ ±Ù°ÅÇØ ÀÀ´äÀ» ±â´ëÇϰí Àֱ⠶§¹®¿¡ ½ºÅÜ
5ÀÇ epoll_wait ÀÇ È£Ãâ·Î ÇàÇÒ °¡´É¼ºÀÌ ÀÖ´Ù. À̰ÍÀº edge trigger À̺¥Æ® ¹è¼Û¿¡¼´Â ¸ð´ÏÅÍ Çϰí ÀÖ´Â ÆÄÀÏ·Î À̺¥Æ®°¡ ¶°³µÀ» ¶§¿¡¸¸ À̺¥Æ®°¡ ¹è¼ÛµÇ±â ¶§¹®¿¡
ÀÖ´Ù. »ó±âÀÇ ¿¹¿¡¼´Â 2·Î ÇàÇØÁø ¾²±â¿¡ ÀÇÇØ
RFD ¿¡ °üÇÑ À̺¥Æ®°¡ »ý¼ºµÇ¾î 3·Î À̺¥Æ®°¡ ¼Òºñ (consume) µÈ´Ù.
4 ·Î ÇàÇØÁö´Â
Àбâ Á¶ÀÛ¿¡¼´Â ÀüºÎÀÇ ¹öÆÛ µ¥ÀÌÅ͸¦ ¼ÒºñÇÏÁö ¾Ê±â ¶§¹®¿¡ ½ºÅÜ 5 ¿¡¼ ÇàÇØÁö´Â epoll_wait ÀÇ È£ÃâÀÌ ¹«±âÇÑÀ¸·Î Àá±ÛÁöµµ
¸ð¸¥´Ù. EPOLLET
Ç÷¡±× (edge trigger)¿Í ÇÔ²² »ç¿ëÇÏ´Â °æ¿ì epoll ÀÎÅÍÆäÀ̽º´Â ºí·Ï ÇÏÁö ¾Ê´Â ÆÄÀÏ µð½ºÅ©¸³Å͸¦ »ç¿ëÇØ¾ß ÇÏ´Â °ÍÀÌ´Ù. À̰ÍÀº
ºí·Ï µÇ´Â Àб⳪ ±âÀÔ¿¡ ÀÇÇØ , º¹¼öÀÇ ÆÄÀÏ µð½ºÅ©¸³Å͸¦ Ãë±ÞÇϴ ŽºÅ©¸¦ ±¾ÁÖ¸²(starve) ½ÃŰÁö ¾Ê°Ô Çϱâ À§ÇÑ °ÍÀÌ´Ù. epoll ¸¦ edge trigger (EPOLLET) ÀÎÅÍÆäÀ̽º·Î¼ »ç¿ëÇϱâ À§Çؼ Á¦¾ÈµÇ´Â ¹æ¹ýÀº ÀÌÇÏ¿Í °°°í
ÈçÈ÷ ÀÖ´Â ÇÔÁ¤À» ÇÇÇÏ´Â ¹æ¹ýµµ °è¼ÓÇØ ¸»ÇÑ´Ù.
i
ºí·Ï ÇÏÁö ¾Ê´Â ÆÄÀÏ µð½ºÅ©¸³ÅÍ¿Í ÇÔ²² »ç¿ëÇÑ´Ù.
ii
read(2) ¶Ç´Â write(2) ÀÌ EAGAIN ¸¦ µ¹·ÁÁØ ´ÙÀ½¿¡¸¸ À̺¥Æ®¸¦ ±â´Ù¸°´Ù.
¹Ý´ë·Î level trigger ÀÎÅÍÆäÀ̽º·Î¼
»ç¿ëÇÏ´Â °æ¿ì´Â epoll Àº Á¤¸»·Î º¸´Ù °í¼ÓÀÇ
pollÀÌ¸ç »ç¿ë¹ýÀÌ °°¾Æ¼ pollÀÌ »ç¿ëµÇ°í ÀÖ´Â °÷Àº ¾îµð¿¡¼¶óµµ »ç¿ëÇÒ ¼ö°¡ ÀÖ´Ù.
edge trigger¸¦ »ç¿ëÇßÀ» °æ¿ì¿¡¼µµ º¹¼öÀÇ µ¥ÀÌÅ͸¦ ¼ö½ÅÇÏ¸é º¹¼öÀÇ epoll À̺¥Æ®°¡ »ý¼ºµÇ¹Ç·Î È£Ãâ Ãø¿¡´Â EPOLLONESHOT Ç÷¡±×¸¦ ÁöÁ¤ÇÏ´Â ¿É¼ÇÀÌ ÀÖ´Ù. ÀÌ Ç÷¡±×´Â epoll¿¡ ´ëÇØ¼ epoll_wait ¿¡ ÀÇÇÑ À̺¥Æ®¸¦ ¼ö½ÅÇÑ ´ÙÀ½¿¡
°ü·ÃÇÏ´Â ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ¹«È¿·Î ½ÃŲ´Ù. EPOLLONESHOT Ç÷¡±×°¡ ÁöÁ¤µÇ¾úÀ» °æ¿ì
epoll_ctl ¿¡ EPOLL_CTL_MOD ¸¦ ÁöÁ¤ÇØ ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ÀçÂ÷ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀº È£Ãâ ÃøÀÇ Ã¥ÀÓÀÌ´Ù.
Á¦¾ÈÇÏ´Â »ç¿ë¹ýÀÇ ¿¹
level trigger ÀÎÅÍÆäÀ̽º·Î¼ »ç¿ëÇÒ ¶§ epoll ÀÇ »ç¿ë¹ýÀº poll°ú °°´Ù. ±×·¯³ª edge trigger·Î¼ »ç¿ëÇÏ´Â °æ¿ì´Â ¾îÇø®ÄÉÀ̼ÇÀÇ À̺¥Æ® ·çÇÁ·Î
stall(stall) ÇÏÁö ¾Ê°Ô »ç¿ë¹ýÀ» º¸´Ù ¸íÈ®ÇϰÔ
ÇØ µÑ Çʿ䰡 ÀÖ´Ù. ÀÌ ¿¹¿¡¼´Â ¸®½º³Ê´Â ºí·Ï ÇÏÁö ¾Ê´Â ¼ÒÄÏÀ̸ç listenÀÌ ºÒ¸®°í ÀÖ´Ù. ÇÔ¼ö do_use_fd()´Â read ¶Ç´Â write¿¡ ÀÇÇØ EAGAIN °¡ µ¹·ÁÁÖ¾îÁú ¶§±îÁö´Â
»õ·Î¿ï Áغñ ³¡³ ÆÄÀÏ µð½ºÅ©¸³Å͸¦ »ç¿ëÇÑ´Ù. À̺¥Æ® ±¸µ¿ ½ºÅ×ÀÌÆ® ¸Ó½Å ¾îÇø®ÄÉÀ̼ÇÀº EAGAIN (À»)¸¦ ¼ö½ÅÇÑ ÈÄ °æÇâ »óŸ¦ ±â·ÏÇØ µÎ¾î¾ß ÇÏ´Â °ÍÀÌ´Ù. À̰Ϳ¡ ÀÇÇØ ´ÙÀ½ÀÇ do_use_fd() È£Ãâ ¶§¿¡ ÀÌÀü¿¡ Á¤Áö
Çߴµ¥·ÎºÎÅÍ read ¶Ç´Â write(2) À» °è¼ÓÇÒ ¼ö°¡ ÀÖ´Ù.
struct epoll_event ev, *events;
for(;;) {
nfds = epoll_wait(kdpfd,
events, maxevents, -1);
for(n = 0; n < nfds; ++n)
{
if(events[n].data.fd == listener) {
client = accept(listener, (struct sockaddr *) &local,
&addrlen);
if(client < 0){
perror("accept");
continue;
}
setnonblocking(client);
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = client;
if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {
fprintf(stderr,
"epoll set insertion error: fd=%d,
client);
return -1;
}
}
else
do_use_fd(events[n].data.fd);
}
}
edge trigger ÀÎÅÍÆäÀ̽º·Î¼ »ç¿ëÇÏ´Â °æ¿ì ¼º´É»óÀÇ ÀÌÀ¯¿¡ ÀÇÇØ ÇÑ ¹ø (EPOLLIN|EPOLLOUT)
À» ÁöÁ¤ÇÏ°í ³ª¼ (EPOLL_CTL_ADD) ·Î ÆÄÀÏ µð½ºÅ©¸³Å͸¦ epoll ÀÎÅÍÆäÀ̽º¿¡ Ãß°¡ÇÒ ¼ö°¡ ÀÖ´Ù. À̰Ϳ¡ ÀÇÇØ epoll_ctl¿¡ EPOLL_CTL_MOD¸¦ ÁöÁ¤ÇØ È£ÃâÇÏ´Â °ÍÀ¸·Î EPOLLIN ¿Í EPOLLOUT ÀÇ
¿¬¼ÓÀûÀÎ ¹Ù²ñÀ» ÇÇÇÒ ¼ö ÀÖ´Ù.
Áú¹®°ú ÇØ´ä (linux-kernel º¸´Ù)
Q1
°°Àº ÆÄÀÏ µð½ºÅ©¸³Å͸¦ 1°³ÀÇ epoll_set ¿¡ 2ȸ Ãß°¡ÇÏ¸é ¾î¶»°Ô µÉ±î?
A1
¾Æ¸¶ EEXIST¸¦ ¹ÞÀ» °ÍÀÌ´Ù. ±×·¯³ª 2°³ÀÇ thread°¡
°°Àº ÆÄÀÏ µð½ºÅ©¸³Å͸¦ 2 ȸ Ãß°¡ÇÏ´Â °ÍÀº °¡´ÉÇÏ´Ù. À̰ÍÀº
¹«ÇØÀÎ »óÅÂÀÌ´Ù.
Q2
2°³ epoll¼¼Æ®°¡ °°Àº ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ±â´Ù¸®´Â
°ÍÀº °¡´ÉÇѰ¡? ¸¸¾à °¡´ÉÇϸé À̺¥Æ®´Â ¾çÂÊ ¸ðµÎ epoll ¼¼Æ®ÀÇ ÆÄÀÏ µð½ºÅ©¸³ÅÍ¿¡ º¸°íµÉ±î?
A2
°¡´ÉÇÏÁö¸¸ Ãßõ µÇÁö ¾Ê´Â´Ù. ±×¸®°í
À̺¥Æ®´Â ¾çÂÊ ¸ðµÎ¿¡ º¸°íµÈ´Ù.
Q3
epoll ÆÄÀÏ µð½ºÅ©¸³ÅÍ
ÀÚ½ÅÀº poll/epoll/select ÀÌ °¡´ÉÇѰ¡?
A3
°¡´ÉÇÏ´Ù.
Q4
epoll ÆÄÀÏ µð½ºÅ©¸³Å͸¦
ÀÚ½ÅÀÇ ÆÄÀÏ µð½ºÅ©¸³ÅÍ ¼¼Æ®¿¡ ³ÖÀ¸¸é ¾î¶»°Ô µÉ±î?
A4
½ÇÆÐÇÒ °ÍÀÌ´Ù. ´Ù¸¸ epoll ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ´Ù¸¥ epoll ÆÄÀÏ µð½ºÅ©¸³ÅÍ ¼¼Æ®ÀÇ ³»ºÎ¿¡ Ãß°¡ÇÏ´Â °ÍÀº °¡´ÉÇÏ´Ù.
Q5
epoll ÆÄÀÏ µð½ºÅ©¸³Å͸¦ unix ¼ÒÄÏÀ¸·Î ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ º¸³»´Â °ÍÀº °¡´ÉÇѰ¡?
A5
ºÒ°¡´ÉÇÏ´Ù.
Q6
ÆÄÀÏ µð½ºÅ©¸³Å͸¦ Ŭ·Î¿ìÁî ±× ÆÄÀÏ µð½ºÅ©¸³ÅÍ´Â ¸ðµç epoll ¼¼Æ®·ÎºÎÅÍ ÀÚµ¿ÀûÀ¸·Î »èÁ¦µÉ±î?
A6
»èÁ¦µÈ´Ù.
Q7
2 °³ ÀÌ»óÀÇ À̺¥Æ®°¡ epoll_wait ÄÝÀÇ »çÀÌ¿¡ ¿ÔÀ» °æ¿ì ±×°ÍµéÀº
Á¤¸®ÇØ º¸°íµÇ´ÂÁö ±×·¸Áö ¾ÊÀ¸¸é µû·Î µû·Î º¸°íµÉ±î?
A7
Á¤¸®ÇØ º¸°íµÉ °ÍÀÌ´Ù.
Q8
ÆÄÀÏ µð½ºÅ©¸³ÅÍ¿¡ ´ëÇÑ Á¶ÀÛÀº ÀÌ¹Ì ¸ð¾ÆÁö°í ÀÖÁö¸¸ ¾ÆÁ÷ º¸°íµÇ¾î ÀÖÁö ¾ÊÀº
À̺¥Æ®¿¡ ¿µÇâÀ» ÁÙ±î?
A8
±âÁ¸ÀÇ ÆÄÀÏ µð½ºÅ©¸³ÅÍ¿¡ ´ëÇØ¼ 2°³ÀÇ
Á¶ÀÛÀ» ½Ç½ÃÇÒ ¼ö°¡ ÀÖ´Ù. ÀÌ °æ¿ì »èÁ¦¿¡´Â Àǹ̰¡ ¾ø´Ù. º¯°æÇϸé
»ç¿ë °¡´ÉÇÑ I/O °¡ ´Ù½Ã ÀÐÈù´Ù.
Q9
EPOLLET Ç÷¡±×(edge trigger µ¿ÀÛ)À» »ç¿ëÇϰí ÀÖ´Â °æ¿ì EAGAIN ¸¦ ¹ÞÀ» ¶§±îÁö °è¼ÓÇØ ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ÀÐ°í ¾²±âÇÒ Çʿ䰡 ÀÖÀ»±î.
A9
±×·² ÇÊ¿ä´Â ¾ø´Ù. epoll_wait·ÎºÎÅÍ À̺¥Æ®¸¦ ¹Þ´Â °ÍÀº ¡¸±× ÆÄÀÏ µð½ºÅ©¸³ÅͰ¡ ¿ä±¸µÈ I/O Á¶ÀÛ¿¡ ´ëÇØ¼ Áغñ°¡ ³¡³ »óÅÂÀÌ´Ù¡¹ ¶ó°í ÇÏ´Â °ÍÀ» À¯Àú¿¡°Ô ³ªÅ¸³»´Â °ÍÀÌ´Ù. ¡¸´ÙÀ½ÀÇ IN À» ¹ÞÀ» ¶§±îÁö´Â ÆÄÀÏ µð½ºÅ©¸³ÅÍ´Â Áغñ°¡ ³¡³ »óÅÂÀÌ´Ù¡¹
¿Í ´Ü¼øÇÏ°Ô »ý°¢ÇØ¾ß ÇÏ´Â °ÍÀÌ´Ù. ±×·¯ÇÑ ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ¾ðÁ¦ ¾î¶»°Ô »ç¿ëÇÒ±î´Â ¿ÏÀüÈ÷ À¯Àú¿¡°Ô
¸Ã°í ÀÖ´Ù. ±×¸®°í Àоîµé¿© ¿ë / ±âÀÔ¿ë I/O °ø°£ÀÌ ¾²¿©Áø »óÅ´ , ´ë»óÀÌ µÇ´Â ÆÄÀÏ µð½ºÅ©¸³ÅͷκÎÅÍ
ÀоîµéÀÎ µ¥ÀÌÅÍ·® ¶Ç´Â ±âÀÔÇÑ µ¥ÀÌÅÍ·®À» üũÇÏ´Â °ÍÀ¸·Î °ËÁöÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é ¾î´À ƯÁ¤ÀÇ ¾çÀÇ
µ¥ÀÌÅ͸¦ ÀоîµéÀ̱⠶§¹®¿¡ read¸¦ ºÒ·¶À» ¶§¿¡ read°¡ µ¹·ÁÁØ ¾Æ¸£¹ÙÀÌÆ®¼ö°¡ ±×°Íº¸´Ù Àû¾ú´ø °æ¿ì ±× ÆÄÀÏ µð½ºÅ©¸³ÅÍÀÇ Àбâ¿ë I/O °ø°£ÀÌ ¾²¿©Áø °ÍÀ» ¾È´Ù. write ÇÔ¼ö¸¦ »ç¿ëÇØ ¾²½Ãň ÇÒ ¶§µµ °°Àº °ÍÀ» ¸»ÇÒ ¼ö ÀÖ´Ù.
ÈçÈ÷ ÀÖ´Â ÇÔÁ¤°ú ȸÇÇ ¹æ¹ý
o ±â¾Æ (starvation) (edge trigger)
Å« I/O °ø°£ÀÌ ÀÖ´Â °æ¿ì ±× I/O °ø°£ÀÇ µ¥ÀÌÅ͸¦ ¸ðµÎ
ó¸®(drain) ÇÏ·Á°í ÇÏ¸é ´Ù¸¥ ÆÄÀÏÀÌ Ã³¸®µÇÁö ¾Ê°í ±¾°í¸¦ ¹ß»ý½ÃŰ´Â ÀÏÀÌ ÀÖ´Ù. À̰ÍÀº epoll ¿¡
°íÀ¯ÀÇ °ÍÀº ¾Æ´Ï´Ù.
ÀÌ ¹®Á¦ÀÇ ÇØ°á¹ýÀº Áغñ°¡ ³¡³ »óÅÂÀÇ ¸®½ºÆ®¸¦ °ü¸®ÇÏ¸ç °ü·ÃÇÏ´Â
data ±¸Á¶Ã¼ Áß¿¡¼ ÆÄÀÏ µð½ºÅ©¸³ÅͰ¡ ÀÌ¿ë °¡´ÉÇÏ´Ù ¶ó°í ¸¶Å© ÇÏ´Â °ÍÀÌ´Ù. °Å±â¿¡
µû¶ó ÀÌ¿ë °¡´ÉÇÑ ¸ðµç ÆÄÀÏ Áß¿¡¼ ¾î´À ÆÄÀÏÀ» ó¸®ÇÒ Çʿ䰡 ÀÖÀ»±î¸¦ ±â¾ïÇÒ ¼ö°¡ ÀÖ¾î °Ô´Ù°¡ Â÷·Ê·Î ó¸®
(round robin) ÇÒ ¼ö°¡ ÀÖ´Ù. ÀÌ¹Ì ÀÌ¿ë °¡´ÉÇÑ ÆÄÀÏ µð½ºÅ©¸³ÅÍ¿¡ ´ëÇØ¼ ±×°Í
ÀÌÈÄ¿¡ ¹Þ´Â À̺¥Æ®¸¦ ¹«½ÃÇÒ ¼öµµ ÀÖ´Ù.
o À̺¥Æ® ij½¬¸¦ »ç¿ëÇϰí ÀÖ´Â °æ¿ì
À̺¥Æ® ij½¬¸¦ »ç¿ëÇϰí ÀÖ´Â °æ¿ì ¶Ç´Â epoll_wait ·ÎºÎÅÍ
¹ÝȯµÈ ¸ðµç ÆÄÀÏ µð½ºÅ©¸³Å͸¦ °Ý³³Çϰí ÀÖ´Â °æ¿ì Ŭ·Î¿ìÁî µÈ °ÍÀ» µ¿ÀûÀ¸·Î ¸¶Å© ÇÏ´Â(Áï ÀüÀÇ À̺¥Æ®ÀÇ
󸮿¡ ÀÇÇØ ¸¶Å© µÇ´Â) ¹æ¹ýÀ» Á¦°øÇØ¾ß ÇÑ´Ù. epoll_wait·ÎºÎÅÍ 100 °³ÀÇ À̺¥Æ®¸¦ ¹Þ¾Æ À̺¥Æ® #47 ÀÎ Á¶°ÇÀ¸·Î À̺¥Æ® 13ÀÌ ´ÝÇôÁö¸é) °¡Á¤ÇÑ´Ù. À̺¥Æ® 13ÀÇ
±¸Á¶Ã¼¸¦ »èÁ¦ÇØ ÆÄÀÏ µð½ºÅ©¸³Å͸¦ close()Çϸé À̺¥Æ® ij½¬´Â ±× ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ±â´Ù¸®´Â À̺¥Æ®°¡
Á¸ÀçÇÑ´Ù°í ÇÏ¿© È¥¶õÀÌ ÀϾÙ.
ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ´Â 1°³ÀÇ ¹æ¹ýÀº À̺¥Æ® 47ÀÇ Ã³¸®¸¦ Çϰí ÀÖ´Â µ¿¾È¿¡ ÆÄÀÏ µð½ºÅ©¸³ÅÍ 13À» »èÁ¦ÇØ close() Çϱâ À§Çؼ epoll_ctl(EPOLL_CTL_DEL)¸¦ È£ÃâÇØ °ü·ÃÁöÀ» ¼ö ÀÖ¾ú´ø data ±¸Á¶Ã¼¸¦
»èÁ¦°¡ ³¡³ »óÅÂ¿Í ¸¶Å© ÇØ Ŭ¸° ¾÷ ¸®½ºÆ®¿¡ ¸µÅ©ÇÏ´Â °ÍÀÌ´Ù. ¹èġó¸® Áß¿¡¼ ÆÄÀÏ µð½ºÅ©¸³ÅÍ 13¿¡ ´ëÇÑ ´Ù¸¥ À̺¥Æ®¸¦ ã¾Æ³ÂÀ»
°æ¿ì ±× ÆÄÀÏ µð½ºÅ©¸³ÅͰ¡ ÀÌÀü¿¡ »èÁ¦µÈ °ÍÀÌ´Ù°í ¾Ë¹Ç·Î È¥¶õÀº ÀϾÁö ¾Ê´Â´Ù.
ÁذÅ
epoll´Â Linux Ä¿³Ú 2.5.44 ¿¡ µµÀÔµÈ »õ·Î¿î API ÀÌ´Ù. ÀÎÅÍÆäÀ̽º´Â Linux Ä¿³Ú 2.5.66 ·Î È®Á¤ µÇ´Â °ÍÀÌ ´ç¿¬ÇÏ´Ù.