pkg://Parallel-Processing-HOWTO-html.tar.gz:76146/Parallel-Processing-HOWTO-2.html
downloads
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
<TITLE>Linux Parallel Processing HOWTO: SMP ¸®´ª½º</TITLE>
<LINK HREF="Parallel-Processing-HOWTO-3.html" REL=next>
<LINK HREF="Parallel-Processing-HOWTO-1.html" REL=previous>
<LINK HREF="Parallel-Processing-HOWTO.html#toc2" REL=contents>
</HEAD>
<BODY>
<A HREF="Parallel-Processing-HOWTO-3.html">´ÙÀ½</A>
<A HREF="Parallel-Processing-HOWTO-1.html">ÀÌÀü</A>
<A HREF="Parallel-Processing-HOWTO.html#toc2">Â÷·Ê</A>
<HR>
<H2><A NAME="s2">2. SMP ¸®´ª½º</A></H2>
<P>
<P>ÀÌ ¹®¼´Â º´·Ä󸮸¦ À§ÇØ
<A HREF="http://www.uk.linux.org/SMP/title.html">SMP ¸®´ª½º</A> ½Ã½ºÅÛÀ» ¾î¶»°Ô »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö¿¡ °üÇØ °£´ÜÇϰÔ
°³¿ä¸¦ Á¦½ÃÇÑ´Ù. SMP ¸®´ª½º¿¡ ´ëÇÑ °¡Àå ÃÖ±Ù Á¤º¸´Â ¾Æ¸¶µµ SMP ¸®´ª½º
ÇÁ·ÎÁ§Æ®ÀÇ ¸ÞÀϸµ ¸®½ºÆ®¿¡¼ ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ¸®½ºÆ®¿¡ °¡ÀÔÇÏ·Á¸é
ÆíÁö º»¹®¿¡ <CODE>subscribe linux-smp</CODE> ¶ó°í Àû¾î
<A HREF="mailto:majordomo@vger.rutgers.edu">majordomo@vger.rutgers.edu</A>·Î ÆíÁö¸¦ º¸³»¸é µÈ´Ù.
<P>SMP ¸®´ª½º°¡ Á¤¸» Á¦´ë·Î µ¿ÀÛÇϴ°¡? 1996³â 6¿ù, ³ª´Â »õ·Î¿î »óÇ¥ÀÇ
(»ç½ÇÀº Çѹ° °£ ǰÁ¾À̾úÁö¸¸ »õ »óÇ¥¿´´Ù ;-) µÎ°³ÀÇ 100MHz ÆæÆ¼¾ö
ÇÁ·Î¼¼¼¸¦ °¡Áö´Â ½Ã½ºÅÛÀ» ±¸ÀÔÇß´Ù. Á¶¸³À» ¸¶Ä£ ½Ã½ºÅÛÀº µÎ°³ÀÇ
ÇÁ·Î¼¼¼¿Í Asus ¸¶´õº¸´õ(motherboard), 256K ij½Ã, 32M RAM, 1.66G
Çϵåµð½ºÅ©, 6¹è¼Ó CDROM, Stealth 64 ±×·¡ÇÈ Ä«µå¿Í 15ÀÎÄ¡ ¸ð´ÏÅÍ·Î, À̸¦
¸¶·ÃÇϴµ¥ ¸ðµÎ 1800$°¡ µé¾ú´Ù. ÀÌ °¡°ÝÀº ÀÌ¿Í ºñ½ÁÇÑ »ç¾çÀÇ ÇÁ·Î¼¼¼
ÇϳªÀÎ ½Ã½ºÅÛº¸´Ù ´ÜÁö ¸î¹é ´Þ·¯Á¤µµ ºñ½Ñ °Å¿´´Ù. Á¦´ë·Î µ¿ÀÛÇÏ´Â SMP
¸®´ª½º¸¦ ±¸ÇÒ·Á¸é, ±×Àú º¸ÅëÀÇ ´ÜÀÏ ÇÁ·Î¼¼¼ ¸®´ª½º¸¦ ¼³Ä¡Çϰí,
makefile¿¡¼ <CODE>SMP=1</CODE>À» ¸·°í ÀÖ´Â ÁÖ¼®À» ÇØÁ¦ÇÏ¿© (ºñ·Ï
<CODE>SMP</CODE>¸¦ <CODE>1</CODE>·Î ¼³Á¤ÇÏ´Â °ÍÀÌ Á¶±ÝÀº ¹Ý¾îÀûÀ̶ó´Â
°ÍÀ» ¾ËÁö¸¸) Ä¿³ÎÀ» ´Ù½Ã ÄÄÆÄÀÏÇϰí, <CODE>lilo</CODE>¿¡°Ô »õ·Î¿î
Ä¿³ÎÀ» ¾Ë·ÁÁֱ⸸ ÇÏ¸é µÈ´Ù. ÀÌ ½Ã½ºÅÛÀº ¸Å¿ì Àß µ¿ÀÛÇÏ¿´°í,
¾ÈÁ¤ÀûÀ̱⵵ ÇÏ¿©, Áö±Ý±îÁö »ç¿ëÇØ¿Â ³ªÀÇ ÁÖ ¿öÅ©½ºÅ×À̼ÇÀÇ ¿ªÇÒÀ»
¼öÇàÇϱ⿡ ÃæºÐÇß´Ù. ¿ä¾àÇϸé, SMP ¸®´ª½º´Â Á¤¸»·Î Á¦´ë·Î µ¿ÀÛÇÑ´Ù.
<P>´ÙÀ½ Áú¹®Àº SMP ¸®´ª½º°¡ °øÀ¯ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â º´·Ä ÇÁ·Î±×·¥À»
ÀÛ¼ºÇÏ°í ½ÇÇàÇÏ´Â µ¥ ÀÖ¾î ¾ó¸¸ÅÀ̳ª °í¼öÁØÀ¸·Î Áö¿øÀ» ÇØÁÖ´À³ÄÀÌ´Ù.
1996³â ÃÊ¿¡´Â ÀÌ·± °ÍÀº º°·Î ¸¹Áö ¾Ê¾Ò´Ù. ±×·¯³ª ÀÌÁ¦ ¸¹Àº °ÍÀÌ º¯Çß´Ù.
¿¹¸¦ µé¾î, ÀÌÁ¦´Â ¸Å¿ì ¿Ïº®ÇÑ POSIX ¾²·¹µå(thread) ¶óÀ̺귯¸®°¡ ÀÖ´Ù.
<P>°øÀ¯ ¸Þ¸ð¸® ¹æ½ÄÀ» »ç¿ëÇÏ´Â °Íº¸´Ù´Â ¼º´ÉÀÌ ¶³¾îÁú ¼öµµ ÀÖÁö¸¸, SMP
¸®´ª½º ½Ã½ºÅÛ¿¡¼´Â ¿ø·¡ ¼ÒÄÏ Åë½ÅÀ» »ç¿ëÇÏ´Â ¿öÅ©½ºÅ×À̼Ç
Ŭ·¯½ºÅÍ(cluster)¿¡¼ µ¿ÀÛÇϵµ·Ï °³¹ßµÈ ´ëºÎºÐÀÇ º´·Ä ó¸® ¼ÒÇÁÆ®¿þ¾îµµ
»ç¿ëÇÒ ¼ö ÀÖ´Ù. ¼ÒÄÏ(3.3 ÀåÀ» º¸¶ó) ¹æ½ÄÀº SMP ¸®´ª½º ½Ã½ºÅÛ »Ó¸¸
¾Æ´Ï¶ó, ¿©·¯°³ÀÇ SMP ½Ã½ºÅÛÀ» ³×Æ®¿÷À¸·Î ¿¬°áÇÑ Å¬·¯½ºÅÍ¿¡¼µµ »ç¿ëÇÒ ¼ö
ÀÖ´Ù. ±×·¸Áö¸¸ ¼ÒÄÏÀº SMP¿¡¼´Â »ó´çÇÑ ¾çÀÇ ºÒÇÊ¿äÇÑ
¿À¹öÇìµå(overhead)¸¦ °¡Áö°Ô µÈ´Ù.
ÀÌ·± ¿À¹öÇìµåÀÇ ´ëºÎºÐÀº Ä¿³Î Áï ÀÎÅÍ·´Æ® Çڵ鷯¿¡¼ ÀϾÙ. SMP
¸®´ª½º¿¡¼´Â º¸Åë µ¿½Ã¿¡ ÇϳªÀÇ ÇÁ·Î¼¼¼¸¸ÀÌ Ä¿³Î ¸ðµå¿¡ ÀÖÀ» ¼ö ÀÖ°í,
ºÎÆ® ÇÁ·Î¼¼¼¸¸ÀÌ ÀÎÅÍ·´Æ®¸¦ ó¸®ÇÒ ¼ö ÀÖµµ·Ï ÀÎÅÍ·´Æ® ÄÁÆ®·Ñ·¯°¡
¼³Á¤µÇ¾î Àֱ⠶§¹®¿¡ ¹®Á¦´Â ´õ ½É°¢ÇØÁø´Ù. ±×·³¿¡µµ ºÒ±¸Çϰí, ÀüÇüÀûÀÎ
SMP Åë½Å Çϵå¿þ¾î°¡ Ŭ·¯½ºÅÍ ³×Æ®¿÷º¸´Ù´Â ÈξÀ ÁÁ±â ¶§¹®¿¡, ¿ø·¡
Ŭ·¯½ºÅÍ¿¡¼ »ç¿ëÇÏ·Á°í ¸¸µç Ŭ·¯½ºÅÍ¿ë ¼ÒÇÁÆ®¿þ¾îµµ SMP¿¡¼ ´õ ÁÁÀº
¼º´ÉÀ» º¸ÀδÙ.
<P>ÀÌ ÀåÀÇ ³ª¸ÓÁö¿¡¼´Â SMP Çϵå¿þ¾î¿¡ ´ëÇØ¼ À̾߱âÇϰí, º´·Ä ÇÁ·Î±×·¥
ÇÁ·Î¼¼½º »çÀÌ¿¡¼ ¸Þ¸ð¸®¸¦ °øÀ¯ÇÏ´Â ±âº»ÀûÀÎ ¸®´ª½º ¸ÞÄ¿´ÏÁòÀ» »ìÆìº¸°í,
¿øÀÚ¼º(atomicity), Èֹ߼º(volatility), ¶ô(lock), ij½Ã ¶óÀÎ(cache line)¿¡
´ëÇØ¼ ¾ÆÁÖ °£´ÜÇÏ°Ô ¾Ë¾Æº¸°í, ¸¶Áö¸·À¸·Î ¿©·¯°¡Áö °øÀ¯ ¸Þ¸ð¸® º´·Ä ó¸®
¶óÀ̺귯¸®µé¿¡ ´ëÇØ ¾à°£ÀÇ Á¶¾ðÀ» Çϵµ·Ï ÇÑ´Ù.
<P>
<H2><A NAME="ss2.1">2.1 SMP Çϵå¿þ¾î(Hardware)</A>
</H2>
<P>
<P>SMP ½Ã½ºÅÛµéÀº ¿©·¯ÇØ ÀüºÎÅÍ »ç¿ëµÇ¾î ¿ÔÁö¸¸, ¾ó¸¶Àü±îÁö¸¸Çصµ ±â°è¸¶´Ù
±âº»ÀûÀÎ ±â´ÉµéÀ» ¼·Î ´Ù¸£°Ô ±¸ÇöÇÏ´Â °æÇâÀÌ ÀÖ¾î¼, ¿î¿µÃ¼Á¦¿¡¼ SMP¸¦
Áö¿øÇÏ´Â °ÍÀÌ È£È¯¼ºÀÌ ¾ø¾ú´Ù. ÀÌ·± ¹®Á¦¸¦ Á¾½Ä½ÃŲ °ÍÀº ÀÎÅÚ¿¡¼
¹ßÇ¥ÇÑ ´ÙÁßÇÁ·Î¼¼¼ ±Ô¾à(Multiprocessor Specification, °£´ÜÈ÷ ÁÙ¿©¼
<B>MPS</B>¶ó°í ÇÑ´Ù)ÀÌ´Ù. MPS 1.4 ±Ô¾àÀº
<A HREF="http://www.intel.com/design/pro/datashts/242016.htm">http://www.intel.com/design/pro/datashts/242016.htm</A>¿¡¼
PDF ÆÄÀÏ Çü½ÄÀ¸·Î µÈ ¹®¼·Î ±¸ÇÒ ¼ö ÀÖÀ¸¸ç,
<A HREF="http://support.intel.com/oem_developer/ial/support/9300.HTM">http://support.intel.com/oem_developer/ial/support/9300.HTM</A>¿¡¼
MPS 1.1 ±Ô¾à¿¡ ´ëÇÑ °³¿ä¸¦ º¼ ¼ö ÀÖÁö¸¸, ÀÎÅÚÀÌ ÀÚ½ÅÀÇ WWW »çÀÌÆ®¸¦ Á¾Á¾
°³ÆíÀ» Çϱ⠶§¹®¿¡ ÀÌ ÁÖ¼Ò´Â ¹Ù²î¾úÀ» ¼öµµ ÀÖ´Ù. ¸¹Àº
<A HREF="http://www.uruk.org/~erich/mps-hw.html">Á¦ÀÛµé</A>Àº 4°³ÀÇ
ÇÁ·Î¼¼¼±îÁö Áö¿øÇÏ´Â MPS ȣȯ ½Ã½ºÅÛµéÀ» ¸¸µé°í ÀÖÁö¸¸, ÀÌ·ÐÀûÀ¸·Î
MPS´Â ´õ ¸¹Àº ÇÁ·Î¼¼¼µéÀ» Áö¿øÇÒ ¼ö ÀÖ´Ù.
<P>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 Áö¿ø ĨµéÀ»
ÇÊ¿ä·Î Çϴµ¥, ÀÌ ±ÛÀ» ¾²°í ÀÖÀ» ¶§ ¾ÆÁ÷ À̵é ĨµéÀº ³ª¿ÍÀÖÁö ¾Ê¾Ò´Ù).
<P>MPS ȣȯ ½Ã½ºÅÛµéÀÇ ¼º´ÉÀº õÂ÷¸¸º°·Î ´Þ¶óÁú ¼ö ÀÖ´Ù´Â Á¡Àº ²À ÀÌÇØÇϰí
³Ñ¾î°¡¾ß ÇÑ´Ù. ÀϹÝÀûÀÎ ¿¹»ó´ë·Î ¼º´ÉÀÇ Â÷À̸¦ ³ªÅ¸³»´Â ¿äÀÎ ÁßÀÇ
Çϳª´Â ÇÁ·Î¼¼¼ ¼ÓµµÀÌ´Ù. ´ëü·Î Á» ´õ ºü¸¥ Ŭ·°ÀÇ ÇÁ·Î¼¼¼À» »ç¿ëÇϸé
´õ ºü¸¥ ½Ã½ºÅÛÀÌ µÇ¸ç, Pentium Pro ÇÁ·Î¼¼¼¸¦ »ç¿ëÇÑ ½Ã½ºÅÛÀÌ Pentium
ÇÁ·Î¼¼¼¸¦ ÀÌ¿ëÇÏ´Â ½Ã½ºÅÛº¸´Ù ºü¸¥ °æÇâÀÌ ÀÖ´Ù. ±×·¸Áö¸¸ MPS¿¡¼´Â
°øÀ¯ ¸Þ¸ð¸®(shared memory)¸¦ Çϵå¿þ¾îÀûÀ¸·Î ¾î¶»°Ô ±¸ÇöÇØ¾ß ÇÏ´ÂÁö´Â
¸í½ÃÇÏÁö ¾Ê°í ÀÖ´Ù. ´ÜÁö ¼ÒÇÁÆ®¿þ¾îÀûÀÎ °üÁ¡¿¡¼ °øÀ¯ ¸Þ¸ð¸®°¡ ¾î¶»°Ô
µ¿ÀÛÇØ¾ß ÇÏ´ÂÁö¸¸ ¸í½ÃÇϰí ÀÖÀ» »ÓÀÌ´Ù. ±×·¡¼ ±¸ÇöÇϰí ÀÖ´Â °øÀ¯
¸Þ¸ð¸® ¹æ½ÄÀÌ SMP ¸®´ª½ºÀÇ Æ¯Â¡°ú ƯÁ¤ ÇÁ·Î±×·¥ÀÇ Æ¯Â¡¿¡ ¾î¶»°Ô
¸Â¾Æµé¾î°¡´À³Ä¿¡ µû¶ó¼ ¼º´ÉÀÌ ´Þ¶óÁú ¼ö ÀÖ´Ù.
<P>MPS ȣȯ ½Ã½ºÅÛµéÀÇ Â÷ÀÌ´Â ¿ì¼± ¹°¸®ÀûÀ¸·Î °øÀ¯ ¸Þ¸ð¸®¿¡ Á¢±ÙÇÏ´Â °ÍÀ»
¾î¶»°Ô ±¸ÇöÇÏ´À³Ä¿¡¼ ³ªÅ¸³´Ù.
<P>
<H3>°¢ ÇÁ·Î¼¼¼°¡ µ¶ÀÚÀûÀÎ L2 ij½Ã¸¦ °¡Áö´Â°¡?(Does each processor have its own L2 cache?)</H3>
<P>
<P>ÀϺΠMPS Pentium ½Ã½ºÅÛ°ú, ¸ðµç MPS Pentium Pro¿Í Pentium II ½Ã½ºÅÛÀº
µ¶ÀÚÀûÀÎ L2 ij½Ã¸¦ °¡Áö°í ÀÖ´Ù. (L2 ij½Ã´Â Pentium Pro³ª Pentium II
¸ðµâ¿¡ µé¾îÀÖ´Ù) ÀϹÝÀûÀ¸·Î µ¶ÀÚÀûÀÎ L2 ij½Ã¸¦ »ç¿ëÇϸé
ó¸® ¼Óµµ¸¦ ÃÖ´ëÈÇÒ ¼ö ÀÖ´Ù°í ¾Ë·ÁÁ® ÀÖÁö¸¸, ¸®´ª½º¿¡¼´Â ¸í¹éÇÏ°Ô ±×·±
°ÍÀº ¾Æ´Ï´Ù. À̸¦ È¥¶õÇÏ°Ô ÇÏ´Â ÁÖµÈ ÀÌÀ¯´Â, ÇöÀçÀÇ ¸®´ª½º ½ºÄÉÁÙ·¯°¡
°¢ ÇÁ·Î¼¼½º¸¦ ¶È°°Àº ÇÁ·Î¼¼¼¿¡¼ ½ÇÇàµÇ°Ô ÇÏ´Â <B>ÇÁ·Î¼¼¼
ģȷÂ(processor infinity)</B>ÀÇ °³³äÀ» µû¸£Áö´Â ¾Ê±â ¶§¹®ÀÌ´Ù.
ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ´Â ÇÁ·Î¼¼¼´Â ±Ý¹æ ¹Ù²ð¼ö ÀÖ´Ù. ÀÌ ¹®Á¦´Â ÃÖ±Ù¿¡
"ÇÁ·Î¼¼¼ °áÇÕ(processor binding)"À̶ó´Â Á¦¸ñÀ¸·Î SMP ¸®´ª½º °³¹ß
°øµ¿Ã¼¿¡¼ Åä·ÐµÈ ÀûÀÌ ÀÖ´Ù. ÇÁ·Î¼¼¼ ģȷ ¾øÀÌ º°µµÀÇ L2 ij½Ã¸¦
°®°ÔµÇ¸é, ¾î¶² ÇÁ·Î¼¼½º°¡ ÀÌÀü¿¡ ½ÇÇàµÇ´ø ÇÁ·Î¼¼¼°¡ ¾Æ´Ñ ´Ù¸¥
ÇÁ·Î¼¼¼¿¡¼ ½Ã°£À» ÇÒ´ç¹Þ¾Æ ½ÇÇàµÇ´Â °æ¿ì »ó´çÇÑ ¿À¹öÇìµå¸¦ ÃÊ·¡ÇÒ ¼ö
ÀÖ´Ù.
<P>»ó´ëÀûÀ¸·Î °ªÀÌ ½Ñ »ó´ç¼öÀÇ ½Ã½ºÅÛµéÀº µÎ°³ÀÇ Pentium ÇÁ·Î¼¼¼°¡ ÇϳªÀÇ
L2 ij½Ã¸¦ °øÀ¯Çϵµ·Ï ¸¸µé¾îÁ® ÀÖ´Ù. ÀÌ ¹æ½ÄÀÇ ¾ÈÁÁÀº Á¡Àº µÎ°³ÀÇ
ÇÁ·Î¼¼¼°¡ ¼·Î ij½Ã¸¦ »çÀÌ¿¡ µÎ°í °æÀïÀ» ÇØ¾ßÇÑ´Ù´Â °ÍÀ¸·Î, ƯÈ÷
¿©·¯°³ÀÇ ¼·Î µ¶¸³ÀûÀÎ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â °æ¿ì ¼º´ÉÀÌ ÇöÀúÇϰÔ
¶³¾îÁø´Ù´Â °ÍÀÌ´Ù. ÁÁÀº Á¡Àº ¸¹Àº º´·Ä ÇÁ·Î±×·¥µé¿¡°Ô ÀÖ¾î¼ µÎ °³ÀÇ
ÇÁ·Î¼¼¼°¡ °øÀ¯ ¸Þ¸ð¸®ÀÇ ¶È°°Àº ¶óÀο¡ Á¢±ÙÇÏ´Â °æ¿ì Çϳª¸¸ÀÌ À̸¦
ij½Ã¿¡ °¡Á®¿À¸é µÇ¾î, ¹ö½º¸¦ µÑ·¯½Ñ °æÀïÀ» ÇÇÇÒ ¼ö ÀÖ¾î¼ Ä³½Ã¸¦
°øÀ¯ÇÏ´Â°Ô ½ÇÁúÀûÀ¸·Î µµ¿òÀÌ µÈ´Ù´Â °ÍÀÌ´Ù. ¶ÇÇÑ ÇÁ·Î¼¼¼ ģȷÂÀ»
Àû¿ëÇÏÁö ¾Ê´Â °æ¿ì L2 ij½Ã¸¦ °øÀ¯ÇÏ´Â °ÍÀÌ ÇÇÇØ°¡ ´õ Àû´Ù. µû¶ó¼ º´·Ä
ÇÁ·Î±×·¥ÀÇ °æ¿ì L2 ij½Ã¸¦ °øÀ¯ÇÏ´Â °ÍÀÌ ÀϹÝÀûÀ¸·Î »ý°¢ÇÏ´Â °Í¸¸Å
³ª»ÚÁö´Â ¾Ê´Ù.
<P>µÎ°³ÀÇ Pentium ÇÁ·Î¼¼¼°¡ 256K ij½Ã¸¦ °øÀ¯ÇÏ´Â ½Ã½ºÅÛÀ» »ç¿ëÇØº» °æÇè¿¡
µû¸£¸é, ÇÊ¿äÇÑ Ä¿³Î ÀÛ¾÷ÀÇ Á¤µµ¿¡ µû¶ó¼ ½Ã½ºÅÛÀÇ ¼º´ÉÀÌ »ó´çÈ÷ Å©°Ô
´Þ¶óÁ³´Ù. ÃÖ¾ÇÀÇ °æ¿ì ¼Óµµ°¡ 1.2¹è Á¤µµ¹Û¿¡ »¡¶óÁöÁö ¾Ê¾ÒÁö¸¸,
"µ¥ÀÌÅ͸¦ °¡Á®¿À´Â °ÍÀº °øÀ¯ÇÏ´Â(shared fetch)" È¿°ú¸¦ Á¦´ë·Î ÀÌ¿ëÇÏ´Â
°è»ê Áß½ÉÀûÀÎ SPMD ½ºÅ¸ÀÏÀÇ Äڵ带 »ç¿ëÇÏ¿´À» ¶§ 2.1 ¹è±îÁö »¡¶óÁö´Â
°ÍÀ» º¸±âµµ ÇÏ¿´´Ù.
<P>
<H3>¹ö½º ¼³Á¤(Bus configuration)?</H3>
<P>
<P>¸ÕÀú À̾߱âÇÒ °ÍÀº ¿äÁò¿¡ ³ª¿À´Â ´ëºÎºÐÀÇ ½Ã½ºÅÛµéÀº, ÇÁ·Î¼¼¼¿¡ Çϳª
ÀÌ»óÀÇ PCI ¹ö½º°¡ ¿¬°áµÇ¾î ÀÖ°í, ÀÌ´Â ¶Ç´Ù½Ã ºê¸´Áö(bridge)¸¦ ÅëÇÏ¿©
Çϳª ÀÌ»óÀÇ ISA/EISA ¹ö½º¿¡ ¿¬°áµÇ¾î ÀÖ´Ù´Â °ÍÀÌ´Ù. ºê¸´Áö¸¦ ÅëÇÏ´Â
°æ¿ì ´ë±â½Ã°£(latency)ÀÌ ´Ã¾î³ª°Ô µÇ°í, EISA³ª ISA´Â ÀϹÝÀûÀ¸·Î PCI¿¡
ºñÇØ¼ ³·Àº ´ë¿ªÆøÀ» Á¦°øÇϱ⠶§¹®¿¡ (ISA°¡ Á¦ÀÏ ³·´Ù), µð½ºÅ©
µå¶óÀ̺곪, ºñµð¿À Ä«µå, ´Ù¸¥ °í¼º´É ÀåÄ¡µéÀº PCI ¹ö½º ÀÎÅÍÆäÀ̽º¸¦
ÅëÇÏ¿© ¿¬°áµÇ¾î¾ß ÇÑ´Ù.
<P>PCI ¹ö½º°¡ Çϳª¹Û¿¡ ¾ø´õ¶óµµ °è»ê Áß½ÉÀûÀÎ º´·Ä ÇÁ·Î±×·¥ÀÇ °æ¿ì MPS
½Ã½ºÅÛÀº ±¦ÂúÀº ¼º´É°³¼± È¿°ú¸¦ º¸¿©ÁØ´Ù. ÇÏÁö¸¸ I/O 󸮼ӵµ´Â ÇϳªÀÇ
ÇÁ·Î¼¼¼¸¦ »ç¿ëÇÒ ¶§º¸´Ù ´õ ³ª¾ÆÁöÁö ¾ÊÀ¸¸ç, ÇÁ·Î¼¼¼µéÀÌ ¹ö½º¸¦ »çÀÌ¿¡
µÎ°í °æÀïÀ» Çϱ⠶§¹®¿¡ ¾Æ¸¶µµ ¼º´ÉÀÌ Á¶±Ý ¶³¾îÁö°Ô µÉ °ÍÀÌ´Ù. µû¶ó¼
I/O ¼Óµµ¸¦ ³ôÀÌ°í ½Í´Ù¸é ¿©·¯°³ÀÇ µ¶ÀÚÀûÀÎ PCI ¹ö½º¿Í I/O ÄÜÆ®·Ñ·¯(¿¹¸¦
µé¾î ¿©·¯°³ÀÇ SCSI üÀεé)¸¦ °¡Áö´Â MPS ½Ã½ºÅÛÀ» ±¸ÀÔÇÏ´Â °ÍÀÌ ÁÁ´Ù. ÀÌ
¶§ SMP ¸®´ª½º¿¡¼ ÀÌµé ½Ã½ºÅÛÀ» Áö¿øÇÏ´ÂÁö Á¶½É½º·´°Ô »ìÆìº¸¾Æ¾ß ÇÑ´Ù.
¶ÇÇÑ ÇöÀçÀÇ SMP ¸®´ª½º¿¡¼´Â ¾î´À ¼ø°£À̵ç ÇϳªÀÇ ÇÁ·Î¼¼¼¸¸ÀÌ
Ä¿³Î¸ðµå¿¡ ÀÖÀ» ¼ö Àֱ⠶§¹®¿¡, I/O 󸮸¦ ÇÒ ¶§ Ä¿³Î¿¡¼ ¼Ò¿äÇÏ´Â
½Ã°£ÀÌ ÀûÀº I/O ÄÜÆ®·Ñ·¯¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù´Â Á¡À» ¸í½ÉÇØ¾ß ÇÑ´Ù. Á¤¸»
°í¼º´ÉÀ» ¿øÇÑ´Ù¸é ½Ã½ºÅÛ ÄÝ(system call)À» ÅëÇÏÁö ¾Ê°í, »ç¿ëÀÚ
ÇÁ·Î¼¼½º°¡ Á÷Á¢ ÀåÄ¡·Î I/O¸¦ ÇÏ´Â °Íµµ °í·ÁÇØ º¼ Çʿ䰡 ÀÖ´Ù. ÀÌ´Â
»ý°¢¸¸Å ¾î·ÆÁöµµ ¾Ê°í, ¾ÈÁ¤¼ºÀ» ÇØÄ¡Áöµµ ¾Ê´Â´Ù (3.3 Àå¿¡¼ ±âº» ±â¼ú¿¡
´ëÇØ¼ ¼³¸íÇϰí ÀÖ´Ù).
<P>¹ö½º ¼Óµµ¿Í ÇÁ·Î¼¼¼ Ŭ·° ¼ÓµµÀÇ °ü°è¸¦ »ìÆìº¸´Â °Íµµ ¸Å¿ì Áß¿äÇÏ´Ù.
Áö³ ¸îÇØµ¿¾È ÀÌµé »çÀÌÀÇ °ü°è´Â ºÒ¸íÈ®ÇÏ°Ô ÀÌÇØµÇ¾î ¿Ô´Ù. ´ëºÎºÐÀÇ
½Ã½ºÅÛÀÌ Áö±ÝÀº ¶È°°Àº PCI Ŭ·° ¼Óµµ¸¦ »ç¿ëÇϰí ÀÖÁö¸¸, ´õ ºü¸¥ Ŭ·°
¼ÓµµÀÇ ÇÁ·Î¼¼¼°¡ ´õ ´À¸° ¹ö½º Ŭ·°°ú ½ÖÀ» ÀÌ·ç´Â °ÍÀº µå¹® ÀÏÀÌ ¾Æ´Ï´Ù.
ÀÌÀÇ °íÀüÀûÀÎ ¿¹·Î, ÀϹÝÀûÀ¸·Î Pentium 133Àº Pentium 150º¸´Ù ´õ ºü¸¥
¹ö½º¸¦ »ç¿ëÇÏ¿´°í, ´Ù¾çÇÑ º¥Ä¡¸¶Å©¿¡¼ ƯÀÌÇÑ °á°ú¸¦ ³ªÅ¸³Â´Ù. ÀÌ·±
È¿°ú´Â SMP ½Ã½ºÅÛ¿¡¼ ´õ¿í ÁõÆøµÈ´Ù. ÀÌ´Â ¹ö½º Ŭ·° ¼Óµµ¸¦ ºü¸£°Ô ÇÏ´Â
°Íº¸´Ùµµ ´õ Áß¿äÇÑ ¹®Á¦ÀÌ´Ù.
<P>
<H3>¸Þ¸ð¸® Áßø°ú DRAM ±â¼ú(Memory interleaving and DRAM technologies)?</H3>
<P>
<P>¸Þ¸ð¸® ÁßøÀº ½ÇÁ¦·Î MPS¿Í´Â ¾Æ¹«·± Àϵµ °°ÀÌ ÇÏÁö ¾Ê´Â´Ù. ±×·¯³ª MPS
½Ã½ºÅÛ¿¡¼ À̰ÍÀÌ Á¾Á¾ ¾ð±ÞµÇ´Â °ÍÀ» º¼ ¼ö Àִµ¥, ÀÌ´Â ÀÌµé ½Ã½ºÅÛÀÌ
´ëü·Î ¸Þ¸ð¸® ´ë¿ªÆøÀ» ´õ ¸¹ÀÌ ÇÊ¿ä·Î Çϱ⠶§¹®ÀÌ´Ù. ±âº»ÀûÀ¸·Î 2-way³ª
4-way ÁßøÀº RAM¿¡ ºí·° Á¢±ÙÀ» ÇÒ ¶§, À̰ÍÀÌ Çϳª°¡ ¾Æ´Ï¶ó ¿©·¯°³ÀÇ RAM
¹ðÅ©(bank)¸¦ »ç¿ëÇÏ¿© ÀÌ·ç¾îÁöµµ·Ï RAMÀ» Á¶Á÷ÈÇÑ´Ù. ÀÌ´Â ´õ ³ôÀº
¸Þ¸ð¸® Á¢±Ù ´ë¿ªÆøÀ» Á¦°øÇÏ°Ô µÇ´Âµ¥, ƯÈ÷ ij½Ã ¶óÀÎ(cache line) Àб⳪
¾²±â¿¡ ÀÖ¾î¼ ´õ¿í ±×·¯ÇÏ´Ù.
<P>À̰ÍÀÇ È¿°ú¿¡ ´ëÇØ¼´Â ±×´ÙÁö ¸íÄèÇÏÁö ¾ÊÀºµ¥, EDO DRAMÀ̳ª ¿©·¯°¡Áö
´Ù¸¥ ¸Þ¸ð¸® ±â¼úµéÀº ÀÌ¿Í ºñ½ÁÇÑ Á¾·ùÀÇ ¿¬»ê ¼Óµµ¸¦ Çâ»ó½Ã۱⠶§¹®ÀÌ´Ù.
<A HREF="http://www.pcguide.com/ref/ram/tech.htm">http://www.pcguide.com/ref/ram/tech.htm</A>¿¡¼
DRAM ±â¼ú¿¡ ´ëÇØ ¹«Ã´ Àß Á¤¸®µÇ¾îÀÖ´Â °³¿ä¸¦ º¼ ¼ö ÀÖ´Ù.
<P>±×·¸´Ù¸é, ¿¹¸¦ µé¾î 2-wayÀÇ ÁßøµÇ´Â EDO DRAMÀ» ¾²´Â °ÍÀÌ ÁßøÀ»
»ç¿ëÇÏÁö ¾Ê´Â SDRAMÀ» ¾²´Â °Íº¸´Ù ´õ ÁÁÀº°¡? À̰ÍÀº ¸Å¿ì ÈǸ¢ÇÑ
Áú¹®À̸ç, ±× ´ë´äÀº °£´ÜÇÏÁö ¾Ê´Ù. ¿Ö³ÄÇϸé Áßø±â¼úÀ̳ª ´Ù¸¥ Èï¹ÌÀÖ´Â
±â¼úµéÀº ´ëü·Î ºñ½Î±â ¶§¹®ÀÌ´Ù. ¿©±â¿¡ µé¾î°¡´Â ¶È°°Àº µ·À» º¸Åë
¸Þ¸ð¸®¿¡ ÅõÀÚÇÑ´Ù¸é ÈξÀ ¸¹Àº ¾çÀÇ ¸ÞÀÎ ¸Þ¸ð¸®¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
°¡Àå ´À¸° DRAMÀ» »ç¿ëÇÑ´Ù ÇÏ´õ¶óµµ µð½ºÅ©¸¦ ÀÌ¿ëÇÑ °¡»ó ¸Þ¸ð¸®º¸´Ù´Â
ÈξÀ ºü¸£´Ù.
<P>
<H2><A NAME="sec_IntroductionToSharedMemoryProgramming"></A> <A NAME="ss2.2">2.2 °øÀ¯ ¸Þ¸ð¸® ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ¼Ò°³</A>
</H2>
<P>
<P>SMP¿¡¼ º´·Ä󸮸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÃæºÐÈ÷ ÇÒ¸¸ÇÑ °ÍÀ̶ó°í °áÁ¤À» ³»·È´Ù¸é,
ÀÌÁ¦ ¾îµð¼ºÎÅÍ ½ÃÀÛÇÏ´Â°Ô ÁÁÀ»±î? ±×·³, °øÀ¯ ¸Þ¸ð¸® Åë½ÅÀÌ ½ÇÁ¦·Î
µ¿ÀÛÇÏ´Â ¹æ½Ä¿¡ ´ëÇØ¼ Á¶±Ý ´õ ¹è¿ì´Â °ÍÀ¸·Î ±× ù¹ßÀ» ³»µó¾îº¸µµ·Ï
ÇÏÀÚ.
<P>¾óÇÍ »ý°¢ÇÏ¸é °øÀ¯ ¸Þ¸ð¸® Åë½ÅÀ̶õ ÇϳªÀÇ ÇÁ·Î¼¼¼°¡ ¸Þ¸ð¸®¿¡ °ªÀ»
ÀúÀåÇϸé, ´Ù¸¥ ÇÁ·Î¼¼¼°¡ À̸¦ ÀоîµéÀÌ´Â °ÍÀ̶ó°í »ý°¢ÇÒ ¼öµµ ÀÖ´Ù.
ÇÏÁö¸¸ ºÒÇàÈ÷µµ ±×·¸°Ô °£´ÜÇÏÁö¸¸Àº ¾Ê´Ù. ¿¹¸¦ µé¾î, ÇÁ·Î¼¼½º¿Í
ÇÁ·Î¼¼¼ »çÀÌÀÇ °ü°è°¡ ¹«Ã´ º¹ÀâÇÏ°Ô ¾ôÇô µÇ¾îÀÖ´Ù°í ÇÏÀÚ. ÇÁ·Î¼¼¼ÀÇ
°¹¼öº¸´Ù ÇöÀç µ¿ÀÛÇÏ´Â ÇÁ·Î¼¼½ºÀÇ ¼ö°¡ Àû´Ù°í ÇÏ´õ¶óµµ ±×·¸°í, ±× ¹Ý´ëÀÇ
°æ¿ìµµ ¸¶Âù°¡Áö´Ù. ÀÌ ÀåÀÇ ³²Àº ºÎºÐ¿¡¼´Â Ưº°È÷ ½Å°æ¾²Áö ¾ÊÀ¸¸é
½É°¢ÇÑ ¹®Á¦¸¦ ¾ß±âÇÒ ¼ö ÀÖ´Â Áß¿äÇÑ ³íÁ¡µé - ¹«¾ùÀ» °øÀ¯ÇÒ °ÍÀÎÁö
ÆÇ´ÜÇϴµ¥ »ç¿ëÇÏ´Â µÎ°¡Áö ¼·Î ´Ù¸¥ ¸ðµ¨°ú, ¿øÀÚ¼º(atomicity) ³íÁ¡,
Èֹ߼º(volatility) °³³ä°ú Çϵå¿þ¾î ¶ô(lock) ¸í·É, ij½Ã ¶óÀÎ(cache line)
È¿°ú, ±×¸®°í ¸®´ª½º ½ºÄÉÁÙ·¯ ³íÁ¡ - À» °£´ÜÈ÷ ¿ä¾àÇϵµ·Ï ÇϰڴÙ.
<P>
<H3>¸ðµÎ °øÀ¯Çϱ⠴ë ÀϺθ¦ °øÀ¯Çϱâ(Shared Everything Vs. Shared Something)</H3>
<P>
<P>°øÀ¯ ¸Þ¸ð¸® ÇÁ·Î±×·¡¹Ö¿¡¼´Â ÀϹÝÀûÀ¸·Î <B>¸ðµÎ °øÀ¯Çϱâ</B>¿Í <B>ÀϺθ¦
°øÀ¯Çϱâ</B>¶ó´Â µÎ°¡ÁöÀÇ ±Ùº»ÀûÀ¸·Î ¼·Î ´Ù¸¥ ¸ðµ¨À» »ç¿ëÇÑ´Ù . ÀÌ
µÎ°¡Áö ¸ðµ¨Àº ¸ðµÎ ÇÁ·Î¼¼¼µéÀÌ °øÀ¯¸Þ¸ð¸®·Î µ¥ÀÌÅ͸¦ ¾²°í,
°øÀ¯¸Þ¸ð¸®¿¡¼ µ¥ÀÌÅ͸¦ ÀоîµéÀÓÀ¸·Î½á Åë½ÅÀ» ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. µÎ
¸ðµ¨ÀÇ ´Ù¸¥Á¡Àº, ¸ðµÎ °øÀ¯ÇÏ´Â ¸ðµ¨¿¡¼´Â ¸ðµç ÀڷᱸÁ¶¸¦ °øÀ¯¸Þ¸ð¸®¿¡
µÎ´Â ¹Ý¸é¿¡, ÀϺθ¦ °øÀ¯ÇÏ´Â ¸ðµ¨¿¡¼´Â »ç¿ëÀÚ°¡ °øÀ¯ÇÒ ÀڷᱸÁ¶¿Í
ÇϳªÀÇ ÇÁ·Î¼¼¼¿¡ <B>±¹ÇѵǴÂ</B> ÀڷᱸÁ¶¸¦ ¸í½ÃÀûÀ¸·Î ÁöÁ¤ÇÑ´Ù´Â
°ÍÀÌ´Ù.
<P>¾î¶² °øÀ¯¸Þ¸ð¸® ¸ðµ¨À» »ç¿ëÇÒ °ÍÀΰ¡? ÀÌ´Â Á¾±³¿¡ ´ëÇÑ Áú¹®°ú ºñ½ÁÇÏ´Ù.
¸¹Àº »ç¶÷µéÀº ÀڷᱸÁ¶¸¦ ¼±¾ðÇÒ ¶§ À̰ÍÀ» °øÀ¯ÇÒ °ÍÀÎÁö µû·Î ±¸º°ÇÒ
Çʿ䰡 ¾ø±â ¶§¹®¿¡, ¸ðµÎ °øÀ¯ÇÏ´Â ¸ðµ¨À» ÁÁ¾ÆÇÑ´Ù. ÀÌ ¶§´Â µ¿½Ã¿¡
ÇϳªÀÇ ÇÁ·Î¼¼½º(ÇÁ·Î¼¼¼)¸¸ÀÌ ÀÚ·á¿¡ Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï, Ãæµ¹À» ÀÏÀ¸Å³ ¼ö
ÀÖ´Â °øÀ¯ÇÏ´Â ÀÚ·á¿¡ Á¢±ÙÇÏ´Â ÄÚµå ÁÖÀ§¿¡ ¶ô(lock)À» °É±â¸¸ ÇÏ¸é µÈ´Ù.
±×·¸Áö¸¸ ÀÌ°Í ¿ª½Ã ¸»Ã³·³ °£´ÜÇÏÁø ¾Ê´Ù. ±×·¡¼ ¸¹Àº »ç¶÷µéÀº ÀϺθ¸À»
°øÀ¯ÇÏ´Â ¸ðµ¨ÀÌ °¡Á®´ÙÁÖ´Â »ó´ëÀûÀÎ ¾ÈÀü¼ºÀ» ´õ ¼±È£Çϱ⵵ ÇÑ´Ù.
<P>
<H3>¸ðµÎ °øÀ¯Çϱâ(Shared Everything)</H3>
<P>¸ðµÎ °øÀ¯ÇÏ´Â ¹æ½ÄÀÇ ÀåÁ¡Àº ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖ´Â ¼øÂ÷ÀûÀÎ ÇÁ·Î±×·¥À»
¼±ÅÃÇÏ¿© ½±°Ô ¸ðµÎ °øÀ¯ÇÏ´Â º´·Ä ÇÁ·Î±×·¥À¸·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.
¿©±â¼´Â ¾î¶² ÀÚ·á°¡ ´Ù¸¥ ÇÁ·Î¼¼¼¿¡¼ Á¢±ÙÇÒ ¼ö ÀÖ´Â °ÍÀÎÁö ¸ÕÀú
ÆÇ´ÜÇØ¾ß ÇÒ Çʿ䰡 ¾ø´Ù.
<P>°£´ÜÇÏ°Ô »ìÆìº¸¸é, ¸ðµç°É °øÀ¯ÇÏ´Â ¹æ½ÄÀÇ °¡Àå Å« ¹®Á¦Á¡Àº ÇϳªÀÇ
ÇÁ·Î¼¼¼°¡ ÃëÇÑ ÇൿÀÌ ´Ù¸¥ ÇÁ·Î¼¼¼µé¿¡°Ô ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.
ÀÌ ¹®Á¦´Â µÎ°¡Áö ¹æÇâÀ¸·Î ³ªÅ¸³´Ù :
<P>
<UL>
<LI>¸¹Àº ¶óÀ̺귯¸®µéÀº °øÀ¯ÇÒ ¼ö ¾ø´Â ÀڷᱸÁ¶µéÀ» »ç¿ëÇÑ´Ù. ¿¹¸¦
µé¾î, UNIX¿¡¼ ´ëºÎºÐÀÇ ÇÔ¼öµéÀº <CODE>errno</CODE>¶ó´Â º¯¼ö¿¡´Ù°¡
¿¡·¯Äڵ带 ´ã¾Æ µ¹·ÁÁØ´Ù. ¸¸¾à ¸ðµÎ °øÀ¯ÇÏ´Â µÎ °³ÀÇ ÇÁ·Î¼¼½º°¡
¿©·¯°¡Áö ÇÔ¼ö¸¦ ºÎ¸¥´Ù¸é, À̵éÀº ¶È°°Àº <CODE>errno</CODE> º¯¼ö¸¦
°øÀ¯Çϱ⠶§¹®¿¡ ¼·Î °£¼·À» ÀÏÀ¸Å°°Ô µÉ °ÍÀÌ´Ù. ºñ·Ï Áö±ÝÀº
<CODE>errno</CODE> ¹®Á¦¸¦ ÇØ°áÇÑ ¶óÀ̺귯¸®°¡ ÀÖ±ä ÇÏÁö¸¸, ÀÌ¿Í ºñ½ÁÇÑ
¹®Á¦´Â ´ëºÎºÐÀÇ ¶óÀ̺귯¸®¿¡ ¿©ÀüÈ÷ ³²¾Æ ÀÖ´Ù. ¿¹¸¦ µé¾î, ¹Ì¸® Ưº°ÇÑ
ÁÖÀǸ¦ ±â¿ïÀÌÁö ¾Ê°í, ¸ðµÎ °øÀ¯ÇÏ´Â ¿©·¯°³ÀÇ ÇÁ·Î¼¼½ºµéÀÌ X ¶óÀ̺귯¸®ÀÇ
ÇÔ¼öµéÀ» È£ÃâÇÑ´Ù¸é, X ¶óÀ̺귯¸®´Â Á¦´ë·Î µ¿ÀÛÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.
</LI>
<LI>ÀϹÝÀûÀ¸·Î Æ÷ÀÎÅ͸¦ À߸ø »ç¿ëÇϰųª, ¹è¿¿¡¼ À妽º¸¦ À߸ø ÁöÁ¤ÇÑ
°æ¿ì, ÃÖ¾ÇÀÇ °á°ú·Î ÀÌ Äڵ带 ¼öÇàÇÏ´ø ÇÁ·Î¼¼½º°¡ Áױ⵵ ÇÑ´Ù. À̶§
core ÆÄÀÏÀ» ¸¸µé¾î ¹«½¼ ÀÏÀÌ ÀϾ´ÂÁö ´Ü¼¸¦ Á¦°øÇØÁֱ⵵ ÇÑ´Ù. ¸ðµÎ
°øÀ¯ÇÏ´Â º´·Ä󸮿¡¼´Â ÀÌ·± À߸øµÈ Á¢±ÙÀÌ ¹ß»ýÇϸé <EM>´Ù¸¥
ÇÁ·Î¼¼½º±îÁöµµ Á×°Ô ÇÒ</EM> °¡´É¼ºÀÌ Ä¿¼, Áö¿ªÈ(localize)¸¦ Çϰųª
¿¡·¯¸¦ °íÄ¡´Â °ÍÀ» °ÅÀÇ ºÒ°¡´ÉÇÏ°Ô ¸¸µç´Ù.</LI>
</UL>
<P>ÀÌ·± Á¾·ùÀÇ ¹®Á¦´Â ÀϺθ¦ °øÀ¯ÇÏ´Â ¹æ½Ä¿¡¼´Â ÈçÈ÷ ÀϾÁø ¾Ê´Â´Ù.
¿Ö³ÄÇÏ¸é ¸í¹éÇÏ°Ô ÁöÁ¤ÇÑ ÀڷᱸÁ¶¸¸ÀÌ °øÀ¯µÇ±â ¶§¹®ÀÌ´Ù. ±×¸®°í, ¸ðµÎ
°øÀ¯ÇÏ´Â ¹æ½ÄÀº ¸ðµç ÇÁ·Î¼¼¼°¡ ¿ÏÀüÈ÷ ¶È°°Àº ¸Þ¸ð¸® À̹ÌÁö¸¦ ½ÇÇàÇÏ´Â
°æ¿ì¿¡¸¸ µ¿ÀÛÇÑ´Ù´Â °ÍÀº ´ç¿¬ÇÑ ÀÏÀÌ´Ù. Áï, ¿©·¯°³ÀÇ ¼·Î ´Ù¸¥ ÄÚµå
À̹ÌÁöµé »çÀÌ¿¡¼´Â ¸ðµÎ °øÀ¯ÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù (´Ù¸£°Ô ¸»Çϸé,
SPMD¸¸À» »ç¿ëÇÒ ¼ö ÀÖÁö, ÀϹÝÀûÀÎ MIMD´Â »ç¿ëÇÒ ¼ö
¾ø´Ù).
<P>¸ðµÎ °øÀ¯ÇÏ´Â ¹æ½ÄÀ» Áö¿øÇÏ´Â °¡Àå ÀϹÝÀûÀÎ À¯ÇüÀº <B>¾²·¹µå
¶óÀ̺귯¸®(threads library)</B>ÀÌ´Ù.
<A HREF="http://liinwww.ira.uka.de/bibliography/Os/threads.html">¾²·¹µå</A>´Â º»·¡, ´ëü·Î ÀϹÝÀûÀÎ UNIX ÇÁ·Î¼¼½º¿Í´Â ´Ù¸£°Ô ½ºÄÉÁÙÀÌ
ÀÌ·ç¾îÁö°í, °¡Àå Áß¿äÇÑ Á¡À¸·Î µ¿ÀÏÇÑ ¸Þ¸ð¸® ¸Ê¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â
"°¡º¿î" ÇÁ·Î¼¼½ºÀÌ´Ù. POSIX
<A HREF="http://www.mit.edu:8001/people/proven/pthreads.html">Pthreads</A>ÆÐŰÁö´Â ¿©·¯ Æ÷ÆÃ ÇÁ·ÎÁ§Æ®¿¡¼ ÃÐÁ¡À» ¹Þ¾Æ ¿Ô¾ú´Ù.
¿©±â¼ Áß¿äÇÑ Áú¹®Àº, ÀÌµé Æ÷ÆÃÁßÀÇ ¾î¶² °ÍµéÀÌ ½ÇÁ¦·Î ÇÁ·Î±×·¥¿¡ ÀÖ´Â
¾²·¹µåµéÀ» SMP ¸®´ª½º¿¡¼ º´·Ä·Î ½ÇÇàÇÒ ¼ö ÀÖ´À³ÄÀÌ´Ù (ÀÌ»óÀûÀ¸·Î, °¢
¾²·¹µå¸¶´Ù ÇϳªÀÇ ÇÁ·Î¼¼¼¸¦). POSIX API´Â À̸¦ ¿ä±¸ÇÏÁö ¾ÊÀ¸¸ç,
<A HREF="http://www.aa.net/~mtp/PCthreads.html">http://www.aa.net/~mtp/PCthreads.html</A>°°Àº
¹öÀü¿¡¼´Â ºÐ¸íÇÏ°Ô º´·Ä ¾²·¹½º ½ÇÇàÀ» ±¸ÇöÇÏÁö ¾Ê°í ÀÖ´Ù - ÇÁ·Î±×·¥ÀÇ
¸ðµç ¾²·¹µåµéÀº ÇϳªÀÇ ¸®´ª½º ÇÁ·Î¼¼½º ¾È¿¡ µé¾îÀÖ´Ù.
<P>SMP ¸®´ª½º¿¡¼ÀÇ º´·Ä󸮸¦ Áö¿øÇÑ Ã¹¹øÂ° ¾²·¹µå ¶óÀ̺귯¸®´Â Áö±ÝÀº
Çѹ°°£ bb_threads ¶óÀ̺귯¸®·Î,
<A HREF="ftp://caliban.physics.utoronto.ca/pub/linux/">ftp://caliban.physics.utoronto.ca/pub/linux/</A>¿¡¼
±¸ÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ¸®´ª½ºÀÇ <CODE>clone()</CODE>ÇÔ¼ö¸¦ »ç¿ëÇÏ¿©, µ¶ÀÚÀûÀ¸·Î
½ºÄÉÁٵǸç, ÇϳªÀÇ ÁÖ¼Ò°ø°£À» °øÀ¯ÇÏ´Â, »õ·Î¿î ¸®´ª½º ÇÁ·Î¼¼½º¸¦
»ý¼º(fork)ÇÏ´Â ¸Å¿ì ÀÛÀº ¶óÀ̺귯ÀÌ´Ù. SMP ¸®´ª½º ±â°è´Â °¢
"¾²·¹µåµé"ÀÌ ¿ÏÀüÇÑ ¸®´ª½º ÇÁ·Î¼¼½ºÀ̱⠶§¹®¿¡ ¿©·¯°³ÀÇ À̵é
"¾²·¹µåµé"À» º´·Ä·Î ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ´ë½Å ÀÌÀÇ ´ñ°¡·Î ´Ù¸¥ ¿î¿µÃ¼Á¦ÀÇ
ÀϺΠ¾²·¹µå ¶óÀ̺귯¸®µéÀÌ Á¦°øÇÏ´Â °Í°ú °°Àº "°¡º¿î" ½ºÄÉÁÙ¸µ Á¦¾î¸¦
ÇÒ ¼ö ¾ø´Ù. ÀÌ ¶óÀ̺귯¸®´Â »õ·Î¿î ¸Þ¸ð¸® Á¶°¢À» °¢ ¾²·¹µåÀÇ ½ºÅÃÀ¸·Î
ÇÒ´çÇϰí, ¶ô(lock)ÀÇ ¹è¿(mutex °³Ã¼µé)µéÀ» ¿øÀÚÀûÀ¸·Î Á¢±ÙÇÒ ¼ö ÀÖ´Â
ÇÔ¼ö¸¦, C·Î Æ÷ÀåµÈ ¾î¼Àºí¸® Äڵ带 Á¶±Ý »ç¿ëÇÏ¿© Á¦°øÇϰí ÀÖ´Ù. ¹®¼´Â
<CODE>README</CODE>¿Í °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥À¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
<P>Á»´õ ÃÖ±Ù¿¡ clone()À» »ç¿ëÇÏ´Â POSIX ¾²·¹µå ¹öÀüÀÌ °³¹ßµÇ¾ú´Ù. ÀÌ
¶óÀ̺귯¸®´Â
<A HREF="http://pauillac.inria.fr/~xleroy/linuxthreads/">LinuxThreads</A>·Î, SMP
¸®´ª½º¿¡¼ »ç¶÷µéÀÌ °¡Àå ¼±È£ÇÏ´Â ¸ðµÎ °øÀ¯ÇÏ´Â ¶óÀ̺귯¸®ÀÌ´Ù. POSIX
¾²·¹µåµéµµ ¹®¼È°¡ ÀߵǾîÀÖ°í,
<A HREF="http://pauillac.inria.fr/~xleroy/linuxthreads/README">LinuxThreads README</A>¿Í
<A HREF="http://pauillac.inria.fr/~xleroy/linuxthreads/faq.html">LinuxThreads FAQ</A> ¿ª½Ã ¸Å¿ì ÀߵǾî ÀÖ´Ù. Áö±ÝÀÇ ÁÖ¿äÇÑ ¹®Á¦´Â
POSIX ¾²·¹µå¸¦
Á¦´ë·Î ÇÏ·Á¸é À̸¦ ÀÚ¼¼ÇÏ°Ô ¾Ë¾Æ¾ßÇÑ´Ù´Â °ÍÀ̰í, LinuxThreads´Â ¾ÆÁ÷Àº
°è¼ÓÇØ¼ ÀÛ¾÷ÁßÀ̶ó´Â °ÍÀÌ´Ù. ¶ÇÇÑ POSIX ¾²·¹µå Ç¥ÁØÀÌ Ç¥ÁØÈ °úÁ¤¿¡¼
°è¼Ó ¹ßÀüµÇ°í ÀÖ¾î, ÀÌ¹Ì ¹Ù²ï ¿¹Àü ¹öÀüÀÇ Ç¥ÁØ¿¡ ¸ÂÃç ÇÁ·Î±×·¥À»
ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÁÖÀǸ¦ ±â¿ï¿©¾ß ÇÑ´Ù´Â °Í ¿ª½Ã ¹®Á¦ÀÌ´Ù.
<P>
<H3>ÀϺθ¦ °øÀ¯Çϱâ(Shared Something)</H3>
<P>
<P>ÀϺθ¦ °øÀ¯ÇÏ´Â °ÍÀº Á¤¸»·Î "°øÀ¯ÇÒ Çʿ䰡 ÀÖ´Â °Í¸¸À» °øÀ¯ÇÏ´Â" °ÍÀÌ´Ù.
ÀÌ Á¢±Ù¹ýÀº °¢ ÇÁ·Î¼¼¼ÀÇ ¸Þ¸ð¸® ¸ÊÀÇ ¶È°°Àº À§Ä¡¿¡ °øÀ¯µ¥ÀÌÅͰ¡
ÇÒ´çµÇ°Ô ÇÏ´Â °Í¿¡ À¯ÀÇÇÑ´Ù¸é ÀϹÝÀûÀÎ MIMD(SPMD°¡ ¾Æ´Ï¶ó) ¿ëÀ¸·Î
µ¿ÀÛÇÏ°Ô µÈ´Ù. ´õ Áß¿äÇÑ Æ¯Â¡Àº, ÀϺθ¦ °øÀ¯ÇÏ´Â ¹æ½ÄÀº ¼º´ÉÀ» ¿¹ÃøÇϰí
Á¶À²Çϸç, Äڵ带 µð¹ö±ëÇÏ´Â °Í µîÀ» ½±°Ô ¸¸µé¾îÁشٴ °ÍÀÌ´Ù. À¯ÀÏÇÑ
¹®Á¦·Î´Â :
<P>
<UL>
<LI>»çÀü¿¡ ¹«¾ùÀÌ Á¤¸»·Î °øÀ¯ÇÒ Çʿ䰡 ÀÖ´ÂÁö ¾Æ´Â°Ô Èûµé´Ù.
</LI>
<LI>°øÀ¯ ¸Þ¸ð¸®¿¡ °´Ã¼¸¦ ½ÇÁ¦·Î ÇÒ´çÇÏ´Â °ÍÀº °ñÄ¡¾ÆÇ ÀÛ¾÷ÀÌ´Ù. ƯÈ÷
½ºÅÿ¡ ÇÒ´çµÇ´ø °´Ã¼ÀÎ °æ¿ì ´õ¿í ±×·¸´Ù. ¿¹¸¦ µé¾î, °øÀ¯ µ¥ÀÌÅ͸¦
º°µµÀÇ ¸Þ¸ð¸® ¿µ¿ª¿¡ ÇÒ´çÀ» ÇØ¾ßÇÒ Çʿ䰡 ÀÖ´Â °æ¿ì°¡ Àִµ¥, ÀÌ ¶§´Â
º°µµÀÇ ¸Þ¸ð¸® ÇÒ´ç ÇÔ¼ö¸¦ »ç¿ëÇϰí, °¢ ÇÁ·Î¼¼½º°¡ À̸¦ ÂüÁ¶ÇÒ ¶§ ¶Ç´Ù¸¥
Æ÷ÀÎÅ͸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.</LI>
</UL>
<P>ÇöÀç ¸®´ª½º ÇÁ·Î¼¼½º ±×·ìµéÀÌ µ¶ÀÚÀûÀÎ ¸Þ¸ð¸® °ø°£À» °¡Áö¸é¼,
»ó´ëÀûÀ¸·Î ÀÛÀº ¸Þ¸ð¸® ¿µ¿ª¸¸À» ÇÔ²² °øÀ¯ÇÏ°Ô Çϴµ¥¿¡´Â µÎ°³ÀÇ À¯»çÇÑ
¹æ½ÄÀ» »ç¿ëÇÑ´Ù. ¸®´ª½º ½Ã½ºÅÛÀ» ¼³Á¤ÇÒ ¶§ ¹Ùº¸°°ÀÌ "System V IPC"¸¦
»©¹ö¸®Áö ¾Ê¾Ò´Ù¸é, ¸®´ª½º´Â "System V °øÀ¯ ¸Þ¸ð¸®"¶ó´Â ´Ù¸¥ ½Ã½ºÅÛ
»çÀÌ¿¡¼µµ ȣȯ¼ºÀÌ ÀÖ´Â ¹æ½ÄÀ» Á¦°øÇÑ´Ù. ´Ù¸¥ ¹æ½ÄÀº <CODE>mmap()</CODE> ½Ã½ºÅÛ
ÄÝÀ» ÅëÇÏ¿© ¸Þ¸ð¸® ¸ÅÇÎ(memory mapping) ±â´ÉÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ´Â
±¸Çö¹æ½ÄÀÌ UNIX ½Ã½ºÅÛ¸¶´Ù Å©°Ô Â÷À̰¡ ³´Ù. À̵é È£Ãâ¿¡ ´ëÇØ¼´Â
¸Å´º¾ó ÆäÀÌÁöµé¿¡¼ ¹è¿ï ¼ö ÀÖ´Ù. ±×¸®°í 2.5Àå°ú 2.6Àå¿¡ ³ª¿À´Â °³°ýÀº
À̸¦ óÀ½ ½ÃÀÛÇÒ ¶§ µµ¿òÀÌ µÉ °ÍÀÌ´Ù.
<P>
<H3>¿øÀÚ¼º°ú ¼ø¼(Atomicity And Ordering)</H3>
<P>
<P>À§ÀÇ µÎ°¡Áö ¸ðµ¨ Áß ¾î¶² °ÍÀ» »ç¿ëÇÏ´õ¶óµµ °á°ú´Â ¸Å¿ì ºñ½ÁÇÏ´Ù.
¿©·¯ºÐÀº ÀÚ½ÅÀÌ ¸¸µç º´·Ä ÇÁ·Î±×·¥¿¡ µé¾î ÀÖ´Â ¸ðµç ÇÁ·Î¼¼½ºµéÀÌ
Á¢±ÙÇÏ¿© ÀÐ°í ¾µ¼ö ÀÖ´Â ¸Þ¸ð¸® Á¶°¢¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò°Ô µÈ´Ù. ÀÌ ¸»Àº
³»°¡ ¸¸µç º´·Ä ÇÁ·Î±×·¥ÀÌ °øÀ¯ ¸Þ¸ð¸® °´Ã¼µéÀ» ¸¶Ä¡ º¸ÅëÀÇ Áö¿ª ¸Þ¸ð¸®¿¡
ÀÖ´Â °Íó·³ Á¢±ÙÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÏÁö´Â ¾Ê´Â´Ù.
<P><B>¿øÀÚ¼º</B>À̶õ ÇÑ °´Ã¼¿¡ ´ëÇÑ ÀÛ¾÷ÀÌ Âɰ³ÁöÁö ¾Ê°í, Áß´ÜµÉ ¼ö ¾ø´Â
ÀÏ·ÃÀÇ °úÁ¤À¸·Î ÀÌ·ç¾îÁö´Â °ÍÀ» °¡¸®Å°´Â °³³äÀÌ´Ù. ºÒÇàÈ÷µµ, °øÀ¯
¸Þ¸ð¸®¿¡ ´ëÇÑ Á¢±ÙÀº °øÀ¯ ¸Þ¸ð¸®¿¡ ÀÖ´Â ÀÚ·á¿¡ ´ëÇÑ ¸ðµç ÀÛ¾÷ÀÌ
¿øÀÚÀûÀ¸·Î ÀÌ·ç¾îÁø´Ù´Â °ÍÀ» ³»Æ÷ÇÏÁø ¾Ê´Â´Ù. ¹Ì¸® Ưº°ÇÑ ÁÖÀǸ¦
±â¿ïÁöÁö ¾Ê´Â´Ù¸é, ¹ö½º(bus)¿¡¼ ´Ü Çѹø¸¸¿¡ 󸮰¡ ÀÌ·ç¾îÁö´Â °£´ÜÇÑ
Àбâ/¾²±â ¿¬»ê¸¸ÀÌ (Áï, Á¤·ÄÀÌ µÈ 8, 16, 32 ºñÆ® ¿¬»êÀÌÁö, Á¤·ÄÀÌ ¾ÈµÇ¾î
Àְųª 64 ºñÆ® ¿¬»êÀº ¾Æ´Ï´Ù) ¿øÀÚ¼ºÀ» °¡Áø´Ù. ´õ¿í
³ª»Û °ÍÀº,
GCC°°ÀÌ "¶È¶ÈÇÑ" ÄÄÆÄÀÏ·¯´Â ÃÖÀûȸ¦ ÅëÇØ ¸Þ¸ð¸® ÀÛ¾÷À» Á¦°ÅÇÏ¿©, ÇÑ
ÇÁ·Î¼¼¼°¡ ÇÑ ÀÏÀ» ´Ù¸¥ ÇÁ·Î¼¼¼¿¡¼ º¼ ¼ö ¾ø°Ô ¸¸µé¾î¹ö¸®±âµµ ÇÑ´Ù.
´ÙÇàÈ÷µµ, ÀÌµé ¹®Á¦µéÀº ¸ðµÎ °íÄ¥ ¼ö ÀÖ´Ù... Á¢±Ù È¿À²¼º(access
efficiency)°ú ij½Ã¶óÀÎ Å©±â(cache line size) »çÀÌÀÇ
°ü°è¸¸ °ÆÁ¤°Å¸®·Î ³²°ÜµÎ°í¼ ¸»ÀÌ´Ù.
<P>±×·¸Áö¸¸ ÀÌµé ³íÁ¡¿¡ ´ëÇØ¼ Åä·ÐÇϱâ Àü¿¡, À̵éÀº ¸ðµÎ °¢ ÇÁ·Î¼¼¼¿¡¼ÀÇ
¸Þ¸ð¸® ÂüÁ¶°¡ ÄÚµùÇÑ ¼ø¼´ë·Î ÀÌ·ç¾îÁö°í ÀÖ´Ù°í °¡Á¤Çϰí ÀÖ´Ù´Â °ÍÀ»
ÁöÀûÇÒ Çʿ䰡 ÀÖ´Ù. PentiumÀº ±×·¸°Ô Çϰí ÀÖÁö¸¸, ¾ÕÀ¸·Î ³ª¿Ã ÀÎÅÚÀÇ
ÇÁ·Î¼¼¼µéÀº ±×·¸Áö ¾ÊÀ» ¼öµµ ÀÖ´Ù´Â °Íµµ ±â¾ïÇϱ⠹ٶõ´Ù. µû¶ó¼,
¾ÕÀ¸·Î ³ª¿Ã ÇÁ·Î¼¼¼¿¡ ´ëºñÇÏ¿©, °øÀ¯ ¸Þ¸ð¸®¿¡ Á¢±ÙÇÏ´Â ÄÚµå ÁÖÀ§¸¦,
¸ðµç ¹Ì°áµÈ ¸Þ¸ð¸® Á¢±ÙÀ» ¿Ï·áÇÏ¿© ¸Þ¸ð¸® Á¢±ÙÀÌ Â÷·Ê´ë·Î ÀÌ·ç¾îÁöµµ·Ï
ÇÏ´Â ¸í·É¾î·Î µÑ·¯½Î¾ß ÇÒ Çʿ䰡 ÀÖ´Ù´Â °ÍÀ» ±íÀÌ »õ±â±æ ¹Ù¶õ´Ù.
<CODE>CPUID</CODE> ¸í·É¾î´Â ÀÌ·± ºÎ¼öÈ¿°ú(side-effect)¸¦ À§ÇØ ¿¹¾àµÇ¾î
ÀÖ´Â °ÍÀÌ´Ù.
<P>
<H3>Èֹ߼º(Volatility)</H3>
<P>
<P>
<P>GCC ¿ÉƼ¸¶ÀÌÀú(optimizer)°¡ °øÀ¯ ¸Þ¸ð¸® °´Ã¼ÀÇ °ªÀ» ·¹Áö½ºÅÍ¿¡
¹öÆÛ¸µÇÏ´Â °ÍÀ» ¸·À¸·Á¸é, °øÀ¯ ¸Þ¸ð¸®¿¡ ÀÖ´Â ¸ðµç °´Ã¼µéÀ»
<CODE>volatile</CODE> ¼Ó¼ºÀ» °¡Áöµµ·Ï ¼±¾ðÇØ¾ß ÇÑ´Ù. ÀÌ·¸°Ô Çϸé,
ÇѹøÀÇ Á¢±Ù¸¸À¸·Î ÀÌ·ç¾îÁö´Â ¸ðµç °øÀ¯ °´Ã¼ÀÇ Àбâ/¾²±â´Â ¿øÀÚÀûÀ¸·Î
ÀϾ°Ô µÈ´Ù. ¿¹¸¦ µé¾î, <EM>p</EM>°¡ Á¤¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀ̰í, À̰ÍÀÌ
°¡¸®Å°°í ÀÖ´Â Á¤¼ö°¡ °øÀ¯ ¸Þ¸ð¸®¿¡ ÀÖ´Ù°í ÇÏÀÚ. ANSI C¿¡¼´Â À̸¦
´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
<P>
<HR>
<PRE>
volatile int * volatile p;
</PRE>
<HR>
<P>ÀÌ Äڵ忡¼, ù¹øÂ° <CODE>volatile</CODE>´Â <CODE>p</CODE>°¡ °¡¸®Å°´Â
<CODE>int</CODE> °ªÀ» ¸»Çϸç, µÎ¹øÂ° <CODE>volatile</CODE>´Â Æ÷ÀÎÅÍ ±×
ÀÚü¸¦ ¸»ÇÑ´Ù. ¹°·Ð ÀÌ´Â ±ÍÂúÀº ÀÛ¾÷ÀÌÁö¸¸, GCC°¡ ¸Å¿ì °·ÂÇÑ ÃÖÀûȸ¦
¼öÇàÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ Ä¡·¯¾ß ÇÏ´Â °ÍÀÌ´Ù. Àû¾îµµ ÀÌ·ÐÀûÀ¸·Î´Â,
GCC¿¡ <CODE>-traditional</CODE> ¿É¼ÇÀ» ÁÖ´Â °ÍÀ¸·Îµµ, ¸î°¡Áö ÃÖÀûȸ¦
Èñ»ýÇÏ´Â ´ë½Å ¿Ã¹Ù¸¥ Äڵ带 ¸¸µé¾î³»´Âµ¥¿¡´Â ÃæºÐÇÏ´Ù. ¿Ö³ÄÇϸé ANSI
K&R C ÀÌÀü¿¡´Â ¸ðµç º¯¼ö´Â µû·Î <CODE>register</CODE>¶ó°í ÁöÁ¤ÇÏÁö ¾ÊÀº
ÀÌ»ó ¸ðµÎ volatileÀ̾ú±â ¶§¹®ÀÌ´Ù. ¿©ÀüÈ÷ GCC·Î <CODE>cc -O6</CODE>¿Í
°°ÀÌ ÄÄÆÄÀÏÀ» Çϰí, ÇÊ¿äÇÑ °Í¿¡¸¸ volatileÀ̶ó°í ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù.
<P>¸ðµç ÇÁ·Î¼¼¼ÀÇ ·¹Áö½ºÅ͸¦ ¼öÁ¤ÇÏ´Â °ÍÀ¸·Î Ç¥½ÃµÇ¾î ÀÖ´Â ¾î¼Àºí¸®¾î
¶ô(lock)À» »ç¿ëÇϸé, GCC°¡ ¸ðµç º¯¼öµéÀ» ´Ù ³»º¸³»¼(flush),
<CODE>volatile</CODE>À̶ó°í ¼±¾ðÇÔÀ¸·Î½á ¹ß»ýÇÏ´Â "ºñÈ¿À²ÀûÀÎ" ÄÚµåµéÀ»
ÇÇÇÒ ¼ö ÀÖ°Ô ÇÏ´Â È¿°ú°¡ ÀÖ´Ù´Â ¼Ò¹®ÀÌ ÀÖ¾î¿Ô´Ù. ÀÌ·± ¹æ¹ýÀº GCC
2.7.0À» »ç¿ëÇÏ´Â °æ¿ì, Á¤ÀûÀ¸·Î ÇÒ´çµÇ´Â Àü¿ªº¯¼ö¿¡ ´ëÇØ¼´Â Á¦´ë·Î
µ¿ÀÛÇÏ´Â °Íó·³ º¸ÀδÙ... ±×·¸Áö¸¸, ÀÌ·± ÇൿÀº ANSI C Ç¥ÁØ¿¡¼´Â
ÇÊ¿äÇÏÁö ¾Ê´Ù. ´õ ³ª»Û °ÍÀº Àбâ Á¢±Ù¸¸À» ÇÏ´Â ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀº º¯¼ö
°ªÀ» ¿µ¿øÈ÷ ·¹Áö½ºÅÍ¿¡ ¹öÆÛ¸µÀ» ÇÒ ¼ö ÀÖ¾î¼, °øÀ¯ ¸Þ¸ð¸®ÀÇ °ªÀÌ ½ÇÁ¦·Î
º¯ÇÏ´Â °ÍÀ» Àý´ë·Î ¾Ë¾ÆÂ÷¸®Áö ¸øÇÒ ¼öµµ ÀÖ´Ù. ¿ä¾àÇϸé, ÇÏ°í ½ÍÀº´ë·Î
ÇØµµ ÁÁÁö¸¸, <CODE>volatile</CODE>¶ó°í ÁöÁ¤ÇÑ º¯¼ö¸¸ÀÌ Á¦´ë·Î µ¿ÀÛÇÑ´Ù´Â
°ÍÀ» <EM>º¸ÀåÇÒ ¼ö ÀÖ´Ù</EM>.
<P>ÀÏ¹Ý º¯¼ö¿¡µµ <CODE>volatile</CODE> ¼Ó¼ºÀ» ¾Ï½ÃÇÏ´Â Çüº¯È¯(type cast)À»
»ç¿ëÇÏ¿© volatile Á¢±ÙÀ» ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, º¸ÅëÀÇ
<CODE>int i;</CODE>´Â <CODE>*((volatile int *) &i);</CODE>°°ÀÌ
¼±¾ðÇÏ¿© volatile·Î
Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô Çϸé Èֹ߼º(volatility)ÀÌ ÇÊ¿äÇÑ °æ¿ì¿¡¸¸, ÀÌ·±
¿À¹öÇìµå¸¦ »ç¿ëÇϵµ·Ï ÇÒ ¼ö ÀÖ´Ù.
<P>
<H3>¶ô(Locks)</H3>
<P>
<P><CODE>++i;</CODE>´Â Ç×»ó °øÀ¯ ¸Þ¸ð¸®¿¡ ÀÖ´Â º¯¼ö <CODE>i</CODE>¿¡ 1À»
´õÇÑ´Ù°í »ý°¢ÇؿԴٸé, ´ÙÀ½ À̾߱â´Â Á¶±ÝÀº ³î¶ø°í ´çȲ½º·¯¿ïÁöµµ
¸ð¸£°Ú´Ù. ÇϳªÀÇ ¸í·ÉÀ¸·Î ÄÚµùÀ» Çß´Ù°í ÇÏ´õ¶óµµ, °ªÀ» ÀÐ°í °á°ú¸¦ ¾²´Â
°ÍÀº º°µµÀÇ ¸Þ¸ð¸® ó¸®(transaction)À» ÅëÇØ¼ ÀÌ·ç¾îÁö¸ç, ÀÌ µÎ ó¸®
»çÀÌ¿¡ ´Ù¸¥ ÇÁ·Î¼¼¼°¡ <CODE>i</CODE>¿¡ Á¢±ÙÇÒ ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î,
µÎ°³ÀÇ ÇÁ·Î¼¼¼°¡ ¸ðµÎ <CODE>++i;</CODE> ¸í·ÉÀ» ¼öÇàÇÏ¿´´Âµ¥, 2°¡
Áõ°¡ÇÏ´Â°Ô ¾Æ´Ï¶ó 1ÀÌ Áõ°¡ÇÒ ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀÎÅÚ PentiumÀÇ
"±¸Á¶(Architecture)¿Í ÇÁ·Î±×·¡¹Ö ¸Å´º¾ó"¿¡ µû¸£¸é, <CODE>LOCK</CODE>
Á¢µÎ¾î´Â ´ÙÀ½¿¡ ³ª¿À´Â ¸í·É¾î°¡ ±×°ÍÀÌ Á¢±ÙÇÏ´Â ¸Þ¸ð¸® À§Ä¡¿¡ ´ëÇØ
¿øÀÚÀûÀ¸·Î ÀÌ·ç¾îÁö´Â °ÍÀ» º¸ÀåÇϱâ À§ÇØ »ç¿ëµÈ´Ù.
<P>
<HR>
<PRE>
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
</PRE>
<HR>
<P>±×·¸Áö¸¸, ÀÌµé ¿¬»êÀ» ¸ðµÎ »ç¿ëÇÏ´Â °ÍÀº ±×´ÙÁö ÁÁÀº »ý°¢Àº ¾Æ´Ñ °Í
°°´Ù. ¿¹¸¦ µé¾î, <CODE>XADD</CODE>´Â 386¿¡¼´Â Á¸ÀçÇÏÁöµµ ¾Ê°í, µû¶ó¼
À̸¦ »ç¿ëÇÏ´Â °ÍÀº ȣȯ¼ºÀÇ ¹®Á¦¸¦ ¹ß»ý½Ãų ¼ö ÀÖ´Ù.
<P><CODE>XCHG</CODE> ¸í·É¾î´Â <CODE>LOCK</CODE> Á¢µÎ¾î°¡ ¾ø´õ¶óµµ Ç×»ó ¶ôÀ»
»ç¿ëÇÑ´Ù. µû¶ó¼ ÀÌ ¸í·É¾î´Â ¼¼¸¶Æ÷¾î(semaphore)³ª °øÀ¯ Å¥(shared
queue)°°Àº °í¼öÁØÀÇ ¿øÀÚÀûÀÎ ±¸¼ºÃ¼¸¦ ¸¸µå´Â °æ¿ì¿¡ ÁÁÀº
¿øÀÚÀûÀÎ ¿¬»êÀÌ´Ù. ´ç¿¬È÷ C ÄÚµå·Î GCC°¡ ÀÌ ¸í·É¾î¸¦ ¸¸µé¾î³»µµ·Ï ÇÒ
¼ö´Â ¾ø´Ù. ´ë½Å ÀζóÀÎ(in-line) ¾î¼Àºí¸® Äڵ带 Á¶±Ý »ç¿ëÇØ¾ß ÇÑ´Ù.
¿öµå(word) Å©±âÀÇ volatile °´Ã¼ÀÎ <EM>obj</EM>¿Í ¿öµå Å©±âÀÇ ·¹Áö½ºÅÍ
°ªÀÎ <EM>reg</EM>°¡ ÀÖ´Ù¸é, GCC ÀζóÀÎ ¾î¼Àºí¸® ÄÚµå´Â ´ÙÀ½°ú °°´Ù :
<P>
<HR>
<PRE>
__asm__ __volatile__ ("xchgl %1,%0"
:"=r" (reg), "=m" (obj)
:"r" (reg), "m" (obj));
</PRE>
<HR>
<P>¶ô(lock)À» Çϴµ¥ ºñÆ®(bit) ¿¬»êÀ» »ç¿ëÇÏ´Â GCC ÀζóÀÎ ¾î¼Àºí¸® ÄÚµåÀÇ
¿¹Á¦°¡
<A HREF="ftp://caliban.physics.utoronto.ca/pub/linux/">bb_threads library</A>¶óÀ̺귯¸®ÀÇ ¼Ò½º Äڵ忡
ÀÖ´Ù.
<P>¸Þ¸ð¸® ó¸®(transaction)¸¦ ¿øÀÚÀûÀ¸·Î ¸¸µå´Â °Í¿¡µµ ÀÌ¿¡ µû¸£´Â ºñ¿ëÀÌ
ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇÒ Çʿ䰡 ÀÖ´Ù. º¸ÅëÀÇ ÂüÁ¶´Â Áö¿ª ij½Ã¸¦ »ç¿ëÇÒ ¼ö
ÀÖ´Ù´Â »ç½Ç¿¡ ºñÃ߾¸é, ¶ô(lock)À» ÇÏ´Â ¿¬»êÀº ¾à°£ÀÇ ¿À¹öÇìµå¸¦
¼ö¹ÝÇϰí, ´Ù¸¥ ÇÁ·Î¼¼¼ÀÇ ¸Þ¸ð¸® Ȱµ¿À» Áö¿¬½Ãų ¼ö ÀÖ´Ù. ¶ô(lock)
¿¬»êÀ» »ç¿ëÇÏ´Â °æ¿ì °¡Àå ÁÁÀº ¼º´ÉÀ» ³»°í ½Í´Ù¸é °¡´ÉÇÑ À̸¦
Àû°Ô »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ´õ ³ª¾Æ°¡ À̵é IA32 ¿øÀÚÀûÀÎ ¸í·É¾îµéÀº ´Ù¸¥
½Ã½ºÅÛ°úÀÇ È£È¯¼ºÀÌ ¾ø´Ù.
<P>¾î¶² ¼ø°£ÀÌµç ¸¹¾Æµµ ÇϳªÀÇ ÇÁ·Î¼¼¼¸¸ÀÌ ÁÖ¾îÁø °øÀ¯ °´Ã¼¸¦ °»½ÅÇÏ´Â
°ÍÀ» º¸ÀåÇÏ´Â ¿©·¯°¡Áö µ¿±âÈ(synchronization) - <B>»óÈ£ ¹èÁ¦(mutual
exclusion)¸¦ Æ÷ÇÔÇÏ¿©</B> -
¸¦ ±¸ÇöÇϴµ¥ º¸ÅëÀÇ ¸í·É¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï
ÇÏ´Â ¿©·¯°¡Áö ´Ù¸¥ Á¢±Ù¹æ¹ýÀÌ ÀÖ´Ù. ´ëºÎºÐÀÇ OS ±³Àç¿¡¼´Â ÀÌµé ±â¹ýÀ»
Àû¾îµµ Çϳª ÀÌ»ó¾¿Àº ´Ù·ç°í ÀÖ´Ù. Abraham Silberschatz¿Í Peter B
GalvinÀÌ ÁöÀº <EM>¿î¿µÃ¼Á¦ °³³ä(Operating System Concepts)</EM> 4ÆÇ(ISBN
0-201-50480-4)¿¡¼ À̸¦ ¾ÆÁÖ Àß ´Ù·ç°í ÀÖ´Ù.
<P>
<H3>ij½Ã¶óÀÎ Å©±â(Cache Line Size)</H3>
<P>
<P>¿øÀÚ¼º¿¡ °ü·ÃµÈ ±âº»ÀûÀÎ °ÍÀ¸·Î¼ SMP ¼º´É¿¡ Å« ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ´Â
°ÍÀ¸·Î ij½Ã¶óÀÎ Å©±â°¡ ÀÖ´Ù. MPS Ç¥ÁØ¿¡´Â ¾î¶² ij½Ã°¡ »ç¿ëµÇµçÁö °£¿¡
ÂüÁ¶´Â ÀϰüÀûÀ̾î¾ß ÇÑ´Ù°í Çϰí ÀÖÁö¸¸, »ç½ÇÀº ÇϳªÀÇ ÇÁ·Î¼¼¼°¡
¸Þ¸ð¸®ÀÇ Æ¯Á¤ ¶óÀο¡ ±â·ÏÀ» ÇÒ ¶§, ÀÌÀü ¶óÀÎÀÇ Ä³½ÃµÈ º¹»çº»ÀÌ ¸ðµÎ
¹«È¿È(invalidate)µÇ°Å³ª °»½Å(update)µÇ¾î¾ß ÇÑ´Ù. ÀÌ ¸»Àº µÎ °³³ª ±×
ÀÌ»óÀÇ ÇÁ·Î¼¼¼°¡ µ¿½Ã¿¡ °°Àº ¶óÀÎÀÇ ´Ù¸¥ ºÎºÐ¿¡ µ¥ÀÌÅ͸¦ ±â·ÏÇÏ·Á°í
Çϸé, »ó´ç·®ÀÇ Ä³½Ã¿Í ¹ö½º ÅëÇà(traffic)ÀÌ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¸ç, ½ÇÁúÀûÀ¸·Î
ij½Ã¿¡¼ ij½Ã·Î ¶óÀÎÀ» Àü´ÞÇÏ°Ô µÈ´Ù. ÀÌ ¹®Á¦´Â <B>À߸øµÈ °øÀ¯(false
sharing)</B>¶ó°í ÇÑ´Ù. ±× ÇØ°áÃ¥Àº <EM>º´·Ä·Î Á¢±ÙµÇ´Â µ¥ÀÌÅͰ¡
µÇµµ·ÏÀÌ¸é °¢ ÇÁ·Î¼¼¼¸¶´Ù ´Ù¸¥ ij½Ã ¶óÀο¡¼ ¿Ã ¼ö ÀÖµµ·Ï µ¥ÀÌÅ͸¦
Á¶Á÷ÈÇϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù.</EM>
<P>À߸øµÈ °øÀ¯´Â L2 ij½Ã¸¦ »ç¿ëÇÏ´Â ½Ã½ºÅÛ¿¡¼´Â ¹®Á¦°¡ ¾ÈµÉ°Å¶ó°í »ý°¢ÇÒ
¼öµµ ÀÖ°ÚÁö¸¸, ¿©ÀüÈ÷ º°µµÀÇ L1 ij½Ã°¡ ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇÏÀÚ. ij½ÃÀÇ
Á¶Á÷°ú ±¸º°µÈ º°µµÀÇ ·¹º§ÀÇ °¹¼ö´Â ¸ðµÎ º¯ÇÒ ¼ö ÀÖÁö¸¸, Pentium L1
ij½Ã¶óÀÎ Å©±â´Â 32 ¹ÙÀÌÆ®À̰í, ÀüÇüÀûÀÎ ¿ÜÀåÇü ij½Ã¶óÀÎ Å©±â´Â 256
¹ÙÀÌÆ® °¡·®ÀÌ´Ù. µÎ Ç׸ñÀÇ ÁÖ¼Ò°¡ (¹°¸®Àû ÁÖ¼ÒÀ̵ç, °¡»ó ÁÖ¼ÒÀ̵ç)
<EM>a</EM>¿Í <EM>b</EM>À̰í, °¡Àå Å« ÇÁ·Î¼¼¼´ç ij½Ã¶óÀÎ Å©±â°¡
<EM>c</EM>À̰í, À̵éÀº ¸ðµÎ 2ÀÇ ¸î Á¦°ö½ÂÀ̶ó°í ÇÏÀÚ. ¸Å¿ì ¾ö¹ÐÇϰÔ
Çϸé, <CODE>((int) <EM>a</EM>) & ~(<EM>c</EM> - 1)</CODE>¿Í <CODE>((int)
<EM>b</EM>) & ~(<EM>c</EM> - 1)</CODE>ÀÌ °°À» ¶§, µÎ°³ÀÇ ÂüÁ¶°¡ ¶È°°Àº
ij½Ã¶óÀο¡ Á¸ÀçÇÏ°Ô µÈ´Ù. ´õ ±ÔÄ¢À» °£´ÜÈÇÏ¸é º´·Ä·Î ÂüÁ¶µÇ´Â °øÀ¯
°´Ã¼°¡ Àû¾îµµ <EM>c</EM> ¹ÙÀÌÆ®°¡ ¶³¾îÁ® ÀÖ´Ù¸é, À̵éÀº ´Ù¸¥ ij½Ã
¶óÀÎÀ¸·Î ¸ÅÇÎÀÌ µÈ´Ù´Â °ÍÀÌ´Ù.
<P>
<H3>¸®´ª½º ½ºÄÉÁÙ·¯ ³íÁ¡(Linux Scheduler Issues)</H3>
<P>
<P>º´·Ä󸮿¡¼ °øÀ¯ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â ÀüÀûÀÎ ÀÌÀ¯´Â OSÀÇ ¿À¹öÇìµå¸¦
ÇÇÇÏÀÚ´Â °ÍÀÌÁö¸¸, OS ¿À¹öÇìµå´Â Åë½Å ±× ÀÚü ¿ÜÀÇ °Í¿¡¼ ¹ß»ýÇϱ⵵
ÇÑ´Ù. ¿ì¸®´Â ÀÌ¹Ì ¸¸µé¾î¾ß ÇÒ ÇÁ·Î¼¼½ºÀÇ °¹¼ö°¡ ±â°è¿¡ ÀÖ´Â ÇÁ·Î¼¼¼ÀÇ
°¹¼öº¸´Ù °°°Å³ª À۾ƾßÇÑ´Ù°í ¸»Çß¾ú´Ù. ±×·¯³ª Á¤È®È÷ ¾ó¸¶³ª ¸¹Àº
ÇÁ·Î¼¼½º¸¦ ¸¸µé¾î¾ß ÇÒ Áö ¾î¶»°Ô °áÁ¤ÇÒ ¼ö ÀÖÀ»±î?
<P>ÃÖ°íÀÇ ¼º´ÉÀ» ³»·Á¸é, <EM>¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ º´·Ä ÇÁ·Î±×·¥¿¡ ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ °¹¼ö´Â, ´Ù¸¥ ÇÁ·Î¼¼¼¿¡¼ °è¼ÓÇØ¼ ½ÇÇàµÉ ¼ö ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ °¹¼öÇϰí
°°¾Æ¾ß ÇÑ´Ù</EM>. ¿¹¸¦ µé¾î, ³×°³ÀÇ ÇÁ·Î¼¼¼°¡ ÀÖ´Â SMP ½Ã½ºÅÛ¿¡¼
ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ´Ù¸¥ ¸ñÀûÀ¸·Î (¿¹¸¦ µé¾î WWW ¼¹ö) µ¿ÀÛÇϰí ÀÖ´Ù¸é,
¿©·¯ºÐÀÌ ¸¸µç º´·Ä ÇÁ·Î±×·¥Àº ¼¼°³ÀÇ ÇÁ·Î¼¼½º¸¸À» »ç¿ëÇØ¾ß ÇÑ´Ù.
½Ã½ºÅÛ¿¡ ¸î °³ÀÇ ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ ÀÖ´ÂÁö´Â <CODE>uptime</CODE> ¸í·É¿¡¼
µ¹·ÁÁÖ´Â "Æò±Õ ºÎÇÏ(load average)"¸¦ ÂüÁ¶ÇÏ¿© ´ë°Àº ¾Ë ¼ö ÀÖ´Ù.
<P>´Ù¸¥ ¹æ¹ýÀ¸·Î <CODE>renice</CODE> ¸í·ÉÀ̳ª <CODE>nice()</CODE> ½Ã½ºÅÛ ÄÝ
°°Àº °ÍÀ» ÀÌ¿ëÇÏ¿© º´·Ä ÇÁ·Î±×·¥¿¡ ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ ¿ì¼±¼øÀ§(priority)¸¦
³ôÀÏ ¼öµµ ÀÖ´Ù. ¿ì¼±¼øÀ§¸¦ ³ôÀÌ·Á¸é ±ÇÇÑÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ »ý°¢Àº ´Ù¸¥
ÇÁ·Î¼¼½º¸¦ ÇÁ·Î¼¼¼¿¡¼ ¦i¾Æ³»¼ ÀÚ½ÅÀÌ ¸¸µç ÇÁ·Î±×·¥ÀÌ ¸ðµç
ÇÁ·Î¼¼¼¿¡¼ °è¼ÓÇØ¼ ½ÇÇàµÉ ¼ö ÀÖ°Ô ÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¹æ¹ýÀº
<A HREF="http://luz.cs.nmt.edu/~rtlinux/">http://luz.cs.nmt.edu/~rtlinux/</A> ¿¡
ÀÖ´Â ½Ç½Ã°£(real-time) ½ºÄÉÁÙ·¯¸¦ Á¦°øÇÏ´Â SMP ¸®´ª½ºÀÇ
ÇÁ·ÎÅäŸÀÔ(prototype) ¹öÀüÀ» »ç¿ëÇϸé Á»´õ È®½ÇÇÏ°Ô ´Þ¼ºÇÒ ¼ö ÀÖ´Ù
<P>¿©·¯ºÐÀÌ SMP ½Ã½ºÅÛÀ» º´·Ä ±â°è·Î »ç¿ëÇÏ´Â À¯ÀÏÇÑ »ç¿ëÀÚ°¡ ¾Æ´Ï¶ó¸é,
°è¼Ó ½ÇÇàÇÏ·Á°í ÇÏ´Â µÎ °³ ÀÌ»óÀÇ º´·Ä ÇÁ·Î±×·¥ »çÀÌ¿¡ Ãæµ¹ÀÌ ºú¾îÁú
¼öµµ ÀÖ´Ù. ÀÌÀÇ Ç¥ÁØ ÇØ°á¹æ¹ýÀº <B>Á¶´ÜÀ§(gang) ½ºÄÉÁÙ¸µ</B> - Áï
µ¿½Ã¿¡ ÇϳªÀÇ º´·Ä ÇÁ·Î±×·¥¿¡ ¼ÓÇÏ´Â ÇÁ·Î¼¼½ºµé¸¸ÀÌ ½ÇÇàµÉ ¼ö ÀÖµµ·Ï
½ºÄÉÁÙ¸µ ¿ì¼±¼øÀ§¸¦ ´Ù·ç´Â °ÍÀÌ´Ù. ±×·¸Áö¸¸ Çϳª ÀÌ»óÀ» º´·Äó¸®Çϸé
°á°ú°¡ ´Ê°Ô µ¹¾Æ¿À°í, ½ºÄÉÁÙ·¯ÀÇ È°µ¿ÀÌ ¿À¹öÇìµå¸¦ ´õÇÏ°Ô µÈ´Ù´Â °ÍÀ»
»ó±âÇϱ⠹ٶõ´Ù. µû¶ó¼, ¿¹¸¦ µé¾î ³× °³ÀÇ ÇÁ·Î¼¼¼¸¦ °¡Áø ½Ã½ºÅÛ¿¡ µÎ
°³ÀÇ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù¸é, µÎ °³ÀÇ ÇÁ·Î¼¼½º¸¦ °¢°¢ ½ÇÇàÇÏ´Â °ÍÀÌ, µÎ
°³ÀÇ ÇÁ·Î±×·¥ÀÌ ³×°³ÀÇ ÇÁ·Î¼¼½º¸¦ °¢°¢ »ç¿ëÇÏ¸é¼ Á¶´ÜÀ§ ½ºÄÉÁÙ¸µÀ»
ÇÏ´Â °Íº¸´Ù ´õ ³´´Ù.
<P>ÀÌ·± ¹®Á¦¸¦ ´õ ²¿ÀÌ°Ô ÇÏ´Â °ÍÀÌ Çϳª ´õ ÀÖ´Ù. ¿©·¯ºÐÀÌ ³·¿¡´Â Á¾ÀÏ
°úÁßÇÏ°Ô »ç¿ëµÇ°í ÀÖÁö¸¸, ¹ã¿¡´Â ¿ÏÀüÈ÷ º´·Ä󸮿ëÀ¸·Î¸¸ »ç¿ë°¡´ÉÇÑ
±â°è¿¡¼ ÇÁ·Î±×·¥À» °³¹ßÇϰí ÀÖ´Ù°í ÇÏÀÚ. ¿©·¯ºÐÀº ³·¿¡ Å×½ºÆ®¸¦
Çϴ°ÍÀÌ ´À¸®´Ù´Â °ÍÀ» ¾Ë´õ¶óµµ ÇÁ·Î±×·¥À» ÀÛ¼ºÇϰí ÀÛ¼ºÇÑ Äڵ带
Å×½ºÆ®ÇÏ°í ¼öÁ¤Çϱâ À§ÇØ ¸ðµç °¹¼öÀÇ ÇÁ·Î¼¼½º¸¦ ¸¸µé¾î »ç¿ëÇÒ °ÍÀÌ´Ù.
±×·±µ¥, ÇÁ·Î¼¼½ºµéÀÌ ÇöÀç ½ÇÇàµÇ°í ÀÖÁö ¾Ê´Â (´Ù¸¥ ÇÁ·Î¼¼¼¿¡¼) ´Ù¸¥
ÇÁ·Î¼¼½º¿Í °øÀ¯ ¸Þ¸ð¸®·Î °ªÀ» Àü´ÞÇϱ⸸À» ¾Æ¹«°Íµµ ÇÏÁö ¾Ê°í ±â´Ù¸®°í
ÀÖ´Ù¸é, À̵é ÀÛ¾÷Àº ¸Å¿ì ´À·ÁÁú °ÍÀÌ´Ù. ÀÌ¿Í ¶È°°Àº ¹®Á¦´Â Äڵ带
ÇϳªÀÇ ÇÁ·Î¼¼¼¹Û¿¡ ¾ø´Â ½Ã½ºÅÛ¿¡¼ °³¹ßÇϰí Å×½ºÆ®ÇÏ´Â °æ¿ì¿¡µµ
¹ß»ýÇÑ´Ù.
<P>ÇØ°áÃ¥Àº Äڵ忡¼ ´Ù¸¥ ÇÁ·Î¼¼¼¿¡¼ ÀϾ´Â µ¿ÀÛÀ» ÇÏ¿°¾øÀÌ ±â´Ù·Á¾ß
ÇÏ´Â ºÎºÐ¿¡, ¸®´ª½º°¡ ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Â ±âȸ¸¦ ÁÖµµ·Ï ÇÔ¼ö
È£ÃâÀ» Áý¾î³Ö´Â °ÍÀÌ´Ù. ³ª´Â C ¸ÅÅ©·Î¸¦ »ç¿ëÇϴµ¥ À̸¦ ÇÏ´Â ¸ÅÅ©·Î¸¦
<CODE>IDLE_ME</CODE>¶ó°í ºÎ¸£°í ÀÖ´Ù. ÇÁ·Î±×·¥À» Å×½ºÆ®Çϱâ À§Çؼ
ÄÄÆÄÀÏÀ» ÇÒ¶§´Â <CODE>cc -DIDLE_ME=usleep(1)</CODE> °°ÀÌ Çϰí,
"Á¦Ç°"À¸·Î ½ÇÇàÇÒ ¶§¿¡´Â <CODE>cc -DIDLE_ME={}</CODE>°°ÀÌ ÄÄÆÄÀÏÀ» ÇÑ´Ù.
<CODE>usleep(1)</CODE>Àº 1/1000 Ãʵ¿¾È ÇÁ·Î¼¼½º°¡ Àáµé°Ô ÇÏ¿©, ¸®´ª½º
½ºÄÉÁÙ·¯°¡ ±× ÇÁ·Î¼¼¼¿¡¼ ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ ½ÇÇàÇϵµ·Ï ¼±ÅÃÇÒ ¼ö ÀÖ°Ô
ÇÑ´Ù. ÇÁ·Î¼¼½ºÀÇ °¹¼ö°¡ »ç¿ë°¡´ÉÇÑ ÇÁ·Î¼¼¼ÀÇ °¹¼öº¸´Ù µÎ¹èÀÌ»ó ¸¹´Ù¸é,
<CODE>usleep(1)</CODE>¸¦ »ç¿ëÇÏ´Â Äڵ尡 À̸¦ »ç¿ëÇÏÁö ¾Ê´Â Äڵ庸´Ù
¿¹èÀÌ»ó ºü¸£°Ô ½ÇÇàµÇ´Â °ÍÀº ±×¸® ÀÌ»óÇÑ ÀÏÀÌ ¾Æ´Ï´Ù.
<P>
<H2><A NAME="ss2.3">2.3 bb_threads</A>
</H2>
<P>
<P>bb_threads("Bare Bones(»À¸¸³²Àº)" threads) ¶óÀ̺귯¸®(
<A HREF="ftp://caliban.physics.utoronto.ca/pub/linux/">ftp://caliban.physics.utoronto.ca/pub/linux/</A>)´Â
¸®´ª½º <CODE>clone()</CODE> È£ÃâÀÇ »ç¿ë¹ýÀ» º¸¿©ÁÖ´Â ¾ÆÁÖ °£´ÜÇÑ
¶óÀ̺귯¸®ÀÌ´Ù. tar ÆÄÀÏÀ» gzipÀ¸·Î ¾ÐÃàÇÏ¸é °Ü¿ì 7K
¹ÙÀÌÆ®¹Û¿¡ µÇÁö ¾Ê´Â´Ù! ÀÌ ¶óÀ̺귯¸®´Â 2.4Àå¿¡¼ ¼³¸íÇÏ´Â LinuxThreads
¶óÀ̺귯¸® ¶§¹®¿¡ ÀÌÁ¦ Çѹ°°£ °ÍÀÌ µÇ¾úÁö¸¸, ¿©ÀüÈ÷ ¾µ¸¸Çϰí, ÀÛ°í
°£´ÜÇÏ¿© ¸®´ª½º¿¡¼ Áö¿øÇÏ´Â ¾²·¹µåÀÇ »ç¿ë¹ýÀ» ¼Ò°³Çϴµ¥¿¡µµ ¾Ë¸Â´Ù.
ºÐ¸íÈ÷ LinuxThreads¿ë ¼Ò½ºÄڵ带 º¸´Â °Íº¸´Ù ÀÌ Äڵ带 º¸´Â °ÍÀÌ ÈξÀ ´ú
±âÁ×À» °ÍÀÌ´Ù. ¿ä¾àÇϸé bb_threads ¶óÀ̺귯¸®´Â ½ÃÀÛÇϱâ ÁÁÀº
ÁöÁ¡ÀÌÁö¸¸, Å« ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé¶§¿¡´Â Àû´çÇÏÁø ¾Ê´Ù.
<P>bb_threads ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÇ ±âº»ÀûÀÎ ±¸Á¶´Â
´ÙÀ½°ú °°´Ù :
<P>
<OL>
<LI>ÇϳªÀÇ ÇÁ·Î¼¼½º·Î ÇÁ·Î±×·¥À» ½ÃÀÛÇÑ´Ù.
</LI>
<LI>ÀÌÁ¦ °¢°¢ÀÇ ¾²·¹µå°¡ ÇÊ¿ä·Î ÇÏ´Â ÃÖ´ë ½ºÅÃÀÇ Å©±â¸¦ °è»êÇØ¾ß ÇÑ´Ù.
À̸¦ Å©°Ô Àâ´õ¶óµµ ±×´ÙÁö ÇØ°¡ µÇÁö ¾Ê´Â´Ù (À̰ÍÀº °¡»ó ¸Þ¸ð¸®°¡
Á¸ÀçÇÏ´Â ÀÌÀ¯ÁßÀÇ ÇϳªÀÌ´Ù). ±×·¯³ª ¸ðµç ½ºÅÃÀº ÇϳªÀÇ
°¡»ó
ÁÖ¼Ò °ø°£¿¡¼ ³ª¿À±â ¶§¹®¿¡, ³Ê¹« Å©°Ô Àâ´Â °Íµµ ÁÁÀº»ý°¢ÀÌ ¾Æ´Ï´Ù.
¿¹Á¦¿¡¼´Â 64K¸¦ »ç¿ëÇϰí ÀÖ´Ù. ÀÌ Å©±â¸¦ <EM>b</EM>
¹ÙÀÌÆ®·Î ¼³Á¤ÇÏ·Á¸é
<CODE>bb_threads_stacksize(<EM>b</EM>)</CODE>¸¦
È£ÃâÇÑ´Ù.
</LI>
<LI>´ÙÀ½ ´Ü°è´Â ÇÊ¿äÇÑ ¶ô(lock)µéÀ» ¸ðµÎ ÃʱâÈÇÏ´Â °ÍÀÌ´Ù. ÀÌ
¶óÀ̺귯¸®¿¡¼ ±¸ÇöµÈ ¶ô ¸ÞÄ¿´ÏÁòÀº ¶ô¿¡ 0ºÎÅÍ
<CODE>MAX_MUTEXES</CODE>±îÁö ¼ýÀÚ¸¦ ºÙÀÌ´Â °ÍÀÌ´Ù. ¶ô
<EM>i</EM>¸¦ ÃʱâÈÇÏ·Á¸é
<CODE>bb_threads_mutexcreate(<EM>i</EM>)</CODE>¸¦ È£ÃâÇÑ´Ù.
</LI>
<LI>¶óÀ̺귯¸® ·çƾÀ» È£ÃâÇÏ¿© »õ·Î¿î ¾²·¹µå¸¦ ¸¸µç´Ù. ¿©±â¿¡ ÀÎÀÚ·Î
»õ·Î¿î ¾²·¹µå°¡ ½ÇÇàÇÒ ÇÔ¼ö¿Í, ¿©±â¿¡ Àü´ÞÇÒ ÀÎÀÚµéÀ» ³Ñ°ÜÁØ´Ù. ÀÎÀÚ·Î
<EM>arg</EM> Çϳª¸¸ ¹Þ°í, ¾Æ¹«°Íµµ µ¹·ÁÁÖÁö ¾Ê´Â ÇÔ¼ö
<EM>f</EM>¸¦ ½ÇÇàÇÏ´Â ¾²·¹µå¸¦ »õ·Î ¸¸µç´Ù¸é, ÇÔ¼ö
<EM>f</EM>>¸¦ <CODE>void <EM>f</EM>(void *arg, size_t dummy)</CODE>
ó·³ ¼±¾ðÀ» Çϰí
<CODE>bb_threads_newthread(<EM>f</EM>, &arg)</CODE>ÇÔ¼ö¸¦
ºÎ¸£¸é µÈ´Ù. Çϳª ÀÌ»óÀÇ ÀÎÀÚ¸¦ Àü´ÞÇØ¾ßÇÏ´Â °æ¿ì ÀÎÀÚ °ªµéÀ» °¡Áö°í
ÀÖ´Â ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ³Ñ°ÜÁÖ¸é µÈ´Ù.
</LI>
<LI>º´·Ä Äڵ带 ½ÇÇàÇÑ´Ù. ¶ôÀ» »ç¿ëÇÏ´Â
<CODE>bb_threads_lock(<EM>n</EM>)</CODE>¿Í
<CODE>bb_threads_unlock(<EM>n</EM>)</CODE> ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§
ÁÖÀǸ¦ ±â¿ïÀδ٠(¿©±â¼ <EM>n</EM>Àº »ç¿ëÇÒ ¶ôÀ» ÁöÁ¤ÇÑ´Ù). ÀÌ
¶óÀ̺귯¸®¿¡ ÀÖ´Â ¶ôÀ» °É°í ¶ôÀ» ÇØÁ¦ÇÏ´Â ¿¬»êÀº ¿øÀÚÀûÀÎ
¹ö½º-¶ô(bus-lock) ¸í·É¾î¸¦ »ç¿ëÇÏ´Â ¸Å¿ì ±âº»ÀûÀÎ ½ºÇɶô(spin lock)ÀÌ´Ù.
±×·¡¼ °úµµÇÑ ¸Þ¸ð¸® Á¢±Ù Ãæµ¹À» ÀÏÀ¸Å³ ¼ö ÀÖÀ¸¸ç, ¾î¶² Á¢±Ùµµ
°øÁ¤ÇÏ´Ù´Â °ÍÀ» º¸ÁõÇÒ ¼ö ¾ø´Ù.
bb_threads¿¡ ÇÔ²² µþ·Á¿À´Â ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼ º¸¸é ÇÔ¼ö <CODE>fnn</CODE>°ú
<CODE>main</CODE>¿¡¼ µ¿½Ã¿¡ <CODE>printf()</CODE>¸¦ ½ÇÇàÇÏ´Â °ÍÀ» ¸·´Âµ¥¿¡ ¶ôÀ»
¿Ç¹Ù¸£°Ô »ç¿ëÇÏÁö ¾Ê°í ÀÖ´Ù. ÀÌ°Í ¶§¹®¿¡ ¿¹Á¦´Â Ç×»ó µ¿ÀÛÇÏÁö´Â ¾Ê´Â´Ù.
³»°¡ ÀÌ ¸»À»ÇÏ´Â °ÍÀº ¿¹Á¦ ÇÁ·Î±×·¥¿¡ Æ®ÁýÀ» Àâ±â À§Çؼ°¡ ¾Æ´Ï¶ó,
À̰ÍÀÌ <EM>¸Å¿ì ´Ù·ç±â ¾î·Æ´Ù</EM>´Â °Í°ú LinuxThreads¸¦ »ç¿ëÇÏ´Â °ÍÀÌ
Á¶±Ý ½±´Ù´Â °É °Á¶Çϱâ À§ÇؼÀÌ´Ù.
</LI>
<LI>¾²·¹µå°¡ <CODE>return</CODE> ¸í·ÉÀ» ½ÇÇàÇϸé, ÀÌ´Â ½ÇÁ¦ÀûÀ¸·Î
ÇÁ·Î¼¼½º¸¦ Á×ÀÌ°Ô µÈ´Ù. ±×·¯³ª Áö¿ª ½ºÅà ¸Þ¸ð¸®´Â ÀÚµ¿À¸·Î ÇÒ´çÀÌ
ÇØÁ¦µÇÁö ¾Ê´Â´Ù. ¾ö¹ÐÇÏ°Ô ¸»ÇÏ¸é ¸®´ª½º´Â ÇÒ´ç ÇØÁ¦¸¦ Áö¿øÇÏÁö ¾ÊÀ¸¸ç,
¸Þ¸ð¸® °ø°£Àº ÀÚµ¿À¸·Î <CODE>malloc()</CODE>ÀÇ »ç¿ëÇÏÁö ¾Ê´Â ¸Þ¸ð¸®
¸ñ·Ï(free list)À¸·Î µÇµ¹¾Æ°¡ Ãß°¡µÇÁö ¾Ê´Â´Ù. µû¶ó¼ ºÎ¸ð ÇÁ·Î¼¼½º´Â
Á×Àº ÀÚ½Ä ÇÁ·Î¼¼½º¸¶´Ù
<CODE>bb_threads_cleanup(wait(NULL))</CODE>¸¦
ºÒ·¯¼ ÀÌ °ø°£À» ¹Ý³³ÇØ¾ß ÇÑ´Ù.</LI>
</OL>
<P>
<P>´ÙÀ½ C ÇÁ·Î±×·¥Àº 1.3Àå¿¡¼
¼³¸íÇÑ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¿©, µÎ°³ÀÇ bb_threads ¾²·¹µå¸¦ ÀÌ¿ëÇØ¼
ÆÄÀÌ(pi)ÀÇ ±Ù»çÄ¡¸¦ °è»êÇÑ´Ù.
<P>
<HR>
<PRE>
#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);
}
</PRE>
<HR>
<P>
<H2><A NAME="ss2.4">2.4 LinuxThreads</A>
</H2>
<P>
<P>LinuxThreads
<A HREF="http://pauillac.inria.fr/~xleroy/linuxthreads/">http://pauillac.inria.fr/~xleroy/linuxthreads/</A> ´Â POSIX
1003.1c ¾²·¹µå Ç¥ÁØ¿¡ µû¶ó "¸ðµÎ °øÀ¯ÇÏ´Â" ¹æ½ÄÀ» ¿ÏÀüÇÏ°í Æ°Æ°ÇϰÔ
±¸ÇöÇÑ °ÍÀÌ´Ù. ´Ù¸¥ POSIX ¾²·¹µå¸¦ Æ÷ÆÃÇÑ °Í°ú´Â ´Þ¸®, LinuxThreads´Â
bb_threads¿¡¼ »ç¿ëÇÑ °Í°ú ¶È°°Àº ¸®´ª½º Ä¿³ÎÀÇ
¾²·¹µå(<CODE>clone()</CODE>)¸¦ »ç¿ëÇÑ´Ù. POSIX¿Í ȣȯµÈ´Ù´Â °ÍÀº ´Ù¸¥
½Ã½ºÅÛ¿¡¼ ¸¸µç »ó´ç¼öÀÇ ¾²·¹µå ÇÁ·Î±×·¥µéÀ» »ó´ëÀûÀ¸·Î ½±°Ô Æ÷ÆÃÇÒ ¼ö
ÀÖÀ¸¸ç, Âü°íÇÒ ¼ö ÀÖ´Â ´Ù¾çÇÑ ¿¹Á¦°¡ ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. °£´ÜÈ÷ ¸»ÇØ,
LinuxThreads´Â ¸®´ª½º¿¡¼ ¹æ´ëÇÑ ±Ô¸ðÀÇ ¾²·¹µå ÇÁ·Î±×·¥À» °³¹ßÇÒ ¶§
»ç¿ëÇÒ ¼ö ÀÖ´Â È®½ÇÇÑ ¾²·¹µå ÆÐŰÁöÀÌ´Ù.
<P>LinuxThreads ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â ±âº» ÇÁ·Î±×·¥ ±¸Á¶´Â ´ÙÀ½°ú °°´Ù :
<P>
<OL>
<LI>ÇϳªÀÇ ÇÁ·Î¼¼½º·Î ÇÁ·Î±×·¥À» ½ÃÀÛÇÑ´Ù.
</LI>
<LI>´ÙÀ½ ´Ü°è´Â ÇÊ¿äÇÑ ¶ô(lock)µéÀ» ¸ðµÎ ÃʱâÈÇÏ´Â °ÍÀÌ´Ù.
¼ýÀÚ·Î ±¸º°µÇ´Â bb_threads ¶ô°ú´Â ´Þ¸® POSIX ¶ôµéÀº
<CODE>pthread_mutex_t</CODE>ŸÀÔ(type)ÀÇ º¯¼ö·Î ¼±¾ðµÈ´Ù.
<CODE>pthread_mutex_init(&lock,val)</CODE>ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿©
ÇÊ¿äÇÑ °¢°¢ÀÇ ¶ôµéÀ» ÃʱâÈÇÑ´Ù.
</LI>
<LI>bb_threads¿¡¼Ã³·³ »õ·Î¿î ¾²·¹µå¸¦ ¸¸µé·Á¸é ¶óÀ̺귯¸® ·çƾÀ»
È£ÃâÇØ¾ß ÇÑ´Ù. ¿©±â¼ ÀÎÀÚ´Â »õ·Î¿î ¾²·¹µå°¡ ½ÇÇàÇÒ ÇÔ¼ö¿Í, ¿©±â¿¡
Àü´ÞÇÒ ÀÎÀÚµéÀÌ´Ù. ±×·¸Áö¸¸ POSIX¿¡¼´Â »ç¿ëÀÚ°¡ °¢ ¾²·¹µå¸¦ ±¸º°ÇÒ ¼ö
ÀÖµµ·Ï <CODE>pthread_t</CODE> ŸÀÔÀÇ º¯¼ö¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù.
<CODE>f()</CODE> ÇÔ¼ö¸¦ ½ÇÇàÇÏ´Â <CODE>pthread_t</CODE> ¾²·¹µå¸¦
»ý¼ºÇÏ·Á¸é <CODE>pthread_create(&thread,NULL,f,&arg)</CODE>¸¦
È£ÃâÇÑ´Ù.
</LI>
<LI>º´·Ä Äڵ带 ½ÇÇàÇÑ´Ù. ÇÊ¿äÇÑ °æ¿ì¿¡
<CODE>pthread_mutex_lock(&lock)</CODE>¿Í
<CODE>pthread_mutex_unlock(&lock)</CODE>¸¦ È£ÃâÇϵµ·Ï
ÁÖÀÇÇÑ´Ù.
</LI>
<LI><CODE>pthread_join(thread,&retval)</CODE> ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© °¢ ¾²·¹µå°¡
³¡³ÈÄ¿¡ ¸¶¹«¸®¸¦ ÇÑ´Ù.
</LI>
<LI>C Äڵ带 ÄÄÆÄÀÏÇÒ ¶§ <CODE>-D_REENTRANT</CODE> ¿É¼ÇÀ» Ãß°¡ÇÑ´Ù.</LI>
</OL>
<P>´ÙÀ½Àº LinuxThreads¸¦»ç¿ëÇÏ¿© ÆÄÀÌ(pi)¸¦ °è»êÇÏ´Â º´·ÄÇÁ·Î±×·¥ÀÇ ¿¹ÀÌ´Ù.
1.3Àå¿¡¼ »ç¿ëÇÑ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¿´°í, bb_threads ¿¹Á¦¿¡¼Ã³·³ µÎ°³ÀÇ
¾²·¹µå°¡ º´·Ä·Î ½ÇÇàµÈ´Ù.
<P>
<HR>
<PRE>
#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);
}
</PRE>
<HR>
<P>
<H2><A NAME="ss2.5">2.5 System V °øÀ¯ ¸Þ¸ð¸®</A>
</H2>
<P>
<P>½Ã½ºÅÛ V IPC(Inter-Process Communication, ÇÁ·Î¼¼½º°£ Åë½Å)´Â ¸Þ½ÃÁö
Å¥(message queue)¿Í ¼¼¸¶Æ÷¾î(semaphore), °øÀ¯ ¸Þ¸ð¸®(shared memory)
¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÏ´Â ¿©·¯°¡Áö ½Ã½ºÅÛ ÄÝÀ» Áö¿øÇÑ´Ù. ¹°·Ð À̵é
¸ÞÄ¿´ÏÁòÀº ¿ø·¡ ÇϳªÀÇ ÇÁ·Î¼¼¼¸¦ »ç¿ëÇÏ´Â ½Ã½ºÅÛ¿¡¼ ¿©·¯°³ÀÇ
ÇÁ·Î¼¼½ºµéÀÌ Åë½ÅÀ» Çϴµ¥ »ç¿ëÇϱâ À§Çؼ ¸¸µé¾îÁ³´Ù. ±×·¸Áö¸¸, ÀÌ
¸»Àº SMP ¸®´ª½º¿¡¼ ÇÁ·Î¼¼½º°¡ ¾î¶² ÇÁ·Î¼¼¼¿¡¼ ½ÇÇàµÇ°í ÀÖµçÁö
°£¿¡ ÇÁ·Î¼¼½º°£ Åë½Å¿¡¼µµ Á¦´ë·Î µ¿ÀÛÇØ¾ß ÇÑ´Ù´Â Àǹ̸¦ ³»Æ÷Çϰí
ÀÖ´Ù.
<P>ÀÌµé ½Ã½ºÅÛ ÄÝÀÌ ¾î¶»°Ô »ç¿ëµÇ´ÂÁö »ìÆìº¸±â Àü¿¡, ½Ã½ºÅÛ V IPC È£ÃâÀÌ
¼¼¸¶Æ÷¾î³ª ¸Þ½ÃÁö Àü´Þ°°Àº ÀÏÀ» À§ÇØ Á¸ÀçÇϱä ÇÏÁö¸¸, À̸¦ »ç¿ëÇØ¼±
¾ÈµÈ´Ù´Â °ÍÀ» ÀÌÇØÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. ¿Ö ¾ÈµÇ´À³Ä? À̵é ÇÔ¼öµéÀº
ÀϹÝÀûÀ¸·Î ´À¸®°í SMP ¸®´ª½º¿¡¼´Â Á÷·ÄÈ(serialize)µÇ¾î ÀÖ´Ù. ÀÌÁ¤µµ¸é
ÃæºÐÇϰڴÙ.
<P>°øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ¸·ÎÀÇ Á¢±ÙÀ» °øÀ¯ÇÏ´Â ÇÁ·Î¼¼½º ±×·ìÀ» ¸¸µå´Â ±âº»ÀûÀÎ
°úÁ¤Àº ´ÙÀ½°ú °°´Ù :
<P>
<OL>
<LI>ÇϳªÀÇ ÇÁ·Î¼¼½º·Î ÇÁ·Î±×·¥À» ½ÃÀÛÇÑ´Ù.
</LI>
<LI>´ëü·Î ¿©·¯ºÐÀº ½ÇÇàµÇ´Â °¢°¢ÀÇ º´·Ä ÇÁ·Î±×·¥ÀÌ ÀڽŸ¸ÀÇ °øÀ¯
¸Þ¸ð¸® ¿µ¿ªÀ» °¡Áö±â¸¦ ¹Ù¶ö °ÍÀÌ´Ù. µû¶ó¼ <CODE>shmget()</CODE> ÇÔ¼ö¸¦
ºÒ·¯ ¿øÇÏ´Â Å©±â¸¸ÅÀÇ »õ·Î¿î ¿µ¿ªÀ» ¸¸µé¾î¾ß ÇÑ´Ù. ÀÌ È£ÃâÀº À̹Ì
Á¸ÀçÇÏ´Â °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀÇ ID¸¦ ¾ò´Âµ¥¿¡µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¾î¶²
°æ¿ìÀ̵ç, µ¹¾Æ¿À´Â °ªÀº °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀÇ IDÀ̰ųª ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì
-1ÀÌ´Ù. ¿¹¸¦ µé¾î, <EM>b</EM> ¹ÙÀÌÆ® Å©±âÀÇ °øÀ¯ ¸Þ¸ð¸®
¿µ¿ªÀ» ¸¸µç´Ù¸é, <CODE>shmid
= shmget(IPC_PRIVATE, <EM>b</EM>, (IPC_CREAT | 0666))</CODE>
°°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
</LI>
<LI>´ÙÀ½ ´Ü°è´Â ÀÌ °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ» ÀÌ ÇÁ·Î¼¼½º¿¡ ¿¬°áÇÏ´Â(attach) °ÍÀÌ´Ù.
¸» ±×´ë·Î ÀÌ ¸Þ¸ð¸®¸¦ ÀÌ ÇÁ·Î¼¼½ºÀÇ °¡»ó ¸Þ¸ð¸® ¸Ê¿¡ Ãß°¡ÇÏ´Â °ÍÀÌ´Ù.
ÇÁ·Î±×·¡¸Ó´Â <CODE>shamt()</CODE> ÇÔ¼ö È£Ãâ¿¡¼ ¸Þ¸ð¸® ¿µ¿ªÀÌ ³ªÅ¸³¯
°¡»ó ÁÖ¼Ò¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖÁö¸¸, ¼±ÅÃÇÑ ÁÖ¼Ò´Â ÆäÀÌÁö °æ°è(boundary)¿¡ µû¶ó
Á¤·Ä(align)ÀÌ µÇ¾î ÀÖ¾î¾ß Çϸç (Áï, <CODE>getpagesize()</CODE>¿¡¼
µ¹·ÁÁÖ´Â ÆäÀÌÁö Å©±â - º¸ÅëÀº 4096 ¹ÙÀÌÆ®ÀÌ´Ù - ÀÇ ¹è¼ö¿©¾ß
ÇÑ´Ù), ÀÌ´Â ÀÌ ÁÖ¼Ò¿¡ ÀÌ¹Ì Á¸ÀçÇÏ´ø ¾î¶² ¸Þ¸ð¸®À̵çÁö°£¿¡ ¸ÅÇÎÀ»
µ¤¾î½á¹ö¸°´Ù. µû¶ó¼, À̺¸´Ù´Â ½Ã½ºÅÛÀÌ ÁÖ¼Ò¸¦ °í¸¦ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ
´õ ¼±È£µÈ´Ù. ¾î¶² °æ¿ìÀ̵ç, µ¹¾Æ¿À´Â °ªÀº ¸ÅÇÎÀÌ µÈ ¼¼±×¸ÕÆ®°¡ ½ÃÀÛÇÏ´Â
°¡»óÁÖ¼Ò¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù. ÄÚµå´Â <CODE>shmptr =
shmat(shmid, 0, 0)</CODE>°ú °°Àº ÇüÅÂÀÌ´Ù.
¸ðµç °øÀ¯ º¯¼öµéÀ» ±¸Á¶Ã¼ÀÇ ¸â¹ö·Î
¼±¾ðÇϰí <EM>shmptr</EM>À» ÀÌ ±¸Á¶Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅÍ·Î ¼±¾ðÇÔÀ¸·Î½á
°£´ÜÇÏ°Ô ¸ðµç Á¤Àû º¯¼ö¸¦ °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ¸·Î ÇÒ´çÇÒ ¼ö ÀÖ´Ù. ÀÌ
±â¹ýÀ» ÀÌ¿ëÇÏ¿©, °øÀ¯ º¯¼ö <EM>x</EM>´Â
<EM>shmptr</EM><CODE>-></CODE><EM>x</EM>·Î
Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
</LI>
<LI>°øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ» »ç¿ëÇÏ´Â ¸¶Áö¸· ÇÁ·Î¼¼½º°¡ Á¾·áÇϰųª ÀÌ ¿µ¿ª¿¡¼
¶³¾îÁ®³ª¿À¸é(detach) ÀÌ °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ» ¾ø¾Ö¾ßÇÑ´Ù. ÀÌ ±âº» ÇൿÀ»
¼³Á¤ÇÏ·Á¸é <CODE>shmctl()</CODE> ÇÔ¼ö¸¦ ºÎ¸¦ Çʿ䰡 ÀÖ´Ù. ÄÚµå´Â
<CODE>shmctl(shmid, IPC_RMID, 0)</CODE>°ú °°Àº ÇüÅ·ΠÀÛ¼ºÇÑ´Ù.
</LI>
<LI>¿øÇÏ´Â °¹¼ö·Î ÇÁ·Î¼¼½ºµéÀ» ¸¸µé·Á¸é Ç¥ÁØ ¸®´ª½ºÀÇ
<CODE>fork()</CODE> ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. °¢°¢ÀÇ ÇÁ·Î¼¼½º´Â °øÀ¯ ¸Þ¸ð¸®
¿µ¿ªÀ» »ó¼Ó¹Þ°ÔµÈ´Ù.
</LI>
<LI>ÇÁ·Î¼¼½º°¡ °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ» »ç¿ëÇÏ´Â ÀÛ¾÷À» ³¡¸¶Ä¡¸é, ÀÌ °øÀ¯ ¸Þ¸ð¸®
¿µ¿ªÀ¸·ÎºÎÅÍ ºÐ¸®(detach)ÇØ¾ß ÇÑ´Ù.
ÀÌ´Â <CODE>shmdt(shmptr)</CODE>À» ºÒ·¯¼ ÇÑ´Ù.</LI>
</OL>
<P>
<P>À§¿¡ ¼³¸íÇÑ °úÁ¤¿¡¼´Â ¸î°³ ¾ÈµÇ´Â ½Ã½ºÅÛ È£Ã⸸À» »ç¿ëÇÏÁö¸¸, ÀÏ´Ü °øÀ¯
¸Þ¸ð¸® ¿µ¿ªÀÌ ¸¸µé¾îÁö¸é, ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ¸Þ¸ð¸®»óÀÇ °ªÀ» ¹Ù²Û °æ¿ì
ÀÚµ¿À¸·Î ¸ðµç ÇÁ·Î¼¼½º¿¡ º¸ÀÌ°Ô µÈ´Ù. °¡Àå Áß¿äÇÑ Á¡Àº °¢ Åë½Å ÀÛ¾÷ÀÌ
½Ã½ºÅÛ ÄÝÀ» ÇÏ´Â ¿À¹öÇìµå¾øÀÌ ÀÌ·ç¾îÁø´Ù´Â °ÍÀÌ´Ù.
<P>´ÙÀ½Àº ½Ã½ºÅÛ V °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ» »ç¿ëÇÏ´Â C ÇÁ·Î±×·¥ÀÇ ¿¹ÀÌ´Ù. ÀÌ
ÇÁ·Î±×·¥Àº ÆÄÀÌ(pi)¸¦ °è»êÇÏ´Â °ÍÀ¸·Î 1.3Àå¿¡¼ ³ª¿Â °Í°ú ¶È°°Àº
¾Ë°í¸®ÁòÀ» »ç¿ëÇÑ´Ù.
<P>
<HR>
<PRE>
#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);
}
</PRE>
<HR>
<P>³ª´Â ÀÌ ¿¹Á¦¿¡¼ ¶ô(lock)À» ±¸ÇöÇϱâ À§ÇØ IA32ÀÇ ¿øÀÚÀûÀÎ(atomic)
±³È¯(exchange) ¸í·É¾î¸¦ »ç¿ëÇÏ¿´´Ù. ´õ ³ªÀº ¼º´É°ú ȣȯ¼ºÀ»
¹Ù¶õ´Ù¸é, ¿øÀÚÀûÀÎ ¹ö½º-¶ô(bus-lock) ¸í·É¾î¸¦ »ç¿ëÇÏÁö ¾Ê´Â µ¿±âÈ
±â¹ýÀ¸·Î ´ëüÇϱ⠹ٶõ´Ù.
<P>ÇöÀç »ç¿ëÇϰí ÀÖ´Â ½Ã½ºÅÛ V IPC ±â´ÉµéÀÇ »óŸ¦ º¸¿©ÁÖ´Â <CODE>ipcs</CODE>À»
±â¾ïÇϰí ÀÖ´Ù¸é, ¿©·¯ºÐÀÌ ¸¸µç Äڵ带 µð¹ö±ëÇÒ ¶§ µµ¿òÀÌ µÉ °ÍÀÌ´Ù.
<P>
<H2><A NAME="sec_MemoryMapCall"></A> <A NAME="ss2.6">2.6 ¸Þ¸ð¸® ¸Ê È£Ãâ</A>
</H2>
<P>
<P>ÆÄÀÏ I/O ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇÏ´Â ºñ¿ëÀº ¸Å¿ì Ŭ ¼ö ÀÖ´Ù. »ç½Ç, À̰ÍÀÌ
»ç¿ëÀÚ ¹öÆÛ¸¦ »ç¿ëÇÏ´Â ÆÄÀÏ I/O ¶óÀ̺귯¸®°¡ ÀÖ´Â ÀÌÀ¯ÀÌ´Ù
(<CODE>getchar()</CODE>, <CODE>fwrite()</CODE> µî). ±×·¯³ª »ç¿ëÀÚ
¹öÆÛ´Â ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ ¶È°°Àº ¾²±â °¡´ÉÇÑ ÆÄÀÏ¿¡ Á¢±ÙÇϰí ÀÖ´Ù¸é
»ç¿ëÇÒ ¼ö ¾øÀ¸¸ç, »ç¿ëÀÚ ¹öÆÛ¸¦ °ü¸®ÇÏ´Â ¿À¹öÇìµåµµ ²Ï Å©´Ù. BSD
UNIX¿¡¼´Â ÆÄÀÏÀÇ ÀϺθ¦ »ç¿ëÀÚ ¸Þ¸ð¸®·Î ¸ÅÇÎÇÏ¿© º»ÁúÀûÀ¸·Î °¡»ó ¸Þ¸ð¸®
ÆäÀÌ¡ ¸ÞÄ¿´ÏÁòÀ» ÅëÇØ °»½ÅÀ» Çϵµ·Ï ÇÒ ¼ö ÀÖ´Â ½Ã½ºÅÛ ÄÝÀ» Ãß°¡ÇÏ¿©
À̸¦ ÇØ°áÇÑ´Ù. ÀÌ¿Í ¶È°°Àº ¸ÞÄ¿´ÏÁòÀÌ ¸î³âÀü Sequent¿¡¼ ¸¸µç
½Ã½ºÅÛ¿¡¼ °øÀ¯ ¸Þ¸ð¸® º´·Äó¸® Áö¿øÀÇ ±â¹ÝÀ¸·Î »ç¿ëµÇ¾ú´Ù. (¾ÆÁÖ
¿À·¡µÈ) man ÆäÀÌÁö¿¡ ¸î°¡Áö ¸Å¿ì ºÎÁ¤ÀûÀÎ ÀǰßÀÌ ÀÖÀ½¿¡µµ ºÒ±¸Çϰí,
¸®´ª½º´Â ±âº»ÀûÀÎ ÇÔ¼öµé Áß Àû¾îµµ ¸î°¡Áö´Â Á¦´ë·Î
¼öÇàÇϴµíÀÌ º¸À̸ç, ÀÌ ½Ã½ºÅÛ ÄÝÀ» ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ °øÀ¯ÇÒ ¼ö ÀÖ´Â
¹«¸íÀÇ(anonymous) ¸Þ¸ð¸® ¿µ¿ªÀ¸·ÎÀÇ ¸ÅÇο¡ »ç¿ëÇÏ´Â °ÍÀ» Áö¿øÇÑ´Ù.
<P>º»ÁúÀûÀ¸·Î ¸®´ª½º¿¡¼ÀÇ <CODE>mmap()</CODE> ±¸ÇöÀº 2.5Àå¿¡¼ ¼³¸íÇÑ 2,
3, 4¹øÂ° ´Ü°è¸¦ Çϳª·Î ´ëüÇÑ °ÍÀÌ´Ù. ¹«¸íÀÇ °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ»
¸¸µé·Á¸é :
<P>
<HR>
<PRE>
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) */
</PRE>
<HR>
<P>½Ã½ºÅÛ V °øÀ¯¸Þ¸ð¸®ÀÇ <CODE>shmdt()</CODE> ÇÔ¼ö¿Í ¶È°°Àº ÀÏÀ» ÇÏ´Â
ÇÔ¼ö´Â <CODE>munmap()</CODE>ÀÌ´Ù :
<P>
<HR>
<PRE>
munmap(shmptr, b);
</PRE>
<HR>
<P>³» »ý°¢¿¡´Â ½Ã½ºÅÛ V °øÀ¯ ¸Þ¸ð¸® Áö¿ø ´ë½Å <CODE>mmap()</CODE>À»
»ç¿ëÇÏ´Â °ÍÀÌ ½ÇÁ¦·Î ´õ ³´Áö´Â ¾Ê´Ù.
<P>
<HR>
<A HREF="Parallel-Processing-HOWTO-3.html">´ÙÀ½</A>
<A HREF="Parallel-Processing-HOWTO-1.html">ÀÌÀü</A>
<A HREF="Parallel-Processing-HOWTO.html#toc2">Â÷·Ê</A>
</BODY>
</HTML>