epoll - Ä¿³Î 2.4 ±âÁØ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.


ÀÌ ¹®¼­´Â kernel2.4¸¦ ±â¹ÝÀ¸·ÎÇÑ ¿À·¡µÈ ¹®¼­ÀÔ´Ï´Ù. ±â¼úÀûÀÎ ³»¿ë¸¸ Âü°íÇϰí kernel 2.6 ¹öÀü¿ëÀ¸·Î º¯°æ»çÇ×À» È®ÀÎÇÏ¸é µÉ °Í °°½À´Ï´Ù. ÀÏ´Ü 2.6Àº Ä¿³ÎÆÐÄ¡³ª ¶óÀ̺귯¸® ¾øÀÌ epollÀ» Áö¿øÇϱ⠶§¹®¿¡, 2.6À» »ç¿ëÇÏ´Â Áö±ÝÀº ¶óÀ̺귯¸®¿Í Ä¿³Î ¼³Á¤ ºÎºÐÀº ÀÐÀ» Çʿ䰡 ¾ø½À´Ï´Ù.

  • ÀÛ¼ºÀÏ : ÃÖÃÊ ¾Æ¸¶ 2004 ³âÂë ??
  • ¼öÁ¤ÀÏ : 2011³â 4¿ù 13ÀÏ
  • ¾ðÁ¦ ³¯ Àâ¾Æ¼­ 2.6¿¡ ¸Â°Ô Àüü ¹®¼­¸¦ ÀçÀÛ¼º ÇØ¾ß°Ú½À´Ï´Ù.

Contents

1 ¼Ò°³
2 epoll
2.1 epoll¿¡ ´ëÇØ¼­
2.2 Edge Trigger °ú Level Trigger
2.3 ÃÖ´ë µî·Ï ÆÄÀÏ °³¼ö
3 epoll API
3.1 epoll_create
3.2 epoll_wait
3.3 epoll_ctl
4 epollÀÇ ÀåÁ¡/´ÜÁ¡/ÇØ°á¹æ¹ý
4.1 ÀåÁ¡
4.2 ´ÜÁ¡
5 ¿¹Á¦ ÇÁ·Î±×·¥
6 ÇÁ·ÎÁ§Æ® ÁøÇà
7 Âü°í ¹®¼­


1 ¼Ò°³

epoll »ç¿ë¿¡ ´ëÇÑ ¹®¼­ÀÔ´Ï´Ù. ¿¹Àü 2.4.x ±âÁØÀ¸·Î ÀÛ¼ºÇÑ ¹®¼­¸¦ °è¼Ó À¯ÁöÇß¾ú´Âµ¥¿ä. 2011³âÀÎ Áö±Ý±îÁö 2.4.x¸¦ ±âÁØÀ¸·Î ÇÑ ¹®¼­¸¦ À¯ÁöÇÒ ÇÊ¿ä´Â ¾øÀ» °Í °°¾Æ¼­ 2.6.x ¹öÀüÀ¸·Î ´Ù½Ã ¸¸µé¾ú½À´Ï´Ù. ¾²Áöµµ ¾Ê´Â 2.4¿¡ ´ëÇÑ ³»¿ëÀÌ ÀÖÀ¸´Ï ¿ÀÈ÷·Á Çê°¥¸®´õ¶ó±¸¿ä.

ÇöÀç epollÀº realtime signal°ú ÇÔ²² °¡Àå ºü¸¥ ÀÔÃâ·Â ó¸® ¹æ½Ä Áß Çϳª·Î ¾Ë·ÁÁ® ÀÖ½À´Ï´Ù. realtime signalº¸´Ù ´õ ºü¸£´ø°¡.. ±×·²°Ì´Ï´Ù. º¥Ä¡¸¶Å© °á°ú°¡ ÀÖ´ÂÁö ã¾ÆºÁ¾ß °Ú±º¿ä.

2 epoll

2.1 epoll¿¡ ´ëÇØ¼­

¸®´ª½ºÀÇ À̺¥Æ® ÅëÁö ÀÔÃâ·Â 󸮴 ÁÖ·Î select¿Í pollÀ» ÀÌ¿ëÇÑ ÀÔÃâ·Â ´ÙÁßÈ­¸ðµ¨À» µû¸£°í ÀÖ½À´Ï´Ù. ÀÔÃâ·Â ´ÙÁßÈ­¸¦ ÀÌ¿ëÇÏ´Â ÀÌÀ¯´Â ´Ù¼öÀÇ ÇÁ·Î¼¼½º ȤÀº ½º·¹µå¸¦ ¸¸µéÁö ¾Ê°íµµ ¿©·¯ ÆÄÀÏÀ» ó¸®ÇÒ ¼ö Àֱ⠶§¹®Àä. ÇÁ·Î¼¼½º¿Í ½º·¹µåÀÇ »ý¼º½Ã°£ÀÌ ¾øÀ¸´Ï ±×¸¸Å­ ºü¸£°Ô ÀÛµ¿ÇÒ ¼ö ÀÖ´Ù´Â ÀÌÁ¡À» ´©¸± ¼ö ÀÖÁÒ. °Ô´Ù°¡ IPC¸¦ »ç¿ëÇÒ Çʿ䵵 ¾ø±¸¿ä. ¸ÖƼ ÇÁ·Î¼¼½º, ¸ÖƼ ½º·¹µå ȯ°æ¿¡¼­ IPC¸¦ »ç¿ëÇØ º» °æÇèÀÌ ÀÖ´Ù¸é, ¾ó¸¶³ª ±î´Ù·Î¿îÁö ¾Æ¸¶ ÀÌÇØÇÏ½Ç °Ì´Ï´Ù.

ÇÏÁö¸¸ select¸¦ ÀÌ¿ëÇÑ ¹æ¹ýÀº ¹®Á¦°¡ Á» ÀÖ½À´Ï´Ù. ¾ÆÀ̵ð¾î´Â ÈǸ¢Çѵ¥, ±¸ÇöÀÌ ±×´ÙÁö È¿À²ÀûÀÌÁö ¾Ê´Ù´Â ¹®Á¦ÀÔ´Ï´Ù.
  1. ºñÆ® Å×À̺íÀ» ÇϳªÇϳª °Ë»çÇØ¾ß ÇÑ´Ù.
    select´Â °íÁ¤ ºñÆ® Å×À̺íÀÎ fd_setÀ» ÀÌ¿ëÇØ¼­ ÀÔÃâ·Â µ¥ÀÌÅ͸¦ È®ÀÎÇϴµ¥¿ä. °íÁ¤ ºñÆ® Å×À̺íÀ̱⠶§¹®¿¡ ÃÖ´ë ÆÄÀÏ ÁöÁ¤¹øÈ£ + 1¸¸Å­ÀÇ Å×À̺íÀ» °Ë»çÇØ¾ß ÇÑ´Ù´Â ¹®Á¦°¡ ÀÖ½À´Ï´Ù. µ¥ÀÌÅͰ¡ ÀÖ´Â ÆÄÀÏÀÇ ¸ñ·ÏÀ» µ¹·ÁÁÖ¸é Âü ÁÁÀ» °Çµ¥ ¸»ÀÌÁÒ.
  2. µ¥ÀÌÅÍ º¹»ç.
    select´Â fd_setÀ» ÀÌ¿ëÇØ¼­ µ¥ÀÌÅ͸¦ ±â´Ù¸®°í, µ¥ÀÌÅͰ¡ ¿À¸é fd_setÀ» °»½ÅÇØ ¹ö¸³´Ï´Ù. ÀÌÀü fd_setÁ¤º¸¸¦ ÀÒ¾î¹ö¸®´Â °ÅÁÒ. °á±¹ ¸Å¹ø fd_setÀ» º¹»çÇØ¾ß µÇ´Âµ¥¿ä. ¿ª½Ã ºñ¿ëÀÌ ¼ÒºñµÇÁÒ.

epollÀº À̸§¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ select¿Í poll·Î ´ëÇ¥µÇ´Â ÀÔÃâ·Â ´ÙÁßÈ­¸¦ °³¼±ÇÑ ±â¼úÀÔ´Ï´Ù. Áï ¾Æ·¡ÀÇ »çÇ׿¡¼­ ±â¼ú°³¼±ÀÌ ÀÌ·ç¾îÁ³½À´Ï´Ù.
  1. À̺¥Æ®°¡ ¹ß»ýÇÑ ÆÄÀÏÀÇ ¸ñ·ÏÀ» ¹ÝȯÇÑ´Ù.
    ÆÄÀÏ ¸ñ·ÏÀ» ¼øÈ¯Çϸ鼭 µ¥ÀÌÅ͸¦ ó¸®ÇÏ¸é µË´Ï´Ù. È¿À²ÀûÀÌÁÒ ?
  2. µ¥ÀÌÅÍ º¹»ç
    fd_setµîÀ» À¯ÁöÇÒ Çʿ䰡 ¾ø½À´Ï´Ù. È¿À²ÀûÀ̱⵵ ÇÏÁö¸¸ »ç¿ëÇϱ⵵ ÆíÇÏÁÒ.

2.2 Edge Trigger °ú Level Trigger

epollÀ» ´Ù·ç´Ùº¸¸é Edge Trigger°ú level Trigger µÑ Áß Çϳª¸¦ ¼±ÅÃÇØ¾ß Çϴµ¥¿ä. °£´ÜÇÏÁö¸¸, Çê°¥¸± ¼ö ÀÖ´Â ¿ë¾î¶ó¼­ ¼³¸íÀ» ÇÏ°í ³Ñ¾î°¥±î ÇÕ´Ï´Ù.

  • Level-triggered´Â ƯÁ¤ ÁØÀ§ (»óÅÂ)°¡ À¯ÁöµÇ´Â µ¿¾È °¨Áö.
  • Edge-triggered´Â ƯÁ¤ ÁØÀ§°¡ º¯È­ÇÏ´Â ½ÃÁ¡¿¡¼­¸¸ °¨Áö.
¿¹¸¦ µé¾î µðÁöÅÐ ½ÅÈ£ 0000111000111000111 ¿¡¼­ 1¿¡ ´ëÇÑ TriggerÀ̶ó¸é LT´Â 1ÀÌ À¯ÁöµÇ´Â ½Ã°£µ¿¾È Ƚ¼ö¿¡ »ó°ü¾øÀÌ ¹ß»ýÇϰí, Edge-triggered´Â 0¿¡¼­ 1·Î º¯ÇÏ´Â ½ÃÁ¡¿¡¼­¸¸ ¹ß»ýÇÕ´Ï´Ù. Áï ÀÌ °æ¿ì ET´Â 3ȸ ¹ß»ýÇÕ´Ï´Ù.


LT ¹æ½ÄÀº select³ª polló·³ ÀÛµ¿À» Çϱ⠶§¹®¿¡ ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖ½À´Ï´Ù. select, pollÀº LT·Î ÀÛµ¿Çϴµ¥, ¼ÒÄÏ ¹öÆÛ°¡ ºñ±âÀü±îÁö 1·Î ¼³Á¤Çϱ⠶§¹®¿¡, ¼ÒÄÏ¿¡ ¹öÆÛ°¡ ÀÖ´Â µ¿¾È¿¡´Â °è¼Ó ¹ÝȯÇÕ´Ï´Ù.

¹Ý¸é ET´Â óÀ½ À̺¥Æ®°¡ ¹ß»ýÇØ¼­ 1À̵ǾúÀ» ¶§¸¸ ¹ß»ýÇÕ´Ï´Ù. ¸¸¾à À̺¥Æ®°¡ ¹ß»ýÇØ¼­ µ¥ÀÌÅ͸¦ Àоú´Âµ¥, ¹öÆÛÀÇ µ¥ÀÌÅ͸¦ ¸ðµÎ ÀÐÁö ¾Ê°í ´ÙÀ½ wait ÇÔ¼ö¸¦ È£ÃâÇÒ °æ¿ì, wait ÇÔ¼ö¿¡¼­ ºÀ¼âµÇ´Â ¹®Á¦°¡ »ý±æ ¼ö ÀÖ½À´Ï´Ù. ÀÚÄ©ÇÏ¸é ¿µ¿øÈ÷ ºÀ¼âµÉ ¼öµµ ÀÖÁÒ. ´ÙÀ½ÀÇ ½Ã³ª¸®¿À¸¦ °¡Á¤Çغ¸ÁÒ.

  1. read sid of pipe(RFD)¿¡ ÀÖ´Â ÆÄÀÏ ÁöÁ¤ÀÚ°¡ epoll ÀåÄ¡¿¡ ET »óÅ·ΠÃß°¡µÈ´Ù.
  2. Pipe write°¡ 2KbÀÇ µ¥ÀÌÅ͸¦ ¾´´Ù.
  3. epoll_wait(2)°¡ È£ÃâµÇ°í RFD´Â À̺¥Æ®°¡ ¹ß»ýÇÑ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ¸®ÅÏÇÑ´Ù.
  4. Pipe readerÀº RFD·Î ºÎÅÍ 1Kbµ¥ÀÌÅ͸¦ ÀоîµéÀδÙ.
  5. epoll_wait(2)°¡ È£ÃâµÈ´Ù.
  6. ET ¹æ½ÄÀ̱⠶§¹®¿¡ epoll_wait¿¡¼­ ºÀ¼âµÈ´Ù.

ETÀÏ °æ¿ì »ý±â´Â ¹®Á¦¸¦ ¾Ë ¼ö ÀÖ°ÚÁÒ. µû¶ó¼­ ET·Î ÀÛµ¿ÇÏ°Ô ÇÏ·Á¸é non-blocking ¼ÒÄÏ¿¡ »ç¿ëÇØ¾ß¸¸ ÇÕ´Ï´Ù.
  1. non-block ÆÄÀϵð½ºÅ©¸³Å͸¦ »ç¿ëÇÑ´Ù.
  2. read(2) ³ª write(2) °¡ errno·Î EGAINÀ» ¹ÝȯÇÒ¶§¸¸ wait À» Çϵµ·Ï ÇÏÀÚ (epoll_wait)

ET°¡ ÁÁÀº ¹æ¹ýÀÎÁö´Â Àß ¸ð¸£°Ú½À´Ï´Ù. ¼º´É»óÀÇ ÀÌÁ¡ÀÌ ÀÖ´Ù°í Çϴµ¥, ÇÁ·Î±×·¥ÀÌ Á» Áö³ªÄ¡°Ô º¹ÀâÇØ Áú ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù. EGAINÀÏ ¶§±îÁö ·çÇÁ¸¦ µ¹¸é¼­ µ¥ÀÌÅ͸¦ ó¸®ÇØ¾ß Çϴµ¥, ÀÌ °æ¿ì µ¥ÀÌÅÍ ¹öÆÛ¸¦ °ü¸®ÇØ¾ß Çϱ⵵ ÇÏ°í ¿©·¯¸ð·Î ½Å°æ¾µ°Ô ¸¹¾ÆÁö°Åµç¿ä.

LT ¹æ½ÄÀ¸·Î epollÀ» »ç¿ëÇÒ °æ¿ì, select¿Í µ¿ÀÏÇÑ ¹æ½ÄÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹°·Ð ´õ ºü¸£°ÚÁÒ.

epollÀº LT ¹æ½ÄÀ» ±âº»À¸·Î ½ÇÇàµË´Ï´Ù. ¸¸¾à ET¹æ½ÄÀ¸·Î ÁöÁ¤ÇÏ°í ½Í´Ù¸é, ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µË´Ï´Ù.
mev.events = EPOLLIN | EPOLLET ....; 
epoll_ctl(mepollfd, EPOLL_CTL_ADD, afd, &mev); 
 

2.3 ÃÖ´ë µî·Ï ÆÄÀÏ °³¼ö

/proc/sys/fs/epoll/max_user_watches ¿¡¼­ È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¿¡´Â À¯Àú°¡ µî·ÏÇÒ ¼ö ÀÖ´Â ÆÄÀÏÀÇ ÃÖ´ë °³¼ö°¡ ¸í½ÃµÇ¾î Àִµ¥¿ä. User ID´ç Á¦ÇÑÀÌ ¼³Á¤µË´Ï´Ù. 32bit Ä¿³Î¿¡¼­´Â ÆÄÀÏ Çϳª´ç ¾à 90byteÀÇ ¸Þ¸ð¸®°¡ 64bit¿¡¼­´Â 160¹ÙÀÌÆ®°¡ ÇÊ¿äÇÏ´Ù°í ÇÕ´Ï´Ù.

3 epoll API

epoll¸¦ »ç¿ëÇϱâ À§ÇÑ ÇÔ¼öµéÀ» ¼³¸íÇÕ´Ï´Ù. selectÀÇ È®ÀåÇÑ ±â¼úÀ̱⠶§¹®¿¡, ÀÔÃâ·Â ´ÙÁßÈ­¿¡ ´ëÇÑ °æÇèÀÌ ÀÖ´Ù¸é ½±°Ô ÀÌÇØÇϰí ÀÀ¿ëÇÒ ¼ö ÀÖÀ» °Ì´Ï´Ù.

3.1 epoll_create

epoll_create(int size) 
 
epoll_create()´Â À̺¥Æ®¸¦ ÀúÀåÇϱâ À§ÇÑ size¸¸Å­ÀÇ °ø°£À» Ä¿³Î¿¡ ¿äûÇÕ´Ï´Ù. Ä¿³Î¿¡ ¿äûÇÑ´Ù°í ÇØ¼­ ¹Ýµå½Ã size¸¸Å­ÀÇ °ø°£ÀÌ È®º¸µÇ´Â °Ç ¾Æ´ÏÁö¸¸ Ä¿³ÎÀÌ ´ë·« ¾î´À Á¤µµÀÇ °ø°£À» ¸¸µé¾î¾ß ÇÒÁö´Â Á¤ÇØÁÙ ¼ö ÀÖ½À´Ï´Ù. ¼öÇàµÈ ÈÄ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ µÇµ¹·Á Áִµ¥, ´õ ÀÌ»ó »ç¿ëÇÏÁö ¾ÊÀ» °Å¶ó¸é close ÇÔ¼ö·Î ´Ý¾ÆÁÖ¸é µË´Ï´Ù.

Å©±â´Â ¼­ºñ½º ¸¶´Ù ´Ù¸¥µ¥¿ä. ÀϹÝÀûÀ¸·Î ¿¹»ó ÃÖ´ë µ¿Á¢ x 1.5 Á¤µµ¸é µÈ´Ù°í ÇÕ´Ï´Ù.

3.2 epoll_wait

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout) 
 
½ÇÁ¦ À̺¥Æ®°¡ ¹ß»ýÇÏ´Â°É ±â´Ù¸®°í ÀÖ´Ù°¡, À̺¥Æ®°¡ ¹ß»ýÇϸé À̺¥Æ® °ü·Ã Á¤º¸¸¦ ³Ñ°ÜÁÖ´Â ÀÏÀ» ÇÕ´Ï´Ù.

epfd´Â epoll_create(2)¸¦ ÀÌ¿ëÇØ¼­ »ý¼ºµÈ epoll ÁöÁ¤¹øÈ£±¸¿ä. ¸¸¾à À̺¥Æ®°¡ ¹ß»ýÇÏ¸é ¹ÝȯÇϴµ¥, À̺¥Æ®¿¡ °üÇÑ Á¤º¸´Â events¿¡ ±â·ÏµË´Ï´Ù . maxevents´Â epollÀ̺¥Æ® Ç®ÀÇ Å©±â°í¿ä. timeout´Â ±â´Ù¸®´Â ½Ã°£ÀÔ´Ï´Ù. 0º¸´Ù ÀÛ´Ù¸é À̺¥Æ®°¡ ¹ß»ýÇÒ ¶§±îÁö ±â´Ù¸®°í, 0ÀÌ¸é ¹Ù·Î ¸®ÅÏ, 0º¸´Ù Å©¸é timeout ¹Ð¸®¼¼ÄÁµå ¸¸Å­ ±â´Ù¸°´Ù. ¸¸¾à timeout½Ã°£¿¡ À̺¥Æ®°¡ ¹ß»ýÇÏÁö ¾Ê´Â´Ù¸é 0À» ¹ÝȯÇÕ´Ï´Ù.

À̺¥Æ®°¡ ¹ß»ýÇß´Ù¸é ¹ß»ýÇÑ À̺¥Æ®ÀÇ °¹¼ö¸¦ ¹ÝȯÇÕ´Ï´Ù.

3.3 epoll_ctl

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) 
 
À̺¥Æ®Ç®À» Á¦¾îÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. poll(2)¿Í ¸Å¿ì ºñ½ÁÇÏ°Ô ÀÛµ¿ÇÑ´Ù. op´Â fd¿¡ ´ëÇØ¼­ ¾î¶² ÀÛ¾÷À» ÇÒ°ÍÀÎÁö¸¦ Á¤ÀÇÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. op°¡ ½ÇÇàµÈ °á°ú´Â event±¸Á¶Ã¼¿¡ Àû¿ëµÈ´Ù.

´ÙÀ½Àº epoll_event±¸Á¶Ã¼ÀÇ ¸ð½ÀÀÌ´Ù.
typedef union epoll_data { 
     void *ptr; 
     int fd; 
     __uint32_t u32; 
     __uint64_t u64; 
} epoll_data_t; 
 
struct epoll_event { 
     __uint32_t events;  /* ¹ß»ýµÈ À̺¥Æ® */ 
     epoll_data_t data;  /* À¯Àú µ¥ÀÌÅÍ·Î Á÷Á¢ ¼³Á¤°¡´ÉÇÏ´Ù */  
}; 
 
epoll_data_t¸¦ À¯½ÉÈ÷ º¼Çʿ䰡 ÀÖ´Ù. unionÀÌ¶ó¼­ »ç¿ëÀÚ Á¤ÀÇ µ¥ÀÌÅÍ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ³Ñ±æ ¼ö°¡ ÀÖ½À´Ï´Ù. ¿¹¸¦µé¾î ¿©±â¿¡ pid°ªÀ̶óµçÁö ¼ÒÄÏÁöÁ¤¹øÈ£ ȤÀº ¸Þ½ÃÁö¸¦ Æ÷ÇÔÇÑ Á¤º¸¸¦ ±¸Á¶Ã¼·Î ³Ñ°ÜÁÙ ¼ö ÀÖ´Â °ÅÁÒ.

op´Â ´ÙÀ½°ú °°Àº Á¾·ùÀÇ ÀÛ¾÷¸í·ÉµéÀ» °¡Áö°í ÀÖ½À´Ï´Ù. poll(2)¿Í ºñ±³Çغ¸¸é ¸Å¿ì À¯»çÇÔÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.
  • EPOLL_CTL_ADD
    fd¸¦ epoll À̺¥Æ® Ç®¿¡ Ãß°¡ÇϱâÀ§Çؼ­ »ç¿ëÇÑ´Ù.
  • EPOLL_CTL_DEL
    fd¸¦ epoll À̺¥Æ® Ç®¿¡¼­ Á¦°ÅÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.
  • EPOLL_CTL_MOD
    ÀÌ¹Ì À̺¥Æ® Ç®¿¡ µé¾î ÀÖ´Â fd¿¡ ´ëÇØ¼­ eventÀÇ ¸â¹ö°ªÀ» º¯°æÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.
  • EPOLLIN
    ÀÔ·Â(read)À̺¥Æ®¿¡ ´ëÇØ¼­ °Ë»çÇÑ´Ù.
  • EPOLLOUT
    Ãâ·Â(write)À̺¥Æ®¿¡ ´ëÇØ¼­ °Ë»çÇÑ´Ù.
  • EPOLLERR
    ÆÄÀÏÁöÁ¤ÀÚ¿¡ ¿¡·¯°¡ ¹ß»ýÇß´ÂÁö¸¦ °Ë»çÇÑ´Ù.
  • EPOLLHUP
    Hang upÀÌ ¹ß»ýÇß´ÂÁö °Ë»çÇÑ´Ù.
  • EPOLLPRI
    ÆÄÀÏÁöÁ¤ÀÚ¿¡ Áß¿äÇÑ µ¥ÀÌÅͰ¡ ¹ß»ýÇß´ÂÁö °Ë»çÇÑ´Ù.
  • EPOLLET
    ÆÄÀÏÁöÁ¤ÀÚ¿¡ ´ëÇØ¼­ ET ÇൿÀ» ¼³Á¤ÇÑ´Ù. ±âº» °ªÀº LT.


4 epollÀÇ ÀåÁ¡/´ÜÁ¡/ÇØ°á¹æ¹ý

4.1 ÀåÁ¡

  1. Á»´õ ÀûÀº ÀÚ¿øÀ» Â÷ÁöÇϸ鼭 È¿À²Àº ±âÁ¸ÀÇ ±â¼úº¸´Ù ÁÁ´Ù.
  2. select, pollµî¿¡ ºñÇØ ÃæºÐÈ÷ È¿À²ÀûÀ̸鼭µµ RealTime Signal¿¡ ºñÇØ¼­ »ç¿ëÇϱ⠽±´Ù.

4.2 ´ÜÁ¡

  1. Ç¥ÁØ Áö¿ø»çÇ×ÀÌ ¾Æ´Ï¶ó¼­ ´Ù¸¥ À¯´Ð½º¿¡¼­´Â »ç¿ëÇÒ ¼ö ¾ø´Ù.

5 ¿¹Á¦ ÇÁ·Î±×·¥

epoll½Ã½ºÅÛ ±¸ÃàÀ» ±â³ä»ï¾Æ¼­ °£´ÜÇÑ ¿¹Á¦ÇÁ·Î±×·¥À» ¸¸µé¾î º¸¾Ò´Ù. ¾Æ·¡ ÇÁ·Î±×·¥Àº echo¼­¹öÀÇ epoll¹öÁ¯À¸·Î LT¸ðµå´Ù.
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/epoll.h> 
#include <arpa/inet.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <fcntl.h> 
#include <sys/ioctl.h> 
 
#define SA  struct sockaddr 
#define EPOLL_SIZE        20 
 
int main(int argc, char **argv) 
{ 
    struct sockaddr_in addr, clientaddr; 
    struct eph_comm *conn; 
    int sfd; 
    int cfd; 
    int clilen; 
    int flags = 1; 
    int n, i; 
    int readn; 
    struct epoll_event ev,*events; 
 
    int efd; 
    char buf_in[256]; 
 
    // À̺¥Æ® Ç®ÀÇ Å©±â¸¸Å­ events±¸Á¶Ã¼¸¦ »ý¼ºÇÑ´Ù. 
    events = (struct epoll_event *)malloc(sizeof(*events) * EPOLL_SIZE); 
 
    // epoll_create¸¦ ÀÌ¿ëÇØ¼­ epoll ÁöÁ¤ÀÚ¸¦ »ý¼ºÇÑ´Ù.     
    if ((efd = epoll_create(100)) < 0) 
    { 
        perror("epoll_create error"); 
        return 1; 
    } 
 
 
    // -------------------------------------- 
    // µè±â ¼ÒÄÏ »ý¼ºÀ» À§ÇÑ ÀϹÝÀûÀÎ ÄÚµå 
    clilen = sizeof(clientaddr); 
    sfd = socket(AF_INET, SOCK_STREAM, 0);     
    if (sfd == -1) 
    { 
        perror("socket error :"); 
        close(sfd); 
        return 1; 
    } 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(atoi(argv[1])); 
    addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    if (bind (sfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) 
    { 
        close(sfd); 
        return 1; 
    } 
    listen(sfd, 5); 
    // -------------------------------------- 
 
    // ¸¸µé¾îÁø µè±â ¼ÒÄÏÀ» epollÀ̺¥Æ® Ç®¿¡ Ãß°¡ÇÑ´Ù. 
    // EPOLLIN(read) À̺¥Æ®ÀÇ ¹ß»ýÀ» ŽÁöÇÑ´Ù. 
    ev.events = EPOLLIN; 
    ev.data.fd = sfd; 
    epoll_ctl(efd, EPOLL_CTL_ADD, sfd, &ev); 
    while(1) 
    { 
        // epollÀ̺¥Æ® Ç®¿¡¼­ À̺¥Æ®°¡ ¹ß»ýÇß´ÂÁö¸¦ °Ë»çÇÑ´Ù. 
        n = epoll_wait(efd, events, EPOLL_SIZE, -1); 
        if (n == -1 ) 
        { 
            perror("epoll wait error"); 
        } 
 
        // ¸¸¾à À̺¥Æ®°¡ ¹ß»ýÇß´Ù¸é ¹ß»ýÇÑ À̺¥Æ®ÀÇ ¼ö¸¸Å­ 
        // µ¹¸é¼­ µ¥ÀÌÅ͸¦ ÀÐ¾î ¿É´Ï´Ù.  
        for (i = 0;    i < n; i++) 
        { 
            // ¸¸¾à À̺¥Æ®°¡ µè±â ¼ÒÄÏ¿¡¼­ ¹ß»ýÇÑ °Å¶ó¸é 
            // accept¸¦ ÀÌ¿ëÇØ¼­ ¿¬°á ¼ÒÄÏÀ» »ý¼ºÇÑ´Ù.  
            if (events[i].data.fd == sfd) 
            { 
                printf("Accept\n"); 
                cfd = accept(sfd, (SA *)&clientaddr, &clilen); 
                ev.events = EPOLLIN; 
                ev.data.fd = cfd; 
                epoll_ctl(efd, EPOLL_CTL_ADD, cfd, &ev); 
            } 
            // ¿¬°á¼ÒÄÏ¿¡¼­ À̺¥Æ®°¡ ¹ß»ýÇß´Ù¸é 
            // µ¥ÀÌÅ͸¦ Àд´Ù. 
            else 
            { 
                memset(buf_in, 0x00, 256); 
                readn = read(events[i].data.fd, buf_in, 255); 
                if (readn <= 0) 
                { 
                    epoll_ctl(efd, EPOLL_CTL_DEL, events[i].data.fd, events); 
                    close(events[i].data.fd); 
                    printf("Close fd\n", cfd); 
                } 
                else 
                { 
                    printf("read data %s\n", buf_in); 
                    write(events[i].data.fd, buf_in, readn); 
                } 
            } 
        } 
    } 
} 
 

6 ÇÁ·ÎÁ§Æ® ÁøÇà

  1. epoll·Î echo ¼­¹ö¸¦ ¸¸µçµÚ ´Ù¸¥ ±â¼ú°ú ºñ±³ÇØ ¼º´Éºñ±³¸¦ Çϵµ·Ï ÇϰڴÙ.

7 Âü°í ¹®¼­

  1. [http]epoll°ú ´Ù¸¥ ¼ÒÄÏ¿¬°á¹æ½Ä ºñ±³
  2. yundream RTS ¿¬±¸ À§Å°
  3. [http]ircu irc¼­¹ö epoll, kqueue, poll ¹ü¿ë ÄÚµå

ÃÖÃÊ ÀÛ¼ºÀÏ : 2004³â Âë
¸¶Áö¸· ¼öÁ¤ÀÏ : 2011³â 6¿ù 10ÀÏ
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.