Filewatcher File Search
FTP Search
  
Directory 
  
Content Search 
   
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½Ã¿¡ °¡Á®¿À¸é µÇ¾î, ¹ö½º¸¦ µÑ·¯½Ñ °æÀïÀ» ÇÇÇÒ ¼ö À־ 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&amp;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 *) &amp;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>) &amp; ~(<EM>c</EM> - 1)</CODE>¿Í <CODE>((int)
<EM>b</EM>) &amp; ~(<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>, &amp;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 &lt;stdio.h>
#include &lt;stdlib.h>
#include &lt;unistd.h>
#include &lt;sys/types.h>
#include &lt;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&lt;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(&amp;lock,val)</CODE>ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿©
ÇÊ¿äÇÑ °¢°¢ÀÇ ¶ôµéÀ» ÃʱâÈ­ÇÑ´Ù.
</LI>
<LI>bb_threads¿¡¼­Ã³·³ »õ·Î¿î ¾²·¹µå¸¦ ¸¸µé·Á¸é ¶óÀ̺귯¸® ·çƾÀ» 
È£ÃâÇØ¾ß ÇÑ´Ù.  ¿©±â¼­ ÀÎÀÚ´Â »õ·Î¿î ¾²·¹µå°¡ ½ÇÇàÇÒ ÇÔ¼ö¿Í, ¿©±â¿¡
Àü´ÞÇÒ ÀÎÀÚµéÀÌ´Ù.  ±×·¸Áö¸¸ POSIX¿¡¼­´Â »ç¿ëÀÚ°¡ °¢ ¾²·¹µå¸¦ ±¸º°ÇÒ ¼ö
ÀÖµµ·Ï <CODE>pthread_t</CODE> ŸÀÔÀÇ º¯¼ö¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù.
<CODE>f()</CODE> ÇÔ¼ö¸¦ ½ÇÇàÇÏ´Â <CODE>pthread_t</CODE> ¾²·¹µå¸¦
»ý¼ºÇÏ·Á¸é <CODE>pthread_create(&amp;thread,NULL,f,&amp;arg)</CODE>¸¦
È£ÃâÇÑ´Ù.
</LI>
<LI>º´·Ä Äڵ带 ½ÇÇàÇÑ´Ù. ÇÊ¿äÇÑ °æ¿ì¿¡
<CODE>pthread_mutex_lock(&amp;lock)</CODE>¿Í
<CODE>pthread_mutex_unlock(&amp;lock)</CODE>¸¦ È£ÃâÇϵµ·Ï
ÁÖÀÇÇÑ´Ù.
</LI>
<LI><CODE>pthread_join(thread,&amp;retval)</CODE> ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© °¢ ¾²·¹µå°¡
³¡³­ÈÄ¿¡ ¸¶¹«¸®¸¦ ÇÑ´Ù.
</LI>
<LI>C Äڵ带 ÄÄÆÄÀÏÇÒ ¶§ <CODE>-D_REENTRANT</CODE> ¿É¼ÇÀ» Ãß°¡ÇÑ´Ù.</LI>
</OL>
<P>´ÙÀ½Àº LinuxThreads¸¦»ç¿ëÇÏ¿© ÆÄÀÌ(pi)¸¦ °è»êÇÏ´Â º´·ÄÇÁ·Î±×·¥ÀÇ ¿¹ÀÌ´Ù. 
1.3Àå¿¡¼­ »ç¿ëÇÑ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¿´°í, bb_threads ¿¹Á¦¿¡¼­Ã³·³ µÎ°³ÀÇ
¾²·¹µå°¡ º´·Ä·Î ½ÇÇàµÈ´Ù.
<P>
<HR>
<PRE>
#include &lt;stdio.h>
#include &lt;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&lt;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(&amp;pi_lock);
  pi += localsum;
  pthread_mutex_unlock(&amp;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(&amp;pi_lock, NULL);

  /* Make the two threads */
  if (pthread_create(&amp;thread0, NULL, process, "0") ||
      pthread_create(&amp;thread1, NULL, process, "1")) {
    fprintf(stderr, "%s: cannot make thread\n", argv[0]);
    exit(1);
  }

  /* Join (collapse) the two threads */
  if (pthread_join(thread0, &amp;retval) ||
      pthread_join(thread1, &amp;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>-&gt;</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 &lt;stdio.h>
#include &lt;stdlib.h>
#include &lt;unistd.h>
#include &lt;sys/types.h>
#include &lt;sys/stat.h>
#include &lt;fcntl.h>
#include &lt;sys/ipc.h>
#include &lt;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&lt;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), &amp;(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>
Results 1 - 1
Help - FTP Sites List - Software Dir.
Searching half a billion files worldwide
© 1997-2009 MARUHN Internet Solutions