ÀÌ ¹®¼´Â º´·Ä󸮸¦ À§ÇØ
SMP ¸®´ª½º ½Ã½ºÅÛÀ» ¾î¶»°Ô »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö¿¡ °üÇØ °£´ÜÇÏ°Ô
°³¿ä¸¦ Á¦½ÃÇÑ´Ù. SMP ¸®´ª½º¿¡ ´ëÇÑ °¡Àå ÃÖ±Ù Á¤º¸´Â ¾Æ¸¶µµ SMP ¸®´ª½º
ÇÁ·ÎÁ§Æ®ÀÇ ¸ÞÀϸµ ¸®½ºÆ®¿¡¼ ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ¸®½ºÆ®¿¡ °¡ÀÔÇÏ·Á¸é
ÆíÁö º»¹®¿¡ subscribe linux-smp
¶ó°í Àû¾î
majordomo@vger.rutgers.edu·Î ÆíÁö¸¦ º¸³»¸é µÈ´Ù.
SMP ¸®´ª½º°¡ Á¤¸» Á¦´ë·Î µ¿ÀÛÇϴ°¡? 1996³â 6¿ù, ³ª´Â »õ·Î¿î »óÇ¥ÀÇ
(»ç½ÇÀº Çѹ° °£ Ç°Á¾À̾úÁö¸¸ »õ »óÇ¥¿´´Ù ;-) µÎ°³ÀÇ 100MHz ÆæƼ¾ö
ÇÁ·Î¼¼¼¸¦ °¡Áö´Â ½Ã½ºÅÛÀ» ±¸ÀÔÇß´Ù. Á¶¸³À» ¸¶Ä£ ½Ã½ºÅÛÀº µÎ°³ÀÇ
ÇÁ·Î¼¼¼¿Í Asus ¸¶´õº¸´õ(motherboard), 256K ij½Ã, 32M RAM, 1.66G
Çϵåµð½ºÅ©, 6¹è¼Ó CDROM, Stealth 64 ±×·¡ÇÈ Ä«µå¿Í 15ÀÎÄ¡ ¸ð´ÏÅÍ·Î, À̸¦
¸¶·ÃÇϴµ¥ ¸ðµÎ 1800$°¡ µé¾ú´Ù. ÀÌ °¡°ÝÀº ÀÌ¿Í ºñ½ÁÇÑ »ç¾çÀÇ ÇÁ·Î¼¼¼
ÇϳªÀÎ ½Ã½ºÅÛº¸´Ù ´ÜÁö ¸î¹é ´Þ·¯Á¤µµ ºñ½Ñ °Å¿´´Ù. Á¦´ë·Î µ¿ÀÛÇÏ´Â SMP
¸®´ª½º¸¦ ±¸ÇÒ·Á¸é, ±×Àú º¸ÅëÀÇ ´ÜÀÏ ÇÁ·Î¼¼¼ ¸®´ª½º¸¦ ¼³Ä¡ÇÏ°í,
makefile¿¡¼ SMP=1
À» ¸·°í ÀÖ´Â ÁÖ¼®À» ÇØÁ¦ÇÏ¿© (ºñ·Ï
SMP
¸¦ 1
·Î ¼³Á¤ÇÏ´Â °ÍÀÌ Á¶±ÝÀº ¹Ý¾îÀûÀ̶ó´Â
°ÍÀ» ¾ËÁö¸¸) Ä¿³ÎÀ» ´Ù½Ã ÄÄÆÄÀÏÇÏ°í, lilo
¿¡°Ô »õ·Î¿î
Ä¿³ÎÀ» ¾Ë·ÁÁֱ⸸ ÇÏ¸é µÈ´Ù. ÀÌ ½Ã½ºÅÛÀº ¸Å¿ì Àß µ¿ÀÛÇÏ¿´°í,
¾ÈÁ¤ÀûÀ̱⵵ ÇÏ¿©, Áö±Ý±îÁö »ç¿ëÇØ¿Â ³ªÀÇ ÁÖ ¿öÅ©½ºÅ×À̼ÇÀÇ ¿ªÇÒÀ»
¼öÇàÇϱ⿡ ÃæºÐÇß´Ù. ¿ä¾àÇϸé, SMP ¸®´ª½º´Â Á¤¸»·Î Á¦´ë·Î µ¿ÀÛÇÑ´Ù.
´ÙÀ½ Áú¹®Àº SMP ¸®´ª½º°¡ °øÀ¯ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â º´·Ä ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ°í ½ÇÇàÇÏ´Â µ¥ ÀÖ¾î ¾ó¸¸ÅÀ̳ª °í¼öÁØÀ¸·Î Áö¿øÀ» ÇØÁÖ´À³ÄÀÌ´Ù. 1996³â ÃÊ¿¡´Â ÀÌ·± °ÍÀº º°·Î ¸¹Áö ¾Ê¾Ò´Ù. ±×·¯³ª ÀÌÁ¦ ¸¹Àº °ÍÀÌ º¯Çß´Ù. ¿¹¸¦ µé¾î, ÀÌÁ¦´Â ¸Å¿ì ¿Ïº®ÇÑ POSIX ¾²·¹µå(thread) ¶óÀ̺귯¸®°¡ ÀÖ´Ù.
°øÀ¯ ¸Þ¸ð¸® ¹æ½ÄÀ» »ç¿ëÇÏ´Â °Íº¸´Ù´Â ¼º´ÉÀÌ ¶³¾îÁú ¼öµµ ÀÖÁö¸¸, SMP ¸®´ª½º ½Ã½ºÅÛ¿¡¼´Â ¿ø·¡ ¼ÒÄÏ Åë½ÅÀ» »ç¿ëÇÏ´Â ¿öÅ©½ºÅ×ÀÌ¼Ç Å¬·¯½ºÅÍ(cluster)¿¡¼ µ¿ÀÛÇϵµ·Ï °³¹ßµÈ ´ëºÎºÐÀÇ º´·Ä ó¸® ¼ÒÇÁÆ®¿þ¾îµµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¼ÒÄÏ(3.3 ÀåÀ» º¸¶ó) ¹æ½ÄÀº SMP ¸®´ª½º ½Ã½ºÅÛ »Ó¸¸ ¾Æ´Ï¶ó, ¿©·¯°³ÀÇ SMP ½Ã½ºÅÛÀ» ³×Æ®¿÷À¸·Î ¿¬°áÇÑ Å¬·¯½ºÅÍ¿¡¼µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö¸¸ ¼ÒÄÏÀº SMP¿¡¼´Â »ó´çÇÑ ¾çÀÇ ºÒÇÊ¿äÇÑ ¿À¹öÇìµå(overhead)¸¦ °¡Áö°Ô µÈ´Ù. ÀÌ·± ¿À¹öÇìµåÀÇ ´ëºÎºÐÀº Ä¿³Î Áï ÀÎÅÍ·´Æ® Çڵ鷯¿¡¼ ÀϾÙ. SMP ¸®´ª½º¿¡¼´Â º¸Åë µ¿½Ã¿¡ ÇϳªÀÇ ÇÁ·Î¼¼¼¸¸ÀÌ Ä¿³Î ¸ðµå¿¡ ÀÖÀ» ¼ö ÀÖ°í, ºÎÆ® ÇÁ·Î¼¼¼¸¸ÀÌ ÀÎÅÍ·´Æ®¸¦ ó¸®ÇÒ ¼ö ÀÖµµ·Ï ÀÎÅÍ·´Æ® ÄÁÆ®·Ñ·¯°¡ ¼³Á¤µÇ¾î Àֱ⠶§¹®¿¡ ¹®Á¦´Â ´õ ½É°¢ÇØÁø´Ù. ±×·³¿¡µµ ºÒ±¸ÇÏ°í, ÀüÇüÀûÀÎ SMP Åë½Å Çϵå¿þ¾î°¡ Ŭ·¯½ºÅÍ ³×Æ®¿÷º¸´Ù´Â ÈξÀ ÁÁ±â ¶§¹®¿¡, ¿ø·¡ Ŭ·¯½ºÅÍ¿¡¼ »ç¿ëÇÏ·Á°í ¸¸µç Ŭ·¯½ºÅÍ¿ë ¼ÒÇÁÆ®¿þ¾îµµ SMP¿¡¼ ´õ ÁÁÀº ¼º´ÉÀ» º¸ÀδÙ.
ÀÌ ÀåÀÇ ³ª¸ÓÁö¿¡¼´Â SMP Çϵå¿þ¾î¿¡ ´ëÇؼ À̾߱âÇÏ°í, º´·Ä ÇÁ·Î±×·¥ ÇÁ·Î¼¼½º »çÀÌ¿¡¼ ¸Þ¸ð¸®¸¦ °øÀ¯ÇÏ´Â ±âº»ÀûÀÎ ¸®´ª½º ¸ÞÄ¿´ÏÁòÀ» »ìÆ캸°í, ¿øÀÚ¼º(atomicity), Èֹ߼º(volatility), ¶ô(lock), ij½Ã ¶óÀÎ(cache line)¿¡ ´ëÇؼ ¾ÆÁÖ °£´ÜÇÏ°Ô ¾Ë¾Æº¸°í, ¸¶Áö¸·À¸·Î ¿©·¯°¡Áö °øÀ¯ ¸Þ¸ð¸® º´·Ä ó¸® ¶óÀ̺귯¸®µé¿¡ ´ëÇØ ¾à°£ÀÇ Á¶¾ðÀ» Çϵµ·Ï ÇÑ´Ù.
SMP ½Ã½ºÅÛµéÀº ¿©·¯ÇØ ÀüºÎÅÍ »ç¿ëµÇ¾î ¿ÔÁö¸¸, ¾ó¸¶Àü±îÁö¸¸Çصµ ±â°è¸¶´Ù ±âº»ÀûÀÎ ±â´ÉµéÀ» ¼·Î ´Ù¸£°Ô ±¸ÇöÇÏ´Â °æÇâÀÌ ÀÖ¾î¼, ¿î¿µÃ¼Á¦¿¡¼ SMP¸¦ Áö¿øÇÏ´Â °ÍÀÌ È£È¯¼ºÀÌ ¾ø¾ú´Ù. ÀÌ·± ¹®Á¦¸¦ Á¾½Ä½ÃŲ °ÍÀº ÀÎÅÚ¿¡¼ ¹ßÇ¥ÇÑ ´ÙÁßÇÁ·Î¼¼¼ ±Ô¾à(Multiprocessor Specification, °£´ÜÈ÷ ÁÙ¿©¼ MPS¶ó°í ÇÑ´Ù)ÀÌ´Ù. MPS 1.4 ±Ô¾àÀº http://www.intel.com/design/pro/datashts/242016.htm¿¡¼ PDF ÆÄÀÏ Çü½ÄÀ¸·Î µÈ ¹®¼·Î ±¸ÇÒ ¼ö ÀÖÀ¸¸ç, http://support.intel.com/oem_developer/ial/support/9300.HTM¿¡¼ MPS 1.1 ±Ô¾à¿¡ ´ëÇÑ °³¿ä¸¦ º¼ ¼ö ÀÖÁö¸¸, ÀÎÅÚÀÌ ÀÚ½ÅÀÇ WWW »çÀÌÆ®¸¦ Á¾Á¾ °³ÆíÀ» Çϱ⠶§¹®¿¡ ÀÌ ÁÖ¼Ò´Â ¹Ù²î¾úÀ» ¼öµµ ÀÖ´Ù. ¸¹Àº Á¦ÀÛµéÀº 4°³ÀÇ ÇÁ·Î¼¼¼±îÁö Áö¿øÇÏ´Â MPS ȣȯ ½Ã½ºÅÛµéÀ» ¸¸µé°í ÀÖÁö¸¸, ÀÌ·ÐÀûÀ¸·Î MPS´Â ´õ ¸¹Àº ÇÁ·Î¼¼¼µéÀ» Áö¿øÇÒ ¼ö ÀÖ´Ù.
MPS°¡ ¾Æ´Ï¸é¼ IA32(ÀÎÅÚ 32ºñÆ® CPU)°¡ ¾Æ´Ñ ½Ã½ºÅÛ Áß¿¡¼ SMP ¸®´ª½º°¡ Áö¿øÇÏ´Â ½Ã½ºÅÛÀ¸·Î´Â Sun4m ´ÙÁßÇÁ·Î¼¼¼ SPARC ½Ã½ºÅÛÀÌ À¯ÀÏÇÏ´Ù. SMP ¸®´ª½º´Â ÀÎÅÚ MPS 1.1°ú 1.4 ȣȯ ½Ã½ºÅÛÀ» ´ëºÎºÐ Áö¿øÇϸç, 16°³±îÁöÀÇ 486DX, Pentium, Pentium MMX, Pentium Pro, Pentium II ÇÁ·Î¼¼¼¸¦ Áö¿øÇÑ´Ù. Áö¿øÇÏÁö ¾Ê´Â IA32 ÇÁ·Î¼¼¼·Î´Â ÀÎÅÚ 386, 486SX/SLC ÇÁ·Î¼¼¼¿Í (ºÎµ¿ ¼Ò¼ýÁ¡ ¿¬»ê Çϵå¿þ¾î°¡ ¾øÀ¸¸é SMP ±â°è¿¡ ¸ÂÁö ¾Ê´Â´Ù), AMD¿Í CyrixÀÇ ÇÁ·Î¼¼¼µéÀÌ´Ù (À̵é ÇÁ·Î¼¼¼´Â ´Ù¸¥ SMP Áö¿ø ĨµéÀ» ÇÊ¿ä·Î Çϴµ¥, ÀÌ ±ÛÀ» ¾²°í ÀÖÀ» ¶§ ¾ÆÁ÷ À̵é ĨµéÀº ³ª¿ÍÀÖÁö ¾Ê¾Ò´Ù).
MPS ȣȯ ½Ã½ºÅÛµéÀÇ ¼º´ÉÀº õÂ÷¸¸º°·Î ´Þ¶óÁú ¼ö ÀÖ´Ù´Â Á¡Àº ²À ÀÌÇØÇÏ°í ³Ñ¾î°¡¾ß ÇÑ´Ù. ÀϹÝÀûÀÎ ¿¹»ó´ë·Î ¼º´ÉÀÇ Â÷À̸¦ ³ªÅ¸³»´Â ¿äÀÎ ÁßÀÇ Çϳª´Â ÇÁ·Î¼¼¼ ¼ÓµµÀÌ´Ù. ´ëü·Î Á» ´õ ºü¸¥ Ŭ·°ÀÇ ÇÁ·Î¼¼¼À» »ç¿ëÇÏ¸é ´õ ºü¸¥ ½Ã½ºÅÛÀÌ µÇ¸ç, Pentium Pro ÇÁ·Î¼¼¼¸¦ »ç¿ëÇÑ ½Ã½ºÅÛÀÌ Pentium ÇÁ·Î¼¼¼¸¦ ÀÌ¿ëÇÏ´Â ½Ã½ºÅÛº¸´Ù ºü¸¥ °æÇâÀÌ ÀÖ´Ù. ±×·¸Áö¸¸ MPS¿¡¼´Â °øÀ¯ ¸Þ¸ð¸®(shared memory)¸¦ Çϵå¿þ¾îÀûÀ¸·Î ¾î¶»°Ô ±¸ÇöÇØ¾ß ÇÏ´ÂÁö´Â ¸í½ÃÇÏÁö ¾Ê°í ÀÖ´Ù. ´ÜÁö ¼ÒÇÁÆ®¿þ¾îÀûÀÎ °üÁ¡¿¡¼ °øÀ¯ ¸Þ¸ð¸®°¡ ¾î¶»°Ô µ¿ÀÛÇØ¾ß ÇÏ´ÂÁö¸¸ ¸í½ÃÇÏ°í ÀÖÀ» »ÓÀÌ´Ù. ±×·¡¼ ±¸ÇöÇÏ°í ÀÖ´Â °øÀ¯ ¸Þ¸ð¸® ¹æ½ÄÀÌ SMP ¸®´ª½ºÀÇ Æ¯Â¡°ú ƯÁ¤ ÇÁ·Î±×·¥ÀÇ Æ¯Â¡¿¡ ¾î¶»°Ô ¸Â¾Æµé¾î°¡´À³Ä¿¡ µû¶ó¼ ¼º´ÉÀÌ ´Þ¶óÁú ¼ö ÀÖ´Ù.
MPS ȣȯ ½Ã½ºÅÛµéÀÇ Â÷ÀÌ´Â ¿ì¼± ¹°¸®ÀûÀ¸·Î °øÀ¯ ¸Þ¸ð¸®¿¡ Á¢±ÙÇÏ´Â °ÍÀ» ¾î¶»°Ô ±¸ÇöÇÏ´À³Ä¿¡¼ ³ªÅ¸³´Ù.
ÀϺΠMPS Pentium ½Ã½ºÅÛ°ú, ¸ðµç MPS Pentium Pro¿Í Pentium II ½Ã½ºÅÛÀº µ¶ÀÚÀûÀÎ L2 ij½Ã¸¦ °¡Áö°í ÀÖ´Ù. (L2 ij½Ã´Â Pentium Pro³ª Pentium II ¸ðµâ¿¡ µé¾îÀÖ´Ù) ÀϹÝÀûÀ¸·Î µ¶ÀÚÀûÀÎ L2 ij½Ã¸¦ »ç¿ëÇϸé ó¸® ¼Óµµ¸¦ ÃÖ´ëÈÇÒ ¼ö ÀÖ´Ù°í ¾Ë·ÁÁ® ÀÖÁö¸¸, ¸®´ª½º¿¡¼´Â ¸í¹éÇÏ°Ô ±×·± °ÍÀº ¾Æ´Ï´Ù. À̸¦ È¥¶õÇÏ°Ô ÇÏ´Â ÁÖµÈ ÀÌÀ¯´Â, ÇöÀçÀÇ ¸®´ª½º ½ºÄÉÁÙ·¯°¡ °¢ ÇÁ·Î¼¼½º¸¦ ¶È°°Àº ÇÁ·Î¼¼¼¿¡¼ ½ÇÇàµÇ°Ô ÇÏ´Â ÇÁ·Î¼¼¼ ģȷÂ(processor infinity)ÀÇ °³³äÀ» µû¸£Áö´Â ¾Ê±â ¶§¹®ÀÌ´Ù. ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ´Â ÇÁ·Î¼¼¼´Â ±Ý¹æ ¹Ù²ð¼ö ÀÖ´Ù. ÀÌ ¹®Á¦´Â ÃÖ±Ù¿¡ "ÇÁ·Î¼¼¼ °áÇÕ(processor binding)"À̶ó´Â Á¦¸ñÀ¸·Î SMP ¸®´ª½º °³¹ß °øµ¿Ã¼¿¡¼ Åä·ÐµÈ ÀûÀÌ ÀÖ´Ù. ÇÁ·Î¼¼¼ ģȷ ¾øÀÌ º°µµÀÇ L2 ij½Ã¸¦ °®°ÔµÇ¸é, ¾î¶² ÇÁ·Î¼¼½º°¡ ÀÌÀü¿¡ ½ÇÇàµÇ´ø ÇÁ·Î¼¼¼°¡ ¾Æ´Ñ ´Ù¸¥ ÇÁ·Î¼¼¼¿¡¼ ½Ã°£À» ÇÒ´ç¹Þ¾Æ ½ÇÇàµÇ´Â °æ¿ì »ó´çÇÑ ¿À¹öÇìµå¸¦ ÃÊ·¡ÇÒ ¼ö ÀÖ´Ù.
»ó´ëÀûÀ¸·Î °ªÀÌ ½Ñ »ó´ç¼öÀÇ ½Ã½ºÅÛµéÀº µÎ°³ÀÇ Pentium ÇÁ·Î¼¼¼°¡ ÇϳªÀÇ L2 ij½Ã¸¦ °øÀ¯Çϵµ·Ï ¸¸µé¾îÁ® ÀÖ´Ù. ÀÌ ¹æ½ÄÀÇ ¾ÈÁÁÀº Á¡Àº µÎ°³ÀÇ ÇÁ·Î¼¼¼°¡ ¼·Î ij½Ã¸¦ »çÀÌ¿¡ µÎ°í °æÀïÀ» ÇؾßÇÑ´Ù´Â °ÍÀ¸·Î, ƯÈ÷ ¿©·¯°³ÀÇ ¼·Î µ¶¸³ÀûÀÎ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â °æ¿ì ¼º´ÉÀÌ ÇöÀúÇÏ°Ô ¶³¾îÁø´Ù´Â °ÍÀÌ´Ù. ÁÁÀº Á¡Àº ¸¹Àº º´·Ä ÇÁ·Î±×·¥µé¿¡°Ô ÀÖ¾î¼ µÎ °³ÀÇ ÇÁ·Î¼¼¼°¡ °øÀ¯ ¸Þ¸ð¸®ÀÇ ¶È°°Àº ¶óÀο¡ Á¢±ÙÇÏ´Â °æ¿ì Çϳª¸¸ÀÌ À̸¦ ij½Ã¿¡ °¡Á®¿À¸é µÇ¾î, ¹ö½º¸¦ µÑ·¯½Ñ °æÀïÀ» ÇÇÇÒ ¼ö ÀÖ¾î¼ Ä³½Ã¸¦ °øÀ¯ÇÏ´Â°Ô ½ÇÁúÀûÀ¸·Î µµ¿òÀÌ µÈ´Ù´Â °ÍÀÌ´Ù. ¶ÇÇÑ ÇÁ·Î¼¼¼ ģȷÂÀ» Àû¿ëÇÏÁö ¾Ê´Â °æ¿ì L2 ij½Ã¸¦ °øÀ¯ÇÏ´Â °ÍÀÌ ÇÇÇØ°¡ ´õ Àû´Ù. µû¶ó¼ º´·Ä ÇÁ·Î±×·¥ÀÇ °æ¿ì L2 ij½Ã¸¦ °øÀ¯ÇÏ´Â °ÍÀÌ ÀϹÝÀûÀ¸·Î »ý°¢ÇÏ´Â °Í¸¸Å ³ª»ÚÁö´Â ¾Ê´Ù.
µÎ°³ÀÇ Pentium ÇÁ·Î¼¼¼°¡ 256K ij½Ã¸¦ °øÀ¯ÇÏ´Â ½Ã½ºÅÛÀ» »ç¿ëÇغ» °æÇè¿¡ µû¸£¸é, ÇÊ¿äÇÑ Ä¿³Î ÀÛ¾÷ÀÇ Á¤µµ¿¡ µû¶ó¼ ½Ã½ºÅÛÀÇ ¼º´ÉÀÌ »ó´çÈ÷ Å©°Ô ´Þ¶óÁ³´Ù. ÃÖ¾ÇÀÇ °æ¿ì ¼Óµµ°¡ 1.2¹è Á¤µµ¹Û¿¡ »¡¶óÁöÁö ¾Ê¾ÒÁö¸¸, "µ¥ÀÌÅ͸¦ °¡Á®¿À´Â °ÍÀº °øÀ¯ÇÏ´Â(shared fetch)" È¿°ú¸¦ Á¦´ë·Î ÀÌ¿ëÇÏ´Â °è»ê Áß½ÉÀûÀÎ SPMD ½ºÅ¸ÀÏÀÇ Äڵ带 »ç¿ëÇÏ¿´À» ¶§ 2.1 ¹è±îÁö »¡¶óÁö´Â °ÍÀ» º¸±âµµ ÇÏ¿´´Ù.
¸ÕÀú À̾߱âÇÒ °ÍÀº ¿äÁò¿¡ ³ª¿À´Â ´ëºÎºÐÀÇ ½Ã½ºÅÛµéÀº, ÇÁ·Î¼¼¼¿¡ Çϳª ÀÌ»óÀÇ PCI ¹ö½º°¡ ¿¬°áµÇ¾î ÀÖ°í, ÀÌ´Â ¶Ç´Ù½Ã ºê¸´Áö(bridge)¸¦ ÅëÇÏ¿© Çϳª ÀÌ»óÀÇ ISA/EISA ¹ö½º¿¡ ¿¬°áµÇ¾î ÀÖ´Ù´Â °ÍÀÌ´Ù. ºê¸´Áö¸¦ ÅëÇÏ´Â °æ¿ì ´ë±â½Ã°£(latency)ÀÌ ´Ã¾î³ª°Ô µÇ°í, EISA³ª ISA´Â ÀϹÝÀûÀ¸·Î PCI¿¡ ºñÇؼ ³·Àº ´ë¿ªÆøÀ» Á¦°øÇϱ⠶§¹®¿¡ (ISA°¡ Á¦ÀÏ ³·´Ù), µð½ºÅ© µå¶óÀ̺곪, ºñµð¿À Ä«µå, ´Ù¸¥ °í¼º´É ÀåÄ¡µéÀº PCI ¹ö½º ÀÎÅÍÆäÀ̽º¸¦ ÅëÇÏ¿© ¿¬°áµÇ¾î¾ß ÇÑ´Ù.
PCI ¹ö½º°¡ Çϳª¹Û¿¡ ¾ø´õ¶óµµ °è»ê Áß½ÉÀûÀÎ º´·Ä ÇÁ·Î±×·¥ÀÇ °æ¿ì MPS ½Ã½ºÅÛÀº ±¦ÂúÀº ¼º´É°³¼± È¿°ú¸¦ º¸¿©ÁØ´Ù. ÇÏÁö¸¸ I/O 󸮼ӵµ´Â ÇϳªÀÇ ÇÁ·Î¼¼¼¸¦ »ç¿ëÇÒ ¶§º¸´Ù ´õ ³ª¾ÆÁöÁö ¾ÊÀ¸¸ç, ÇÁ·Î¼¼¼µéÀÌ ¹ö½º¸¦ »çÀÌ¿¡ µÎ°í °æÀïÀ» Çϱ⠶§¹®¿¡ ¾Æ¸¶µµ ¼º´ÉÀÌ Á¶±Ý ¶³¾îÁö°Ô µÉ °ÍÀÌ´Ù. µû¶ó¼ I/O ¼Óµµ¸¦ ³ôÀÌ°í ½Í´Ù¸é ¿©·¯°³ÀÇ µ¶ÀÚÀûÀÎ PCI ¹ö½º¿Í I/O ÄÜÆ®·Ñ·¯(¿¹¸¦ µé¾î ¿©·¯°³ÀÇ SCSI üÀεé)¸¦ °¡Áö´Â MPS ½Ã½ºÅÛÀ» ±¸ÀÔÇÏ´Â °ÍÀÌ ÁÁ´Ù. ÀÌ ¶§ SMP ¸®´ª½º¿¡¼ ÀÌµé ½Ã½ºÅÛÀ» Áö¿øÇÏ´ÂÁö Á¶½É½º·´°Ô »ìÆ캸¾Æ¾ß ÇÑ´Ù. ¶ÇÇÑ ÇöÀçÀÇ SMP ¸®´ª½º¿¡¼´Â ¾î´À ¼ø°£À̵ç ÇϳªÀÇ ÇÁ·Î¼¼¼¸¸ÀÌ Ä¿³Î¸ðµå¿¡ ÀÖÀ» ¼ö Àֱ⠶§¹®¿¡, I/O 󸮸¦ ÇÒ ¶§ Ä¿³Î¿¡¼ ¼Ò¿äÇÏ´Â ½Ã°£ÀÌ ÀûÀº I/O ÄÜÆ®·Ñ·¯¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù´Â Á¡À» ¸í½ÉÇØ¾ß ÇÑ´Ù. Á¤¸» °í¼º´ÉÀ» ¿øÇÑ´Ù¸é ½Ã½ºÅÛ ÄÝ(system call)À» ÅëÇÏÁö ¾Ê°í, »ç¿ëÀÚ ÇÁ·Î¼¼½º°¡ Á÷Á¢ ÀåÄ¡·Î I/O¸¦ ÇÏ´Â °Íµµ °í·ÁÇØ º¼ ÇÊ¿ä°¡ ÀÖ´Ù. ÀÌ´Â »ý°¢¸¸Å ¾î·ÆÁöµµ ¾Ê°í, ¾ÈÁ¤¼ºÀ» ÇØÄ¡Áöµµ ¾Ê´Â´Ù (3.3 Àå¿¡¼ ±âº» ±â¼ú¿¡ ´ëÇؼ ¼³¸íÇÏ°í ÀÖ´Ù).
¹ö½º ¼Óµµ¿Í ÇÁ·Î¼¼¼ Ŭ·° ¼ÓµµÀÇ °ü°è¸¦ »ìÆ캸´Â °Íµµ ¸Å¿ì Áß¿äÇÏ´Ù. Áö³ ¸îÇص¿¾È ÀÌµé »çÀÌÀÇ °ü°è´Â ºÒ¸íÈ®ÇÏ°Ô ÀÌÇØµÇ¾î ¿Ô´Ù. ´ëºÎºÐÀÇ ½Ã½ºÅÛÀÌ Áö±ÝÀº ¶È°°Àº PCI Ŭ·° ¼Óµµ¸¦ »ç¿ëÇÏ°í ÀÖÁö¸¸, ´õ ºü¸¥ Ŭ·° ¼ÓµµÀÇ ÇÁ·Î¼¼¼°¡ ´õ ´À¸° ¹ö½º Ŭ·°°ú ½ÖÀ» ÀÌ·ç´Â °ÍÀº µå¹® ÀÏÀÌ ¾Æ´Ï´Ù. ÀÌÀÇ °íÀüÀûÀÎ ¿¹·Î, ÀϹÝÀûÀ¸·Î Pentium 133Àº Pentium 150º¸´Ù ´õ ºü¸¥ ¹ö½º¸¦ »ç¿ëÇÏ¿´°í, ´Ù¾çÇÑ º¥Ä¡¸¶Å©¿¡¼ ƯÀÌÇÑ °á°ú¸¦ ³ªÅ¸³Â´Ù. ÀÌ·± È¿°ú´Â SMP ½Ã½ºÅÛ¿¡¼ ´õ¿í ÁõÆøµÈ´Ù. ÀÌ´Â ¹ö½º Ŭ·° ¼Óµµ¸¦ ºü¸£°Ô ÇÏ´Â °Íº¸´Ùµµ ´õ Áß¿äÇÑ ¹®Á¦ÀÌ´Ù.
¸Þ¸ð¸® ÁßøÀº ½ÇÁ¦·Î MPS¿Í´Â ¾Æ¹«·± Àϵµ °°ÀÌ ÇÏÁö ¾Ê´Â´Ù. ±×·¯³ª MPS ½Ã½ºÅÛ¿¡¼ ÀÌ°ÍÀÌ Á¾Á¾ ¾ð±ÞµÇ´Â °ÍÀ» º¼ ¼ö Àִµ¥, ÀÌ´Â ÀÌµé ½Ã½ºÅÛÀÌ ´ëü·Î ¸Þ¸ð¸® ´ë¿ªÆøÀ» ´õ ¸¹ÀÌ ÇÊ¿ä·Î Çϱ⠶§¹®ÀÌ´Ù. ±âº»ÀûÀ¸·Î 2-way³ª 4-way ÁßøÀº RAM¿¡ ºí·° Á¢±ÙÀ» ÇÒ ¶§, ÀÌ°ÍÀÌ Çϳª°¡ ¾Æ´Ï¶ó ¿©·¯°³ÀÇ RAM ¹ðÅ©(bank)¸¦ »ç¿ëÇÏ¿© ÀÌ·ç¾îÁöµµ·Ï RAMÀ» Á¶Á÷ÈÇÑ´Ù. ÀÌ´Â ´õ ³ôÀº ¸Þ¸ð¸® Á¢±Ù ´ë¿ªÆøÀ» Á¦°øÇÏ°Ô µÇ´Âµ¥, ƯÈ÷ ij½Ã ¶óÀÎ(cache line) Àб⳪ ¾²±â¿¡ ÀÖ¾î¼ ´õ¿í ±×·¯ÇÏ´Ù.
ÀÌ°ÍÀÇ È¿°ú¿¡ ´ëÇؼ´Â ±×´ÙÁö ¸íÄèÇÏÁö ¾ÊÀºµ¥, EDO DRAMÀ̳ª ¿©·¯°¡Áö ´Ù¸¥ ¸Þ¸ð¸® ±â¼úµéÀº ÀÌ¿Í ºñ½ÁÇÑ Á¾·ùÀÇ ¿¬»ê ¼Óµµ¸¦ Çâ»ó½ÃÅ°±â ¶§¹®ÀÌ´Ù. http://www.pcguide.com/ref/ram/tech.htm¿¡¼ DRAM ±â¼ú¿¡ ´ëÇØ ¹«Ã´ Àß Á¤¸®µÇ¾îÀÖ´Â °³¿ä¸¦ º¼ ¼ö ÀÖ´Ù.
±×·¸´Ù¸é, ¿¹¸¦ µé¾î 2-wayÀÇ ÁßøµÇ´Â EDO DRAMÀ» ¾²´Â °ÍÀÌ ÁßøÀ» »ç¿ëÇÏÁö ¾Ê´Â SDRAMÀ» ¾²´Â °Íº¸´Ù ´õ ÁÁÀº°¡? ÀÌ°ÍÀº ¸Å¿ì ÈǸ¢ÇÑ Áú¹®À̸ç, ±× ´ë´äÀº °£´ÜÇÏÁö ¾Ê´Ù. ¿Ö³ÄÇϸé Áßø±â¼úÀ̳ª ´Ù¸¥ Èï¹ÌÀÖ´Â ±â¼úµéÀº ´ëü·Î ºñ½Î±â ¶§¹®ÀÌ´Ù. ¿©±â¿¡ µé¾î°¡´Â ¶È°°Àº µ·À» º¸Åë ¸Þ¸ð¸®¿¡ ÅõÀÚÇÑ´Ù¸é ÈξÀ ¸¹Àº ¾çÀÇ ¸ÞÀÎ ¸Þ¸ð¸®¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. °¡Àå ´À¸° DRAMÀ» »ç¿ëÇÑ´Ù ÇÏ´õ¶óµµ µð½ºÅ©¸¦ ÀÌ¿ëÇÑ °¡»ó ¸Þ¸ð¸®º¸´Ù´Â ÈξÀ ºü¸£´Ù.
SMP¿¡¼ º´·Ä󸮸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÃæºÐÈ÷ ÇÒ¸¸ÇÑ °ÍÀ̶ó°í °áÁ¤À» ³»·È´Ù¸é, ÀÌÁ¦ ¾îµð¼ºÎÅÍ ½ÃÀÛÇÏ´Â°Ô ÁÁÀ»±î? ±×·³, °øÀ¯ ¸Þ¸ð¸® Åë½ÅÀÌ ½ÇÁ¦·Î µ¿ÀÛÇÏ´Â ¹æ½Ä¿¡ ´ëÇؼ Á¶±Ý ´õ ¹è¿ì´Â °ÍÀ¸·Î ±× ù¹ßÀ» ³»µó¾îº¸µµ·Ï ÇÏÀÚ.
¾óÇÍ »ý°¢ÇÏ¸é °øÀ¯ ¸Þ¸ð¸® Åë½ÅÀ̶õ ÇϳªÀÇ ÇÁ·Î¼¼¼°¡ ¸Þ¸ð¸®¿¡ °ªÀ» ÀúÀåÇϸé, ´Ù¸¥ ÇÁ·Î¼¼¼°¡ À̸¦ ÀоîµéÀÌ´Â °ÍÀ̶ó°í »ý°¢ÇÒ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ ºÒÇàÈ÷µµ ±×·¸°Ô °£´ÜÇÏÁö¸¸Àº ¾Ê´Ù. ¿¹¸¦ µé¾î, ÇÁ·Î¼¼½º¿Í ÇÁ·Î¼¼¼ »çÀÌÀÇ °ü°è°¡ ¹«Ã´ º¹ÀâÇÏ°Ô ¾ôÇô µÇ¾îÀÖ´Ù°í ÇÏÀÚ. ÇÁ·Î¼¼¼ÀÇ °¹¼öº¸´Ù ÇöÀç µ¿ÀÛÇÏ´Â ÇÁ·Î¼¼½ºÀÇ ¼ö°¡ Àû´Ù°í ÇÏ´õ¶óµµ ±×·¸°í, ±× ¹Ý´ëÀÇ °æ¿ìµµ ¸¶Âù°¡Áö´Ù. ÀÌ ÀåÀÇ ³²Àº ºÎºÐ¿¡¼´Â Ưº°È÷ ½Å°æ¾²Áö ¾ÊÀ¸¸é ½É°¢ÇÑ ¹®Á¦¸¦ ¾ß±âÇÒ ¼ö ÀÖ´Â Áß¿äÇÑ ³íÁ¡µé - ¹«¾ùÀ» °øÀ¯ÇÒ °ÍÀÎÁö ÆÇ´ÜÇϴµ¥ »ç¿ëÇÏ´Â µÎ°¡Áö ¼·Î ´Ù¸¥ ¸ðµ¨°ú, ¿øÀÚ¼º(atomicity) ³íÁ¡, Èֹ߼º(volatility) °³³ä°ú Çϵå¿þ¾î ¶ô(lock) ¸í·É, ij½Ã ¶óÀÎ(cache line) È¿°ú, ±×¸®°í ¸®´ª½º ½ºÄÉÁÙ·¯ ³íÁ¡ - À» °£´ÜÈ÷ ¿ä¾àÇϵµ·Ï ÇÏ°Ú´Ù.
°øÀ¯ ¸Þ¸ð¸® ÇÁ·Î±×·¡¹Ö¿¡¼´Â ÀϹÝÀûÀ¸·Î ¸ðµÎ °øÀ¯Çϱâ¿Í ÀϺθ¦ °øÀ¯Çϱâ¶ó´Â µÎ°¡ÁöÀÇ ±Ùº»ÀûÀ¸·Î ¼·Î ´Ù¸¥ ¸ðµ¨À» »ç¿ëÇÑ´Ù . ÀÌ µÎ°¡Áö ¸ðµ¨Àº ¸ðµÎ ÇÁ·Î¼¼¼µéÀÌ °øÀ¯¸Þ¸ð¸®·Î µ¥ÀÌÅ͸¦ ¾²°í, °øÀ¯¸Þ¸ð¸®¿¡¼ µ¥ÀÌÅ͸¦ ÀоîµéÀÓÀ¸·Î½á Åë½ÅÀ» ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. µÎ ¸ðµ¨ÀÇ ´Ù¸¥Á¡Àº, ¸ðµÎ °øÀ¯ÇÏ´Â ¸ðµ¨¿¡¼´Â ¸ðµç ÀڷᱸÁ¶¸¦ °øÀ¯¸Þ¸ð¸®¿¡ µÎ´Â ¹Ý¸é¿¡, ÀϺθ¦ °øÀ¯ÇÏ´Â ¸ðµ¨¿¡¼´Â »ç¿ëÀÚ°¡ °øÀ¯ÇÒ ÀڷᱸÁ¶¿Í ÇϳªÀÇ ÇÁ·Î¼¼¼¿¡ ±¹ÇѵǴ ÀڷᱸÁ¶¸¦ ¸í½ÃÀûÀ¸·Î ÁöÁ¤ÇÑ´Ù´Â °ÍÀÌ´Ù.
¾î¶² °øÀ¯¸Þ¸ð¸® ¸ðµ¨À» »ç¿ëÇÒ °ÍÀΰ¡? ÀÌ´Â Á¾±³¿¡ ´ëÇÑ Áú¹®°ú ºñ½ÁÇÏ´Ù. ¸¹Àº »ç¶÷µéÀº ÀڷᱸÁ¶¸¦ ¼±¾ðÇÒ ¶§ ÀÌ°ÍÀ» °øÀ¯ÇÒ °ÍÀÎÁö µû·Î ±¸º°ÇÒ ÇÊ¿ä°¡ ¾ø±â ¶§¹®¿¡, ¸ðµÎ °øÀ¯ÇÏ´Â ¸ðµ¨À» ÁÁ¾ÆÇÑ´Ù. ÀÌ ¶§´Â µ¿½Ã¿¡ ÇϳªÀÇ ÇÁ·Î¼¼½º(ÇÁ·Î¼¼¼)¸¸ÀÌ ÀÚ·á¿¡ Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï, Ãæµ¹À» ÀÏÀ¸Å³ ¼ö ÀÖ´Â °øÀ¯ÇÏ´Â ÀÚ·á¿¡ Á¢±ÙÇÏ´Â ÄÚµå ÁÖÀ§¿¡ ¶ô(lock)À» °É±â¸¸ ÇÏ¸é µÈ´Ù. ±×·¸Áö¸¸ ÀÌ°Í ¿ª½Ã ¸»Ã³·³ °£´ÜÇÏÁø ¾Ê´Ù. ±×·¡¼ ¸¹Àº »ç¶÷µéÀº ÀϺθ¸À» °øÀ¯ÇÏ´Â ¸ðµ¨ÀÌ °¡Á®´ÙÁÖ´Â »ó´ëÀûÀÎ ¾ÈÀü¼ºÀ» ´õ ¼±È£Çϱ⵵ ÇÑ´Ù.
¸ðµÎ °øÀ¯ÇÏ´Â ¹æ½ÄÀÇ ÀåÁ¡Àº ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖ´Â ¼øÂ÷ÀûÀÎ ÇÁ·Î±×·¥À» ¼±ÅÃÇÏ¿© ½±°Ô ¸ðµÎ °øÀ¯ÇÏ´Â º´·Ä ÇÁ·Î±×·¥À¸·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¿©±â¼´Â ¾î¶² ÀÚ·á°¡ ´Ù¸¥ ÇÁ·Î¼¼¼¿¡¼ Á¢±ÙÇÒ ¼ö ÀÖ´Â °ÍÀÎÁö ¸ÕÀú ÆÇ´ÜÇØ¾ß ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
°£´ÜÇÏ°Ô »ìÆ캸¸é, ¸ðµç°É °øÀ¯ÇÏ´Â ¹æ½ÄÀÇ °¡Àå Å« ¹®Á¦Á¡Àº ÇϳªÀÇ ÇÁ·Î¼¼¼°¡ ÃëÇÑ ÇൿÀÌ ´Ù¸¥ ÇÁ·Î¼¼¼µé¿¡°Ô ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀÌ ¹®Á¦´Â µÎ°¡Áö ¹æÇâÀ¸·Î ³ªÅ¸³´Ù :
errno
¶ó´Â º¯¼ö¿¡´Ù°¡
¿¡·¯Äڵ带 ´ã¾Æ µ¹·ÁÁØ´Ù. ¸¸¾à ¸ðµÎ °øÀ¯ÇÏ´Â µÎ °³ÀÇ ÇÁ·Î¼¼½º°¡
¿©·¯°¡Áö ÇÔ¼ö¸¦ ºÎ¸¥´Ù¸é, À̵éÀº ¶È°°Àº errno
º¯¼ö¸¦
°øÀ¯Çϱ⠶§¹®¿¡ ¼·Î °£¼·À» ÀÏÀ¸Å°°Ô µÉ °ÍÀÌ´Ù. ºñ·Ï Áö±ÝÀº
errno
¹®Á¦¸¦ ÇØ°áÇÑ ¶óÀ̺귯¸®°¡ ÀÖ±ä ÇÏÁö¸¸, ÀÌ¿Í ºñ½ÁÇÑ
¹®Á¦´Â ´ëºÎºÐÀÇ ¶óÀ̺귯¸®¿¡ ¿©ÀüÈ÷ ³²¾Æ ÀÖ´Ù. ¿¹¸¦ µé¾î, ¹Ì¸® Ưº°ÇÑ
ÁÖÀǸ¦ ±â¿ïÀÌÁö ¾Ê°í, ¸ðµÎ °øÀ¯ÇÏ´Â ¿©·¯°³ÀÇ ÇÁ·Î¼¼½ºµéÀÌ X ¶óÀ̺귯¸®ÀÇ
ÇÔ¼öµéÀ» È£ÃâÇÑ´Ù¸é, X ¶óÀ̺귯¸®´Â Á¦´ë·Î µ¿ÀÛÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.
ÀÌ·± Á¾·ùÀÇ ¹®Á¦´Â ÀϺθ¦ °øÀ¯ÇÏ´Â ¹æ½Ä¿¡¼´Â ÈçÈ÷ ÀϾÁø ¾Ê´Â´Ù. ¿Ö³ÄÇÏ¸é ¸í¹éÇÏ°Ô ÁöÁ¤ÇÑ ÀڷᱸÁ¶¸¸ÀÌ °øÀ¯µÇ±â ¶§¹®ÀÌ´Ù. ±×¸®°í, ¸ðµÎ °øÀ¯ÇÏ´Â ¹æ½ÄÀº ¸ðµç ÇÁ·Î¼¼¼°¡ ¿ÏÀüÈ÷ ¶È°°Àº ¸Þ¸ð¸® À̹ÌÁö¸¦ ½ÇÇàÇÏ´Â °æ¿ì¿¡¸¸ µ¿ÀÛÇÑ´Ù´Â °ÍÀº ´ç¿¬ÇÑ ÀÏÀÌ´Ù. Áï, ¿©·¯°³ÀÇ ¼·Î ´Ù¸¥ ÄÚµå À̹ÌÁöµé »çÀÌ¿¡¼´Â ¸ðµÎ °øÀ¯ÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù (´Ù¸£°Ô ¸»Çϸé, SPMD¸¸À» »ç¿ëÇÒ ¼ö ÀÖÁö, ÀϹÝÀûÀÎ MIMD´Â »ç¿ëÇÒ ¼ö ¾ø´Ù).
¸ðµÎ °øÀ¯ÇÏ´Â ¹æ½ÄÀ» Áö¿øÇÏ´Â °¡Àå ÀϹÝÀûÀÎ À¯ÇüÀº ¾²·¹µå ¶óÀ̺귯¸®(threads library)ÀÌ´Ù. ¾²·¹µå´Â º»·¡, ´ëü·Î ÀϹÝÀûÀÎ UNIX ÇÁ·Î¼¼½º¿Í´Â ´Ù¸£°Ô ½ºÄÉÁÙÀÌ ÀÌ·ç¾îÁö°í, °¡Àå Áß¿äÇÑ Á¡À¸·Î µ¿ÀÏÇÑ ¸Þ¸ð¸® ¸Ê¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â "°¡º¿î" ÇÁ·Î¼¼½ºÀÌ´Ù. POSIX PthreadsÆÐÅ°Áö´Â ¿©·¯ Æ÷Æà ÇÁ·ÎÁ§Æ®¿¡¼ ÃÐÁ¡À» ¹Þ¾Æ ¿Ô¾ú´Ù. ¿©±â¼ Áß¿äÇÑ Áú¹®Àº, À̵é Æ÷ÆÃÁßÀÇ ¾î¶² °ÍµéÀÌ ½ÇÁ¦·Î ÇÁ·Î±×·¥¿¡ ÀÖ´Â ¾²·¹µåµéÀ» SMP ¸®´ª½º¿¡¼ º´·Ä·Î ½ÇÇàÇÒ ¼ö ÀÖ´À³ÄÀÌ´Ù (ÀÌ»óÀûÀ¸·Î, °¢ ¾²·¹µå¸¶´Ù ÇϳªÀÇ ÇÁ·Î¼¼¼¸¦). POSIX API´Â À̸¦ ¿ä±¸ÇÏÁö ¾ÊÀ¸¸ç, http://www.aa.net/~mtp/PCthreads.html°°Àº ¹öÀü¿¡¼´Â ºÐ¸íÇÏ°Ô º´·Ä ¾²·¹½º ½ÇÇàÀ» ±¸ÇöÇÏÁö ¾Ê°í ÀÖ´Ù - ÇÁ·Î±×·¥ÀÇ ¸ðµç ¾²·¹µåµéÀº ÇϳªÀÇ ¸®´ª½º ÇÁ·Î¼¼½º ¾È¿¡ µé¾îÀÖ´Ù.
SMP ¸®´ª½º¿¡¼ÀÇ º´·Ä󸮸¦ Áö¿øÇÑ Ã¹¹ø° ¾²·¹µå ¶óÀ̺귯¸®´Â Áö±ÝÀº
Çѹ°°£ bb_threads ¶óÀ̺귯¸®·Î,
ftp://caliban.physics.utoronto.ca/pub/linux/¿¡¼
±¸ÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ¸®´ª½ºÀÇ clone()
ÇÔ¼ö¸¦ »ç¿ëÇÏ¿©, µ¶ÀÚÀûÀ¸·Î
½ºÄÉÁٵǸç, ÇϳªÀÇ ÁÖ¼Ò°ø°£À» °øÀ¯ÇÏ´Â, »õ·Î¿î ¸®´ª½º ÇÁ·Î¼¼½º¸¦
»ý¼º(fork)ÇÏ´Â ¸Å¿ì ÀÛÀº ¶óÀ̺귯ÀÌ´Ù. SMP ¸®´ª½º ±â°è´Â °¢
"¾²·¹µåµé"ÀÌ ¿ÏÀüÇÑ ¸®´ª½º ÇÁ·Î¼¼½ºÀ̱⠶§¹®¿¡ ¿©·¯°³ÀÇ À̵é
"¾²·¹µåµé"À» º´·Ä·Î ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ´ë½Å ÀÌÀÇ ´ñ°¡·Î ´Ù¸¥ ¿î¿µÃ¼Á¦ÀÇ
ÀϺΠ¾²·¹µå ¶óÀ̺귯¸®µéÀÌ Á¦°øÇÏ´Â °Í°ú °°Àº "°¡º¿î" ½ºÄÉÁÙ¸µ Á¦¾î¸¦
ÇÒ ¼ö ¾ø´Ù. ÀÌ ¶óÀ̺귯¸®´Â »õ·Î¿î ¸Þ¸ð¸® Á¶°¢À» °¢ ¾²·¹µåÀÇ ½ºÅÃÀ¸·Î
ÇÒ´çÇÏ°í, ¶ô(lock)ÀÇ ¹è¿(mutex °³Ã¼µé)µéÀ» ¿øÀÚÀûÀ¸·Î Á¢±ÙÇÒ ¼ö ÀÖ´Â
ÇÔ¼ö¸¦, C·Î Æ÷ÀåµÈ ¾î¼Àºí¸® Äڵ带 Á¶±Ý »ç¿ëÇÏ¿© Á¦°øÇÏ°í ÀÖ´Ù. ¹®¼´Â
README
¿Í °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥À¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
Á»´õ ÃÖ±Ù¿¡ clone()À» »ç¿ëÇÏ´Â POSIX ¾²·¹µå ¹öÀüÀÌ °³¹ßµÇ¾ú´Ù. ÀÌ ¶óÀ̺귯¸®´Â LinuxThreads·Î, SMP ¸®´ª½º¿¡¼ »ç¶÷µéÀÌ °¡Àå ¼±È£ÇÏ´Â ¸ðµÎ °øÀ¯ÇÏ´Â ¶óÀ̺귯¸®ÀÌ´Ù. POSIX ¾²·¹µåµéµµ ¹®¼È°¡ ÀߵǾîÀÖ°í, LinuxThreads README¿Í LinuxThreads FAQ ¿ª½Ã ¸Å¿ì ÀߵǾî ÀÖ´Ù. Áö±ÝÀÇ ÁÖ¿äÇÑ ¹®Á¦´Â POSIX ¾²·¹µå¸¦ Á¦´ë·Î ÇÏ·Á¸é À̸¦ ÀÚ¼¼ÇÏ°Ô ¾Ë¾Æ¾ßÇÑ´Ù´Â °ÍÀÌ°í, LinuxThreads´Â ¾ÆÁ÷Àº °è¼ÓÇؼ ÀÛ¾÷ÁßÀ̶ó´Â °ÍÀÌ´Ù. ¶ÇÇÑ POSIX ¾²·¹µå Ç¥ÁØÀÌ Ç¥ÁØÈ °úÁ¤¿¡¼ °è¼Ó ¹ßÀüµÇ°í ÀÖ¾î, ÀÌ¹Ì ¹Ù²ï ¿¹Àü ¹öÀüÀÇ Ç¥ÁØ¿¡ ¸ÂÃç ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÁÖÀǸ¦ ±â¿ï¿©¾ß ÇÑ´Ù´Â °Í ¿ª½Ã ¹®Á¦ÀÌ´Ù.
ÀϺθ¦ °øÀ¯ÇÏ´Â °ÍÀº Á¤¸»·Î "°øÀ¯ÇÒ ÇÊ¿ä°¡ ÀÖ´Â °Í¸¸À» °øÀ¯ÇÏ´Â" °ÍÀÌ´Ù. ÀÌ Á¢±Ù¹ýÀº °¢ ÇÁ·Î¼¼¼ÀÇ ¸Þ¸ð¸® ¸ÊÀÇ ¶È°°Àº À§Ä¡¿¡ °øÀ¯µ¥ÀÌÅÍ°¡ ÇÒ´çµÇ°Ô ÇÏ´Â °Í¿¡ À¯ÀÇÇÑ´Ù¸é ÀϹÝÀûÀÎ MIMD(SPMD°¡ ¾Æ´Ï¶ó) ¿ëÀ¸·Î µ¿ÀÛÇÏ°Ô µÈ´Ù. ´õ Áß¿äÇÑ Æ¯Â¡Àº, ÀϺθ¦ °øÀ¯ÇÏ´Â ¹æ½ÄÀº ¼º´ÉÀ» ¿¹ÃøÇÏ°í Á¶À²Çϸç, Äڵ带 µð¹ö±ëÇÏ´Â °Í µîÀ» ½±°Ô ¸¸µé¾îÁشٴ °ÍÀÌ´Ù. À¯ÀÏÇÑ ¹®Á¦·Î´Â :
ÇöÀç ¸®´ª½º ÇÁ·Î¼¼½º ±×·ìµéÀÌ µ¶ÀÚÀûÀÎ ¸Þ¸ð¸® °ø°£À» °¡Áö¸é¼,
»ó´ëÀûÀ¸·Î ÀÛÀº ¸Þ¸ð¸® ¿µ¿ª¸¸À» ÇÔ²² °øÀ¯ÇÏ°Ô Çϴµ¥¿¡´Â µÎ°³ÀÇ À¯»çÇÑ
¹æ½ÄÀ» »ç¿ëÇÑ´Ù. ¸®´ª½º ½Ã½ºÅÛÀ» ¼³Á¤ÇÒ ¶§ ¹Ùº¸°°ÀÌ "System V IPC"¸¦
»©¹ö¸®Áö ¾Ê¾Ò´Ù¸é, ¸®´ª½º´Â "System V °øÀ¯ ¸Þ¸ð¸®"¶ó´Â ´Ù¸¥ ½Ã½ºÅÛ
»çÀÌ¿¡¼µµ ȣȯ¼ºÀÌ ÀÖ´Â ¹æ½ÄÀ» Á¦°øÇÑ´Ù. ´Ù¸¥ ¹æ½ÄÀº mmap()
½Ã½ºÅÛ
ÄÝÀ» ÅëÇÏ¿© ¸Þ¸ð¸® ¸ÅÇÎ(memory mapping) ±â´ÉÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ´Â
±¸Çö¹æ½ÄÀÌ UNIX ½Ã½ºÅÛ¸¶´Ù Å©°Ô Â÷ÀÌ°¡ ³´Ù. À̵é È£Ãâ¿¡ ´ëÇؼ´Â
¸Å´º¾ó ÆäÀÌÁöµé¿¡¼ ¹è¿ï ¼ö ÀÖ´Ù. ±×¸®°í 2.5Àå°ú 2.6Àå¿¡ ³ª¿À´Â °³°ýÀº
À̸¦ óÀ½ ½ÃÀÛÇÒ ¶§ µµ¿òÀÌ µÉ °ÍÀÌ´Ù.
À§ÀÇ µÎ°¡Áö ¸ðµ¨ Áß ¾î¶² °ÍÀ» »ç¿ëÇÏ´õ¶óµµ °á°ú´Â ¸Å¿ì ºñ½ÁÇÏ´Ù. ¿©·¯ºÐÀº ÀÚ½ÅÀÌ ¸¸µç º´·Ä ÇÁ·Î±×·¥¿¡ µé¾î ÀÖ´Â ¸ðµç ÇÁ·Î¼¼½ºµéÀÌ Á¢±ÙÇÏ¿© ÀÐ°í ¾µ¼ö ÀÖ´Â ¸Þ¸ð¸® Á¶°¢¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò°Ô µÈ´Ù. ÀÌ ¸»Àº ³»°¡ ¸¸µç º´·Ä ÇÁ·Î±×·¥ÀÌ °øÀ¯ ¸Þ¸ð¸® °´Ã¼µéÀ» ¸¶Ä¡ º¸ÅëÀÇ Áö¿ª ¸Þ¸ð¸®¿¡ ÀÖ´Â °Íó·³ Á¢±ÙÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÏÁö´Â ¾Ê´Â´Ù.
¿øÀÚ¼ºÀ̶õ ÇÑ °´Ã¼¿¡ ´ëÇÑ ÀÛ¾÷ÀÌ ÂÉ°³ÁöÁö ¾Ê°í, Áß´ÜµÉ ¼ö ¾ø´Â ÀÏ·ÃÀÇ °úÁ¤À¸·Î ÀÌ·ç¾îÁö´Â °ÍÀ» °¡¸®Å°´Â °³³äÀÌ´Ù. ºÒÇàÈ÷µµ, °øÀ¯ ¸Þ¸ð¸®¿¡ ´ëÇÑ Á¢±ÙÀº °øÀ¯ ¸Þ¸ð¸®¿¡ ÀÖ´Â ÀÚ·á¿¡ ´ëÇÑ ¸ðµç ÀÛ¾÷ÀÌ ¿øÀÚÀûÀ¸·Î ÀÌ·ç¾îÁø´Ù´Â °ÍÀ» ³»Æ÷ÇÏÁø ¾Ê´Â´Ù. ¹Ì¸® Ưº°ÇÑ ÁÖÀǸ¦ ±â¿ïÁöÁö ¾Ê´Â´Ù¸é, ¹ö½º(bus)¿¡¼ ´Ü Çѹø¸¸¿¡ 󸮰¡ ÀÌ·ç¾îÁö´Â °£´ÜÇÑ Àбâ/¾²±â ¿¬»ê¸¸ÀÌ (Áï, Á¤·ÄÀÌ µÈ 8, 16, 32 ºñÆ® ¿¬»êÀÌÁö, Á¤·ÄÀÌ ¾ÈµÇ¾î Àְųª 64 ºñÆ® ¿¬»êÀº ¾Æ´Ï´Ù) ¿øÀÚ¼ºÀ» °¡Áø´Ù. ´õ¿í ³ª»Û °ÍÀº, GCC°°ÀÌ "¶È¶ÈÇÑ" ÄÄÆÄÀÏ·¯´Â ÃÖÀûȸ¦ ÅëÇØ ¸Þ¸ð¸® ÀÛ¾÷À» Á¦°ÅÇÏ¿©, ÇÑ ÇÁ·Î¼¼¼°¡ ÇÑ ÀÏÀ» ´Ù¸¥ ÇÁ·Î¼¼¼¿¡¼ º¼ ¼ö ¾ø°Ô ¸¸µé¾î¹ö¸®±âµµ ÇÑ´Ù. ´ÙÇàÈ÷µµ, ÀÌµé ¹®Á¦µéÀº ¸ðµÎ °íÄ¥ ¼ö ÀÖ´Ù... Á¢±Ù È¿À²¼º(access efficiency)°ú ij½Ã¶óÀÎ Å©±â(cache line size) »çÀÌÀÇ °ü°è¸¸ °ÆÁ¤°Å¸®·Î ³²°ÜµÎ°í¼ ¸»ÀÌ´Ù.
±×·¸Áö¸¸ ÀÌµé ³íÁ¡¿¡ ´ëÇؼ Åä·ÐÇϱâ Àü¿¡, À̵éÀº ¸ðµÎ °¢ ÇÁ·Î¼¼¼¿¡¼ÀÇ
¸Þ¸ð¸® ÂüÁ¶°¡ ÄÚµùÇÑ ¼ø¼´ë·Î ÀÌ·ç¾îÁö°í ÀÖ´Ù°í °¡Á¤ÇÏ°í ÀÖ´Ù´Â °ÍÀ»
ÁöÀûÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. PentiumÀº ±×·¸°Ô ÇÏ°í ÀÖÁö¸¸, ¾ÕÀ¸·Î ³ª¿Ã ÀÎÅÚÀÇ
ÇÁ·Î¼¼¼µéÀº ±×·¸Áö ¾ÊÀ» ¼öµµ ÀÖ´Ù´Â °Íµµ ±â¾ïÇϱ⠹ٶõ´Ù. µû¶ó¼,
¾ÕÀ¸·Î ³ª¿Ã ÇÁ·Î¼¼¼¿¡ ´ëºñÇÏ¿©, °øÀ¯ ¸Þ¸ð¸®¿¡ Á¢±ÙÇÏ´Â ÄÚµå ÁÖÀ§¸¦,
¸ðµç ¹Ì°áµÈ ¸Þ¸ð¸® Á¢±ÙÀ» ¿Ï·áÇÏ¿© ¸Þ¸ð¸® Á¢±ÙÀÌ Â÷·Ê´ë·Î ÀÌ·ç¾îÁöµµ·Ï
ÇÏ´Â ¸í·É¾î·Î µÑ·¯½Î¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù´Â °ÍÀ» ±íÀÌ »õ±â±æ ¹Ù¶õ´Ù.
CPUID
¸í·É¾î´Â ÀÌ·± ºÎ¼öÈ¿°ú(side-effect)¸¦ À§ÇØ ¿¹¾àµÇ¾î
ÀÖ´Â °ÍÀÌ´Ù.
GCC ¿ÉƼ¸¶ÀÌÀú(optimizer)°¡ °øÀ¯ ¸Þ¸ð¸® °´Ã¼ÀÇ °ªÀ» ·¹Áö½ºÅÍ¿¡
¹öÆÛ¸µÇÏ´Â °ÍÀ» ¸·À¸·Á¸é, °øÀ¯ ¸Þ¸ð¸®¿¡ ÀÖ´Â ¸ðµç °´Ã¼µéÀ»
volatile
¼Ó¼ºÀ» °¡Áöµµ·Ï ¼±¾ðÇØ¾ß ÇÑ´Ù. ÀÌ·¸°Ô Çϸé,
ÇѹøÀÇ Á¢±Ù¸¸À¸·Î ÀÌ·ç¾îÁö´Â ¸ðµç °øÀ¯ °´Ã¼ÀÇ Àбâ/¾²±â´Â ¿øÀÚÀûÀ¸·Î
ÀϾ°Ô µÈ´Ù. ¿¹¸¦ µé¾î, p°¡ Á¤¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ°í, ÀÌ°ÍÀÌ
°¡¸®Å°°í ÀÖ´Â Á¤¼ö°¡ °øÀ¯ ¸Þ¸ð¸®¿¡ ÀÖ´Ù°í ÇÏÀÚ. ANSI C¿¡¼´Â À̸¦
´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
volatile int * volatile p;
ÀÌ Äڵ忡¼, ù¹ø° volatile
´Â p
°¡ °¡¸®Å°´Â
int
°ªÀ» ¸»Çϸç, µÎ¹ø° volatile
´Â Æ÷ÀÎÅÍ ±×
ÀÚü¸¦ ¸»ÇÑ´Ù. ¹°·Ð ÀÌ´Â ±ÍÂúÀº ÀÛ¾÷ÀÌÁö¸¸, GCC°¡ ¸Å¿ì °·ÂÇÑ ÃÖÀûȸ¦
¼öÇàÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ Ä¡·¯¾ß ÇÏ´Â °ÍÀÌ´Ù. Àû¾îµµ ÀÌ·ÐÀûÀ¸·Î´Â,
GCC¿¡ -traditional
¿É¼ÇÀ» ÁÖ´Â °ÍÀ¸·Îµµ, ¸î°¡Áö ÃÖÀûȸ¦
Èñ»ýÇÏ´Â ´ë½Å ¿Ã¹Ù¸¥ Äڵ带 ¸¸µé¾î³»´Âµ¥¿¡´Â ÃæºÐÇÏ´Ù. ¿Ö³ÄÇϸé ANSI
K&R C ÀÌÀü¿¡´Â ¸ðµç º¯¼ö´Â µû·Î register
¶ó°í ÁöÁ¤ÇÏÁö ¾ÊÀº
ÀÌ»ó ¸ðµÎ volatileÀ̾ú±â ¶§¹®ÀÌ´Ù. ¿©ÀüÈ÷ GCC·Î cc -O6
¿Í
°°ÀÌ ÄÄÆÄÀÏÀ» ÇÏ°í, ÇÊ¿äÇÑ °Í¿¡¸¸ volatileÀ̶ó°í ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù.
¸ðµç ÇÁ·Î¼¼¼ÀÇ ·¹Áö½ºÅ͸¦ ¼öÁ¤ÇÏ´Â °ÍÀ¸·Î Ç¥½ÃµÇ¾î ÀÖ´Â ¾î¼Àºí¸®¾î
¶ô(lock)À» »ç¿ëÇϸé, GCC°¡ ¸ðµç º¯¼öµéÀ» ´Ù ³»º¸³»¼(flush),
volatile
À̶ó°í ¼±¾ðÇÔÀ¸·Î½á ¹ß»ýÇÏ´Â "ºñÈ¿À²ÀûÀÎ" ÄÚµåµéÀ»
ÇÇÇÒ ¼ö ÀÖ°Ô ÇÏ´Â È¿°ú°¡ ÀÖ´Ù´Â ¼Ò¹®ÀÌ ÀÖ¾î¿Ô´Ù. ÀÌ·± ¹æ¹ýÀº GCC
2.7.0À» »ç¿ëÇÏ´Â °æ¿ì, Á¤ÀûÀ¸·Î ÇÒ´çµÇ´Â Àü¿ªº¯¼ö¿¡ ´ëÇؼ´Â Á¦´ë·Î
µ¿ÀÛÇÏ´Â °Íó·³ º¸ÀδÙ... ±×·¸Áö¸¸, ÀÌ·± ÇൿÀº ANSI C Ç¥ÁØ¿¡¼´Â
ÇÊ¿äÇÏÁö ¾Ê´Ù. ´õ ³ª»Û °ÍÀº Àбâ Á¢±Ù¸¸À» ÇÏ´Â ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀº º¯¼ö
°ªÀ» ¿µ¿øÈ÷ ·¹Áö½ºÅÍ¿¡ ¹öÆÛ¸µÀ» ÇÒ ¼ö ÀÖ¾î¼, °øÀ¯ ¸Þ¸ð¸®ÀÇ °ªÀÌ ½ÇÁ¦·Î
º¯ÇÏ´Â °ÍÀ» Àý´ë·Î ¾Ë¾ÆÂ÷¸®Áö ¸øÇÒ ¼öµµ ÀÖ´Ù. ¿ä¾àÇϸé, ÇÏ°í ½ÍÀº´ë·Î
Çصµ ÁÁÁö¸¸, volatile
¶ó°í ÁöÁ¤ÇÑ º¯¼ö¸¸ÀÌ Á¦´ë·Î µ¿ÀÛÇÑ´Ù´Â
°ÍÀ» º¸ÀåÇÒ ¼ö ÀÖ´Ù.
ÀÏ¹Ý º¯¼ö¿¡µµ volatile
¼Ó¼ºÀ» ¾Ï½ÃÇÏ´Â Çüº¯È¯(type cast)À»
»ç¿ëÇÏ¿© volatile Á¢±ÙÀ» ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, º¸ÅëÀÇ
int i;
´Â *((volatile int *) &i);
°°ÀÌ
¼±¾ðÇÏ¿© volatile·Î
Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô Çϸé Èֹ߼º(volatility)ÀÌ ÇÊ¿äÇÑ °æ¿ì¿¡¸¸, ÀÌ·±
¿À¹öÇìµå¸¦ »ç¿ëÇϵµ·Ï ÇÒ ¼ö ÀÖ´Ù.
++i;
´Â Ç×»ó °øÀ¯ ¸Þ¸ð¸®¿¡ ÀÖ´Â º¯¼ö i
¿¡ 1À»
´õÇÑ´Ù°í »ý°¢ÇØ¿Ô´Ù¸é, ´ÙÀ½ À̾߱â´Â Á¶±ÝÀº ³î¶ø°í ´çȲ½º·¯¿ïÁöµµ
¸ð¸£°Ú´Ù. ÇϳªÀÇ ¸í·ÉÀ¸·Î ÄÚµùÀ» Çß´Ù°í ÇÏ´õ¶óµµ, °ªÀ» ÀÐ°í °á°ú¸¦ ¾²´Â
°ÍÀº º°µµÀÇ ¸Þ¸ð¸® ó¸®(transaction)À» ÅëÇؼ ÀÌ·ç¾îÁö¸ç, ÀÌ µÎ ó¸®
»çÀÌ¿¡ ´Ù¸¥ ÇÁ·Î¼¼¼°¡ i
¿¡ Á¢±ÙÇÒ ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î,
µÎ°³ÀÇ ÇÁ·Î¼¼¼°¡ ¸ðµÎ ++i;
¸í·ÉÀ» ¼öÇàÇÏ¿´´Âµ¥, 2°¡
Áõ°¡ÇÏ´Â°Ô ¾Æ´Ï¶ó 1ÀÌ Áõ°¡ÇÒ ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀÎÅÚ PentiumÀÇ
"±¸Á¶(Architecture)¿Í ÇÁ·Î±×·¡¹Ö ¸Å´º¾ó"¿¡ µû¸£¸é, LOCK
Á¢µÎ¾î´Â ´ÙÀ½¿¡ ³ª¿À´Â ¸í·É¾î°¡ ±×°ÍÀÌ Á¢±ÙÇÏ´Â ¸Þ¸ð¸® À§Ä¡¿¡ ´ëÇØ
¿øÀÚÀûÀ¸·Î ÀÌ·ç¾îÁö´Â °ÍÀ» º¸ÀåÇϱâ À§ÇØ »ç¿ëµÈ´Ù.
BTS, BTR, BTC mem, reg/imm XCHG reg, mem XCHG mem, reg ADD, OR, ADC, SBB, AND, SUB, XOR mem, reg/imm NOT, NEG, INC, DEC mem CMPXCHG, XADD
±×·¸Áö¸¸, ÀÌµé ¿¬»êÀ» ¸ðµÎ »ç¿ëÇÏ´Â °ÍÀº ±×´ÙÁö ÁÁÀº »ý°¢Àº ¾Æ´Ñ °Í
°°´Ù. ¿¹¸¦ µé¾î, XADD
´Â 386¿¡¼´Â Á¸ÀçÇÏÁöµµ ¾Ê°í, µû¶ó¼
À̸¦ »ç¿ëÇÏ´Â °ÍÀº ȣȯ¼ºÀÇ ¹®Á¦¸¦ ¹ß»ý½Ãų ¼ö ÀÖ´Ù.
XCHG
¸í·É¾î´Â LOCK
Á¢µÎ¾î°¡ ¾ø´õ¶óµµ Ç×»ó ¶ôÀ»
»ç¿ëÇÑ´Ù. µû¶ó¼ ÀÌ ¸í·É¾î´Â ¼¼¸¶Æ÷¾î(semaphore)³ª °øÀ¯ Å¥(shared
queue)°°Àº °í¼öÁØÀÇ ¿øÀÚÀûÀÎ ±¸¼ºÃ¼¸¦ ¸¸µå´Â °æ¿ì¿¡ ÁÁÀº
¿øÀÚÀûÀÎ ¿¬»êÀÌ´Ù. ´ç¿¬È÷ C ÄÚµå·Î GCC°¡ ÀÌ ¸í·É¾î¸¦ ¸¸µé¾î³»µµ·Ï ÇÒ
¼ö´Â ¾ø´Ù. ´ë½Å ÀζóÀÎ(in-line) ¾î¼Àºí¸® Äڵ带 Á¶±Ý »ç¿ëÇØ¾ß ÇÑ´Ù.
¿öµå(word) Å©±âÀÇ volatile °´Ã¼ÀÎ obj¿Í ¿öµå Å©±âÀÇ ·¹Áö½ºÅÍ
°ªÀÎ reg°¡ ÀÖ´Ù¸é, GCC ÀζóÀÎ ¾î¼Àºí¸® ÄÚµå´Â ´ÙÀ½°ú °°´Ù :
__asm__ __volatile__ ("xchgl %1,%0" :"=r" (reg), "=m" (obj) :"r" (reg), "m" (obj));
¶ô(lock)À» Çϴµ¥ ºñÆ®(bit) ¿¬»êÀ» »ç¿ëÇÏ´Â GCC ÀζóÀÎ ¾î¼Àºí¸® ÄÚµåÀÇ ¿¹Á¦°¡ bb_threads library¶óÀ̺귯¸®ÀÇ ¼Ò½º Äڵ忡 ÀÖ´Ù.
¸Þ¸ð¸® ó¸®(transaction)¸¦ ¿øÀÚÀûÀ¸·Î ¸¸µå´Â °Í¿¡µµ ÀÌ¿¡ µû¸£´Â ºñ¿ëÀÌ ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. º¸ÅëÀÇ ÂüÁ¶´Â Áö¿ª ij½Ã¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â »ç½Ç¿¡ ºñÃ߾¸é, ¶ô(lock)À» ÇÏ´Â ¿¬»êÀº ¾à°£ÀÇ ¿À¹öÇìµå¸¦ ¼ö¹ÝÇÏ°í, ´Ù¸¥ ÇÁ·Î¼¼¼ÀÇ ¸Þ¸ð¸® È°µ¿À» Áö¿¬½Ãų ¼ö ÀÖ´Ù. ¶ô(lock) ¿¬»êÀ» »ç¿ëÇÏ´Â °æ¿ì °¡Àå ÁÁÀº ¼º´ÉÀ» ³»°í ½Í´Ù¸é °¡´ÉÇÑ À̸¦ Àû°Ô »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ´õ ³ª¾Æ°¡ À̵é IA32 ¿øÀÚÀûÀÎ ¸í·É¾îµéÀº ´Ù¸¥ ½Ã½ºÅÛ°úÀÇ È£È¯¼ºÀÌ ¾ø´Ù.
¾î¶² ¼ø°£ÀÌµç ¸¹¾Æµµ ÇϳªÀÇ ÇÁ·Î¼¼¼¸¸ÀÌ ÁÖ¾îÁø °øÀ¯ °´Ã¼¸¦ °»½ÅÇÏ´Â °ÍÀ» º¸ÀåÇÏ´Â ¿©·¯°¡Áö µ¿±âÈ(synchronization) - »óÈ£ ¹èÁ¦(mutual exclusion)¸¦ Æ÷ÇÔÇÏ¿© - ¸¦ ±¸ÇöÇϴµ¥ º¸ÅëÀÇ ¸í·É¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â ¿©·¯°¡Áö ´Ù¸¥ Á¢±Ù¹æ¹ýÀÌ ÀÖ´Ù. ´ëºÎºÐÀÇ OS ±³Àç¿¡¼´Â ÀÌµé ±â¹ýÀ» Àû¾îµµ Çϳª ÀÌ»ó¾¿Àº ´Ù·ç°í ÀÖ´Ù. Abraham Silberschatz¿Í Peter B GalvinÀÌ ÁöÀº ¿î¿µÃ¼Á¦ °³³ä(Operating System Concepts) 4ÆÇ(ISBN 0-201-50480-4)¿¡¼ À̸¦ ¾ÆÁÖ Àß ´Ù·ç°í ÀÖ´Ù.
¿øÀÚ¼º¿¡ °ü·ÃµÈ ±âº»ÀûÀÎ °ÍÀ¸·Î¼ SMP ¼º´É¿¡ Å« ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ´Â °ÍÀ¸·Î ij½Ã¶óÀÎ Å©±â°¡ ÀÖ´Ù. MPS Ç¥ÁØ¿¡´Â ¾î¶² ij½Ã°¡ »ç¿ëµÇµçÁö °£¿¡ ÂüÁ¶´Â ÀÏ°üÀûÀ̾î¾ß ÇÑ´Ù°í ÇÏ°í ÀÖÁö¸¸, »ç½ÇÀº ÇϳªÀÇ ÇÁ·Î¼¼¼°¡ ¸Þ¸ð¸®ÀÇ Æ¯Á¤ ¶óÀο¡ ±â·ÏÀ» ÇÒ ¶§, ÀÌÀü ¶óÀÎÀÇ Ä³½ÃµÈ º¹»çº»ÀÌ ¸ðµÎ ¹«È¿È(invalidate)µÇ°Å³ª °»½Å(update)µÇ¾î¾ß ÇÑ´Ù. ÀÌ ¸»Àº µÎ °³³ª ±× ÀÌ»óÀÇ ÇÁ·Î¼¼¼°¡ µ¿½Ã¿¡ °°Àº ¶óÀÎÀÇ ´Ù¸¥ ºÎºÐ¿¡ µ¥ÀÌÅ͸¦ ±â·ÏÇÏ·Á°í Çϸé, »ó´ç·®ÀÇ Ä³½Ã¿Í ¹ö½º ÅëÇà(traffic)ÀÌ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¸ç, ½ÇÁúÀûÀ¸·Î ij½Ã¿¡¼ ij½Ã·Î ¶óÀÎÀ» Àü´ÞÇÏ°Ô µÈ´Ù. ÀÌ ¹®Á¦´Â À߸øµÈ °øÀ¯(false sharing)¶ó°í ÇÑ´Ù. ±× ÇØ°áÃ¥Àº º´·Ä·Î Á¢±ÙµÇ´Â µ¥ÀÌÅÍ°¡ µÇµµ·ÏÀÌ¸é °¢ ÇÁ·Î¼¼¼¸¶´Ù ´Ù¸¥ ij½Ã ¶óÀο¡¼ ¿Ã ¼ö ÀÖµµ·Ï µ¥ÀÌÅ͸¦ Á¶Á÷ÈÇϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù.
À߸øµÈ °øÀ¯´Â L2 ij½Ã¸¦ »ç¿ëÇÏ´Â ½Ã½ºÅÛ¿¡¼´Â ¹®Á¦°¡ ¾ÈµÉ°Å¶ó°í »ý°¢ÇÒ
¼öµµ ÀÖ°ÚÁö¸¸, ¿©ÀüÈ÷ º°µµÀÇ L1 ij½Ã°¡ ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇÏÀÚ. ij½ÃÀÇ
Á¶Á÷°ú ±¸º°µÈ º°µµÀÇ ·¹º§ÀÇ °¹¼ö´Â ¸ðµÎ º¯ÇÒ ¼ö ÀÖÁö¸¸, Pentium L1
ij½Ã¶óÀÎ Å©±â´Â 32 ¹ÙÀÌÆ®ÀÌ°í, ÀüÇüÀûÀÎ ¿ÜÀåÇü ij½Ã¶óÀÎ Å©±â´Â 256
¹ÙÀÌÆ® °¡·®ÀÌ´Ù. µÎ Ç׸ñÀÇ ÁÖ¼Ò°¡ (¹°¸®Àû ÁÖ¼ÒÀ̵ç, °¡»ó ÁÖ¼ÒÀ̵ç)
a¿Í bÀÌ°í, °¡Àå Å« ÇÁ·Î¼¼¼´ç ij½Ã¶óÀÎ Å©±â°¡
cÀÌ°í, À̵éÀº ¸ðµÎ 2ÀÇ ¸î Á¦°ö½ÂÀ̶ó°í ÇÏÀÚ. ¸Å¿ì ¾ö¹ÐÇÏ°Ô
Çϸé, ((int) a) & ~(c - 1)
¿Í ((int)
b) & ~(c - 1)
ÀÌ °°À» ¶§, µÎ°³ÀÇ ÂüÁ¶°¡ ¶È°°Àº
ij½Ã¶óÀο¡ Á¸ÀçÇÏ°Ô µÈ´Ù. ´õ ±ÔÄ¢À» °£´ÜÈÇÏ¸é º´·Ä·Î ÂüÁ¶µÇ´Â °øÀ¯
°´Ã¼°¡ Àû¾îµµ c ¹ÙÀÌÆ®°¡ ¶³¾îÁ® ÀÖ´Ù¸é, À̵éÀº ´Ù¸¥ ij½Ã
¶óÀÎÀ¸·Î ¸ÅÇÎÀÌ µÈ´Ù´Â °ÍÀÌ´Ù.
º´·Ä󸮿¡¼ °øÀ¯ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â ÀüÀûÀÎ ÀÌÀ¯´Â OSÀÇ ¿À¹öÇìµå¸¦ ÇÇÇÏÀÚ´Â °ÍÀÌÁö¸¸, OS ¿À¹öÇìµå´Â Åë½Å ±× ÀÚü ¿ÜÀÇ °Í¿¡¼ ¹ß»ýÇϱ⵵ ÇÑ´Ù. ¿ì¸®´Â ÀÌ¹Ì ¸¸µé¾î¾ß ÇÒ ÇÁ·Î¼¼½ºÀÇ °¹¼ö°¡ ±â°è¿¡ ÀÖ´Â ÇÁ·Î¼¼¼ÀÇ °¹¼öº¸´Ù °°°Å³ª À۾ƾßÇÑ´Ù°í ¸»Çß¾ú´Ù. ±×·¯³ª Á¤È®È÷ ¾ó¸¶³ª ¸¹Àº ÇÁ·Î¼¼½º¸¦ ¸¸µé¾î¾ß ÇÒ Áö ¾î¶»°Ô °áÁ¤ÇÒ ¼ö ÀÖÀ»±î?
ÃÖ°íÀÇ ¼º´ÉÀ» ³»·Á¸é, ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ º´·Ä ÇÁ·Î±×·¥¿¡ ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ °¹¼ö´Â, ´Ù¸¥ ÇÁ·Î¼¼¼¿¡¼ °è¼ÓÇؼ ½ÇÇàµÉ ¼ö ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ °¹¼öÇÏ°í
°°¾Æ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î, ³×°³ÀÇ ÇÁ·Î¼¼¼°¡ ÀÖ´Â SMP ½Ã½ºÅÛ¿¡¼
ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ´Ù¸¥ ¸ñÀûÀ¸·Î (¿¹¸¦ µé¾î WWW ¼¹ö) µ¿ÀÛÇÏ°í ÀÖ´Ù¸é,
¿©·¯ºÐÀÌ ¸¸µç º´·Ä ÇÁ·Î±×·¥Àº ¼¼°³ÀÇ ÇÁ·Î¼¼½º¸¸À» »ç¿ëÇØ¾ß ÇÑ´Ù.
½Ã½ºÅÛ¿¡ ¸î °³ÀÇ ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ ÀÖ´ÂÁö´Â uptime
¸í·É¿¡¼
µ¹·ÁÁÖ´Â "Æò±Õ ºÎÇÏ(load average)"¸¦ ÂüÁ¶ÇÏ¿© ´ë°Àº ¾Ë ¼ö ÀÖ´Ù.
´Ù¸¥ ¹æ¹ýÀ¸·Î renice
¸í·ÉÀ̳ª nice()
½Ã½ºÅÛ ÄÝ
°°Àº °ÍÀ» ÀÌ¿ëÇÏ¿© º´·Ä ÇÁ·Î±×·¥¿¡ ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ ¿ì¼±¼øÀ§(priority)¸¦
³ôÀÏ ¼öµµ ÀÖ´Ù. ¿ì¼±¼øÀ§¸¦ ³ôÀÌ·Á¸é ±ÇÇÑÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ »ý°¢Àº ´Ù¸¥
ÇÁ·Î¼¼½º¸¦ ÇÁ·Î¼¼¼¿¡¼ ¦i¾Æ³»¼ ÀÚ½ÅÀÌ ¸¸µç ÇÁ·Î±×·¥ÀÌ ¸ðµç
ÇÁ·Î¼¼¼¿¡¼ °è¼ÓÇؼ ½ÇÇàµÉ ¼ö ÀÖ°Ô ÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¹æ¹ýÀº
http://luz.cs.nmt.edu/~rtlinux/ ¿¡
ÀÖ´Â ½Ç½Ã°£(real-time) ½ºÄÉÁÙ·¯¸¦ Á¦°øÇÏ´Â SMP ¸®´ª½ºÀÇ
ÇÁ·ÎÅäŸÀÔ(prototype) ¹öÀüÀ» »ç¿ëÇϸé Á»´õ È®½ÇÇÏ°Ô ´Þ¼ºÇÒ ¼ö ÀÖ´Ù
¿©·¯ºÐÀÌ SMP ½Ã½ºÅÛÀ» º´·Ä ±â°è·Î »ç¿ëÇÏ´Â À¯ÀÏÇÑ »ç¿ëÀÚ°¡ ¾Æ´Ï¶ó¸é, °è¼Ó ½ÇÇàÇÏ·Á°í ÇÏ´Â µÎ °³ ÀÌ»óÀÇ º´·Ä ÇÁ·Î±×·¥ »çÀÌ¿¡ Ãæµ¹ÀÌ ºú¾îÁú ¼öµµ ÀÖ´Ù. ÀÌÀÇ Ç¥ÁØ ÇØ°á¹æ¹ýÀº Á¶´ÜÀ§(gang) ½ºÄÉÁÙ¸µ - Áï µ¿½Ã¿¡ ÇϳªÀÇ º´·Ä ÇÁ·Î±×·¥¿¡ ¼ÓÇÏ´Â ÇÁ·Î¼¼½ºµé¸¸ÀÌ ½ÇÇàµÉ ¼ö ÀÖµµ·Ï ½ºÄÉÁÙ¸µ ¿ì¼±¼øÀ§¸¦ ´Ù·ç´Â °ÍÀÌ´Ù. ±×·¸Áö¸¸ Çϳª ÀÌ»óÀ» º´·Äó¸®ÇÏ¸é °á°ú°¡ ´Ê°Ô µ¹¾Æ¿À°í, ½ºÄÉÁÙ·¯ÀÇ È°µ¿ÀÌ ¿À¹öÇìµå¸¦ ´õÇÏ°Ô µÈ´Ù´Â °ÍÀ» »ó±âÇϱ⠹ٶõ´Ù. µû¶ó¼, ¿¹¸¦ µé¾î ³× °³ÀÇ ÇÁ·Î¼¼¼¸¦ °¡Áø ½Ã½ºÅÛ¿¡ µÎ °³ÀÇ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù¸é, µÎ °³ÀÇ ÇÁ·Î¼¼½º¸¦ °¢°¢ ½ÇÇàÇÏ´Â °ÍÀÌ, µÎ °³ÀÇ ÇÁ·Î±×·¥ÀÌ ³×°³ÀÇ ÇÁ·Î¼¼½º¸¦ °¢°¢ »ç¿ëÇÏ¸é¼ Á¶´ÜÀ§ ½ºÄÉÁÙ¸µÀ» ÇÏ´Â °Íº¸´Ù ´õ ³´´Ù.
ÀÌ·± ¹®Á¦¸¦ ´õ ²¿ÀÌ°Ô ÇÏ´Â °ÍÀÌ Çϳª ´õ ÀÖ´Ù. ¿©·¯ºÐÀÌ ³·¿¡´Â Á¾ÀÏ °úÁßÇÏ°Ô »ç¿ëµÇ°í ÀÖÁö¸¸, ¹ã¿¡´Â ¿ÏÀüÈ÷ º´·Ä󸮿ëÀ¸·Î¸¸ »ç¿ë°¡´ÉÇÑ ±â°è¿¡¼ ÇÁ·Î±×·¥À» °³¹ßÇÏ°í ÀÖ´Ù°í ÇÏÀÚ. ¿©·¯ºÐÀº ³·¿¡ Å×½ºÆ®¸¦ Çϴ°ÍÀÌ ´À¸®´Ù´Â °ÍÀ» ¾Ë´õ¶óµµ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ°í ÀÛ¼ºÇÑ Äڵ带 Å×½ºÆ®ÇÏ°í ¼öÁ¤Çϱâ À§ÇØ ¸ðµç °¹¼öÀÇ ÇÁ·Î¼¼½º¸¦ ¸¸µé¾î »ç¿ëÇÒ °ÍÀÌ´Ù. ±×·±µ¥, ÇÁ·Î¼¼½ºµéÀÌ ÇöÀç ½ÇÇàµÇ°í ÀÖÁö ¾Ê´Â (´Ù¸¥ ÇÁ·Î¼¼¼¿¡¼) ´Ù¸¥ ÇÁ·Î¼¼½º¿Í °øÀ¯ ¸Þ¸ð¸®·Î °ªÀ» Àü´ÞÇϱ⸸À» ¾Æ¹«°Íµµ ÇÏÁö ¾Ê°í ±â´Ù¸®°í ÀÖ´Ù¸é, À̵é ÀÛ¾÷Àº ¸Å¿ì ´À·ÁÁú °ÍÀÌ´Ù. ÀÌ¿Í ¶È°°Àº ¹®Á¦´Â Äڵ带 ÇϳªÀÇ ÇÁ·Î¼¼¼¹Û¿¡ ¾ø´Â ½Ã½ºÅÛ¿¡¼ °³¹ßÇÏ°í Å×½ºÆ®ÇÏ´Â °æ¿ì¿¡µµ ¹ß»ýÇÑ´Ù.
ÇØ°áÃ¥Àº Äڵ忡¼ ´Ù¸¥ ÇÁ·Î¼¼¼¿¡¼ ÀϾ´Â µ¿ÀÛÀ» ÇÏ¿°¾øÀÌ ±â´Ù·Á¾ß
ÇÏ´Â ºÎºÐ¿¡, ¸®´ª½º°¡ ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Â ±âȸ¸¦ ÁÖµµ·Ï ÇÔ¼ö
È£ÃâÀ» Áý¾î³Ö´Â °ÍÀÌ´Ù. ³ª´Â C ¸ÅÅ©·Î¸¦ »ç¿ëÇϴµ¥ À̸¦ ÇÏ´Â ¸ÅÅ©·Î¸¦
IDLE_ME
¶ó°í ºÎ¸£°í ÀÖ´Ù. ÇÁ·Î±×·¥À» Å×½ºÆ®Çϱâ À§Çؼ
ÄÄÆÄÀÏÀ» ÇÒ¶§´Â cc -DIDLE_ME=usleep(1)
°°ÀÌ ÇÏ°í,
"Á¦Ç°"À¸·Î ½ÇÇàÇÒ ¶§¿¡´Â cc -DIDLE_ME={}
°°ÀÌ ÄÄÆÄÀÏÀ» ÇÑ´Ù.
usleep(1)
Àº 1/1000 Ãʵ¿¾È ÇÁ·Î¼¼½º°¡ Àáµé°Ô ÇÏ¿©, ¸®´ª½º
½ºÄÉÁÙ·¯°¡ ±× ÇÁ·Î¼¼¼¿¡¼ ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ ½ÇÇàÇϵµ·Ï ¼±ÅÃÇÒ ¼ö ÀÖ°Ô
ÇÑ´Ù. ÇÁ·Î¼¼½ºÀÇ °¹¼ö°¡ »ç¿ë°¡´ÉÇÑ ÇÁ·Î¼¼¼ÀÇ °¹¼öº¸´Ù µÎ¹èÀÌ»ó ¸¹´Ù¸é,
usleep(1)
¸¦ »ç¿ëÇÏ´Â Äڵ尡 À̸¦ »ç¿ëÇÏÁö ¾Ê´Â Äڵ庸´Ù
¿¹èÀÌ»ó ºü¸£°Ô ½ÇÇàµÇ´Â °ÍÀº ±×¸® ÀÌ»óÇÑ ÀÏÀÌ ¾Æ´Ï´Ù.
bb_threads("Bare Bones(»À¸¸³²Àº)" threads) ¶óÀ̺귯¸®(
ftp://caliban.physics.utoronto.ca/pub/linux/)´Â
¸®´ª½º clone()
È£ÃâÀÇ »ç¿ë¹ýÀ» º¸¿©ÁÖ´Â ¾ÆÁÖ °£´ÜÇÑ
¶óÀ̺귯¸®ÀÌ´Ù. tar ÆÄÀÏÀ» gzipÀ¸·Î ¾ÐÃàÇÏ¸é °Ü¿ì 7K
¹ÙÀÌÆ®¹Û¿¡ µÇÁö ¾Ê´Â´Ù! ÀÌ ¶óÀ̺귯¸®´Â 2.4Àå¿¡¼ ¼³¸íÇÏ´Â LinuxThreads
¶óÀ̺귯¸® ¶§¹®¿¡ ÀÌÁ¦ Çѹ°°£ °ÍÀÌ µÇ¾úÁö¸¸, ¿©ÀüÈ÷ ¾µ¸¸ÇÏ°í, ÀÛ°í
°£´ÜÇÏ¿© ¸®´ª½º¿¡¼ Áö¿øÇÏ´Â ¾²·¹µåÀÇ »ç¿ë¹ýÀ» ¼Ò°³Çϴµ¥¿¡µµ ¾Ë¸Â´Ù.
ºÐ¸íÈ÷ LinuxThreads¿ë ¼Ò½ºÄڵ带 º¸´Â °Íº¸´Ù ÀÌ Äڵ带 º¸´Â °ÍÀÌ ÈξÀ ´ú
±âÁ×À» °ÍÀÌ´Ù. ¿ä¾àÇϸé bb_threads ¶óÀ̺귯¸®´Â ½ÃÀÛÇϱâ ÁÁÀº
ÁöÁ¡ÀÌÁö¸¸, Å« ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé¶§¿¡´Â Àû´çÇÏÁø ¾Ê´Ù.
bb_threads ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÇ ±âº»ÀûÀÎ ±¸Á¶´Â ´ÙÀ½°ú °°´Ù :
bb_threads_stacksize(b)
¸¦
È£ÃâÇÑ´Ù.
MAX_MUTEXES
±îÁö ¼ýÀÚ¸¦ ºÙÀÌ´Â °ÍÀÌ´Ù. ¶ô
i¸¦ ÃʱâÈÇÏ·Á¸é
bb_threads_mutexcreate(i)
¸¦ È£ÃâÇÑ´Ù.
void f(void *arg, size_t dummy)
ó·³ ¼±¾ðÀ» ÇÏ°í
bb_threads_newthread(f, &arg)
ÇÔ¼ö¸¦
ºÎ¸£¸é µÈ´Ù. Çϳª ÀÌ»óÀÇ ÀÎÀÚ¸¦ Àü´ÞÇؾßÇÏ´Â °æ¿ì ÀÎÀÚ °ªµéÀ» °¡Áö°í
ÀÖ´Â ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ³Ñ°ÜÁÖ¸é µÈ´Ù.
bb_threads_lock(n)
¿Í
bb_threads_unlock(n)
ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§
ÁÖÀǸ¦ ±â¿ïÀδ٠(¿©±â¼ nÀº »ç¿ëÇÒ ¶ôÀ» ÁöÁ¤ÇÑ´Ù). ÀÌ
¶óÀ̺귯¸®¿¡ ÀÖ´Â ¶ôÀ» °É°í ¶ôÀ» ÇØÁ¦ÇÏ´Â ¿¬»êÀº ¿øÀÚÀûÀÎ
¹ö½º-¶ô(bus-lock) ¸í·É¾î¸¦ »ç¿ëÇÏ´Â ¸Å¿ì ±âº»ÀûÀÎ ½ºÇɶô(spin lock)ÀÌ´Ù.
±×·¡¼ °úµµÇÑ ¸Þ¸ð¸® Á¢±Ù Ãæµ¹À» ÀÏÀ¸Å³ ¼ö ÀÖÀ¸¸ç, ¾î¶² Á¢±Ùµµ
°øÁ¤ÇÏ´Ù´Â °ÍÀ» º¸ÁõÇÒ ¼ö ¾ø´Ù.
bb_threads¿¡ ÇÔ²² µþ·Á¿À´Â ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼ º¸¸é ÇÔ¼ö fnn
°ú
main
¿¡¼ µ¿½Ã¿¡ printf()
¸¦ ½ÇÇàÇÏ´Â °ÍÀ» ¸·´Âµ¥¿¡ ¶ôÀ»
¿Ç¹Ù¸£°Ô »ç¿ëÇÏÁö ¾Ê°í ÀÖ´Ù. ÀÌ°Í ¶§¹®¿¡ ¿¹Á¦´Â Ç×»ó µ¿ÀÛÇÏÁö´Â ¾Ê´Â´Ù.
³»°¡ ÀÌ ¸»À»ÇÏ´Â °ÍÀº ¿¹Á¦ ÇÁ·Î±×·¥¿¡ Æ®ÁýÀ» Àâ±â À§Çؼ°¡ ¾Æ´Ï¶ó,
ÀÌ°ÍÀÌ ¸Å¿ì ´Ù·ç±â ¾î·Æ´Ù´Â °Í°ú LinuxThreads¸¦ »ç¿ëÇÏ´Â °ÍÀÌ
Á¶±Ý ½±´Ù´Â °É °Á¶Çϱâ À§ÇؼÀÌ´Ù.
return
¸í·ÉÀ» ½ÇÇàÇϸé, ÀÌ´Â ½ÇÁ¦ÀûÀ¸·Î
ÇÁ·Î¼¼½º¸¦ Á×ÀÌ°Ô µÈ´Ù. ±×·¯³ª Áö¿ª ½ºÅà ¸Þ¸ð¸®´Â ÀÚµ¿À¸·Î ÇÒ´çÀÌ
ÇØÁ¦µÇÁö ¾Ê´Â´Ù. ¾ö¹ÐÇÏ°Ô ¸»ÇÏ¸é ¸®´ª½º´Â ÇÒ´ç ÇØÁ¦¸¦ Áö¿øÇÏÁö ¾ÊÀ¸¸ç,
¸Þ¸ð¸® °ø°£Àº ÀÚµ¿À¸·Î malloc()
ÀÇ »ç¿ëÇÏÁö ¾Ê´Â ¸Þ¸ð¸®
¸ñ·Ï(free list)À¸·Î µÇµ¹¾Æ°¡ Ãß°¡µÇÁö ¾Ê´Â´Ù. µû¶ó¼ ºÎ¸ð ÇÁ·Î¼¼½º´Â
Á×Àº ÀÚ½Ä ÇÁ·Î¼¼½º¸¶´Ù
bb_threads_cleanup(wait(NULL))
¸¦
ºÒ·¯¼ ÀÌ °ø°£À» ¹Ý³³ÇØ¾ß ÇÑ´Ù.
´ÙÀ½ C ÇÁ·Î±×·¥Àº 1.3Àå¿¡¼ ¼³¸íÇÑ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¿©, µÎ°³ÀÇ bb_threads ¾²·¹µå¸¦ ÀÌ¿ëÇؼ ÆÄÀÌ(pi)ÀÇ ±Ù»çÄ¡¸¦ °è»êÇÑ´Ù.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include "bb_threads.h" volatile double pi = 0.0; volatile int intervals; volatile int pids[2]; /* Unix PIDs of threads */ void do_pi(void *data, size_t len) { register double width, localsum; register int i; register int iproc = (getpid() != pids[0]); /* set width */ width = 1.0 / intervals; /* do the local computations */ localsum = 0; for (i=iproc; i<intervals; i+=2) { register double x = (i + 0.5) * width; localsum += 4.0 / (1.0 + x * x); } localsum *= width; /* get permission, update pi, and unlock */ bb_threads_lock(0); pi += localsum; bb_threads_unlock(0); } int main(int argc, char **argv) { /* get the number of intervals */ intervals = atoi(argv[1]); /* set stack size and create lock... */ bb_threads_stacksize(65536); bb_threads_mutexcreate(0); /* make two threads... */ pids[0] = bb_threads_newthread(do_pi, NULL); pids[1] = bb_threads_newthread(do_pi, NULL); /* cleanup after two threads (really a barrier sync) */ bb_threads_cleanup(wait(NULL)); bb_threads_cleanup(wait(NULL)); /* print the result */ printf("Estimation of pi is %f\n", pi); /* check-out */ exit(0); }
LinuxThreads
http://pauillac.inria.fr/~xleroy/linuxthreads/ ´Â POSIX
1003.1c ¾²·¹µå Ç¥ÁØ¿¡ µû¶ó "¸ðµÎ °øÀ¯ÇÏ´Â" ¹æ½ÄÀ» ¿ÏÀüÇÏ°í Æ°Æ°ÇÏ°Ô
±¸ÇöÇÑ °ÍÀÌ´Ù. ´Ù¸¥ POSIX ¾²·¹µå¸¦ Æ÷ÆÃÇÑ °Í°ú´Â ´Þ¸®, LinuxThreads´Â
bb_threads¿¡¼ »ç¿ëÇÑ °Í°ú ¶È°°Àº ¸®´ª½º Ä¿³ÎÀÇ
¾²·¹µå(clone()
)¸¦ »ç¿ëÇÑ´Ù. POSIX¿Í ȣȯµÈ´Ù´Â °ÍÀº ´Ù¸¥
½Ã½ºÅÛ¿¡¼ ¸¸µç »ó´ç¼öÀÇ ¾²·¹µå ÇÁ·Î±×·¥µéÀ» »ó´ëÀûÀ¸·Î ½±°Ô Æ÷ÆÃÇÒ ¼ö
ÀÖÀ¸¸ç, Âü°íÇÒ ¼ö ÀÖ´Â ´Ù¾çÇÑ ¿¹Á¦°¡ ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. °£´ÜÈ÷ ¸»ÇØ,
LinuxThreads´Â ¸®´ª½º¿¡¼ ¹æ´ëÇÑ ±Ô¸ðÀÇ ¾²·¹µå ÇÁ·Î±×·¥À» °³¹ßÇÒ ¶§
»ç¿ëÇÒ ¼ö ÀÖ´Â È®½ÇÇÑ ¾²·¹µå ÆÐÅ°ÁöÀÌ´Ù.
LinuxThreads ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â ±âº» ÇÁ·Î±×·¥ ±¸Á¶´Â ´ÙÀ½°ú °°´Ù :
pthread_mutex_t
ŸÀÔ(type)ÀÇ º¯¼ö·Î ¼±¾ðµÈ´Ù.
pthread_mutex_init(&lock,val)
ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿©
ÇÊ¿äÇÑ °¢°¢ÀÇ ¶ôµéÀ» ÃʱâÈÇÑ´Ù.
pthread_t
ŸÀÔÀÇ º¯¼ö¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù.
f()
ÇÔ¼ö¸¦ ½ÇÇàÇÏ´Â pthread_t
¾²·¹µå¸¦
»ý¼ºÇÏ·Á¸é pthread_create(&thread,NULL,f,&arg)
¸¦
È£ÃâÇÑ´Ù.
pthread_mutex_lock(&lock)
¿Í
pthread_mutex_unlock(&lock)
¸¦ È£ÃâÇϵµ·Ï
ÁÖÀÇÇÑ´Ù.
pthread_join(thread,&retval)
ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© °¢ ¾²·¹µå°¡
³¡³ÈÄ¿¡ ¸¶¹«¸®¸¦ ÇÑ´Ù.
-D_REENTRANT
¿É¼ÇÀ» Ãß°¡ÇÑ´Ù.´ÙÀ½Àº LinuxThreads¸¦»ç¿ëÇÏ¿© ÆÄÀÌ(pi)¸¦ °è»êÇÏ´Â º´·ÄÇÁ·Î±×·¥ÀÇ ¿¹ÀÌ´Ù. 1.3Àå¿¡¼ »ç¿ëÇÑ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¿´°í, bb_threads ¿¹Á¦¿¡¼Ã³·³ µÎ°³ÀÇ ¾²·¹µå°¡ º´·Ä·Î ½ÇÇàµÈ´Ù.
#include <stdio.h> #include <stdlib.h> #include "pthread.h" volatile double pi = 0.0; /* Approximation to pi (shared) */ pthread_mutex_t pi_lock; /* Lock for above */ volatile double intervals; /* How many intervals? */ void * process(void *arg) { register double width, localsum; register int i; register int iproc = (*((char *) arg) - '0'); /* Set width */ width = 1.0 / intervals; /* Do the local computations */ localsum = 0; for (i=iproc; i<intervals; i+=2) { register double x = (i + 0.5) * width; localsum += 4.0 / (1.0 + x * x); } localsum *= width; /* Lock pi for update, update it, and unlock */ pthread_mutex_lock(&pi_lock); pi += localsum; pthread_mutex_unlock(&pi_lock); return(NULL); } int main(int argc, char **argv) { pthread_t thread0, thread1; void * retval; /* Get the number of intervals */ intervals = atoi(argv[1]); /* Initialize the lock on pi */ pthread_mutex_init(&pi_lock, NULL); /* Make the two threads */ if (pthread_create(&thread0, NULL, process, "0") || pthread_create(&thread1, NULL, process, "1")) { fprintf(stderr, "%s: cannot make thread\n", argv[0]); exit(1); } /* Join (collapse) the two threads */ if (pthread_join(thread0, &retval) || pthread_join(thread1, &retval)) { fprintf(stderr, "%s: thread join failed\n", argv[0]); exit(1); } /* Print the result */ printf("Estimation of pi is %f\n", pi); /* Check-out */ exit(0); }
½Ã½ºÅÛ V IPC(Inter-Process Communication, ÇÁ·Î¼¼½º°£ Åë½Å)´Â ¸Þ½ÃÁö Å¥(message queue)¿Í ¼¼¸¶Æ÷¾î(semaphore), °øÀ¯ ¸Þ¸ð¸®(shared memory) ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÏ´Â ¿©·¯°¡Áö ½Ã½ºÅÛ ÄÝÀ» Áö¿øÇÑ´Ù. ¹°·Ð ÀÌµé ¸ÞÄ¿´ÏÁòÀº ¿ø·¡ ÇϳªÀÇ ÇÁ·Î¼¼¼¸¦ »ç¿ëÇÏ´Â ½Ã½ºÅÛ¿¡¼ ¿©·¯°³ÀÇ ÇÁ·Î¼¼½ºµéÀÌ Åë½ÅÀ» Çϴµ¥ »ç¿ëÇϱâ À§Çؼ ¸¸µé¾îÁ³´Ù. ±×·¸Áö¸¸, ÀÌ ¸»Àº SMP ¸®´ª½º¿¡¼ ÇÁ·Î¼¼½º°¡ ¾î¶² ÇÁ·Î¼¼¼¿¡¼ ½ÇÇàµÇ°í ÀÖµçÁö °£¿¡ ÇÁ·Î¼¼½º°£ Åë½Å¿¡¼µµ Á¦´ë·Î µ¿ÀÛÇØ¾ß ÇÑ´Ù´Â Àǹ̸¦ ³»Æ÷ÇÏ°í ÀÖ´Ù.
ÀÌµé ½Ã½ºÅÛ ÄÝÀÌ ¾î¶»°Ô »ç¿ëµÇ´ÂÁö »ìÆ캸±â Àü¿¡, ½Ã½ºÅÛ V IPC È£ÃâÀÌ ¼¼¸¶Æ÷¾î³ª ¸Þ½ÃÁö Àü´Þ°°Àº ÀÏÀ» À§ÇØ Á¸ÀçÇϱä ÇÏÁö¸¸, À̸¦ »ç¿ëÇؼ± ¾ÈµÈ´Ù´Â °ÍÀ» ÀÌÇØÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. ¿Ö ¾ÈµÇ´À³Ä? À̵é ÇÔ¼öµéÀº ÀϹÝÀûÀ¸·Î ´À¸®°í SMP ¸®´ª½º¿¡¼´Â Á÷·ÄÈ(serialize)µÇ¾î ÀÖ´Ù. ÀÌÁ¤µµ¸é ÃæºÐÇÏ°Ú´Ù.
°øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ¸·ÎÀÇ Á¢±ÙÀ» °øÀ¯ÇÏ´Â ÇÁ·Î¼¼½º ±×·ìÀ» ¸¸µå´Â ±âº»ÀûÀÎ °úÁ¤Àº ´ÙÀ½°ú °°´Ù :
shmget()
ÇÔ¼ö¸¦
ºÒ·¯ ¿øÇÏ´Â Å©±â¸¸ÅÀÇ »õ·Î¿î ¿µ¿ªÀ» ¸¸µé¾î¾ß ÇÑ´Ù. ÀÌ È£ÃâÀº À̹Ì
Á¸ÀçÇÏ´Â °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀÇ ID¸¦ ¾ò´Âµ¥¿¡µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¾î¶²
°æ¿ìÀ̵ç, µ¹¾Æ¿À´Â °ªÀº °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀÇ IDÀ̰ųª ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì
-1ÀÌ´Ù. ¿¹¸¦ µé¾î, b ¹ÙÀÌÆ® Å©±âÀÇ °øÀ¯ ¸Þ¸ð¸®
¿µ¿ªÀ» ¸¸µç´Ù¸é, shmid
= shmget(IPC_PRIVATE, b, (IPC_CREAT | 0666))
°°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
shamt()
ÇÔ¼ö È£Ãâ¿¡¼ ¸Þ¸ð¸® ¿µ¿ªÀÌ ³ªÅ¸³¯
°¡»ó ÁÖ¼Ò¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖÁö¸¸, ¼±ÅÃÇÑ ÁÖ¼Ò´Â ÆäÀÌÁö °æ°è(boundary)¿¡ µû¶ó
Á¤·Ä(align)ÀÌ µÇ¾î ÀÖ¾î¾ß Çϸç (Áï, getpagesize()
¿¡¼
µ¹·ÁÁÖ´Â ÆäÀÌÁö Å©±â - º¸ÅëÀº 4096 ¹ÙÀÌÆ®ÀÌ´Ù - ÀÇ ¹è¼ö¿©¾ß
ÇÑ´Ù), ÀÌ´Â ÀÌ ÁÖ¼Ò¿¡ ÀÌ¹Ì Á¸ÀçÇÏ´ø ¾î¶² ¸Þ¸ð¸®À̵çÁö°£¿¡ ¸ÅÇÎÀ»
µ¤¾î½á¹ö¸°´Ù. µû¶ó¼, À̺¸´Ù´Â ½Ã½ºÅÛÀÌ ÁÖ¼Ò¸¦ °í¸¦ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ
´õ ¼±È£µÈ´Ù. ¾î¶² °æ¿ìÀ̵ç, µ¹¾Æ¿À´Â °ªÀº ¸ÅÇÎÀÌ µÈ ¼¼±×¸ÕÆ®°¡ ½ÃÀÛÇÏ´Â
°¡»óÁÖ¼Ò¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù. ÄÚµå´Â shmptr =
shmat(shmid, 0, 0)
°ú °°Àº ÇüÅÂÀÌ´Ù.
¸ðµç °øÀ¯ º¯¼öµéÀ» ±¸Á¶Ã¼ÀÇ ¸â¹ö·Î
¼±¾ðÇÏ°í shmptrÀ» ÀÌ ±¸Á¶Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅÍ·Î ¼±¾ðÇÔÀ¸·Î½á
°£´ÜÇÏ°Ô ¸ðµç Á¤Àû º¯¼ö¸¦ °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ¸·Î ÇÒ´çÇÒ ¼ö ÀÖ´Ù. ÀÌ
±â¹ýÀ» ÀÌ¿ëÇÏ¿©, °øÀ¯ º¯¼ö x´Â
shmptr->
x·Î
Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
shmctl()
ÇÔ¼ö¸¦ ºÎ¸¦ ÇÊ¿ä°¡ ÀÖ´Ù. ÄÚµå´Â
shmctl(shmid, IPC_RMID, 0)
°ú °°Àº ÇüÅ·ΠÀÛ¼ºÇÑ´Ù.
fork()
ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. °¢°¢ÀÇ ÇÁ·Î¼¼½º´Â °øÀ¯ ¸Þ¸ð¸®
¿µ¿ªÀ» »ó¼Ó¹Þ°ÔµÈ´Ù.
shmdt(shmptr)
À» ºÒ·¯¼ ÇÑ´Ù.
À§¿¡ ¼³¸íÇÑ °úÁ¤¿¡¼´Â ¸î°³ ¾ÈµÇ´Â ½Ã½ºÅÛ È£Ã⸸À» »ç¿ëÇÏÁö¸¸, ÀÏ´Ü °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀÌ ¸¸µé¾îÁö¸é, ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ¸Þ¸ð¸®»óÀÇ °ªÀ» ¹Ù²Û °æ¿ì ÀÚµ¿À¸·Î ¸ðµç ÇÁ·Î¼¼½º¿¡ º¸ÀÌ°Ô µÈ´Ù. °¡Àå Áß¿äÇÑ Á¡Àº °¢ Åë½Å ÀÛ¾÷ÀÌ ½Ã½ºÅÛ ÄÝÀ» ÇÏ´Â ¿À¹öÇìµå¾øÀÌ ÀÌ·ç¾îÁø´Ù´Â °ÍÀÌ´Ù.
´ÙÀ½Àº ½Ã½ºÅÛ V °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ» »ç¿ëÇÏ´Â C ÇÁ·Î±×·¥ÀÇ ¿¹ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ÆÄÀÌ(pi)¸¦ °è»êÇÏ´Â °ÍÀ¸·Î 1.3Àå¿¡¼ ³ª¿Â °Í°ú ¶È°°Àº ¾Ë°í¸®ÁòÀ» »ç¿ëÇÑ´Ù.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ipc.h> #include <sys/shm.h> volatile struct shared { double pi; int lock; } *shared; inline extern int xchg(register int reg, volatile int * volatile obj) { /* Atomic exchange instruction */ __asm__ __volatile__ ("xchgl %1,%0" :"=r" (reg), "=m" (*obj) :"r" (reg), "m" (*obj)); return(reg); } main(int argc, char **argv) { register double width, localsum; register int intervals, i; register int shmid; register int iproc = 0;; /* Allocate System V shared memory */ shmid = shmget(IPC_PRIVATE, sizeof(struct shared), (IPC_CREAT | 0600)); shared = ((volatile struct shared *) shmat(shmid, 0, 0)); shmctl(shmid, IPC_RMID, 0); /* Initialize... */ shared->pi = 0.0; shared->lock = 0; /* Fork a child */ if (!fork()) ++iproc; /* get the number of intervals */ intervals = atoi(argv[1]); width = 1.0 / intervals; /* do the local computations */ localsum = 0; for (i=iproc; i<intervals; i+=2) { register double x = (i + 0.5) * width; localsum += 4.0 / (1.0 + x * x); } localsum *= width; /* Atomic spin lock, add, unlock... */ while (xchg((iproc + 1), &(shared->lock))) ; shared->pi += localsum; shared->lock = 0; /* Terminate child (barrier sync) */ if (iproc == 0) { wait(NULL); printf("Estimation of pi is %f\n", shared->pi); } /* Check out */ return(0); }
³ª´Â ÀÌ ¿¹Á¦¿¡¼ ¶ô(lock)À» ±¸ÇöÇϱâ À§ÇØ IA32ÀÇ ¿øÀÚÀûÀÎ(atomic) ±³È¯(exchange) ¸í·É¾î¸¦ »ç¿ëÇÏ¿´´Ù. ´õ ³ªÀº ¼º´É°ú ȣȯ¼ºÀ» ¹Ù¶õ´Ù¸é, ¿øÀÚÀûÀÎ ¹ö½º-¶ô(bus-lock) ¸í·É¾î¸¦ »ç¿ëÇÏÁö ¾Ê´Â µ¿±âÈ ±â¹ýÀ¸·Î ´ëüÇϱ⠹ٶõ´Ù.
ÇöÀç »ç¿ëÇÏ°í ÀÖ´Â ½Ã½ºÅÛ V IPC ±â´ÉµéÀÇ »óŸ¦ º¸¿©ÁÖ´Â ipcs
À»
±â¾ïÇÏ°í ÀÖ´Ù¸é, ¿©·¯ºÐÀÌ ¸¸µç Äڵ带 µð¹ö±ëÇÒ ¶§ µµ¿òÀÌ µÉ °ÍÀÌ´Ù.
ÆÄÀÏ I/O ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇÏ´Â ºñ¿ëÀº ¸Å¿ì Ŭ ¼ö ÀÖ´Ù. »ç½Ç, ÀÌ°ÍÀÌ
»ç¿ëÀÚ ¹öÆÛ¸¦ »ç¿ëÇÏ´Â ÆÄÀÏ I/O ¶óÀ̺귯¸®°¡ ÀÖ´Â ÀÌÀ¯ÀÌ´Ù
(getchar()
, fwrite()
µî). ±×·¯³ª »ç¿ëÀÚ
¹öÆÛ´Â ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ ¶È°°Àº ¾²±â °¡´ÉÇÑ ÆÄÀÏ¿¡ Á¢±ÙÇÏ°í ÀÖ´Ù¸é
»ç¿ëÇÒ ¼ö ¾øÀ¸¸ç, »ç¿ëÀÚ ¹öÆÛ¸¦ °ü¸®ÇÏ´Â ¿À¹öÇìµåµµ ²Ï Å©´Ù. BSD
UNIX¿¡¼´Â ÆÄÀÏÀÇ ÀϺθ¦ »ç¿ëÀÚ ¸Þ¸ð¸®·Î ¸ÅÇÎÇÏ¿© º»ÁúÀûÀ¸·Î °¡»ó ¸Þ¸ð¸®
ÆäÀÌ¡ ¸ÞÄ¿´ÏÁòÀ» ÅëÇØ °»½ÅÀ» Çϵµ·Ï ÇÒ ¼ö ÀÖ´Â ½Ã½ºÅÛ ÄÝÀ» Ãß°¡ÇÏ¿©
À̸¦ ÇØ°áÇÑ´Ù. ÀÌ¿Í ¶È°°Àº ¸ÞÄ¿´ÏÁòÀÌ ¸î³âÀü Sequent¿¡¼ ¸¸µç
½Ã½ºÅÛ¿¡¼ °øÀ¯ ¸Þ¸ð¸® º´·Äó¸® Áö¿øÀÇ ±â¹ÝÀ¸·Î »ç¿ëµÇ¾ú´Ù. (¾ÆÁÖ
¿À·¡µÈ) man ÆäÀÌÁö¿¡ ¸î°¡Áö ¸Å¿ì ºÎÁ¤ÀûÀÎ ÀÇ°ßÀÌ ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í,
¸®´ª½º´Â ±âº»ÀûÀÎ ÇÔ¼öµé Áß Àû¾îµµ ¸î°¡Áö´Â Á¦´ë·Î
¼öÇàÇϴµíÀÌ º¸À̸ç, ÀÌ ½Ã½ºÅÛ ÄÝÀ» ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ °øÀ¯ÇÒ ¼ö ÀÖ´Â
¹«¸íÀÇ(anonymous) ¸Þ¸ð¸® ¿µ¿ªÀ¸·ÎÀÇ ¸ÅÇο¡ »ç¿ëÇÏ´Â °ÍÀ» Áö¿øÇÑ´Ù.
º»ÁúÀûÀ¸·Î ¸®´ª½º¿¡¼ÀÇ mmap()
±¸ÇöÀº 2.5Àå¿¡¼ ¼³¸íÇÑ 2,
3, 4¹ø° ´Ü°è¸¦ Çϳª·Î ´ëüÇÑ °ÍÀÌ´Ù. ¹«¸íÀÇ °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ»
¸¸µé·Á¸é :
shmptr = mmap(0, /* system assigns address */ b, /* size of shared memory segment */ (PROT_READ | PROT_WRITE), /* access rights, can be rwx */ (MAP_ANON | MAP_SHARED), /* anonymous, shared */ 0, /* file descriptor (not used) */ 0); /* file offset (not used) */
½Ã½ºÅÛ V °øÀ¯¸Þ¸ð¸®ÀÇ shmdt()
ÇÔ¼ö¿Í ¶È°°Àº ÀÏÀ» ÇÏ´Â
ÇÔ¼ö´Â munmap()
ÀÌ´Ù :
munmap(shmptr, b);
³» »ý°¢¿¡´Â ½Ã½ºÅÛ V °øÀ¯ ¸Þ¸ð¸® Áö¿ø ´ë½Å mmap()
À»
»ç¿ëÇÏ´Â °ÍÀÌ ½ÇÁ¦·Î ´õ ³´Áö´Â ¾Ê´Ù.