°øÀ¯¸Þ¸ð¸®¿Í ·¹ÄÚµå Àá±ÝÀ» ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º°£ µ¥ÀÌÅÍó¸®
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

°øÀ¯¸Þ¸ð¸® Å¥ ±¸¼ºÀ» ÅëÇÑ È¿°úÀûÀÎ µ¥ÀÌÅÍ Ã³¸® ÇÁ·Î¼¼½º ±¸Çö

Contents

1 ¼Ò°³
2 °øÀ¯¸Þ¸ð¸®¸¦ ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º°£ µ¥ÀÌÅÍ °øÀ¯
2.1 µ¥ÀÌÅÍ °øÀ¯½Ã ¹ß»ý °¡´ÉÇÑ ¹®Á¦
2.2 ¹®Á¦ÇذáÀ» À§ÇÑ ´Ù¾çÇÑ Á¦¾È
2.2.1 °øÀ¯¸Þ¸ð¸® + ¼¼¸¶Æ÷¾î
2.2.2 °øÀ¯¸Þ¸ð¸® + »ý»êÀÚ ÅëÁö
2.2.3 *** °øÀ¯¸Þ¸ð¸® + ÆÄÀÏ ·¹ÄÚµå Àá±Ý ***
2.3 °øÀ¯¸Þ¸ð¸® + ÆÄÀÏ ·¹ÄÚµå Àá±Ý ±¸Çö
2.4 Å×½ºÆ® ÄÚµå
2.4.1 »ý»êÀÚ
2.4.2 ¼ÒºñÀÚ
2.4.3 ¹®Á¦Á¡ ¹× ÇØ°á ¹æ¾È
2.4.3.1 ¿©·¯°³ÀÇ ¼ÒºñÀÚ Âü°¡
2.4.3.2 »ý»êÀÚÀÇ ºñÁ¤»ó Á¾·á
3 °øÀ¯ ¸Þ¸ð¸®Å¥ ¶óÀ̺귯¸® Á¦ÀÛ
3.1 ¿ä±¸ »çÇ×
3.2 ÀÏ¹Ý ±¸Á¶
3.2.1 ¸ðµâ ³»ºÎ ¹öÆÛ °ü¸® Ŭ·¡½º : TQueue
3.2.2 °øÀ¯¸Þ¸ð¸® °ü¸® Ŭ·¡½º : ShmQue
4 Âü°í¹®Çå

1 ¼Ò°³

µ¿ÀÏÇÑ µ¥ÀÌÅ͸¦ ¿©·¯¹ø º¹»çÇØ¼­ »ç¿ëÇØ¾ß ÇÏ´Â ¿©·¯°³ÀÇ ´ÜÀ§ ¸ðµâ·Î ÀÌ·ç¾îÁø ¹Ìµé¿þ¾î ¼ÒÇÁÆ®¿þ¾î¿¡¼­ °¡Àå È¿À²ÀûÀÎ µ¥ÀÌÅÍ ±³È¯¿¡ ´ëÇÑ ¹æ¹ýÀ¸·Î °øÀ¯¸Þ¸ð¸®ÀÇ Å¥ ±¸¼º¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù.

  1. °øÀ¯¸Þ¸ð¸®´Â (Å¥)¹öÆÛÀÇ ¿ªÇÒÀÌ °¡´ÉÇØ¾ß ÇϹǷΠ¹è¿­·Î ±¸¼ºµÈ´Ù.
  2. µ¥ÀÌÅ͸¦ µ¿±âÈ­ ½Ãų ¼ö ÀÖ¾î¾ß ÇÑ´Ù.
  3. µ¥ÀÌÅÍ µ¿±âÈ­¸¦ À§Çؼ­ °¢ ´ÜÀ§ ¸ðµâ(¼ÒºñÀÚ)Àº µ¥ÀÌÅÍ ÀԷºκаú 󸮺κÐÀÌ ºÐ¸®µÇ¾î¾ß ÇÑ´Ù. ºÐ¸®¸¦ À§Çؼ­ ¹öÆÛ°¡ »ç¿ëµÇ¾î¾ß ÇÑ´Ù.

°øÀ¯¸Þ¸ð¸®¸¦ ÅëÇÑ queue(12) ¹öÆÛÀÇ ±¸¼ºÀ̶ó°í »ý°¢ÇÏ¸é µÉ°Í °°´Ù. ¾Æ¸¶µµ ´ÙÀ½°ú °°Àº (¼ÒÇÁÆ®¿þ¾î)½Ã½ºÅÛ ±¸¼ºÀ» °¡Áú °ÍÀÌ´Ù.


À̶§ ¼ÒºñÀÚ´Â °¢°¢ÀÇ ¹öÆÛ¸¦ À¯ÁöÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

2 °øÀ¯¸Þ¸ð¸®¸¦ ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º°£ µ¥ÀÌÅÍ °øÀ¯

¹Ìµé¿þ¾î¿Í °°Àº ±Ô¸ð°¡ ÀÖ´Â ¼ÒÇÁÆ®¿þ¾î ¸¸µé¾î¾ß ÇÒ°æ¿ì ¿©·¯°³ÀÇ ´ÜÀ§ ÇÁ·Î¼¼½º·Î ÀÌ·ç¾îÁö´Â °æ¿ì°¡ ¸¹´Ù. ±â´Éº°·Î ¸ðµâÈ­ ÇÏ´Â ¹æ½ÄÀε¥, ¿¹¸¦ µé¾î Åë½Å¸ðµâ, µ¥ÀÌÅÍ ºÐ¼®¸ðµâ, µ¥ÀÌÅÍ ÀúÀå ¸ðµâ, ½Ã½ºÅÛ °¨½Ã ¸ðµâ.. µîÀ¸·Î ³ª´©¾î Áö´Â °æ¿ì´Ù.

ÀÌ·¸°Ô ÇÏ´Â ÀÌÀ¯´Â °¢ ¸ðµâº°·Î °³¹ßÀÚ¸¦ ÇÒ´çÇÒ ¼ö ÀÖÀ¸¸ç, µð¹ö±ë ¹× À¯Áöº¸¼ö°¡ ¼ö¿ùÇϱ⠶§¹®ÀÌ´Ù. ÇÊ¿äÇÑ Àϸ¸À» Çϱ⠶§¹®¿¡ ¹®Á¦°¡ ¹ß»ýÇÒ ¿©Áöµµ Àû°í, ¹®Á¦°¡ »ý±â´õ¶óµµ Àüü ½Ã½ºÅÛÀÌ ¸ØÃß´Â ÃÖ¾ÇÀÇ »óȲÀ» ÇÇÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù.

2.1 µ¥ÀÌÅÍ °øÀ¯½Ã ¹ß»ý °¡´ÉÇÑ ¹®Á¦

ÀÌ·¸°Ô ´ÜÀ§ ¸ðµâº°·Î ¼ÒÇÁÆ®¿þ¾î ½Ã½ºÅÛÀÌ ±¸¼ºµÉ°æ¿ì ´ë·« ´ÙÀ½°ú °°Àº ±¸¼ºÀ» °¡Áö°Ô µÉ°ÍÀÌ´Ù.


°¢ ¸ðµâ°£ÀÇ µ¥ÀÌÅÍ ±³È¯À» À§Çؼ­ °á±¹ IPC¸¦ »ç¿ëÇÏ°Ô µÉ°Çµ¥, ¼±ÅÃÇÏ´Â IPC¿¡ µû¶ó¼­ ÀÔÃâ·Â °ü·Ã ºÎÇÏ´Â ±×·¸´Ù Ä¡´õ¶óµµ, µ¿ÀÏÇÑ µ¥ÀÌÅ͸¦ ¸î¹øÀÌ°í º¹»çÇÏ´Â ¹®Á¦°¡ ¹ß»ýÇÑ´Ù.

2.2 ¹®Á¦ÇذáÀ» À§ÇÑ ´Ù¾çÇÑ Á¦¾È

2.2.1 °øÀ¯¸Þ¸ð¸® + ¼¼¸¶Æ÷¾î

°¡Àå ½ÉÇÃÇÑ Á¦¾È °°Áö¸¸ ¸î°¡Áö ¹®Á¦°¡ º¸ÀδÙ. ´ÜÁö ÇϳªÀÇ »ý»êÀÚ¿Í ÇϳªÀÇ ¼ÒºñÀÚ·Î ÀÌ·ç¾îÁø °æ¿ì¿¡´Â ¹®Á¦°¡ ¾øÁö¸¸ ¼ÒºñÀÚ°¡ ¿©·µÀÏ °æ¿ì ¼¼¸¶Æ÷¾î°ªÀ» ¾î¶»°Ô Á¦¾îÇÒ °ÍÀ̳İ¡ Áß¿äÇÑ ¹®Á¦°¡ µÈ´Ù.

°øÀ¯¸Þ¸ð¸® + ¼¼¸¶Æ÷¾îÀÇ ÇÙ½ÉÀ̶ó¸é »ý»êÀÚ°¡ µ¥ÀÌÅ͸¦ ½×À» ¶§¸¶´Ù ¼¼¸¶Æ÷¾î °ªÀ» 1¾¿ Áõ°¡ ½Ã۰í, ¼ÒºñÀÚ´Â ¼¼¸¶Æ÷¾î °ªÀ» 1¾¿ °¨¼Ò½ÃŰ°í ¸¸¾à 0ÀÏ °æ¿ì¿¡´Â »ý»êÀÚ°¡ ¾´ µ¥ÀÌÅͰ¡ ¾ø´Ù´Â °¡Á¤ÇÏ¿¡ ÇØ´ç¿µ¿ª¿¡¼­ ±â´Ù¸®°Ô µÇ´Â °ÍÀÌ´Ù. ±×·±µ¥ ¼ÒºñÀÚ°¡ ¿©·µÀÏ °æ¿ì °ú¿¬ ¾î´À ½ÃÁ¡¿¡¼­ ¼¼¸¶Æ÷¾î °ªÀ» °¨¼Ò½ÃÄÑ¾ß ÇÏ´ÂÁö°¡ ¾Ö¸Å¸ðÈ£ÇØ Áø´Ù.

¹°·Ð ¼¼¸¶Æ÷¾î¼³ºñ¸¦ ¼ÒºñÀÚ °¹¼ö¸¸Å­ ¸¸µé¾î¼­ Á¦¾îÇϵµ·Ï ÇÏ´Â µîÀÇ ¸î°¡Áö ¹æ¹ýÀÌ ÀÖ°ÚÁö¸¸ º¹ÀâÇÑ °ü°è·Î »ý°¢ÇÏÁö ¾Ê±â·Î Çß´Ù. °¡´ÉÇϸé È¿À²ÀûÀ¸·Î ½ÉÇÃÇÏ°Ô ÀÛµ¿ÇÏ´Â ¹æ¹ýÀ» ã±æ ¿øÇϱ⠶§¹®ÀÌ´Ù.

2.2.2 °øÀ¯¸Þ¸ð¸® + »ý»êÀÚ ÅëÁö

°øÀ¯¸Þ¸ð¸®ÀÇ °¡Àå ¾ÕºÎºÐ¿¡ ÇöÀç »ý»êÀÚ°¡ ¾îµð¿¡ ¾²°í ÀÖ´ÂÁö¸¦ ³²±â´Â ¹æ¹ýÀÌ´Ù. ±×·³ ¼ÒºñÀÚ´Â ÀڱⰡ Àаí ÀÖ´Â µ¥ÀÌÅͰ¡ »ý»êÀÚÀÇ ¾²°í ÀÖ´Â ºÎºÐ°ú ÀÏÄ¡ÇÏ´ÂÁö¸¦ ¾Ë ¼ö ÀÖ°í ¸¸¾à ÀÏÄ¡ÇÑ´Ù¸é ±â´Ù¸®µµ·Ï ÇÏ´Â °ÍÀÌ´Ù.

½ÉÇÃÇÑ ¹æ¹ýÀ̱ä Çѵ¥, busy wait »óÅ¿¡ ³õÀÌÁö ¾Êµµ·Ï ÇÏ´Â°Ô ¹®Á¦ÇذáÀÇ ÇÙ½ÉÀÏ°Í °°´Ù. ¼ÒºñÀÚ°¡ »ý»êÀÚÀÇ µ¥ÀÌÅÍ ¾²´Â ½ÃÁ¡À» ±â´Ù¸®±â À§Çؼ­ ¹Ù»Ú°Ô index°ªÀÌ º¯ÇÏ´ÂÁö °Ë»çÇÏ´Â °ÍÀº ¾Æ¹«·¡µµ ÁÁÀº ¹æ¹ýÀÌ ¾Æ´Ï±â ¶§¹®ÀÌ´Ù. À̸¦ À§ÇØ ´ÙÀ½ÀÇ ÇØ¹ýÀ» »ý°¢ÇØ º¸¾Ò´Ù.

  • ¼ÒºñÀÚ°¡ »ý»êÀÚÀÇ index¿Í ÀÏÄ¡ÇÏ°Ô µÇ¾î¼­ ±â´Ù·Á¾ß ÇÒ°æ¿ì »ý»êÀÚ·ÎÀÇ ÅëÁö¸¦ ±â´Ù¸®µµ·Ï ÇÑ´Ù. »ý»êÀÚ´Â µ¥ÀÌÅ͸¦ ¾²°Ô µÉ°æ¿ì À̸¦ ÅëÁöÇØ¾ß ÇÑ´Ù. ÀÌ·² °æ¿ì ÅëÁö¸¦ À§ÇÑ ¹æ¹ýÀÌ Áß¿äÇØÁø´Ù. °£´ÜÈ÷ »ý°¢ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº signal(2)À» ÀÌ¿ëÇÏ´Â ¹æ¹ýÀ¸·Î ¼ÒºñÀÚ´Â sigsuspend(2)·Î ±â´Ù¸®°í »ý»êÀÚ´Â kill(2)µîÀ» ÀÌ¿ëÇØ¼­ ½Ã±×³ÎÀ» º¸³»µµ·Ï ÇÏ´Â ¹æ¹ýÀÌ´Ù.

2.2.3 *** °øÀ¯¸Þ¸ð¸® + ÆÄÀÏ ·¹ÄÚµå Àá±Ý ***

°øÀ¯¸Þ¸ð¸®°¡ ´ãÀ» ¼ö ÀÖ´Â ¿ø¼ÒÀÇ Å©±â¸¸Å­ÀÇ Å©±âÀÇ Àá±ÝÀü¿ë Àӽà ÆÄÀÏÀ» ¸¸µç´Ù. »ý»êÀÚ´Â µ¥ÀÌÅÍÀÇ À妽º À§Ä¡¿¡ ´ëÀÀÇÏ´Â ÆÄÀÏÀÇ ·¹Äڵ带 Àá±Ù´Ù. ¼ÒºñÀÚ´Â µ¥ÀÌÅ͸¦ ÀбâÀü¿¡ ·¹ÄÚµåÀÇ Àá±ÝÀ» ¸ÕÀú ¾òµµ·Ï ÄÚµùÇÑ´Ù. ±×·¯¸é ¼ÒºñÀÚ´Â ¹Ù»Û ´ë±â»óÅ¿¡ ³õÀÌÁö ¾ÊÀ¸¸é¼­µµ µ¥ÀÌÅÍÀÇ Á¸Àç À¯¹«¸¦ ÆÇ´ÜÇØ¼­ µ¥ÀÌÅ͸¦ ÀÐÀ» ¼ö ÀÖ´Ù.

ÀÌ ¹æ¹ýÀ» ÀÀ¿ëÇϴµ¥ À־ ÁÖÀÇÇØ¾ß ÇÒ Á¡Àº »ý»êÀÚ°¡ ´ÙÀ½ ·¹ÄÚµå Àá±ÝÀ» ¾ò±âÀü¿¡ ¼ÒºñÀÚ°¡ µ¥ÀÌÅ͸¦ ÀÐ¾î ¹ö¸®´Â °æ¿ì´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­ »ý»êÀÚ´Â ¹Ýµå½Ã ´ÙÀ½ ·¹ÄÚµå Àá±ÝÀ» ¾òÀº ÈÄ ÀÌÀü ·¹ÄÚµå Àá±ÝÀ» Ç®µµ·Ï ÄÚµùÇØ¾ß ÇÑ´Ù.


2.3 °øÀ¯¸Þ¸ð¸® + ÆÄÀÏ ·¹ÄÚµå Àá±Ý ±¸Çö

À̹ø¿¡´Â °øÀ¯¸Þ¸ð¸®¿Í ÆÄÀÏ ·¹ÄÚµå Àá±ÝÀ» ÅëÇØ¼­ ±¸ÇöÀ» Çϱâ·Î Çß´Ù.

¾ÆÀ̵ð¾î´Â °£´ÜÇÏ´Ù. »ý»êÀÚ´Â ¹è¿­À» °¡Áö´Â °øÀ¯¸Þ¸ð¸®¿Í °øÀ¯¸Þ¸ð¸® ¹è¿­ÀÇ Å©±â¿Í µ¿ÀÏÇÑ Àá±Ý°Ë»ç Àü¿ë ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. »ý»êÀÚ´Â (°øÀ¯¸Þ¸ð¸®)¹è¿­¿¡ µ¥ÀÌÅ͸¦ ÀûÀ¸¸é ÇØ´ç ¹è¿­ÀÇ Ã·ÀÚ¸¦ ±âÁØÀ¸·Î ÇØ¼­ ÆÄÀÏÀÇ ·¹Äڵ带 Àá±×°Ô µÈ´Ù. 10¹øÂ° ¹è¿­¿¡ ½è´Ù¸é ÆÄÀÏÀÇ 10¹øÂ° ·¹Äڵ带 Àá±×´Â ½ÄÀÌ´Ù.

Àá±Ù ·¹Äڵ带 ¿©´Â ½ÃÁ¡Àº »ý»êÀÚ°¡ ´ÙÀ½ ·¹ÄÚµåÀÇ Àá±ÝÀ» ¾ò¾òÀ» ¶§°¡ µÈ´Ù. ÀÌ·±½ÄÀ¸·Î ¾î·ÆÁö ¾Ê°Ô »ý»êÀÚ¿Í ¼ÒºñÀÚ°£ µ¿±âÈ­¸¦ ÀÌ·ê ¼ö ÀÖ°Ô µÈ´Ù.

¼ÒºñÀÚ´Â Á¦ÀÏ Ã³À½ ½ÃÀ۵Ǹé Àá±Ý ÆÄÀÏÀÇ ¸î¹øÂ° ·¹Äڵ尡 Àá°ÜÀÖ´ÂÁö È®ÀÎÇÒ ¼ö ÀÖÀ¸¹Ç·Î Àá±ä ·¹ÄÚµå ¿µ¿ªÀ» °Ë»çÇÏ¸é °¡Àå ÃÖ±Ù »ý»êÀÚ°¡ µ¥ÀÌÅ͸¦ ¾´ °øÀ¯¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¼ÒºñÀÚ´Â ÀÌ À§Ä¡ºÎÅÍ µ¥ÀÌÅ͸¦ ÀÐ¾î ³ª°¡¸é µÈ´Ù.


2.4 Å×½ºÆ® ÄÚµå

¾Æ·¡ÀÇ ÄÚµå´Â ¾ÆÀ̵ð¾îÀÇ ÀûÀÀ °¡´É ¿©ºÎ¸¦ È®ÀÎÇϱâ À§ÇÑ Å×½ºÆ®¿ë ÄÚµå´Ù. °øÀ¯¸Þ¸ð¸® °ü·ÃÇÔ¼öµé shmget(2), shmat(2), shmdt(2)¿Í ·¹ÄÚµå Àá±Ý°ú °ü·ÃÇØ¼­ fcntl(2)ÀÌ »ç¿ëµÈ ¿Ü¿¡ Ưº°ÇÑ ´Ù¸¥ ½Ã½ºÅÛÄÝÀº »ç¿ëÇÏÁö ¾Ê¾Ò´Ù.

2.4.1 »ý»êÀÚ


#include <sys/ipc.h>  
#include <sys/shm.h>  
#include <fcntl.h> 
 
#include <string.h>  
#include <unistd.h>  
 
#define QUEUE_SIZE 10 
 
// »ý»êÀÚ¿Í ¼ÒºñÀÚ°£ °øÀ¯ÇÒ µ¥ÀÌÅÍ 
struct data 
{ 
    char name[80];  
}; 
 
struct flock lock, unlock; 
 
int lock_open(int fd, int index) 
{ 
  lock.l_start  = index; 
  lock.l_type = F_WRLCK; 
  lock.l_len = 1; 
  lock.l_whence = SEEK_SET; 
  return fcntl(fd, F_SETLKW, &lock); 
} 
 
int lock_close(int fd, int index) 
{ 
  unlock.l_start  = index; 
  unlock.l_type = F_UNLCK; 
  unlock.l_len = 1; 
  unlock.l_whence = SEEK_SET; 
  return fcntl(fd, F_SETLK, &unlock); 
} 
 
void lock_init() 
{ 
  lock.l_start  = 0; 
  lock.l_type = F_WRLCK; 
  lock.l_len = 1; 
  lock.l_whence = SEEK_SET; 
} 
void unlock_init() 
{ 
  unlock.l_start  = 0; 
  unlock.l_type = F_UNLCK; 
  unlock.l_len = 1; 
  unlock.l_whence = SEEK_SET; 
} 
 
int main() 
{ 
    int shmid; 
    int i = 0; 
    int offset = 0; 
 
    struct data *cal_num; 
    void *shared_memory; 
    struct data ldata;     
    int fd; 
 
    lock_init(); 
    unlock_init(); 
 
    // Àá±Ý ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. 
    if ((fd = open("shm_lock", O_CREAT|O_RDWR)) < 0) 
    { 
        perror("file open error "); 
        exit(0); 
    } 
    // ÆÄÀÏÀ» °øÀ¯¸Þ¸ð¸® Å¥ÀÇ Å©±â¸¸Å­ ¸¸µç´Ù. 
    write(fd, (void *)'\0', sizeof(char)*QUEUE_SIZE); 
 
    // °øÀ¯¸Þ¸ð¸®¸¦ »ý¼ºÇÑ´Ù. 
    // °øÀ¯¸Þ¸ð¸®ÀÇ Å©±â´Â QUEUE_SIZE * ¿ø¼ÒÀÇ Å©±â°¡ µÈ´Ù.   
    shmid = shmget((key_t)1234, sizeof(ldata)*QUEUE_SIZE, 0666|IPC_CREAT); 
    if (shmid == -1) 
    { 
        perror("shmget failed : "); 
        exit(0); 
    } 
 
    // °øÀ¯ÇÒ ¸Þ¸ð¸®ÀÇ Å©±â¸¦ ÇÒ´çÇϰí À̸¦ °øÀ¯ ¸Þ¸ð¸®¿µ¿ª¿¡ ºÙÀδÙ.   
    shared_memory = (void *)malloc(sizeof(ldata)*QUEUE_SIZE); 
    shared_memory = shmat(shmid, (void *)0, 0); 
    if (shared_memory == (void *)-1) 
    { 
        perror("shmat failed : "); 
        exit(0); 
    } 
 
    while(1) 
    { 
        // °øÀ¯ÇÒ µ¥ÀÌÅÍ  
        sprintf(ldata.name, "write Data : %d\n",i); 
        // ÀÌ°Ç µð¹ö±ë¿ë Ãâ·Â¹° 
        printf("%d %s",(i==0)? QUEUE_SIZE - 1:i-1, ldata.name); 
 
        // ·¹Äڵ带 Àá±Ù´Ù. 
        if(lock_open(fd, i)< 0) 
        { 
            perror("lock error"); 
        } 
        // ·¹ÄÚµå Àá±ÝÀ» ¾ò¾ú´Ù¸é 
        // ÀÌÀü ·¹ÄÚµåÀÇ Àá±ÝÀ» Ǭ´Ù. 
        if(lock_close(fd, (i==0)? QUEUE_SIZE - 1: i-1) < 0) 
        { 
            perror("flock error"); 
        } 
        // °øÀ¯¸Þ¸ð¸®¿¡ µ¥ÀÌÅ͸¦ ¾´´Ù. 
        memcpy((void *)shared_memory+offset, (void *)&ldata, sizeof(ldata)); 
        sleep(1); 
        offset += sizeof(ldata); 
        i++; 
 
        // ÀÌ°Ç ¼øÈ¯ Å¥ÀÌ´Ù. ¸¸¾à Å¥ÀÇ Å©±â¸¦ ¸ðµÎ ä¿ü´Ù¸é  
        // offset°ú À妽º ¹øÈ£ i¸¦ ÃʱâÈ­ ÇÑ´Ù. 
        if (i == QUEUE_SIZE) {i = 0; offset = 0;} 
    } 
} 
 
 

2.4.2 ¼ÒºñÀÚ


#include <sys/ipc.h>  
#include <sys/shm.h>  
#include <errno.h> 
#include <fcntl.h> 
 
#include <string.h>  
#include <unistd.h>  
 
#define QUEUE_SIZE 10 
 
struct data 
{ 
    char name[80];  
}; 
 
struct flock lock, unlock; 
 
int lock_open(int fd, int index) 
{ 
    lock.l_start    = index;  
    lock.l_type = F_WRLCK; 
    lock.l_len = 1; 
    lock.l_whence = SEEK_SET; 
    return fcntl(fd, F_SETLKW, &lock); 
} 
 
int lock_isopen(int fd, int index) 
{ 
    lock.l_start    = index;  
    lock.l_type = F_WRLCK; 
    lock.l_len = 1; 
    lock.l_whence = SEEK_SET; 
    return fcntl(fd, F_SETLK, &lock); 
} 
 
int lock_close(int fd, int index) 
{ 
    unlock.l_start    = index;  
    unlock.l_type = F_UNLCK; 
    unlock.l_len = 1; 
    unlock.l_whence = SEEK_SET; 
    return fcntl(fd, F_SETLK, &unlock); 
} 
 
void lock_init() 
{ 
  lock.l_start  = 0; 
  lock.l_type = F_WRLCK; 
  lock.l_len = 1; 
  lock.l_whence = SEEK_SET; 
} 
void unlock_init() 
{ 
  unlock.l_start  = 0; 
  unlock.l_type = F_UNLCK; 
  unlock.l_len = 1; 
  unlock.l_whence = SEEK_SET; 
} 
 
int main() 
{ 
    int shmid; 
    int i = 0; 
    int offset = 0; 
  int fd; 
 
    void *shared_memory; 
    struct data *ldata;     
    lock_init(); 
    unlock_init(); 
 
  if ((fd = open("shm_lock", O_RDWR)) < 0) 
  { 
      perror("file open error "); 
       exit(0); 
  } 
 
    shmid = shmget((key_t)1234, sizeof(struct data)*QUEUE_SIZE, 0666); 
    if (shmid == -1) 
    { 
        perror("shmget failed : "); 
        exit(0); 
    } 
 
    shared_memory = (void *)malloc(sizeof(ldata)*QUEUE_SIZE); 
    shared_memory = shmat(shmid, (void *)0, 0); 
    if (shared_memory == (void *)-1) 
    { 
        perror("shmat failed : "); 
        exit(0); 
    } 
 
    // ÀÌ ºÎºÐÀº »ý»êÀÚ°¡ °¡Àå ÃÖ±Ù¿¡ ¾´ µ¥ÀÌÅÍÀÇ À妽º¸¦  
    // ã¾Æ³»±â À§ÇÑ ÄÚµå´Ù.   
    // Àá±Ý ÆÄÀÏÀÇ ·¹Äڵ带 Â÷·Ê´ë·Î °Ë»çÇϸ鼭 Àá±ÝÀÌ ÀÖ´Â ºÎºÐÀ» °Ë»çÇÑ´Ù.  
    // Àá±ÝÀÌ °Ë»çµÇ¸é, ¸®ÅÏÇÑ´Ù.   
    while(1) 
    { 
        if(lock_isopen(fd, i)< 0) 
        { 
            if (errno == EAGAIN) 
            { 
                printf("Read index is %d %d %d\n", i, EAGAIN, errno); 
                fcntl(fd, F_GETLK, &lock);  // ÄÚµå 1  
                offset = sizeof(struct data)*i;  
                break; 
            } 
            else 
            { 
                printf("Init Error\n"); 
                exit(0); 
            } 
        } 
        lock_close(fd, i); 
        i++; 
        if (i == QUEUE_SIZE) 
        { 
            printf("Server Error\n"); 
        } 
    } 
 
    // °øÀ¯ ¸Þ¸ð¸®·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àд´Ù. 
    while(1) 
    { 
        if (lock_open(fd, i) < 0) 
        { 
            perror("flock error"); 
        } 
        ldata = (struct data *)(shared_memory+offset); 
        printf("%s",ldata->name);     
        lock_close(fd, i); 
 
        offset += sizeof(struct data); 
        i++; 
        if (i == QUEUE_SIZE) {i = 0;offset = 0;}     
    } 
} 
 
 

2.4.3 ¹®Á¦Á¡ ¹× ÇØ°á ¹æ¾È


2.4.3.1 ¿©·¯°³ÀÇ ¼ÒºñÀÚ Âü°¡
¿©·¯°³ÀÇ ¼ÒºñÀÚ°¡ Âü°¡ÇÒ °æ¿ì °¢ ¼ÒºñÀÚ ¸¶´Ù ÆÄÀÏÀÇ Àá±ÝÀ» ¾ò°Ô µÇ¹Ç·Î ´Ê°Ô Âü°¡ÇÏ´Â ¼ÒºñÀÚ´Â ¾ÕÀÇ ¼ÒºñÀÚÀÇ Àá±Ý ¶§¹®¿¡ ÃÖ½ÅÀÇ µ¥ÀÌÅ͸¦ ÀÐÁö ¸øÇÏ´Â ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ÀÌ ¹®Á¦ÀÇ ÇØ°áÀº ¼ÒºñÀÚ ¿¹Á¦ ¼Ò½ºÀÇ ÄÚµå 1¸¦ ÅëÇØ¼­ ÇØ°áÇÑ´Ù. GETLK´Â ÆÄÀÏ Àá±Ý¿¡ ´ëÇÑ ¾î¶°ÇÑ ÀÛµ¿µµ ÇÏÁö ¾ÊÀ¸¸é¼­ ÇöÀç ¾òÀº ÆÄÀÏÀá±ÝÀ» ÇØÁ¦ÇÑ ÇÁ·Î¼¼½ºÀÇ PID¸¦ °¡Á®¿Ã ¼ö ÀÖ´Ù.

¿ì¸®´Â ÇØ´ç PID°¡ »ý»êÀÚÀÇ PIDÀÎÁö ÆÇ´ÜÇØ¼­ ÀûÀýÇÑ ÇൿÀ» ÃëÇÏ¸é µÈ´Ù. ¸¸¾à ´Ù¸¥ ¼ÒºñÀÚÀÇ Àá±ÝÀ̶ó¸é fcntlÀ» SETLK·Î È£ÃâÇϰí, »ý»êÀÚÀÇ Àá±ÝÀ̶ó¸é SETLKW·Î È£ÃâÇÏ¸é µÉ°ÍÀÌ´Ù.

2.4.3.2 »ý»êÀÚÀÇ ºñÁ¤»ó Á¾·á
»ý»êÀÚ°¡ ºñÁ¤»ó Á¾·áÇÏ´Â ÀÏÀÌ ¾øµµ·Ï ¸¸µé¾î Áà¾ß ÇϰÚÁö¸¸, ÇÁ·Î±×·¡¸ÓÀÇ ÀÔÀå¿¡¼­´Â ¸¸¾à¿¡ ÀÖÀ» Áöµµ ¸ð¸£´Â ºñÀå»óÁ¾·á¸¦ ¿°µÎ¿¡ µÎ¾î¾ß ÇÑ´Ù. »ý»êÀÚ°¡ ºñÁ¤»ó Á¾·á¸¦ ÇÏ°Ô µÇ¸é, ÇØ´ç ·¹Äڵ忡 ´ëÇÑ Àá±ÝÀÌ Ç®·Á¹ö¸®°í, ¼ÒºñÀÚµéÀº Àá±ÝÀÌ ¾ø´Â »óÅ¿¡¼­ ÆøÁÖ(¹«ÇÑ ¼øÈ¯)ÇÏ°Ô µÉ°ÍÀÌ´Ù.

ÀÌ ¹®Á¦ÀÇ °¡Àå °£´ÜÇÑ ÇØ°á¹æ¹ýÀº ¹è¿­ÀÇ ¿ø¼Ò ±¸Á¶Ã¼ÀÇ °¡Àå ¾Õ¿¡ flag¸¦ µÖ¼­ ÀÌ °ªÀ» üũÇϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î »ý»êÀÚ°¡ 99¹øÂ° ¹è¿­¿¡ µ¥ÀÌÅ͸¦ ½è´Ù¸é flag¸¦ 1·Î Çϰí, ±×´ÙÀ½ µ¥ÀÌÅÍÀÇ flag¸¦ 0À¸·Î ÇÏ´Â °ÍÀÌ´Ù. ±×·¸´Ù¸é ¸¸¾àÀÇ °æ¿ì »ýÀÜÀÚ°¡ Á׾ Àá±ÝÀÌ Ç®·Á¹ö¸®´õ¶óµµ ¼ÒºñÀÚ´Â flag°ªÀ» ÅëÇØ¼­ »ý»êÀÚ°¡ ºñÁ¤»óÀûÀ¸·Î Á¾·áÇßÀ½À» ÀÎÁöÇÒ ¼ö ÀÖ°Ô µÈ´Ù. flag´Â intÇü Á¤µµ·Î ÇÏ¸é µÉ °ÍÀÌ´Ù.

3 °øÀ¯ ¸Þ¸ð¸®Å¥ ¶óÀ̺귯¸® Á¦ÀÛ

Áö±Ý±îÁöÀÇ ³»¿ëÀ» ±âº»À¸·Î ÀϹÝÀûÀ¸·Î »ç¿ë°¡´ÉÇÑ °øÀ¯ ¸Þ¸ð¸® Å¥ ¶óÀ̺귯¸®¸¦ ÀÛ¼ºÇÑ´Ù.

3.1 ¿ä±¸ »çÇ×

  • ÀϹÝÀûÀ¸·Î »ç¿ë°¡´É
    1. °øÀ¯ ¸Þ¸ð¸®Å¥ÀÇ °ü¸®¸¦ À§ÇÑ ±¸Á¶Ã¼ Á¤ÀÇ(¹öÀü, »ý»êÀÚ Á¤º¸, ¸Þ¸ð¸®Å¥ÀÇ Å©±âµîÀ» ¸í½Ã)
  • ¸ðµâ¿¡¼­ »ç¿ë°¡´ÉÇÑ Å¥ ¹öÆÛ»ç¿ë
    1. µ¥ÀÌÅÍÀÇ Àд ºÎºÐ°ú 󸮺κÐÀ» ºÐ¸®ÇÑ´Ù. À̸¦ À§Çؼ­ ¹öÆÛ¸¦ ±¸¼ºÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.
  • È¿À²ÀûÀÎ ÀÛµ¿
    1. °¡´ÉÇÏ¸é µ¥ÀÌÅÍ º¹»ç´Â ÃÖ¼ÒÇÑÀ¸·Î ÀÌ·ç¾îÁöµµ·Ï Á¦ÇÑÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î¼­ ¸ðµâ³»ºÎ¿¡¼­µµ µ¥ÀÌÅÍ Àд ºÎºÐ°ú 󸮺κÐÀÇ ºÐ¸®¸¦ À§Çؼ­ ¹öÆÛ¸¦ »ç¿ëÇÑ´Ù°í Çߴµ¥, °¡´ÉÇÏ¸é Æ÷ÀÎÅÍ º¹»ç¸¸ÀÌ ÀÌ·ç¾îÁö°Ô ÇÏ´Âµî µ¥ÀÌÅÍ º¹»ç¸¦ ÃÖ¼ÒÈ­½Ãų Çʿ䰡 ÀÖ´Ù.

3.2 ÀÏ¹Ý ±¸Á¶

´ÙÀ½Àº ¿©±â¿¡¼­ ¸¸µé °øÀ¯ ¸Þ¸ð¸® Å¥ ¶óÀ̺귯¸®¿Í °¢ ¸ðµâ°£ÀÇ ±¸Á¶¸¦ ³ªÅ¸³½ ±×¸²ÀÌ´Ù.


¼ÒºñÀÚ(´ÜÀ§ ¸ðµâ)Àº °øÀ¯ ¸Þ¸ð¸® Å¥¿¡¼­ µ¥ÀÌÅ͸¦ ÀоîµéÀÌ´Â ºÎºÐ°ú À̸¦ ó¸®ÇÏ´Â ºÎºÐÀ» ºÐ¸®½Ã۵µ·Ï ÇÏ¸ç ºÐ¸®¸¦ À§Çؼ­ Áß°£¿¡ ¹öÆÛ¸¦ µÐ´Ù. ¹öÆÛ¸¦ µÎ¾î¼­ ºÐ¸®½ÃŰ´Â ÀÌÀ¯´Â Ưº°È÷ ªÀº ½Ã°£¿¡ ´Ù·®ÀÇ Ã³¸®ÇؾßÇÒ µ¥ÀÌÅͰ¡ µé¾î¿À´õ¶óµµ À̸¦ ¹öÆÛ¿¡ ´ã¾Æ µÒÀ¸·Î½á ¾ÈÁ¤ÀûÀ¸·Î µ¥ÀÌÅ͸¦ ó¸®ÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§ÇÔÀÌ´Ù.

3.2.1 ¸ðµâ ³»ºÎ ¹öÆÛ °ü¸® Ŭ·¡½º : TQueue

ÀϹݱ¸Á¶¸¦ º¸¸é ¸ðµâ ³»ºÎ¿¡¼­ ÀÔ·ÂºÎ¿Í Ã³¸®ºÎ¸¦ ºÐ¸®Çϱâ À§Çؼ­ ¹öÆÛ¸¦ »ç¿ëÇϰí ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ÀÌ´Â ¸ÖƼ ¾²·¹µå ȤÀº ¸ÖƼ ÇÁ·Î¼¼½º ±¸Á¶·Î ¸ðµâÀÌ ÀÛ¼ºµÇ¾î¾ß ÇÔÀ» ÀǹÌÇÑ´Ù. ¸ÖƼ ÇÁ·Î¼¼½º ±¸Á¶·Î °¥°æ¿ì °í·ÁÇØ¾ßÇÒ º¹ÀâÇÑ ¹®Á¦°¡ Àֱ⠶§¹®¿¡ - IPC¸¦ »ç¿ëÇÒ °æ¿ì µ¥ÀÌÅ͸¦ ¸ðµÎ º¹»çÇØ¼­ º¸³»¾ß Çϴµ¥, ÀÌ´Â ÃÖÃÊ µ¥ÀÌÅÍ º¹»ç¸¦ Á¦°ÅÇϱâ À§Çؼ­ °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÑ Àǹ̸¦ ¹«»öÄÉ ¸¸µç´Ù. Àڽİú ºÎ¸ð°£ °øÀ¯¸Þ¸ð¸®¸¦ ±¸¼ºÇÏ´Â ¹æ¹ýµµ ÀÖ°ÚÀ¸³ª ³Ê¹« º¹ÀâÇÏ´Ù - ¸ÖƼ ¾²·¹µå ȯ°æÀ¸·Î ±¸¼ºÇϱâ·Î Çß´Ù.


¹öÆÛ°ü¸® Ŭ·¡½º´Â ¾²·¹µå Àü¿ªÀûÀÎ À§Ä¡¿¡ Á¸ÀçÇϸç, Input/OutputÀ» À§ÇÑ µÎ°³ÀÇ ¸Þ¼­µå¸¦ Á¦°øÇÑ´Ù. Å¥´Â ÅÛÇø´À» ÀÌ¿ëÇØ¼­ ±¸ÇöÇϱâ·Î ÇÑ´Ù. Input/Output µ¿±âÈ­¸¦ À§Çؼ­ ³»ºÎÀûÀ¸·Î mutex¿Í Á¶°Çº¯¼ö¸¦ »ç¿ëÇÏ°Ô µÈ´Ù.

´ÙÀ½Àº ´ë·«ÀûÀΠŬ·¡½º Á¤ÀÇ´Ù. ´Ù¹Ý »À´ë¸¸ º¸¿©ÁÖ´Â °ÍÀ¸·Î º¯°æµÉ ¼ö ÀÖ´Ù.
template <typename T>  
class TQueue 
{ 
    private: 
        T *container;     
        unsigned int size; 
 
    public: 
} 
 

3.2.2 °øÀ¯¸Þ¸ð¸® °ü¸® Ŭ·¡½º : ShmQue

¶óÀ̺귯¸®´Â C++À» ÀÌ¿ëÇØ¼­ ÀÛ¼ºÇϱâ·Î Çß´Ù. ¾Æ¹«·¡µµ ¸Þ¼­µå¿Í µ¥ÀÌÅ͸¦ ÇÔ²² °ü¸®ÇÒ ¼ö ÀÖ´Â°Ô Å« ÀåÁ¡À̰í, ¸ðµâ³»ºÎ¿¡¼­ °ü¸®µÇ´Â ¹öÆÛ¸¦ À§Çؼ­µµ STLÀÇ ÄÁÅ×À̳ʸ¦ ÀÌ¿ëÇÒ ¼ö ÀִµîÀÇ ÀåÁ¡À» °¡Áö±â ¶§¹®ÀÌ´Ù.

4 Âü°í¹®Çå

  1. fcntlÀ» ÀÌ¿ëÇÑ ·¹ÄÚµå Àá±Ý
  2. °øÀ¯ ¸Þ¸ð¸®
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.