OS

Go back

OS Review
Device Driver
NS Tools

Home
Papers
Daily Link


To Main
9. öÇÐÀÚµéÀÇ ¸¸Âù (The Dining-Philosophers Problem)

öÇÐÀÚµéÀÇ ¸¸Âù¿¡ ´ëÇÑ ¹®Á¦¶ó,,, À¢Áö ¹º°¡ À־À̴µíÇÑ ¸ÚÁø Á¦¸ñÀεí ÇÕ´Ï´Ù¸¸, ÀÌ »óȲÀÇ ¼³Á¤À» Àß ¶â¾îº¸¸é ¸»±×´ë·Î ±×³É ¹äÃÄ¸Ô°í ¸ù»óÇÏ´Â°Ô ÀüºÎÀÎ ¶Ê¾ÆÀÌ Áý´Ü¿¡ ´ëÇÑ À̾߱â ÀÔ´Ï´Ù. ½Ä»çÇϴ öÇÐÀÚµéÀÇ ¹®Á¦´Â ¿À¿¡½º·Ð¿¡ À־ ²Ï À¯¸íÇÑ Æз¯´ÙÀÓÀÎÁö Àü¿¡µµ ¾îµð¿¡¼±°¡ Çѹø ±× Á¦¸ñ¸¸À» µé¾îº»µíÇѵ¥, À̱âȸ¿¡ ¿©·¯ºÐµéµµ ÀÌ°ÍÀÌ ¾î¶² ¹®Á¦Á¦±â¸¦ ÇÏ°í ÀÖ´Â °ÍÀ̸ç, ÀÌ À̾߱Ⱑ ÁÖ´Â ±³ÈÆÀÌ ¹«¾ùÀÎÁö¸¦ Çѹø Àß À½¹ÌÇغ¸½ÃÁö¿ä. ¹¹ ÀÏÇÏÁö ¾Ê´Â ÀÚ¿© ¸ÔÁöµµ ¸»¶ó°°Àº°Ç ¾Æ´Õ´Ï´Ù¿ä. ¹é¼ö´Ôµé Èû³»½Ê¼î.

¸ÕÀú 5¸íÀÇ Ã¶ÇÐÀÚ°¡ ¿øÇüÀÇ ½ÄŹÀ§¿¡ µÑ·¯ ¾É¾ÆÀÖ½À´Ï´Ù. ±×µéÀº Æò»ýÅä·Ï ÇÏ´Â ÀÏÀ̶ó°í´Â »ý°¢!Çϰųª ¶Ç´Â ¸Ô´Â°Í! µü ÀÌ µÎ°¡ÁöÀÔ´Ï´Ù. ¿©±â¼­ Á¶±Ý ƯÀÌÇÑ »óȲÀÌ Çϳª ¿¬ÃâµÇ´Âµ¥, ±×°ÍÀº À̵éÀº À§»ý°ü³äÀÌ ÀüÇô ¾ø´Â ÀÌ Àΰ£µéÀÌ Á£°¡¶ô ÇѦ¾¿¸¸À» ÀÚ½ÅÀÇ Á¢½Ã ¿·¿¡ ³õ¾ÆµÎ°í µÎ»ç¶÷ÀÌ ÇѦÀ» °øÀ¯ÇÏ°í ÀÖ´Ù´Â ÀüÁ¦ÀÌÁÒ. ±×¸²À¸·Î Çѹø ¸ÚÁö°Ô ½ÂÈ­½ÃÄÑ º¸°Î½À´Ï´Ù.

                                  Á£°¡¶ôÇÑÂÊ
 

                       öÇÐÀÚ                    öÇÐÀÚ

                   Á£°¡¶ôÇÑÂÊ                     Á£°¡¶ôÇÑÂÊ 
                     
                      öÇÐÀÚ                      öÇÐÀÚ 
                        
                        Á£°¡¶ôÇÑÂÊ           Á£°¡¶ôÇÑÂÊ 
                               
                                    öÇÐÀÚ 

¿¹¼úÀÔ´Ï´Ù. ÀÌ Ã¶ÇÐÀÚµéÀº ¹º°¡ »ý°¢ÇÏ°í ÀÖÀ»½Ã¿¡´Â ¿· öÇÐÀÚ¿Í Àý´ë À̾߱â Á¶Â÷ ¾ÈÇÏ¸ç »ý°¢¿¡¸¸ ¸ôµÎÇÏ´Ù°¡ Á¦°¢ÀÚ ¹è°íÇà ÁîÀ½¿¡´Â ½Ãµµ¶§µµ ¾øÀÌ ÀÚ½ÅÀÇ ¾ç ¿·¿¡ ³õ¿©ÀÖ´Â Á£°¡¶ô ÇѦ¾¿À» °¡Á®´Ù°¡ ÇѽÖÀ» ¸¸µçµÚ ¹äÀ» ¸Ô¾î´ð´Ï´Ù. ¹°·Ð ¹è°íÇ ¶§´Â ¸ðµç öÇÐÀÚ ¸Ú´ë·ÎÀÔ´Ï´Ù. ½Ä»ç°¡ ³¡³ª¸é ÀÚ½ÅÀÇ Á£°¡¶ôµéÀ» °¡Áö·±ÀÌ ¾ç¿·¿¡ ´Ù½Ã ³õ¾ÆµÎ°í ´Ù½Ã °í³ú¸¦ ÇÏ°Ô µÇÁö¿ä.

À̹®Á¦´Â Á¤¸» °íÀüÀûÀÎ ½ÌÅ©(synchronization)¹®Á¦¶ó°í Ã¥¿¡¼­´Â ¾ð±ÞÀ» ÇÕ´Ï´Ù. ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º¿Í ¿©·¯°³ÀÇ ¸®¼Ò½º »çÀÌ¿¡¼­ÀÇ µ¥µå¶ô(deal-lock)°ú ¹è°íÇÄ(starvation)ÀÌ ¹ß»ýÇÒ¼ö ÀÖ´Â »óȲ¿¡ ´ëÇÑ ¸ðµ¨ÀÎ °ÍÀÔ´Ï´Ù. º» »óȲ¿¡¼­ÀÇ °¡Àå Áß¿äÇÑ ¸ñÀûÀº À§ÀÇ Ã¶ÇÐÀÚµéÀ» ¸ðµÎ ÇູÇÏ°Ô ¸¸µé¾î ÁÖ´Â °ÍÀÌÁÒ. À̵éÁß ´©±¸ Çϳª¶óµµ ¹è°íÆļ­ °á±¹ Á×¾î¹ö¸®°Å³ª(¹è°íÇÄ), ¼­·Î ÇѦ¾¿ Á£°¡¶ôÀ» µé°í ³ª¸ÓÁö Çϳª°¡ Á£°¡¶ôÀ» ³öÁֱ⸦ Æò»ý ±â´Ù¸®´Ù°¡ ±¾¾îÁ×´Â °æ¿ì(µ¥µå¶ô)¸¦ ÃÖ´ëÇÑ ¹æÁöÇÏ´Â ¹æ¹ýÀ» ã¾Æ¾ß Çϴ°̴ϴÙ.

ÀÚ, ÀÌ»óȲ¿¡ ´ëÇÑ ÇØ°áÃ¥À» ±×·¸´Ù¸é Á»´õ ÄÄÇ»ÅÍƽÇÏ°Ô ¸ðµ¨¸µÇÏ´Â ¹æ¹ýÀ» Çѹø »ìÆ캸ÁÒ.

¸ÕÀú var chopstick : array [0..4] of semaphore all elememts of chopstick are initialized to 1

ÇϳªÀÇ ÁÁÀº ¾ÆÀ̵ð¾î´Â °¢°¢ÀÇ Á£°¡¶ôÀ» ÇϳªÀÇ ¼¼¸¶Æ÷¾î·Î, ±×¸®°í öÇÐÀÚ¸¦ ÇϳªÀÇ ÇÁ·Î¼¼½º·Î ¼³Á¤ÇÏ´Â °ÍÀÔ´Ï´Ù. º» ¸ðµ¨Àº ¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇÏ¿© ½ÌÅ©¸¦ ±¸ÇöÇÏ´Â ÁÁÀº ¿¹À̸ç, À̶§ÀÇ ¼¼¸¶Æ÷¾î chopstickÀº °á±¹ ÇöÀç ½Ã½ºÅÛ¿¡ ³²¾ÆÀÖ´Â »ç¿ë°¡´ÉÇÑ ¸®¼Ò½º(resourse)ÀÇ °¹¼ö!¸¦ »ó¡ÇÏ°Ô µÇ´Â°ÍÀÌÁÒ. Áï, ¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇÏ¿© ³²Àº ¸®¼Ò½ºÀÇ °¹¼ö¸¦ Æ®·¡Å· Çϴ°ÍÀÔ´Ï´Ù(¹ÙÀ̳ʸ® ¼¼¸¶Æ÷¾î¿©¿ä). À̶§ ¸¸ÀÏ ¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇÏÁö ¾Ê°í ±×³É Æò¹üÇÑ º¯¼ö³ª IPCÁß ÇϳªÀÎ ½¦¾îµå ¸Þ¸ð¸®¸¸À» ÀÌ¿ëÇÑ´Ù¸é ¾î¶² »óȲÀÌ ÆîÃÄÁú±î¿ä? (´º½ºÆÇ¿¡ Çѹø ¸¾²¯ ÀÚ½ÅÀÇ ÀÇ°ß ÇÇ·ÂÇغ¸½ÉÀÌ ¾î¶³·±Áö? )

´ÙÀ½ÀÇ Äڵ带 Çѹø À½¹ÌÇØÁֽñæ.

repeat 
   wait(chopstick[i]); 
   wait(chopstick[i+1 mod 5]); 
   ... 
   eat 
   ... 
   signal(chopstick[i]); 
   signal(chopstick[i+1 mod 5]); 
   ... 
   think 
   ... 
until false; 

À§ÀÇ ÄÚµå´Â ¹Ù·Î öÇÐÀÚi¸¦ ³ªÅ¸³»ÁÖ´Â ±¸Á¶ÀÔ´Ï´Ù. ¿©±â¼­ ¿ì¸®´Â ÀüÀå¿¡¼­ µîÀåÇß´ø wait()°ú signal()À» ÀÌ Ã¶ÇÐÀÚÀÇ ¸¸Âù¿¡¼­ ¾î¶² ÇàÀ§·Î »ó¡ÀÌ µÇ´ÂÁö¸¦ ´«¿©°Ü º¼ ÇÊ¿ä°¡ ÀÖÀ»°Ì´Ï´Ù. öÇÐÀÚµéÀº Á£°¡¶ôÀ» ÃëÇϱâ À§Çؼ­ wait()À» ÄÝÇÏ°Ô µÇ°í, ´Ù ¾´ Á£¶ó¶ôÀ» ´Ù½Ã ³õ±â À§ÇÏ¿© signal()À» ÄÝÇÏ°Ô µÇ´Â °ÍÀÌÁÒ. À§ÀÇ Äڵ忡¼­ Á¶±Ý ¾î·Æ°Ô º¸Àϼö ÀÖ´Â i+1 mod 5´Â ¹»±î¿ä? x mod y ¶ó´Â ¿¬»êÀº x¸¦ y·Î ³ª´«´ÙÀ½ ³ª¿Â ³ª¸ÓÁö °ªÀ» ÀǹÌÇÏÁö¿ä. °í·Î i=5ÀÏ°æ¿ì (5¹ø(¸¶Áö¸·) Á£°¡¶ô) ±× °á°ú´Â 1ÀÌ ³ª¿Â´Ù´Â »ç½Ç((1+5)/5ÀÇ ³ª¸ÓÁö)¿¡¼­ °á±¹ ¿øÇü¼øȯÀû!À¸·Î ¹Ù·Î ¿·¿¡ ³õ¿©ÀÖ´Â Á£°¡¶ôÀ» ÀǹÌÇÏ°Ô µÇ´Â °ÍÀÔ´Ï´Ù. °á±¹ À§ÀÇ ÄÚµå´Â óÀ½ öÇÐÀÚ ÀÚ½ÅÀÇ ¿ÞÂÊ(¶Ç´Â ¿À¸¥ÂÊ)¿¡ ³õ¿©ÀÖ´Â Á£°¡¶ôÀ» ¸ÕÀú µé°í, ±×´ÙÀ½¿¡ ÀÚ½ÅÀÇ ¿À¸¥ÂÊ(¶Ç´Â ¿ÞÂÊ) Á£¶ô¶ôÀ» µç°ÍÀ» È®ÀÎÇÑ ´ÙÀ½ ¾ÈÀüÇÏ°Ô ¸Ô°í~ ÀÚ½ÅÀÌ µé°íÀÖ´ø ¿ÞÂÊ Á£°¡¶ôÀ» ³õ°í, ¸¶Áö¸·À¸·Î ¿À¸¥ÂÊ Á£°¡¶ôÀ» ³õ´Â °úÁ¤À» ±â¼úÇØÁÖ°í ÀÖÁÒ.

À§¿¡¼­ Á¦°øµÈ ÄÚµå´Â ¼­·Î ÀÎÁ¢ÇÑ Ã¶ÇÐÀÚ°¡ Á£°¡¶ôÀ» µå´Â »ç°ÇÀ» ¹æÁöÇØ ÁÖ±ä ÇÏÁö¸¸ ¾Æų·¹½º°ÇÀÌ µÇ´Â °æ¿ìÀÇ ¼ö°¡ Çϳª ÀÖ½À´Ï´Ù. ¾î¶²°æ¿ìÀϱî¿ä? ¹Ù·Î ¸ðµç öÇÐÀÚµéÀÌ ÇѼø°£ ¹è°¡ °íÆÄÁ®¼­ ÀÏÁ¦È÷ ÀÚ½ÅÀÇ ¿ÞÂÊ(¶Ç´Â ¿À¸¥ÂÊ)Á£°¡¶ôÀ» µé°Ô µÇ´Â °æ¿ìÀÔ´Ï´Ù. ¹Ù·Î µ¥µå¶ôÀÌ ¹ß»ýÇعö¸®ÁÒ. ÇÑ Á£°¡¶ôÀ» µé°í µÎ¹ø° wait()¿¡ °É·Á¼­ °á±¹ öÇÐÀÚµéÀº Æò»ý Á£°¡¶ô ÇÑ°³ µçä·Î ±¾¾îÁ×´Â Áý´Ü Âü±ØÀÌ ÀϾ°Ô µË´Ï´Ù. Á¤¸» »ý°¢ÇÏ¸é »ý°¢ÇÒ¼ö·Ï ¹ÌÄ£³ðµéÀÌ ¾Æ´Ò¼ö ¾ø±º¿ä.

ÀÌ µ¥µå¶ôÀ» ¹æÁöÇϱâ À§ÇÏ¿© ¸î°¡Áö ÇØ°áÃ¥À» Á¦½ÃÇغ»´Ù¸é ´ÙÀ½°ú °°½À´Ï´Ù.

1. ÃÖ´ëÇÑ 4¸íÀÇ Ã¶ÇÐÀÚ°¡ Å×ÀÌºí¿¡ ¾Éµµ·Ï ¸¸µç´Ù. 2. ¾ç¿·ÀÇ Á£°¡¶ôÀÌ ¸ðµÎ´Ù Á¦°ø °¡´ÉÇÑÁö¸¦ ¸ÕÀú È®ÀÎÈÄ¿¡ µç´Ù. 3. Ȧ¼ö¹ø°ÀÇ Ã¶ÇÐÀڴ óÀ½¿¡ ¿ÞÂÊÀÇ Á£°¡¶ôÀ» µé°í, ¦¼ö¹ø°ÀÇ Ã¶ÇÐÀڴ óÀ½¿¡ ¿À¸¥ÂÊÀÇ Á£°¡¶ôÀ» µé°Ô ¸¸µç´Ù. 4. ÂïÂïÀÌ(jjickjjickii)¸¦ Àú¸¸Âù¿¡ ³¢¿ö¼­ öÇÐÀÚµé ¹ä¸À ¶³¾îÁö°Ô ¸¸µç´Ù.

Á¦ °³ÀÎÀûÀ¸·Î´Â ƯÈ÷ 3¹ø°ú 4¹øÀÌ ÂüÀ¸·Î ȹ±âÀûÀÎ ¾ÆÀ̵ð¾î·Î ´À²¸Áý´Ï´Ù¸¸Àº, ¿ª½Ã ¸ðµÎ ÇÑ Ã¶ÇÐÀÚ°¡ ¹è°íÆÄ Á×´Â »çÅ´ ¹æÁöÇÏÁö ¸øÇÏ´Â ¾àÁ¡À» °¡Áö°í ÀÖ½À´Ï´Ù.

¼¼¸¶Æ÷¾î°¡ ÇÁ·Î¼¼½º ½ÌÅ©¸¦ À§ÇÑ ÂüÀ¸·Î °£ÆíÇÏ°í È¿°úÀûÀÎ ¸ÞÄ«´ÏÁòÀ» Á¦°øÇØÁÖ±â´Â ÇÏÁö¸¸, ÀüÀå¿¡¼­µµ ¸»¾¸µå·ÈµíÀÌ Á¶±×¸¶ÇÑ Âø°¢À¸·Î ÀÎÇÑ ½Ç¼ö´Â Âó¾î³»±âÁ¶Â÷ Èûµç ¿¡·¯¸¦ À¯¹ßÇÏ°Ô µË´Ï´Ù. ´õ±¸³ª À̶§ÀÇ ¿¡·¯´Â ƯÁ¤ÇÑ ¼ø¼­·Î ÇÁ·Î¼¼½ºµéÀÌ ¸®¼Ò½º¸¦ ¿ä±¸ÇÒ¶§¸¸ ³ªÅ¸³ª°í, ±× ¿¡·¯°¡ ³ªÅ¸³¯ °¡´É¼ºÀÌ ¹Ýµå½Ã ÀÖÀ½¿¡µµ Èñ¹ÚÇϱ⿡ ¹ß°ßÇØ ³»±â°¡ ¹«ÁöÇÏ°Ô ¾î·Á¿ö¿ä. ±×·¸±â¿¡ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ±Øº¹Çϱâ À§ÇÏ¿© ¶ÇÇѹø ÄÄÇ»ÅÍ °øÇÐÀÚµéÀº °í¹ÎÀ» ÇÏ°Ô µÇ°í À̹ø¿¡´Â ¸î°¡ÁöÀÇ °í·¹º§ ·©±ÍÁö ±¸Á¶Ã¼(high-level language construct)¸¦ °í¾ÈÇØ ³»°Ô µË´Ï´Ù. ´ëÇ¥ÀûÀÎ °ÍÀÌ Å©¸®Æ¼Äø®Á¯(Critical Region)°ú ¸ð´ÏÅÍ(Monitors)Àε¥ µÑ ´Ù¸¦ ´Ù·ç±â¿£ ¼ÖÁ÷È÷ ¹÷Â÷¹Ç·Î ±×Áß ÈÄÀÚÀÎ ¸ð´ÏÅ͸¦ °£·«ÇÏ°Ô ´Ù·ïº¸µµ·Ï ÇÏÁö¿ä.

¸ð´ÏÅÍ´Â ÇϳªÀÇ ±¸Á¶Ã¼(construct)ÀÔ´Ï´Ù. ¸ð´ÏÅÍ Å¸ÀÔ(type)Àº ±× ¾È¿¡ º¯¼ö¿Í ÇÁ·Î½ÃÁ®(ÇÔ¼ö°¡ ¾Æ´Õ´Ï´Ù. ÇÁ·Î½ÃÁ®´Â ¸®ÅÏ°ªÀÌ ¾øÁÒ?)¸¦ ¸ðµÎ Æ÷ÇÔÇÏ°Ô µÇ¹Ç·Î ¸¶Ä¡ C++ÀÇ Å¬·¡½º¿Í ºñ½ÁÇÏ°Ô Á¤Àǵ˴ϴÙ. ¿©±â¼­ Áß¿äÇÑ Á¡Àº ¾Æ¹« ÇÁ·Î¼¼½º³ª ¸ð´ÏÅÍ Å¸ÀÔ³»ÀÇ º¯¼ö³ª ÇÔ¼ö¿¡ Á÷Á¢ Á¢±ÙÇÒ¼ö°¡ ¾øÀ¸¸ç, ¹Ýµå½Ã ¸ð´ÏÅÍ ¾È¿¡¼­ Á¤ÀÇµÈ ÇÁ·Î½ÃÁ®¸¦ ÅëÇؼ­¸¸ ¸ð´ÏÅÍ ³»¿¡¼­ º¯¼ö¿¡ ´ëÇÑ Á¢±ÙÀÌ Çã¿ëµÇÁö¿ä. ¸ð´ÏÅÍ ±¸Á¶Ã¼´Â ¿ÀÁ÷ ÇÑ°³ÀÇ ÇÁ·Î¼¼½º¸¸ÀÌ ¸ð´ÏÅÍ ³»¿¡¼­ È°¼ºÈ­ µÇ´Â°ÍÀ» º¸ÀåÇØÁֱ⿡ ¹ÂÅؽº¿¡ ´ëÇÑ ÀåÄ¡¸¦ ÇÁ·Î±×·¡¸Ó°¡ ¸í½ÃÇÒ ÇÊ¿ä°¡ ¾ø´Ù´Â Æí¸®ÇÑ Á¡µµ °¡Áö°í ÀÖ¾î¿ä. ¸ð´ÏÅÍ¿¡´Â ¶ÇÇÑ °¡Áö °áÁ¤Àû ¿ªÇÒÀ» ¼öÇàÇÏ´Â ¿É¼ÇÀÌ Àִµ¥, ¹Ù·Î Á¶°Ç(condition) ±¸Á¶Ã¼ÀÔ´Ï´Ù. ¹Ù·Î ÀÌ Á¶°Ç±¸Á¶Ã¼¸¦ Á¶ÀÛÇÒ ¼ö ÀÖ´Â ÇÔ¼ö´Â ¿ÀÁ÷ wait°ú signalÀÌÁÒ. ÄÁº¥¼Ç¹× ±× ±â´ÉÀÌ ¼¼¸¶Æ÷¾î¿Í´Â ¾à°£ ´Ù¸£´Ï ¿°µÎÇØ ÁÖ½Ã°í ¾Æ·¡¿¡ ¼Ò°³µÇ´Â ¸ð´ÏÅ͸¦ ÀÌ¿ëÇÑ µ¥µå¶ô ¾ø´Â! öÇÐÀÚµéÀÇ ¸¸ÂùÀÇ ÇعýÀ» ºÁÁּſä.

¸ð´ÏÅÍ¿¡ ´ëÇÑ Á¤ÀÇÀÔ´Ï´Ù.

type dining-philosophers = monitor 
   var state : array[0..4] of (thinking, hungry, eating) 
   /* ¹Ù·Î Á¶°Ç ±¸Á¶Ã¼¿¡ ´ëÇÑ Á¤ÀÇÀÔ´Ï´Ù. */ 
   var self : array[0..4] of condition 

   procedure entry pickup(i:0..4); 
      begin 
         state[i]:=hungry; 
         test(i); 
         if state[i]!=eating then self[i].wait; 
      end; 

   procedure entry putdown(i:0..4); 
      begin 
         state[i]:=thinking; 
         test(i+4 mod 5); 
         test(i+1 mod 5); 
      end; 
    
   procedure test(k:0..4); 
      begin 
         if state[k+4 mod 5]!=eating 
            and state[k]=hungry 
            and state[k+1 mod 5]!=eating 
            then begin 
                    state[k]:=eating; 
                    self[k].signal; 
                 end; 
      end; 
    
   begin 
      for i:=0 to 4 
         do state[i]:=thinking; 
   end; 

±×·³, ¸ð´ÏÅÍÀÇ ³»ºÎºÎÅÍ Çѹø »ìÆ캼±î¿ä? Á¦ÀϸÕÀú 5°³Â¥¸® ÀÏÂ÷¿ø ¹è¿­À» Á¤ÀÇÇϴµ¥ ±× ¾È¿¡´Â 3°¡ÁöÀÇ »óÅ º¯¼ö('»ý°¢ÇÔ', '¹è°íÇÄ', '½Ä»çÁß')Áß Çϳª¸¦ ³Ö¾îÁÙ¼ö ÀÖ¾î¿ä, ±×¸®°í ¶Ç 5°³Â¥¸® ÀÏÂ÷¿ø ¹è¿­¿¡´Â Á¶°ÇÀ» ´ã¾ÆÁÖµÇ ¹Ýµå½Ã .signal¶Ç´Â .waitÀ¸·Î¸¸ ¿¢¼¼½º°¡ °¡´ÉÇÏ°ÚÁÒ? óÀ½ pickup()À̶ó´Â ÇÁ·Î½ÃÁ®¿¡¼­´Â Á¦ÀϸÕÀú öÇÐÀÚÀÇ »óŸ¦ '¹è°íÇÄ'À¸·Î ÁöÁ¤À» ÇØÁÝ´Ï´Ù. Èì,,,¼ÖÁ÷È÷ ÀÌ°Å Á£°¡¶ôÀ» µé±âÀ§Çؼ­ ¹è°íÇÁ´Ù°í ¾î°ÅÁö ¾²´Â°Å °°±âµµ ÇÏ°í,,,ÇÏ¿©°£ ´ßÀÌ ¸ÕÀúÀÌ³Ä ´Þ°¿ÀÌ ¸ÕÀúÀÌ³Ä °°Àº ³íÀǶó°í »ý°¢ÇÒ¼ö ÀÖ°Ú±º¿ä. ±×µÚ¿¡ test()·Î ¹º°¡¸¦ ÆǺ°ÇÕ´Ï´Ù. test()´Â ¹º°¡¸¦ Á¶»çÇÑµÚ »óź¯¼ö¸¦ ÀçÁöÁ¤Çϴµí Çѵ¥, ¸¸ÀÏ ±× »óÅ°¡ '½Ä»çÁß'À¸·Î ÀüȯµÇÁö ¸øÇÒ °æ¿ì¿¡´Â .wait()À» È£ÃâÇϴ±º¿ä. ±Ùµ¥, ¿Ö ÀüȯÀ» ¸øÇßÁö??? °á°úÀûÀ¸·Î Á£°¡¶ôÀÌ ¾ø¾î¼­ ±×·²°Å »·ÇÏÀݾֿä.

µÎ¹ø° Á£°¡¶ôÀ» ³õ´Â ÇÁ·Î½ÃÁ®ÀÎ putdown()Àº ¿ª½Ã ¿¹»óÇß´ø µ¥·Î »óŸ¦ ´Ù½Ã »ý°¢ÇÔÀ¸·Î ÁöÁ¤À» ÇØÁØµÚ ¿· öÇÐÀÚµéÀ» test()·Î ¹º°¡ ¶Ç ÆǺ°Çϴ±º¿ä. ¿À¸¥Æí öÇÐÀÚ¿Í, ¿ÞÆí öÇÐÀÚ ÀÌ µÑÀ» ¸ðµÎ Á¶»çÇÑ´Ù´Â °ÍÀ» ¾Ë¼ö ÀÖÀ»»ÓÀÔ´Ï´Ù.

¸¶Áö¸· ÇÁ·Î½ÃÁ®´Â ¹Ù·Î °è¼Ó µîÀåÇÏ´Â test()¿¡ ´ëÇÑ Á¤ÀÇ°¡ ÀÖ½À´Ï´Ù. Á¦ÀϸÕÀú test()´Â Å×½ºÆ®¸¦ ¿äûÇÑ Ã¶ÇÐÀÚÀÇ ¿ÞÆí(¶Ç´Â ¿À¸¥Æí)ÀÇ Ã¶ÇÐÀÚÀÇ »óÅ°¡ '½Ä»çÁß'ÀÎÁö¸¦ »ìÆìºÁ¼­ ¸¸ÀÏ ¸ÔÁö¾Ê°í ÀÖ´Ù¸é ´ÙÀ½ Á¶°ÇÀ» ¶Ç º¸°ÔµÇÁö¿ä. ´ÙÀ½ Á¶°ÇÀº ¿äûÇÑ Ã¶ÇÐÀÚÀÇ »óÅ°¡ ¹è°íÇÄÀÎÁö¸¦ º¸´Âµ¥, ¸¸ÀÏ »óÅ°¡ ¹è°íÇÄÀÌ ¸Â´Ù¸é ¶ÇÇϳªÀÇ Á¶°ÇÀ» ´õ »ìÆ캸°Ô µË´Ï´Ù. À̹ø¿¡´Â ¿äûÇÑ Ã¶ÇÐÀÚÀÇ ¿À¸¥Æí(¶Ç´Â ¿ÞÆí)ÀÇ Ã¶ÇÐÀÚ°¡ '½Ä»çÁß'ÀÎÁö¸¦ ºÁ¼­ À§ÀÇ ¼¼°¡Áö Á¶°Ç¿¡ ¸ðµÎ ºÎÇյǸé(¾ç¿·ÀÇ Ã¶ÇÐÀÚ°¡ ¸ðµÎ ½Ä»ç¸¦ ¾ÈÇÏ°í ÀÖÀ¸¸ç ¿äûÇÑ Ã¶ÇÐÀÚ´Â '¹è°íÇÄ'À϶§ÁÒ) ±×Á¦¼­¾ß ¿äûÇÑ Ã¶ÇÐÀÚÀÇ »óŸ¦ '½Ä»çÁß'À¸·Î ÀüȯÀ» ½ÃÅ°°í Á¶°Çº¯¼ö¿¡ .signalÀ» È£ÃâÇØ¿ä. ¸¸ÀÏ ¾ç¿·ÀÇ Ã¶ÇÐÀÚµéÁß ÇÑ»ç¶÷ÀÌ¶óµµ '½Ä»çÁß'À̰ųª test()¸¦ È£ÃâÇÑ »ç¶÷ÀÌ '¹è°íÇÄ'ÀÌ ¾Æ´Ñ »óŶó¸é ¾Æ¹«Áþµµ ¾ÈÇÏ°í Á¶¿ëÈ÷ Å×½ºÆ®¸¦ ³¡³»Áö¿ä. ¸¶Áö¸·Àº ±×³É »óź¯¼ö state[i]¸¦ ¸ðµÎ '»ý°¢ÇÔ'À¸·Î ÃʱâÈ­ ½ÃÅ°´Â °úÁ¤ÀÏ »ÓÀÔ´Ï´Ù.

À§ÀÇ ³í¸®¸¦ Àß µû¶ó¿Â ºÐÀ̽öó¸é, .wait()°ú .signal()ÀÌ ¾î¶² ¿­¼â¸¦ Áã°í ÀÖ´Ù´Â »ç½ÇÀ» ´À³¢½Ã°ÚÁÒ? ¸ÕÀú .wait()Àº ´©±º°¡°¡ .signal()À» È£ÃâÇØ ÁÖ±â Àü±îÁö´Â ÇÁ·Î¼¼½º¸¦ ´õÀÌ»ó ÁøÇàÀ» ¸øÇÏ°Ô ÇÏ°í, .signal()Àº Á¤È®È÷ µü ÇÑ°³!ÀÇ .wait()À¸·Î °É·ÁÀÖ´Â ÇÁ·Î¼¼½º¸¦ ±ú¿öÁÖ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. µÑÀº ¼¼¸¶Æ÷¾îÀÇ wait()°ú signal()¿Í ºñ½ÁÇØ º¸ÀÌÁö¸¸, °áÁ¤Àû Â÷ÀÌÁ¡Àº ¸¸ÀÏ ¾Æ¹«µµ .wait()À» Àü¿¡ È£ÃâÇÏÁö ¾Ê¾Ò´Ù¸é ¹é¹ø .signal()À» È£ÃâÇغÁ¾ß ¾Æ¹«ÀÏ ¾ø´Ù´Â »ç½ÇÀÔ´Ï´Ù. ¼¼¸¶Æ÷¾î´Â °¢ wait()°ú signal()Àº ÇØ´ç ¼¼¸¶Æ÷¾îÀÇ °ªÀ» ¹Ýµå½Ã °¨¼Ò½ÃÅ°°Å³ª Áõ°¡½ÃÄÑÁÖ¾ú´Ù´Â »ç½ÇÀ» »ó±âÇϼſä. À§ÀÇ µÑÀº ³»ºÎÀûÀ¸·Î ¼¼¸¶Æ÷¾î¿Í ¸î°¡Áö Ä«¿îÅ͸¦ ÀÌ¿ëÇؼ­ ±¸ÇöÇÑ´Ù´ÂÁ¤µµ¸¸ ¿©±â¼­´Â ¾Ë¾ÆµÎ¼Åµµ ¹«¹æÇÕ´Ï´Ù. ±Ã±ÝÇؼ­ ¹ÌÄ¡°Ú´ÂºÐ, ±³°ú¼­ º¸½Ê¼î. ºÁµµ ¸ð¸£°ÎÀ¸¸é Àç°æ¼±¹è³ª ¼ºÀϼ±¹è¿¡°Ô Áú¹® ¶§¸®½Ê¼î.

À§ÀÇ ¾Ë°í¸®ÁòÀ» ¶°³ª±â Àü¿¡ ÇÑ°¡Áö ¤°í ³Ñ¾î°¡¾ß ÇÒ ºÎºÐÀÌ Àִµ¥, putdown()¿¡¼­ ¾ç ¿·ÀÇ Ã¶ÇÐÀÚµéÀ» Å×½ºÆ®·Î º¸³»´Â ºÎºÐÀÔ´Ï´Ù. ÀÌ°æ¿ì¸¦ Çؼ®ÇØ º¸¸é, ½Ä»ç¸¦ ¸¶Ä£µÚ ¾ç ¿·ÀÇ Ã¶ÇÐÀÚµéÀÌ È¤½Ã ÀÚ½ÅÀÇ Á£°¡¶ô¸¸À» ¹Ù¶óº¸¸ç ħÀ» ÁúÁú È긮°í ÀÖÁö ¾Ê¾Ò´ÂÁö¸¦ È®ÀÎÇÏ´Â °æ¿ìÀÌÁÒ. öÇÐÀÚ°¡ Á£°¡¶ôÀ» ±â´Ù¸®´Â °æ¿ì(.wait()À» ÄÝÇÑ°æ¿ì)´Â ¾ðÁ¦³ª ¾ç¿·ÀÇ Ã¶ÇÐÀÚÁß ÇÑÂÊÀÌ Á£°¡¶ôÀ» µé°í ÀÖ´Â °æ¿ì¹Û¿¡´Â ¾ø±â¿¡ ±×µé·Î ÇÏ¿©±Ý À̹ø¿£ ½Ä»ç¸¦ Ç϶ó´Â .signal()À» À̶§ º¸³»ÁÖ°Ô µÇ´Â °ÍÀÔ´Ï´Ù.

ÀÌÁ¦ ÀÌ ¸ð´ÏÅ͸¦ »ç¿ëÇÏ·Á¸é,¸ÕÀú dp¶ó´Â dining-philosophers typeÀÇ º¯¼ö¿¡ ´ëÇÑ ÀνºÅϽº(instance:º¯¼ö¸¦ ¼±¾ðÈÄ ±×°ÍÀ» ±¸Ã¼ÀûÀ¸·Î ¸Þ¸ð¸®¿¡ »ý¼º½ÃÄѳõÀº »óÅÂÀÌÁÒ)¸¦ ¸¸µé°í ´ÙÀ½°ú °°ÀÌ Ã¶ÇÐÀÚ°¡ ½Ä»ç¸¦ ÇÏ°Ô µÇ´Â ¼ø°£À» ±â¼úÇØ ÁÙ ¼ö ÀÖ½À´Ï´Ù.

   dp.pickup(i); 
      ... 
      eat 
      ... 
   dp.putdown(i); 

±ò²û!ÇÏ°Ô ¿ì¸®´Â ÇÏÀÌ·¹º§ ±¸Á¶Ã¼ÀÎ ¸ð´ÏÅ͸¦ ÀÌ¿ëÇÏ¿© ½ÌÅ©¹®Á¦¸¦ ¹«Áö ³­ÀâÇÑ ¼³¸íÀ¸·Î Ç®¾î³Â½À´Ï´Ù¿ä. Â÷·Ê·Î µîÀåÇÏ´Â ¾Ë°í¸®ÁòµéÀ» º¸¸é¼­ ¹«½¼ »ý°¢ÀÌ µå½Ã³ª¿ä. Àü °³ÀÎÀûÀ¸·Î ¹ä¹úÀÌ·Î ÀÌÁþ ¸øÇظÔÀ»Áöµµ ¸ð¸£°Î´Ù´Â ÁÂÀýÀÌ ¾ö½ÀÇØ ¿Ô¾î¿ä. Ç㳪 ÇÑ°¡Áö »ÀÀú¸®°Ô ´À³¢´Â »ç½ÇÀÌ ÀÖ¾ú´Ù¸é ÁÁÀº ¾Ë°í¸®ÁòÀ̶õ Á¤¸» 1¾ïºÐÀÇ 1ÀÇ È®·ü·Î ÀϾ »ç°ÇÀÏÁö¶óµµ ¹Ì¸® Áغñ¸¦ Çسõ´Â ¾Ë°í¸®ÁòÀ̶ó´Â »ç½ÇÀÌÁÒ. ¹°·Ð ´õ ª°í °£°áÇÏ¸é ±×¸¸Å­ ´õ ºü¸£±â¿¡ ÈǸ¢ÇÑ ¾Ë°í¸®Áò´Ù¶ó´Â »ç½ÇÀº µÎ¸»ÇÒ ³ªÀ§µµ ¾ø°í¿ä.

ÀÌ»óÀ¸·Î 6ÀåÀ» ³¡³»¸é¼­ ²¿¸®¸»À» ºÙ¿©º¸¸é, »ç½Ç ³í¸®¶ó´Â°ÍÀÌ º¹ÀâÇÑ ¸»¶§¹®¿¡ ´õ¿í ¾î·Á¿öÁú¼öµµ Àִµ¥, ÀúÀÇ ³­ÀâÇÑ ¼³¸íÀ¸·Î ÀÎÇØ ¿ÀÈ÷·Á ½±°Ô ÀÌÇØÇÒ¼ö ÀÖ´Â ºÐµé±îÁö ¾î¸®µÕÀýÇØÇÏ½Ã´Â°Ç ¾Æ´Ò±î ½Í´õ±º¿ä. ¹°·Ð °£°áÇÏ°Ô ¾Ë°í¸®Áò¸¸ Á¦½ÃÇØÁÖ°í °¢ÀÚ°¡ ¾Ë¾Æ¼­ Çؼ®Ç϶ó°í Çұ »ý°¢ÇØ º¸¾ÒÁö¸¸, ¿ØÁö ±×°Ç Á¦½º½º·Î°¡ ÁÖ¾îÁø Ã¥¹«¸¦ ȸÇÇÇÏ´Â °ÍÀ̶ó´Â ´À³¦ÀÌ µé±â¿¡ ºÒÇÊ¿äÇÑ ºÎºÐÀÏÁö¶óµµ ÀÚ¼¼ÇÏ°Ô ÁÖ¼®À» ´Þ¾Æº¸¾Ò½À´Ï´Ù. ¶ÇÇÑ! Á¦ ÁÖ¼®ÀÌ ¹Ýµå½Ã ¿Ç´Ù°í´Â ÇÒ¼ö ¾ø½À´Ï´Ù. ¸¸ÀÏ ±×·±ºÎºÐÀ» ¿©·¯ºÐµéÀÌ ¹ß°ßÇؼ­ ÁöÀûÇØÁֽŴٸé Àü Á¤¸» ±â»Ü°Ì´Ï´Ù. ¾û¶×ÇÏ°Ô ¾Ë°íÀִ°ͺ¸´Ù´Â Â÷¶ó¸® ¸ð¸£´Â°Ô ³´´Ù¶ó´Â ¸»ÀÌ Æ²¸° ¸»ÀÌ ¾Æ´Ï°Åµç¿ä. ¾î¶µç, ²Ï ¾î·Á¿î »êÀ» Àú¿Í ³Ñ¾îÁֽŠ¿©·ÁºÐ ¼ö°íÇß¾î¿ä :)

´ÙÀ½Àå¿¡¼­´Â ±Ù·¡ ÀÚÁÖ µîÀåÇß´ø ¸»ÀÎ µ¥µå¶ôÀ» Á»´õ ü°èÈ­½ÃÅ°°í ¼¼·ÃµÈ ¸ðµ¨·Î ó¸®ÇÏ´Â ¹æ¹ýÀ» Ž±¸Çغ¼ ¿¹Á¤ÀÔ´Ï´Ù. ±×·³ ±×¶§±îÁö,,,¸ðºñ¿ì½ºÁ» ¾îÄÉ ÇغÁÀ¯. ¾î¶»°Ô »ì¾ÆÀÖ´Â ³¯º¸´Ù Á×¾îÀÖ´Â ³¯ÀÌ ´õ ¸¹Àº°Å °°¾Ö.

-duffer °æÁØ (http://vorlon.cwru.edu/~kxm73)