Real-Time Signal°ú À̺¥Æ®±â¹Ý ³×Æ®¿öÅ· ±â¼ú¿¡ ´ëÇÑ ¼Ò°³
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Contents

1 ¼Ò°³
2 °³¿ä
3 ¼Ò°³
4 À̺¥Æ® Àü´Þ ¹æ½Ä
4.1 ´ÙÁß ¿¬°áÀÇ Ã³¸®
5 ¸®´ª½º Ä¿³Î ¸ÅÄ¿´ÏÁò
5.1 select() ½Ã½ºÅÛ ÄÝ
5.2 poll() ½Ã½ºÅÛ ÄÝ
5.3 POSIX. 4 Real Time Signals
6 À̺¥Æ® ÅëÁö¿¡¼­ÀÇ È¿À²¼º
7 RTSÀÇ ´ÜÁ¡/ÇØ°á¹æ¹ý
7.1 Linux¿¡¼­ÀÇ Signal Queue Å©±â
7.2 Siganl queue Overflow ¹®Á¦
7.3 Signal-per-fdÀÇ »ç¿ë
8 2.4.x¿¡¼­ÀÇ signal-per-fd Ä¿³Î ÆÐÄ¡
8.1 kernel ´Ù¿î·Îµå ¹× ÆÐÄ¡ Çϱâ
8.2 2.6¿¡¼­ÀÇ signal-per-fd
8.3 °£´ÜÇÑ ¼ÀÇà ÇÁ·Î±×·¥
9 ÇÁ·ÎÁ§Æ® ÁøÇà
10 Âü°í ¹®Çå

  • ÀÌ ¹®¼­´Â ÀϺΠ2.6ÀÇ ³»¿ëÀ» Æ÷ÇÔÇϰí ÀÖÁö¸¸ ÀüüÀûÀ¸·Î Ä¿³Î 2.4¸¦ ±âÁØÀ¸·Î ÀÛ¼ºµÇ¾ú´Ù. ÃֽŠĿ³ÎÀÇ º¯°æ»çÇ×À» Á¶»çÇØ¼­ ¼öÁ¤ÇÒ Çʿ䰡 ÀÖ´Ù.

1 ¼Ò°³

¸î¹ø¿¡ °ÉÃļ­ RTS¸¦ ´Ù·ç¾ú´Âµ¥ ³Ê¹« ÇÇ»óÀûÀÎ ³»¿ë¸¸ ´Ù·é°Í °°´Ù. ¾Æ¹«·¡µµ Á¦´ë·Î »ç¿ëÇϱâ À§Çؼ­´Â ½ÇÁ¦·Î ¼­ºñ½º °¡´ÉÇÑ °£´ÜÇÑ ÀÎÅÍ³Ý ¼­ºñ½º ÇÁ·Î±×·¥ÀÌ¶óµµ °³¹ßÇØ¾ß ÇÒ°Í °°´Ù.

±×·¯±â À§Çؼ­´Â ¸î°¡Áö ÇØ°áÇØ¾ßµÉ ¹®Á¦µéÀÌ ÀÖÀ¸¸ç, ´Ù¸¥ À̺¥Æ® Àü´Þ ¹æ¹ýÀÎ select(), /dev/pollµî°ú ºñ±³Çؼ­ ¾î¶² ÀÕÁ¡À» °¡Áö°í ÀÖ´ÂÁöµµ È®½ÇÈ÷ ¤°í ³Ñ¾î°¡¾ß ÇÑ´Ù.

ÀÌ¿Í °ü·ÃµÈ ¹®¼­¸¦ ã´øÁß HP ¿¬±¸¼ÒÀÇ ÈǸ¢ÇÑ ¹®¼­¸¦ ã°Ô µÇ¾ú°í ÀÌ ¹®¼­¸¦ ÀÌ¿ëÇØ¼­ ¿¬±¸¸¦ ÇÏ°í °á°ú¸¦ ÀÌ¿ëÇÑ ÀÀ¿ë ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇϱâ·Î °áÁ¤Çß´Ù.

2 °³¿ä

ÀÎÅ׳ׯ® ¼­ºñ½ºµéÀÇ ¹®Á¦Á¡Àº ¹«¾ùÀϱî ?. ¾Æ¸¶µµ ¸¹Àº ¾çÀÇ µ¥ÀÌÅ͸¦ 󸮶§¹®¿¡ °ñÄ¡¾ÆÇà °Å¶ó°í »ý°¢µÉ ¼ö ÀÖ°ÔÁö¸¸, ½ÇÁ¦ °Þ´Â ÁøÁ¤ÇÑ °ñÄ¡°Å¸®´Â ´Ù¼öÀÇ ¿¬°áÀ» ó¸®ÇØ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù. º¸Åë ÀÌ·¯ÇÑ ¿¬°á¿¡ À־ Åë½Å¿¡ »ç¿ëµÇ´Â µ¥ÀÌÅÍ ÀÚüÀÇ Å©±â´Â ±×¸® ¸¹Áö ¾ÊÀº ¹Ý¸é ¿äû°ú ÀÀ´äÀÌ ¸Å¿ì ºó¹øÇÏ°Ô ÀÌ·ç¾î Áö´Âµ¥, ¼­¹öÃø¿¡¼­ º¸ÀÚ¸é ÀÌ·¯ÇÑ ¿äûÀ» ºü¸¥½Ã°£¿¡ ¹ÞÀ» ¼ö ÀÖ¾î¾ß Çϸç, ¿äûÀ» ´©°¡Çß´ÂÁö ÃÖ´ëÇÑ È¿À²ÀûÀ¸·Î ÆÇ´ÜÇØ¼­ ¿äû¿¡ ´ëÇÑ ÀÀ´äÀ» º¸³»ÁÙ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

ÀÌ ±Û¿¡¼­ ¿ì¸®´Â ÀÎÅÍ³×Æ® ¼­¹ö¿¡¼­ ´Ù¼öÀÇ ¿äû¿¡ ÀÇÇÑ ³×Æ®¿öÅ© I/O À̺¥Æ®¸¦ È¿°úÀûÀ¸·Î ó¸®Çϱâ À§ÇÑ ¸î°¡Áö ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¼ °ÍÀÌ´Ù. ¾Æ¸¶µµ ÀÌ »çÀÌÆ®¿¡¼­ ¸î¹ø ´Ù·ç¾îº»ÀûÀÌ ÀÖ´Â (ºñ±³Àû ÃÖ±ÙÀÇ À̺¥Æ® 󸮱â¼úÀÎ)RTS¸¦ À§ÁÖ·Î ¼³¸íÇÒ °ÍÀ̸ç, RTS°¡ Á¤¸»·Î È¿À²ÀûÀ¸·Î À̺¥Æ®¸¦ ó¸®ÇÒ ¼ö ÀÖ´ÂÁö¸¦ È®ÀÎÇϱâ À§Çؼ­ °íÀüÀûÀÎ À̺¥Æ® ó¸® ¹æ½ÄÀÎ select()¿Í /dev/poll°úÀÇ ¼º´É Å×½ºÆ®µµ ÇÔ²² ÇÏ°Ô µÉ °ÍÀÌ´Ù.

¶ÇÇÑ RTS¿Í °°Àº ·¹º§¿¡¼­ /dev/epollµµ ´Ù·ç°í ¼­·Î ºñ±³ÇÒ °ÍÀÌ´Ù. /dev/epollÀº ÃÖ±Ù¿¡ ³ª¿Â À̺¥Æ® 󸮱â¼ú·Î ¸Å¿ì ÁÁÀº ¼º´ÉÀ» º¸¿©ÁØ´Ù°í ¾Ë·ÁÁ® ÀÖ´Ù. /dev/epoll¿¡ ´ëÇÑ ³»¿ëÀº gururang´ÔÀÇ epollÀ§Å°¸¦ ¸¹ÀÌ Âü°íÇÏ°Ô µÉ°ÍÀÌ´Ù.

RTS¸¦ ´Ù·ë¿¡ À־´Â Áߺ¹µÈ ³»¿ëÀº °¡±ÞÀû ÇÇÇϰí, ¸î¹ø ¾ð±ÞµÇ¾úÁö¸¸ ±íÀÌ ´Ù·çÁö ¾ÊÀº signal-per-fd¿¡ ´ëÇÑ ³»¿ëÀ» ²Ï ½Éµµ ÀÖ°Ô ´Ù·ç°í ½ÇÁ¦ Àû¿ëÈÄ ¿¹Á¦Äڵ带 ¸¸µé¾î º¸µµ·Ï ÇÒ°ÍÀÌ´Ù. signal-per-fd¸¦ »ç¿ëÇÒ°æ¿ì ½Ã±×³ÎÀ» Á¦¾îÇϱâ À§ÇÑ ¿©·¯°¡Áö º¹ÀâÇÑ ³»¿ëµé¿¡ ´ëÇØ ½Å°æ¾²Áö ¾Ê°Ô µÇ¹Ç·Î Á»´õ Äڵ忡 ÁýÁßÇÒ ¼ö ÀÖÀ¸¸ç, Á»´õ ¾ÈÀüÇÑ ÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖ°Ô µÈ´Ù.

3 ¼Ò°³

ÀÌ ¹®¼­ÀÇ Á¦¸ñÀÌ ³×Æ®¿öÅ© I/OÀ̺¥Æ® 󸮿¡ °üÇÑ ¿¬±¸ÀÌ´Ù. ¿Ö ÀÌ·¯ÇÑ ÁÖÁ¦¸¦ ´Ù·ç°Ô µÇ¾ú´ÂÁö ÀÎÅÍ³×Æ®¿Í ÀÎÅÍ³×Æ®¿¡ °ü·ÃµÈ ±â¼úµ¿Çâµé¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

À¥°ú e-commerce°¡ ºü¸¥ ¼Óµµ·Î ¹ßÀüÇϰí ÀÖÀ¸¸ç, ÀÌ·ÎÀÎÇØ ÀÎÅÍ³×Æ®ÀÇ Æ®·¡ÇÈ ¿ª½Ã °¡ÆÄ¸£°Ô Áõ°¡Çϰí ÀÖ´Ù. À¥¼­ºñ½º¿Í °ü·ÃµÈ ³×Æ®¿öÅ© ¾ÖÇø®ÄÉÀ̼ǰú ÇÁ·Ï½Ã(proxy)µéÀº Àü¼¼°è¿¡¼­ µé¾î¿À´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿äûÀ» ó¸®ÇÒ ¼ö ÀÖ¾î¾ß¸¸ ÇÑ´Ù. °Å±â¿¡´Ù °¡ ¼­¹öµéÀº °ÅÀÇ µ¿½Ã¿¡ ¹ß»ýÇÏ´Â ¼ö¸¹Àº ¿¬°áÀ» °¡´ÉÇÑ ºü¸¥½Ã°£¿¡ ó¸®ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¸¸¾à ¿¬°á󸮰¡ ´Ê¾îÁö°Ô µÈ´Ù¸é Ŭ¶óÀÌ¾ðÆ®´Â ¼­ºñ½ºÀÇ ÀÌ¿ëÀ» À§Çؼ­ ¸¹Àº ½Ã°£À» ±â´Ù·Á¾ß ÇÒ °ÍÀÌ°í °í°´ÀÇ Àγ»½ÉÀ» ¹þ¾î³ª°Ô µÉ°æ¿ì ºÐ¸íÈ÷ °í°´À» ÀÒ¾î ¹ö¸®°Ô µÉ°ÍÀÌ´Ù. ƯÈ÷ ´Ù¸¥ °Íµé(´ÜÁö µ¥ÀÌÅ͸¦ Åë½ÅÇϴ°Í)¿¡ ºñÇØ ¿¬°áÀº ¸Å¿ì ¸¹Àº ½Ã°£À» ¼ÒºñÇÑ´Ù. °í·Î °¡´ÉÇÏ¸é ºü¸£°Ô Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°áÀ» °¨ÁöÇϰí À̸¦ ó¸®ÇØ ³¾ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

°¡Àå Àαâ ÀÖ´Â ÀÎÅÍ³×Æ® ¼­ºñ½ºÀÎ À¥¼­ºñ½º¸¦ ¿¹·Î µé¾îº¸ÀÚ. À¥¼­ºñ½ºÀÇ °æ¿ì µ¿½Ã¿¡ ¿©·¯°³ÀÇ ³×Æ®¿öÅ© I/O¸¦ ó¸®Çϱâ À§Çؼ­ ¿î¿µÃ¼Á¦¿¡¼­ Á¦°øÇÏ´Â À̺¥Æ® Àü´Þ(devent-dispatch) ¹æ½ÄÀ» »ç¿ëÇÑ´Ù. ¾ÆÁ÷±îÁö´Â ¸¹Àº ¼­¹öµéÀÌ °íÀüÀûÀÎ À̺¥Æ® Àü´Þ ¹æ½ÄµéÀ» »ç¿ëÇϴµ¥ À̵é À̺¥Æ® Àü´Þ¹æ½ÄÀº ¿À·¡µÈ ¸¸Å­ ±×¸® È¿À²ÀûÀÌÁö ¸øÇÏ´Ù´Â ´ÜÁ¡À» °¡Áø´Ù. ¾ÆÆÄÄ¡ À¥¼­¹öÀÇ °æ¿ì ÀϹÝÀûÀÎ ¼­ºñ½º¸¦ ¿î¿µÇϴµ¥¿¡´Â ¹®Á¦°¡ ¾øÁö¸¸ Á¶±Ý´õ ±Ô¸ð°¡ Ä¿Áö¸é ¿¬°áÁõ°¡¿¡ µû¸¥ ¸¹Àº ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. ¿¬°áÀÌ ´À·ÁÁö°Å³ª ¾Æ¿¹ ¿¬°á½Ãµµ ÀÚü°¡ ½ÇÆÐÇÏ´Â °æ¿ì°¡ ´ëÇ¥ÀûÀÎ °æ¿ìÀε¥, ÀÌ·¯ÇÑ ¹®Á¦ÀÇ ÇØ°áÀ» À§Çؼ­´Â À¥¼­¹ö Æ©´×°ú Çϵå¿þ¾î Áõ¼³µî¿¡ ¸¹Àº ½Ã°£°í ºñ¿ëÀ» ÅõÀÚÇÏ°Ô µÈ´Ù.

ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­ TUX¿Í °°ÀÌ ¾Æ¿¹ Ä¿³Î °ø°£À¸·Î ¼­ºñ½º ±â´ÉÀ» ¿Ã·Á¼­ ¼º´ÉÀ» ±ØÀûÀ¸·Î Çâ»ó½ÃÄÑ ¹ö¸®´Â Á¦Ç°µéµµ ÀÖ´Ù. ±×·¯³ª ¿©±â¿¡¼­´Â ÀÌ·¯ÇÑ °ÍµéÀº ´Ù·çÁö ¾ÊÀ» °ÍÀÌ´Ù. À̺¥Æ® Àü´Þ¹æ½ÄÀ» »ç¿ëÇØ¼­ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϴµ¥ ÁýÁßÇϵµ·Ï ÇϰڴÙ.

¾ÕÀ¸·ÎÀÇ Àå¿¡¼­ ¿ì¸®´Â select()½Ã½ºÅÛÄݰú /dev/poll ÀÎÅÍÆäÀ̽º ±×¸®°í POSIx.4 Real Time Signal(ÀÌÇÏ RTS)ÀÇ À̺¥Æ® Àü´Þ ±â¹ýµé¿¡ ´ëÇØ¼­ ´Ù·ê °ÍÀÌ´Ù.

4 À̺¥Æ® Àü´Þ ¹æ½Ä

À̹øÀå¿¡¼­ ¿ì¸®´Â ´ÙÁß¿¬°áÀ» ó¸®ÇÏ´Â ¼­¹öµéÀÇ µÎ°¡Áö À¯Çü¿¡ ´ëÇØ¼­ ¾Ë¾Æº¼ °ÍÀÌ´Ù. ±×¸®°í ¸®´ª½º Ä¿³Î¿¡¼­ Áö¿øÇÏ´Â ¿©·¯°¡Áö À̺¥Æ® Àü´Þ¹æ½ÄµéÀ» ¾Ë¾Æº¼ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ³»¿ëµéÀº ÀÌ¹Ì ÀÌ»çÀÌÆ®¿¡¼­ ¿©·¯¹ø¿¡ °ÉÃļ­ ´Ù·ç¾î Á³À¸¹Ç·Î ÁÖ·Î °¢°¢ÀÇ ¹æ½ÄÀÇ È¿À²¼º°ú ´ÜÁ¡, ¾î¶² °ÍÀ» ¼±ÅÃÇØ¾ß ÇÏ´ÂÁö µî¿¡ ÃÐÁ¡À» ¸ÂÃâ °ÍÀÌ´Ù.

4.1 ´ÙÁß ¿¬°áÀÇ Ã³¸®

³×Æ®¿öÅ©»ó¿¡¼­ ´ÙÁß ¿¬°áÀ» ó¸®ÇÏ´Â µ¥´Â Å©°Ô 2°¡Áö ¹æ¹ýÀÌ Á¸ÀçÇÑ´Ù.
  • ¾²·¹µå ±â¹Ý : ´ÙÁß¿¬°áÀ» ó¸®Çϱâ À§ÇÑ ¹æ¹ýÁß Çϳª·Î ¸ÞÀÎ ¾²·¹µå¿¡¼­ accept¸¦ ÀÌ¿ëÇØ¼­ ¿¬°áÀ» ±â´Ù¸®°í ÀÖ´Ù°¡ »õ·Î¿î ¿¬°á¼ÒÄÏÀÌ ¸¸µé¾îÁö¸é ¿¬°á¼ÒÄϸ¸À» ó¸®ÇÏ´Â ¾²·¹µå¸¦ »ý¼ºÇؼ­ ¾²·¹µå´ç ÇϳªÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ó¸®Çϵµ·Ï ÇÏ´Â ¹æ½ÄÀÌ´Ù. ¿©±â¿¡´Â ¾²·¹µåÀÇ »ý¼º½Ã°£¿¡ µû¶ó¼­ µÎ°¡Áö ´Ù¸¥ ¹æ½ÄÀÌ Á¸ÀçÇÑ´Ù.
    • ¿äûÀÌ ÀÖÀ» ¶§¸¶´Ù(on-demand)) : accept¿¡ ÀÇÇØ¼­ »õ·Î¿î ¿¬°áÀÌ µé¾î¿Ã ¶§¸¶´Ù ¿¬°áÀ» ó¸®ÇÒ ¾²·¹µå¸¦ »ý¼ºÇÏ´Â ¹æ½ÄÀÌ´Ù. ¸Å¿ì Á÷°üÀûÀ̰í ÄÚµùÀÌ ÆíÇϱä ÇÏÁö¸¸ ¾²·¹µå¸¦ »ý¼ºÇÒ ¶§ ¸¹Àº ºñ¿ëÀ» ÁöºÒÇÑ´Ù´Â ´ÜÁ¡À» °¡Áø´Ù. ¿¬°áÀÌ ºó¹øÇÏ°Ô ÀÌ·ç¾îÁö´Â ¼­¹öÀÏ °æ¿ì ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù.
    • ¾²·¹µå Ç® ¹æ½Ä : on-demand¹æ½ÄÀÇ ´ÜÁ¡À» ±Øº¹Çϱâ À§Çؼ­ »ç¿ëµÇ´Â ¹æ¹ýÀ¸·Î ¹Ì¸® ¿¬°áÀ» ó¸®ÇÒ ¾²·¹µå¸¦ ÀÏÁ¤ °¹¼ö »ý¼º½ÃÄÑ ³õ´Â ¹æ½ÄÀÌ´Ù. ¸ÞÀÎ ¾²·¹µå´Â »õ·Î¿î ¿¬°áÀÌ ¸¸µé¾î Á³À» ¶§ ¿¬°á 󸮸¦ À§ÇÑ »õ·Î¿î ¾²·¹µå¸¦ »ý¼º½ÃŰ´Â ´ë½Å ÀÌ¹Ì ¸¸µé¾îÁø ¾²·¹µå¿¡ ¿¬°áÀ» À§ÀÓÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÑ´Ù. ÀÌ ¹æ¹ýÀ» ÀÌ¿ëÇÏ¸é ¾²·¹µå »ý¼º½Ã ¹ß»ýÇÏ´Â ¿À¹öÇìµå¸¦ »ó´çÈ÷ ÇØ¼ÒÇÒ ¼ö ÀÖ´Ù. on-demand¹æ½Ä¿¡ ºñÇØ¼­ ±¸ÇöÀÌ Á»´õ º¹ÀâÇÏ°í ¿¬°áÀÌ ÀûÀº ¼­¹öÀÇ °æ¿ì ¿ÀÈ÷·Á ÀÚ¿øÀ» ³¶ºñÇÒ ¼ö ÀÖ´Ù´Â ´ÜÁ¡À» °¡Áø´Ù.
  • À̺¥Æ® ±â¹Ý : À̺¥Æ® ±â¹Ý ¾îÇø®ÄÉÀ̼ÇÀº ÇϳªÀÇ ¾²·¹µå¿¡¼­ ºñºÀ¼â(non-blocking) I/O¹æ½ÄÀ¸·Î ¿©·¯°³ÀÇ ¿¬°áÀ» ó¸®ÇÑ´Ù. ¿î¿µÃ¼Á¦´Â Çϳª ȤÀº ¿©·¯°³ÀÇ ¿¬°á·Î ºÎÅÍ À̺¥Æ®°¡ ¹ß»ýÇϸé À̸¦ ¾îÇø®ÄÉÀ̼ÇÀ¸·Î Å뺸ÇÏ°í ¾îÇø®ÄÉÀ̼ÇÀº Å뺸µÈ Á¤º¸¸¦ ¹ÙÅÁÀ¸·Î À̺¥Æ® ¹ß»ýÇÑ ÆÄÀÏ(¼ÒÄÏ)À» ÀÌ¿ëÇØ¼­ Åë½ÅÀ» ÇÑ´Ù. ¾îÇø®ÄÉÀ̼ǿ¡ À̺¥Æ®¸¦ Å뺸Çϱâ À§Çؼ­ ¿î¿µÃ¼Á¦´Â ¸¸µé¾îÁø ¿¬°á¿¡ ´ëÇÑ ÆÄÀÏÁöÁ¤ÀÚ¿¡ ´ëÇÑ ¸®½ºÆ®¸¦ À¯ÁöÇϰí ÀÖ¾î¾ß ÇÑ´Ù. ¿î¿µÃ¼Á¦´Â ÀÌ ÆÄÀÏÁöÁ¤ÀÚ ¸®½ºÆ®ÀÇ °¢ ÁöÁ¤ÀÚ¿¡ À̺¥Æ®°¡ ¹ß»ýÇÏ´ÂÁö¸¦ È®ÀÎÀ» ÇØ¼­ À̺¥Æ®°¡ ¹ß»ýÇÏ¸é ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î À̺¥Æ®¸¦ Àü´ÞÇÑ´Ù.

ÀϹÝÀûÀ¸·Î ¿¬°á´ç ¾²·¹µå(thread-per-connection)¸¦ »ý¼ºÇÏ´Â ¼­¹ö´Â ¸¹Àº ¾²·¹µå°¡ »ý¼ºµÉ °æ¿ì ¹®¹é±³È¯(context switching)À» À§ÇÑ »ó´çÇÑ ¿À¹öÇìµå°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù´Â ´ÜÁ¡À» °¡Áø´Ù. ¶ÇÇÑ °¢°¢ÀÇ ¾²·¹µå´Â ÀڽŸ¸ÀÇ ½ºÅðø°£°ú ¿¬°á󸮸¦ À§ÇÑ º°µµÀÇ ·çƾÀ» °¡Á®¾ß Çϱ⠶§¹®¿¡ ¸Þ¸ð¸® °ø°£¿ª½Ã ¸¹ÀÌ Â÷ÁöÇÑ´Ù´Â ¹®Á¦Á¡µµ °¡Áö°Ô µÈ´Ù. ¸¸¾à ¿î¿µÃ¼Á¦°¡ Ä¿³Î·¹º§ ¾²·¹µå¸¦ Áö¿øÇÏÁö ¾Ê´Â´Ù¸é ÀÌ·¯ÇÑ ´ÜÁ¡Àº ´õ¿í Å©°Ô ºÎ°¢µÉ °ÍÀÌ´Ù. ¸®´ª½º°¡ ÀÌ·¯ÇÑ °æ¿ì¿¡ ÇØ´çµÇ´Âµ¥ clone()¸¦ ÅëÇÑ ÇÁ·Î¼¼½º ¹æ½ÄÀÇ ¾²·¹µå¸¦ »ç¿ëÇÏ°Ô µÇ¹Ç·Î ´Ù¸¥ ¿î¿µÃ¼Á¦ º¸´Ù ´õ¿í °úµµÇÑ ¿À¹öÇìµå¿Í ¸Þ¸ð¸® ¼Òºñ¸¦ °¡Áö°Ô µÈ´Ù. ¾î¶µç °£¿¡ ¾²·¹µå(ȤÀº ÇÁ·Î¼¼½º)±â¹ÝÀÇ ¼­¹ö´Â ¸¹Àº ¿¬°áÀ» ó¸®Çϴµ¥ À־ ±Ùº»ÀûÀÎ ¹®Á¦¸¦ °¡Áö°Ô µÈ´Ù.

À§ÀÇ ÀÌÀ¯·Î ¸¹Àº ¿î¿µÃ¼Á¦µéÀÌ À̺¥Æ® ±â¹Ýó¸® ¹æ½ÄÀ» Á¦°øÇϰí ÀÖ´Ù. ¹°·Ð À̺¥Æ® ±â¹Ý 󸮸¦ µµÀÔÇÏ·Á´Â ¼­¹ö´Â ´ëºÎºÐ ¸Å¿ì ¹Ù»Ú°Ô ÀÛµ¿ÇÒ °ÍÀ̶ó°í ¿¹»óÇϰí ÀÛ¼ºµÇ¹Ç·Î À̺¥Æ® 󸮹æ½Ä°ú ÇÔ²² ´ÙÁß ¾²·¹µå ±â¹ý±îÁö ÇÔ²² »ç¿ëÇÏ°Ô µÈ´Ù. ÀÌ·¯ÇÑ ¼­¹öµé¿¡¼­ ¾î¶°ÇÑ À̺¥Æ® 󸮹æ½ÄÀ» »ç¿ëÇÒ °ÍÀΰ¡ ÇÏ´Â °ÍÀº ¸Å¿ì Áß¿äÇÑ ¹®Á¦´Ù. ¿©·¯ Á¾·ùÀÇ À̺¥Æ® 󸮹æ½ÄÀÌ Á¸ÀçÇϴµ¥ °¢°¢ ¿ëµµ¿Í ¼º´É¿¡ À־ Â÷À̰¡ Àֱ⠶§¹®ÀÌ´Ù. ´ÙÀ½Àå¿¡¼­´Â ¿©±â¿¡ ´ëÇØ¼­ ÁýÁßÀûÀ¸·Î ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

5 ¸®´ª½º Ä¿³Î ¸ÅÄ¿´ÏÁò

À§¿¡¼­ À̺¥Æ® ±â¹Ý ¼­¹ö´Â ³×Æ®¿öÅ©»óÀÇ ÀÔÃâ·Â(I/O)ÀÇ Ã³¸®¸¦ À§Çؼ­ À̺¥Æ® Àü´Þ±â¹ýÀ» »ç¿ëÇϰí ÀÖ´Ù. À̹ø Àå¿¡¼­´Â ¸®´ª½º Ä¿³Î¿¡¼­ ¾ÖÇø®ÄÉÀ̼ǿ¡ À̹øÆ®¸¦ ÅëÁöÇϱâ À§Çؼ­ »ç¿ëµÇ´Â ¸î°¡Áö ¹æ¹ýµé¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ´ÙÀ½Àº ¸®´ª½º Ä¿³Î¿¡¼­ Áö¿øÇÏ´Â À̺¥Æ® Àü´Þ ¹æ¹ýµéÀÌ´Ù.

5.1 select() ½Ã½ºÅÛ ÄÝ

select()´Â ´ÜÀÏ ¾²·¹µå³ª ÇÁ·Î¼¼½º¿¡¼­ ¿­·ÁÀÖ´Â ¿©·¯°³ÀÇ ¿¬°áÀ» ´ÙÁßÈ­ ½ÃÄѼ­ ó¸®ÇÒ¼ö ÀÖµµ·Ï Çã¿ëÇÑ´Ù. select()´Â fdsetÀ» °¡Áø´Ù. ÀÌ fdsetÀº 1024Å©±âÀÇ bitÅ×À̺í·Î½á ¿©±â¿¡ °ü½ÉÀÖ¾îÇÏ´Â ÆÄÀÏÀÇ ¸ñ·ÏÀ» µî·Ï½ÃŲ´Ù. ¸¸¾à µî·Ï½ÃŲ ÆÄÀÏ¿¡¼­ ÀÔÃâ·ÂÀÌ ¹ß»ýÇϸé select()´Â ¸®ÅÏÇϸç À̶§ fdsetÀÇ bitÅ×À̺íÀ» ¼³Á¤ÇÑ´Ù. ¸¸¾à 4¹ø ÆÄÀÏÁöÁ¤ÀÚ¿¡ Àбâ À̺¥Æ®°¡ ¹ß»ýÇß´Ù¸é fdset[3]ÀÇ °ªÀ» 1·Î ÇØ¼­ ³Ñ°ÜÁÖ´Â ¹æ½ÄÀÌ´Ù.

´ÙÀ½Àº select()ÀÇ Æ¯Â¡ÀûÀÎ ÀÛµ¿ÀÌ´Ù.
  1. ¾ÖÇø®ÄÉÀ̼ÇÀº °ü½ÉÀÖ¾îÇÏ´Â ÆÄÀÏÁöÁ¤ÀÚÀÇ ¸ñ·Ï(fdset)À» Ä¿³Î¿¡ Àü´ÞÇÑ´Ù.
  2. °ü½ÉÀÖ´Â ÆÄÀÏÁöÁ¤ÀÚ¿¡ ´ëÇÑ Á¤º¸´Â fdset¿¡ µå¹®µå¹® ¼³Á¤µÉ °ÍÀÌ´Ù. ÀÌ Á¤º¸´Â À¯Àú·¹º§¿¡¼­ Ä¿³Î·¹º§·Î º¹»çµÈ´Ù.
  3. Ä¿³ÎÀº fdsetÀ» ¸ðµÎ µÚÁö¸é¼­ °ü½ÉÀÖ´Â ÆÄÀÏÁöÁ¤ÀÚ¸¦ ã¾Æ³»°í ÀÌ ÆÄÀÏ ÁöÁ¤ÀÚ¿¡ À̺¥Æ®(Àбâ/¾²±â µ¥ÀÌÅͰ¡ ÀÖ´ÂÁö)°¡ ¹ß»ýÇß´ÂÁö¸¦ °Ë»çÇÑ´Ù. ´«Ä¡Ã«°ÚÁö¸¸ À̰ÍÀº ²Ï³ª ºñ¿ëÀÌ µå´Â ÀÛ¾÷ÀÌ´Ù.
  4. ÀÌ fdsetÀº Ä¿³Î ¸ðµå¿¡¼­ ´Ù½Ã À¯Àú¸ðµå·Î º¹»çµÇ°í select()´Â ¸®ÅϵȴÙ.

5.2 poll() ½Ã½ºÅÛ ÄÝ

poll()Àº ³»ºÎÀûÀ¸·Î select()¸¦ »ç¿ëÇÑ´Ù. ¾îÂ¸é select()¿Í ÀüÇô µ¿ÀÏÇÏ´Ù°í »ý°¢ÇÒ ¼öµµ ÀÖ´Ù. ±×·¸Áö¸¸ ÀÎÅÍÆäÀ̽º¿¡ À־ ¾à°£ÀÇ Â÷ÀÌÁ¡À» º¸ÀδÙ. poll()Àº °ü½ÉÀÖ´Â ÆÄÀÏÁöÁ¤ÀÚ¸¦ À¯ÁöÇϱâ À§Çؼ­ fdsetÀ» ÀÌ¿ëÇÏ´Â ´ë½Å¿¡ pollfd ±¸Á¶Ã¼¸¦ »ç¿ëÇÑ´Ù. ¸¸¾à pollfd±¸Á¶Ã¼¿¡¼­ À¯ÁöÇϰí ÀÖ´Â ÆÄÀÏ¿¡ µ¥ÀÌÅͰ¡ ÁغñµÇ¾î ÀÖ´Ù¸é ÀÌ ±¸Á¶Ã¼¸¦ ¸®ÅÏÇÏ°Ô µÈ´Ù.

poll()ÀÌ ³»ºÎÀûÀ¸·Î select()¸¦ »ç¿ëÇϰí ÀÖ´Ù´Â °Í ¶§¹®¿¡ ¾ð¶æ »ý°¢Çϱ⿡ ¾ðÁ¦³ª select()°¡ ´õ È¿À²ÀûÀÏ °Å¶ó°í »ý°¢ÇÏÁö¸¸ ±×·¸Áö¾Ê´Ù. select()´Â poll()¿¡ ºñÇØ¼­ ¸Å¿ì ³ÐÀº fdset¹üÀ§¿¡¼­ ÆÄÀÏÁöÁ¤ÀÚµéÀ» °Ë»öÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù.

5.3 POSIX. 4 Real Time Signals

RTS´Â Unix¿¡¼­ À̺¥Æ® ÅëÁö¸¦ À§ÇØ »ç¿ëÇÏ´Â ½Ã±×³ÎÀ» È®Àå½ÃŲ ÇüÅ·Π½Ã±×³ÎÀ» °´Ã¼·Î ´Ù·ç¸ç µ¿½Ã¿¡ ½Ã±×³ÎÀÇ ´ë±â¿­(queue)¸¦ À¯ÁöÇÑ´Ù. ±âÁ¸ÀÇ ½Ã±×³ÎÀº ½Ã±×³ÎÀ» ºñÆ®¸¦ ¼¼ÆÃÇÏ´Â °ÍÀ¸·Î ½Å°íÇϰ¡ Àü´Þ µÇ¾ú´ÂÁöÀÇ À¯¹«¸¦ °ü¸®ÇÑ´Ù. ±×·¯¹Ç·Î µ¿ÀÏÇÑ ½Ã±×³ÎÀÌ ºü¸¥ ½Ã°£¿¡(Çڵ鷯°¡ Á¾·áÇϱâ Àü¿¡)¿©·¯¹ø ¹ß»ýÇÏ°Ô µÈ´Ù¸é Çϳª¸¦ Á¦¿ÜÇÏ°í ¸ðµç ½Ã±×³ÎÀ» ÀÒ¾î ¹ö¸®°Ô µÈ´Ù.

´õºÒ¾î ½Ã±×³Î¿¡ ´ëÇØ¼­ ºñÆ® ¼³Á¤¸¸ÀÌ ¾Æ´Ñ sigino¸¦ Àü´ÞÇϴµ¥, À̸¦ ÅëÇØ¼­ ¿©·¯°¡Áö Á¤º¸µé±îÁö ÇÔ²² Àü´Þ °¡´ÉÇÏ´Ù.

´ÙÀ½Àº RTS¸¦ ÀÌ¿ëÇØ¼­ ÆÄÀÏ·Î ºÎÅÍ À̺¥Æ®¸¦ ÅëÁö ¹Þ±â À§ÇÑ ÀϹÝÀûÀÎ ÄÚµåÀÌ´Ù. RTSÀÀ¿ë¿¡ ´ëÇØ¼­´Â ÀÌ¹Ì ¿©·¯¹ø ´Ù·éÀûÀÌ ÀÖÀ¸¹Ç·Î ¼³¸íÀº ÇÏÁö ¾Êµµ·Ï ÇϰڴÙ.
// »õ·Î¿î ¿¬°áÀÌ µé¾î¿Ô´Ù¸é
int sd = accept(...);

// »õ·Î¿î ¿¬°á ¼ÒÄÏ¿¡ ´ëÇØ¼­ RTS¼³Á¤À» ÇÑ´Ù.  
fcntl (sd, F_SETOWN, getpid());
fcntl (sd, F_SETSIG, SIGRTMIN);

fcntl (sd, F_SETTL, O_NONBLOCK|O_ASYNC);

6 À̺¥Æ® ÅëÁö¿¡¼­ÀÇ È¿À²¼º

À̹øÀå¿¡¼­´Â °¢°¢ÀÇ À̺¥Æ® ÅëÁö¹æ¹ýÀÌ ¾î´ÀÁ¤µµÀÇ È¿À²¼ºÀ» °¡Áö°í ÀÖ´ÂÁö ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. Âü°í·Î ÀÌ Å×½ºÆ®ÀÇ °á°ú´Â ÇÊÀÚÀÇ Å×½ºÆ® °á°ú°¡ ¾Æ´Ñ HP ¿¬±¸¼Ò¿¡ÀÇ Scalability of Linux Event-Dispatch Mechanisms¹®¼­ÀÇ ³»¿ëÀ» ¹ßÃéÇÑ °ÍÀÓÀ» ¹ÚÈù´Ù.

ÀÌ Å×½ºÆ®¸¦ À§Çؼ­ (HPL)Àº uservers¶ó´Â Á¶±×¸¶ÇÑ À¥¼­¹ö¸¦ ¸¸µé¾î¼­ Å×½ºÆ® Çß´Ù. ¹°·Ð Å×½ºÆ®¸¦ À§Çؼ­ °¢ À̺¥Æ® ÅëÁö¹æ½ÄÀ» Àû¿ëÇÑ ¿©·¯°³ÀÇ À¥¼­¹ö°¡ ¸¸µé¾î Á³´Ù. Å×½ºÆ®´Â 2°³ÀÇ 400MHz ÆÒƼ¾öIII CPU¸¦ ÀåÂøÇÑ ½Ã½ºÅÛ¿¡¼­ ÀÌ·ç¾îÁ³´Ù. Ä¿³ÎÀº 2.4.0-test7¹öÁ¯ÀÌ´Ù. ÇöÀç 2.4.23¾ÈÁ¤¹öÁ¯±îÁö ³ª¿À°í 2.6.0-13Å×½ºÆ® ¹öÁ¯±îÁö ³ª¿Â »óÅ¿¡¼­ Çö½Ç¿¡ ¾à°£ µ¿¶³¾îÁø ±¸½ÄÀÇ Ä¿³ÎÀ» »ç¿ëÇϱä ÇßÁö¸¸ °¢ À̺¥Æ® ÅëÁö ¹æ½Ä°£ ¼º´É Â÷À̸¦ ºñ±³Çϴµ¥´Â º° ¹®Á¦°¡ ¾øÀ» °ÍÀÌ´Ù.
- ½Ã°£ÀÌ µÈ´Ù¸é Á÷Á¢ ÃÖ½ÅÀÇ È¯°æÀ» ¸¸µé¾î¼­ Å×½ºÆ®Çϵµ·Ï Çϰڴ٠-

Å×½ºÆ® ¼­¹ö°¡ ÁغñµÇ¾úÀ¸´Ï Å×½ºÆ® Ŭ¶óÀÌ¾ðÆ®µµ ÁغñµÇ¾î¾ß ÇÒ°ÍÀÌ´Ù. ¿ª½Ã Àü¿ëÀÇ Å×½ºÆ®¿ë Ŭ¶óÀÌ¾ðÆ®°¡ ÁغñµÇ¾ú´Ù. Å×½ºÆ®¿ë Ŭ¶óÀÌ¾ðÆ®´Â HP-UX10.20À» žÁ¦ÇÑ B180 RA-RISC±â°è¿¡¼­ ÀÛµ¿À» ÇÑ´Ù. ¼­¹ö¿Í Ŭ¶óÀÌ¾ðÆ®´Â 100Mbps ÆÐ½ºÆ® ÀÌ´õ³Ý ½ºÀ§Ä¡·Î ¿¬°áµÈ´Ù. Å×½ºÆ®´Â ¸¹Àº ¼öÀÇ ¿¬°áÀ» ¸¸µé¾úÀ» ¶§ °¢°¢ÀÇ ¼­¹ö°¡ ¾ó¸¶³ª ºü¸£°Ô ¹ÝÀÀÇÏ´ÂÁö ¾î´ÀÁ¤µµÀÇ CPUÀÚ¿øÀ» »ç¿ëÇÏ´ÂÁö¸¦ È®ÀÎÇÏ´Â ¹æ½ÄÀ¸·Î ÀÌ·ç¾îÁø´Ù.

´ÙÀ½Àº Å×½ºÆ® °á°ú´Ù.

  • µ¿½Ã ¿¬°á¿äû¿¡ ´ëÇÑ ÀÀ´äÀ²
  • µ¿½Ã ¿¬°á¿äûÀÌ ÀÌ·ç¾îÁ³À» ¶§ÀÇ CPU»ç¿ëÀ²
  • µ¿½Ã ¿¬°á¿äû¿¡ ´ëÇÑ ÀÀ´ä¹ÝÀÀ ½Ã°£
  • 256idle ¿¬°á¿¡ ´ëÇÑ ¼º´Éºñ±³
  • 6000 idle ¿¬°á¿¡ ´ëÇÑ ¼º´Éºñ±³
  • ·ÎµåÁõ°¡¿¡ ´ëÇÑ ÀÀ´ä½Ã°£

¼º´ÉÀÇ Â÷À̸¦ Çѹø¿¡ ¾Ë¾Æ º¼¼ö ÀÖÀ» °ÍÀÌ´Ù.

7 RTSÀÇ ´ÜÁ¡/ÇØ°á¹æ¹ý

RTS°¡ ¸Å¿ì È¿À²ÀûÀ̱ä ÇÏÁö¸¸ ¸î °¡Áö ´ÜÁ¡µéÀ» °¡Áö°í ÀÖ´Ù. À̹ø Àå¿¡¼­´Â ÀÌ·¯ÇÑ RTSÀÇ ´ÜÁ¡°ú ÀÌ¿¡ ´ëÇÑ ÇØ°á¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

7.1 Linux¿¡¼­ÀÇ Signal Queue Å©±â

½Ã±×³Î Å¥ÀÇ Å©±â´Â ÇÁ·Î¼¼½º´ç Á¦ÇѵǾî ÀÖÀ¸¸ç, Å©±â´Â /proc/sys/kernel/rtsig-max¿¡ Á¤ÀǵǾî ÀÖ´Ù. ¾Æ¸¶ 1024·Î ¼³Á¤µÇ¾î ÀÖÀ» °ÍÀÌ´Ù. ¹°·Ð Çʿ信 µû¶ó¼­ °£´ÜÇÏ°Ô º¯°æ °¡´ÉÇÏ´Ù.
# echo 2048 > rtsig-max  
 
¼­¹öÀÇ ¿ëµµ¿¡ µû¶ó¼­ Àû´çÇÑ °ªÀ» ÀÌ¿ëÇϵµ·Ï ÇÏÀÚ.

7.2 Siganl queue Overflow ¹®Á¦

ÀÌ·¯ÇÑ ´ÜÁ¡Àº ½Ã±×³Î ´ë±â¿­ÀÇ Å©±â°¡ Á¦ÇѵǾî Àֱ⠶§¹®¿¡ ¹ß»ýÇÏ´Â ¹®Á¦µéÀÌ´Ù. ¼ÒÄÏ¿¡¼­ ¹ß»ýÇÑ À̺¥Æ®´Â ½Ã±×³ÎÀÇ ´ë±â¿­¿¡ ½×ÀδÙ. ½×ÀÎ À̺¥Æ®µéÀº sigwaitinfo()¸¦ ÅëÇØ¼­ °¡Á®¿ÅÀ¸·Î½á ´ë±â¿­¿¡¼­ Áö¿öÁö°Ô µÈ´Ù. ±×·±µ¥ ƯÁ¤ ½Ã°£´ë¿¡ ¼­¹ö°¡ ¸Å¿ì ¹Ù»µÁ®¼­ ½Ã±×³Î ´ë±â¿­À» ºñ¿ì´Â ¼Óµµ¸¦ ÈξÀ ÃʰúÇØ¼­ À̺¥Æ®°¡ ½×ÀÌ°í °á±¹ ½Ã±×³Î ´ë±â¿­ÀÌ ¸ðµÎ Â÷¹ö¸®´Â ¹®Á¦°¡ ¹ß»ýÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù.

½Ã±×³Î Å¥ ¿À¹öÇ÷δ µ¥µå¶ô(deadlock -±³Âø»óÅÂ)»óŸ¦ ¸¸µé ¼ö ÀÖ´Ù. ¶ÇÇÑ ´ë±â¿­ÀÌ ²ËÂ÷°Ô µÉ°æ¿ì ´ç¿¬È÷ ÀÌÈÄ¿¡ ¹ß»ýÇÏ´Â ¾î¶°ÇÑ ½Ã±×³Îµµ ´ë±â¿­¿¡ ½×ÀÌÁö ¸øÇÏ°í ¹ö·ÁÁö°Ô µÈ´Ù.

ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇÇÇϱâ À§Çؼ­ ¸®´ª½º Ä¿³ÎÀº ½Ã±×³Î Å¥ ¿À¹öÇ÷ξ ¹ß»ýÇÏ¸é ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î SIGIO¸¦ ¹ß»ý½ÃŲ´Ù. ¸¸¾à RTS¸¦ »ç¿ëÁß SIGIO¸¦ ÅëÁö ¹Þ¾Ò´Ù¸é ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ ½Ã±×³Î Å¥ ¿À¹öÇÃ·Î¾î ¹®Á¦¸¦ ÇØ°áÇØ¾ß ÇÑ´Ù. ºÒÇàÇϰԵµ RTS¿¡¼­ÀÇ ½Ã±×³ÎÅ¥ ¿À¹öÇ÷ξîÀÇ Ã³¸®´Â ¾ÖÇø®ÄÉÀ̼ÇÀ» ²Ï³ª º¹ÀâÇÏ°Ô ¸¸µç´Ù.


7.3 Signal-per-fdÀÇ »ç¿ë

À§¿¡¼­ RTSÀÇ °¡Àå Å« ´ÜÁ¡ÀÎ ½Ã±×³Î Å¥ ¿À¹öÇ÷ξ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. À̰ÍÀº ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÀÛ¼ºÀ» ¸Å¿ì º¹ÀâÇÏ°Ô ¸¸µç´Ù. ±×·¸´Ù¸é °¡Àå ¹Ù¶÷Á÷ÇÑ ¹æ¹ýÀº ½Ã±×³Î Å¥ ¿À¹öÇÃ·Î¾î »óȲÀÌ ¾Æ¿¹ ¹ß»ýÇÏÁö ¾Êµµ·Ï ÇÏ´Â °ÍÀÌ´Ù.

½Ã±×³Î Å¥ ¿À¹öÇ÷ξ ¹ß»ýÇÏ°Ô µÇ´Â ÀÌÀ¯´Â °¢°¢ÀÇ ¿¬°á´ç ¿©·¯°³ÀÇ À̺¥Æ®¸¦ ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Ù´Â µ¥¿¡¼­ ¹ß»ýÇÑ´Ù. Áö±Ý 4,5,6,7,...,100 ÀÇ ¿¬°áÀÌ ¸¸µé¾îÁ® ÀÖ´Ù°í °¡Á¤À» ÇØº¸ÀÚ. À̶§ °¢°¢ÀÇ ¼ÒÄÏÀº Á¦ÇÑ ¾øÀÌ À̺¥Æ®¸¦ ¹Þ¾ÆµéÀÌ°Ô µÇ°í ±×·¯´Ù º¸´Ï À̺¥Æ®ÀÇ ÃÑÇÕÀÌ ½Ã±×³Î ´ë±â¿­ÀÇ Å©±â¸¦ ¹þ¾î³ª´Â ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. ±×·¸´Ù¸é °¢°¢ÀÇ ¿¬°á¿¡ ´ëÇØ¼­ ´ÜÁö ÇϳªÀÇ ½Ã±×³Î¸¸ À¯ÁöÇϵµ·Ï ¸¸µç´Ù¸é ½Ã±×³Î Å¥ ¿À¹öÇÃ·Î¾î ¹®Á¦¸¦ °£´ÜÇÏ°Ô È¸ÇÇÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¸´Ù¸é 1000°³ÀÇ ¿©°áÀÌ ÀÖ´Ù°í ÇÏ´õ¶óµµ ÃÖ´ë 1000°³ÀÇ À̺¥Æ®¸¸ÀÌ ½Ã±×³Î Å¥¿¡ ½×ÀÏ ¼ö Àֱ⠶§¹®¿¡ Àý´ë ½Ã±×³Î Å¥ ¿À¹öÇ÷ξ ¹ß»ýÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. - Âü°í·Î ½Ã±×³Î Å¥ÀÇ Å©±â´Â ¿­¼ö ÀÖ´Â ÆÄÀÏÀÇ Å©±â¿Í °°´Ù. -

ÀÌ·¸°Ô ÆÄÀÏÁöÁ¤ÀÚ´ç ÇϳªÀÇ ½Ã±×³Î¸¸ »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇÏ¸é ½Ã±×³Î Å¥ ¿À¹öÇÃ·Î¾î ¹®Á¦¸¦ ÇØ°á°¡´ÉÇϱä Çϴµ¥, ÀÌ·¸°Ô µÉ°æ¿ì ¼º´É¿¡ À־ Èñ»ýÀ» °¡Á®¿ÀÁö ¾Ê´Â°¡ ÇÏ´Â Àǹ®ÀÌ ¹ß»ýÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇϳªÀÇ ¼ÒÄÏÀÌ µ¿½Ã¿¡ ¿©·¯°³ÀÇ À̺¥Æ®¸¦ ó¸®ÇÒ ¼ö ¾ø´Ù´Â °ÍÀ» ÀǹÌÇϱ⠶§¹®ÀÌ´Ù. ±×·¯³ª ÀÌ ¹®Á¦´Â ±×¸® °ÆÁ¤ÇÒ »óȲÀÌ µÇÁö´Â ¾Ê´Â´Ù. º¸Åë ÇϳªÀÇ ¼ÒÄÏÀº ÇϳªÀÇ Å¬¶óÀÌ¾ðÆ®¿ÍÀÇ ¿¬°áÀε¥, ÇϳªÀÇ Å¬¶óÀÌ¾ðÆ®¿¡¼­ µ¿½Ã¿¡(¸Å¿ì ªÀº½Ã°£¿¡) ¿©·¯°³ÀÇ À̺¥Æ®°¡ ¹ß»ýÇÏ´Â °æ¿ì´Â ÇÊ¿äÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ÀϹÝÀûÀ¸·Î Ŭ¶óÀÌ¾ðÆ®¿Í ¼­¹ö°£¿¡ ÀÏ´ëÀÏ ¿¬°áÀÌ ¸Î¾îÁ³´Ù¸é Ŭ¶óÀÌ¾ðÆ®¿¡¼­ ¿äûÀ» º¸³»°í ¼­¹ö°¡ ÀÀ´äÀ» ÇÏ¸é ´Ù½Ã Å¬¶óÀÌ¾ðÆ®°¡ ¿äûÀ» ÇÏ´Â ¹æ½ÄÀ̱⠶§¹®ÀÌ´Ù. ¸Å¿ì ¹Ù»Û À¥¼­¹ö¶ó°í ÇÒÁö¶óµµ ´ÜÀÏ Å¬¶óÀÌ¾ðÆ®¿Í ¼­¹öÀÇ °üÁ¡(¼ÒÄϰüÁ¡)¿¡¼­ º»´Ù¸é ÇϳªÀÇ ¼ÒÄÏ¿¡ ´ëÇØ¼­´Â Çѹø¿¡ ´ÜÁö ÇϳªÀÇ À̺¥Æ®¸¸ ¹ß»ýÇÑ´Ù.

°á·ÐÀûÀ¸·Î Signal-per-fd¸¦ »ç¿ëÇÏ°Ô µÉ°æ¿ì ¼­¹ö¼º´É¿¡ Å« Èñ»ý ¾øÀÌ ½Ã±×³Î Å¥ ¿À¹öÇ÷ξ ÇÇÇØ³ª°¥ ¼ö ÀÖ´Ù.

´ÙÀ½Àº signal-per-fd¸¦ »ç¿ëÇÒ ¶§ ¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡µéÀÌ´Ù.
  1. ½Ã±×³Î Å¥ ¿À¹öÇ÷ξ ȸÇÇÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÇÁ·Î±×·¥ÀÌ ±¸Á¶ÀûÀ¸·Î ´Ü¼øÇØ Áø´Ù.
  2. ¶ÇÇÑ ½Ã±×³Î Å¥ ÀÚ¿øÀ» ¾ÈÀüÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï º¸ÀåÇÑ´Ù.
  3. ÇϳªÀÇ »ç°Ç¿¡ ´ëÇØ¼­ ¿©·¯°³ÀÇ À̺¥Æ®°¡ ¹ß»ýÇÒ ¼öµµ Àִµ¥, signal-per-fd¸¦ ÀÌ¿ëÇÏ¹Ç·Î½á ¾ÖÇø®ÄÉÀ̼ǿ¡°Ô ÀßÁ¤ÀÇµÈ ÇϳªÀÇ À̺¥Æ®¸¸ ¹ÞÀ» ¼ö ÀÖµµ·Ï ÇÑ´Ù.

8 2.4.x¿¡¼­ÀÇ signal-per-fd Ä¿³Î ÆÐÄ¡

ÀÌÁ¦ ½ÇÁ¦ 2.4.xÄ¿³Î¿¡ signal-per-fd ÆÐÄ¡¸¦ Çϰí, À̸¦ ÅëÇØ¼­ °£´ÜÇÑ ÀÀ¿ë ÇÁ·Î±×·¥À» ¸¸µé¾î¼­ Å×½ºÆ® ÇØ º¸µµ·Ï ÇϰڴÙ.

8.1 kernel ´Ù¿î·Îµå ¹× ÆÐÄ¡ Çϱâ

signal-per-fd°¡ ºñ±³Àû ÃÖ±Ù¿¡ Á¦°øµÈ ±â¼úÀÎ °ü°è·Î ¸ðµç ¸®´ª½º Ä¿³Î¿¡ ´ëÇÑ ÆÐÄ¡°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. ¼³»ç Á¸ÀçÇÑ´Ù°í ÇÏ´õ¶óµµ ã±â ¾î·Á¿î °æ¿ì°¡ ¸¹´Ù. ±×·¡¼­ °¡Àå ¾ò±â ½¬¿î ÆÐÄ¡¸¦ ±âÁØÀ¸·Î Ä¿³ÎÀ» ´Ù¿î·Îµå ¹Þ¾Æ¼­ ÆÐÄ¡ÈÄ ÄÄÆÄÀÏ Çϱâ·Î Çß´Ù.

google¿¡¼­ signal-per-fd patch·Î ãÀº °á°ú Ä¿³Î 2.4.13¿¡ ´ëÇÑ signal-per-fdÄ¿³Î ÆÐÄ¡¸¦ ½±°Ô ãÀ» ¼ö ÀÖ¾ú´Ù. Ä¿³Î 2.4.13´Â http://www.kernel.org¿¡¼­ ¹ÞÀ¸¸éµÈ´Ù. signal-per-signalÆÐÄ¡´Â [http]one-sig-perfd-2.4.13.pat¸¦ ´Ù¿î·Îµå ¹ÞÀ¸¸é µÈ´Ù.

´Ù¿î·Îµå ¹ÞÀº Ä¿³Î¼Ò½º´Â /usr/src/linux-2.4.13¿¡ Ǭ´Ù. ±×ÈÄ ÆÐÄ¡ÆÄÀÏÀ» linux-2.4.13µð·ºÅ丮·Î À̵¿ÇÑÈÄ ´ÙÀ½°ú °°ÀÌ ÆÐÄ¡¸¦ Çϵµ·ÏÇÑ´Ù.
# patch -p 1 < one-sig-perfd-241.pat
...
À§ÀÇ ÆÐÄ¡ÆÄÀÏÀ» º¸¸é ´ÙÀ½°ú °°Àº ³»¿ëÀ» ¹ß°ßÇÒ ¼ö ÀÖ´Ù.
+                /* For one signal per fd discipline, indicate signal
+                 * delivery so a new one can be queued
+                 */
+                if (sig >= SIGRTMIN) {
+                    struct file *filep = fcheck( q->info.si_fd );
+
+                    if( filep && (filep->f_auxflags & O_ONESIGFD) &
+                        ( q == (siginfo_t *) filep->f_infoptr ) )
+                        filep->f_infoptr = NULL;
+                }
+
                /* Copy the sigqueue information and free the queue entry */
                copy_siginfo(info, &q->info);
                kmem_cache_free(sigqueue_cachep,q);
À§ÀÇ Äڵ带 º¸¸é f_auxflagsÀÇ ¼³Á¤ ¿©ºÎ¿¡ µû¶ó¼­ signal-pre-fdÀÇ Àû¿ë¿©ºÎ°¡ °áÁ¤µÊÀ» È®ÀÎ ÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦ ÄÚµå »ó¿¡¼­´Â ¾Æ·¡Ã³·³ fcntlÀ» ÀÌ¿ëÇØ¼­ ÇØ¼­ signal-per-fd¸¦ Àû¿ë½ÃŲ´Ù.
fcntl(sockfd, F_SETAUXFL, O_ONESIGFD); 
 

ÆÐÄ¡¸¦ ³¡³Â´Ù¸é ÀÌÁ¦ Ä¿³ÎÄÄÆÄÀÏÀ» Çϵµ·Ï ÇÑ´Ù. Ä¿³Î ÄÄÆÄÀÏ ¹æ¹ýÀº ¿©±â¿¡¼­ ¾ð±ÞÇÏÁö ¾Êµµ·Ï ÇϰڴÙ.

8.2 2.6¿¡¼­ÀÇ signal-per-fd

2.6.xÄ¿³Î¿¡¼­ signal-pre-fdÀÇ Áö¿øÀ» È®ÀÎ Çϱâ À§Çؼ­ kernel/signal.cÆÄÀÏÀ» È®ÀÎÇØ º¸¾Ò´Ù. Á¤È®ÇÑ Ä¿³Î¹öÁ¯Àº 2.6.0-test11ÀÌ¿´À¸¸ç, ´ÙÀ½°ú °°Àº ³»¿ëÀ» È®ÀÎ ÇÒ ¼ö ÀÖ¾ú´Ù.

  • ¾Æ·¡ Äڵ忡 ´ëÇØ¼± ÇØ¼®ÀÌ ÇÊ¿äÇÔ..
    /* Real-time signals must be queued if sent by sigqueue, or
       some other real-time mechanism.  It is implementation
       defined whether kill() does so.  We attempt to do so, on
       the principle of least surprise, but since kill is not
       allowed to fail with EAGAIN when low on memory we just
       make sure at least one signal gets delivered and don't
       pass on the info struct.  */

    if (atomic_read(&nr_queued_signals) < max_queued_signals)
        q = kmem_cache_alloc(sigqueue_cachep, GFP_ATOMIC);
    if (q) {
        atomic_inc(&nr_queued_signals);
        q->flags = 0;
        list_add_tail(&q->list, &signals->list);
        switch ((unsigned long) info) {
        case 0:
            q->info.si_signo = sig;
            q->info.si_errno = 0;
            q->info.si_code = SI_USER;
            q->info.si_pid = current->pid;
            q->info.si_uid = current->uid;
            break;
        case 1:
            q->info.si_signo = sig;
            q->info.si_errno = 0;
            q->info.si_code = SI_KERNEL;
            q->info.si_pid = 0;
            q->info.si_uid = 0;
            break;
        default:
            copy_siginfo(&q->info, info);
            break;
        }
    } else {
        if (sig >= SIGRTMIN && info && (unsigned long)info != 1
           && info->si_code != SI_USER)
        /*
         * Queue overflow, abort.  We may abort if the signal was rt
         * and sent by user using something other than kill().
         */
            return -EAGAIN;
        if (((unsigned long)info > 1) && (info->si_code == SI_TIMER))
            /*
             * Set up a return to indicate that we dropped 
             * the signal.
             */
            ret = info->si_sys_private;
    }

8.3 °£´ÜÇÑ ¼ÀÇà ÇÁ·Î±×·¥

  1. signal-per-fd¸¦ Àû¿ëÇÑ °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé°í ÀÌ¿¡ ´ëÇÑ Å×½ºÆ®¸¦ ½Ç½ÃÇÑ´Ù.

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

  1. signal-per-fd Ä¿³Î ÆÐÄ¡°¡ Àû¿ëµÈ ¸®´ª½º¿¡¼­ÀÇ RTSÀ¥¼­¹ö Á¦ÀÛ ÇÁ·ÎÁ§Æ®¸¦ ¼öÇàÇÑ´Ù. ½ÇÁúÀûÀÎ ÇÁ·ÎÁ§Æ®·Î ¹ßÀü½Ã۵µ·Ï ÇÑ´Ù.


10 Âü°í ¹®Çå


  1. [http]Real Time Signal - 1
  2. [http]Real Time Signal -2
  3. [http]RTS¿Í ¾²·¹µåÇ®°úÀÇ Á¶ÇÕ
  4. [http]Scalability of Linux Event-Dispatch Mechanisms
  5. [http]Scalability of Linux Event-Dispatch Mechanisms (ps)
  6. ±¸·ç¶û´ÔÀÇ epoll ¿¬±¸ À§Å°
  7. http://www.kegel.com/c10k.html
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.