¾²·¹µå¿¡ ´ëÇØ¼­
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

  • ¸Å¿ì ¿À·¡µÈ ¹®¼­¶ó¼­ ´Ù½Ã Á¤¸®ÇÒ Çʿ䰡 ÀÖÀ½ - 2009/11/26

°³¿ä

SMP¿Í °°Àº shared memory multiprocessor architectures¿¡¼­ thread´Â º´·ÄÈ­¸¦ ´Þ¼ºÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ¾²·¹µå ±¸ÇöÀº Çϵå¿þ¾î º¥´õ¿¡¼­ ±×µéÀÚ½ÅÀÇ Çʿ信 ÀÇÇØ¼­ ¸¸µé¾î¼­ »ç¿ëÇßÀ¸¸ç ÈÄ¿¡ ¼ÒÇÁÅ©¿þ¾î °³¹ßÀÚµéÀÌ °£´ÜÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÀÛ¼ºÇÏ°Ô µÇ¾ú´Ù. UNIX¿¡¼­´Â C ¾ð¾î¸¦ À§ÇÑ Ç¥ÁØ thread ÇÁ·Î±×·¡¹Ö ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇϴµ¥, IEEE POSIX 1003.1c ¿¡ ±× Ç¥ÁØÀÌ Á¤ÀǵǾî ÀÖ´Ù. À̸¦ POSIX Thread ¶ó°í ºÎ¸£°Ô µÇ¾ú°í, ´õ¿í ÁÙ¿©¼­ pthread ¶ó°í ºÎ¸£°í ÀÖ´Ù.

ÀÌ ¹®¼­´Â threadÀÇ °³³ä¿¡ ´ëÇØ¼­ °£´ÜÈ÷ ¼³¸íÇϰí, ±× ±¸Çö¹°ÀÎ pthread¸¦ ÀÌ¿ëÇÑ º´·Äó¸® ÇÁ·Î±×·¡¹Ö ±â¹ý¿¡ ´ëÇØ¼­ ¼³¸íÇÒ °ÍÀÌ´Ù.

¾²·¹µå´Â ¹«¾ùÀ̸ç, ¿Ö ÀÌ¿ëÇϴ°¡

¾²·¹µå´Â ¼¼¹Ì(semi)ÇÁ·Î¼¼½º, ȤÀº Light Weight ÇÁ·Î¼¼½º¶ó°í ºÒ¸®¿ì¸ç, ¿©·¯°³ÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ó¸®ÇÏ´Â ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨ÀÇ ¼­¹öÇÁ·Î±×·¡¹Ö ÀÛ¾÷À» À§Çؼ­ ÁÖ·Î »ç¿ëµÈ´Ù. ºñ½ÁÇÑ ÀÏÀ» ÇÏ´Â fork(2) ¿¡ ºñÇØ¼­ ºü¸¥ ÇÁ·Î¼¼½º »ý¼º ´É·Â°ú, ÀûÀº ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â°Ô Light Weight ÇÁ·Î¼¼½º¶ó°í ºÒ¸®¿ì´Â ÀÌÀ¯ÀÌ´Ù.

º¸ÅëÀÇ À¯´Ð½º ÇÁ·Î¼¼½º´Â main()ÇÔ¼ö¿¡ ÀÇÇØ¼­ ½ÃÀÛµÇ°í ½ÇÇàµÇ´Â single ¾²·¹µå ·Î ÀÌ·ç¾îÁö¸ç, ÇϳªÀÇ ¿¬¼ÓµÈ ¸í·É¾îµé¸¸À» ó¸®ÇÑ´Ù. ¹Ý¸é ¸ÖƼ¾²·¹µå ÇÁ·Î±×·¥Àº ¿©·¯°³ÀÇ ¿¬¼ÓµÈ ¸í·É¾îµéÀ» µ¿½Ã¿¡ ó¸®ÇÒ¼ö ÀÖ´Ù.

½º·¹µå´Â ÀÚ±âÀÚ½ÅÀÇ ½ºÅø޸𸮿µ¿ªÀ» °¡Áö°í, ÄÚµåÀÇ Á¶°¢À» ½ÇÇàÇÑ´Ù. ½Ç(real) ÇÁ·Î¼¼½º ¿Í´Â ´Þ¸® ¾²·¹µå´Â ´Ù¸¥ ÇüÁ¦ ¾²·¹µåµé°ú ¸Þ¸ð¸®¸¦ °øÀ¯ÇÏ°Ô µÈ´Ù.(º¸Åë ÇÁ·Î¼¼½º´Â ÀÚ±âÀڽŸ¸ÀÇ ¸Þ¸ð¸®¿µ¿ªÀ» °¡Áø´Ù). ÀÌ·¸µí Àü¿ª ¸Þ¸ð¸®¸¦ °øÀ¯ÇÏ°Ô µÇ¹Ç·Î fork ¹æ½Ä¿¡ ºñÇØ¼­ Á»´õ ÀÛÀº ¸Þ¸ð¸®¸¦ ¼ÒºñÇÏ°Ô µÈ´Ù.

fork ¿¡ ºñÇØ¼­ thread °¡ °¡Áö´Â ÀåÁ¡Àº À§¿¡¼­ ¾ð±ÞÇßµíÀÌ "ºü¸¥ ÇÁ·Î¼¼½º »ý¼º" ´É·Â°ú, ¸Þ¸ð¸® °øÀ¯¿¡ À§ÇÑ"ÀûÀº ¸Þ¸ð¸®ÀÇ »ç¿ë"°ú ¸Þ¸ð¸® °øÀ¯¿¡ µû¸¥ ¾²·¹µå°£ÀÇ Á»´õ ½¬¿î Á¤º¸°øÀ¯ÀÌ´Ù. fork(2) ½Ã½ºÅÛ¿¡¼­ ºÎ¸ð¿Í ÀڽݰÀÌ Åë½ÅÀ» À§Çؼ­´Â IPC¸¦ »ç¿ëÇØ¾ß Çϸç ÀÌ´Â ²Ï ¾î·Á¿î ÀÛ¾÷ÀÌ µÉ¼öµµ Àִµ¥, ¸Þ¸ð¸®¸¦ °øÀ¯ÇÔÀ¸·Î IPCÀÇ »ç¿ëÀ» ÁÙÀ̸鼭µµ ¾²·¹µå°£ Á¤º¸±³È¯À» ½±°Ô ÇÒ¼öÀÖ´Ù.

¾Æ·¡´Â fork()¸¦ ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º »ý¼º°ú pthread_create()¸¦ ÀÌ¿ëÇÑ thread »ý¼º°£ÀÇ ºñ¿ëÀ» ºñ±³ÇÑ Ç¥ÀÌ´Ù.
Platform fork() pthread_create()
real user sys real user sys
AMD 2.4 GHz Opteron (8cpus/node) 41.07 60.08 9.01 0.66 0.19 0.43
IBM 1.9 GHz POWER5 p5-575 (8cpus/node) 64.24 30.78 27.68 1.75 0.69 1.10
IBM 1.5 GHz POWER4 (8cpus/node) 104.05 48.64 47.21 2.01 1.00 1.52
INTEL 2.4 GHz Xeon (2 cpus/node) 54.95 1.54 20.78 1.64 0.67 0.90
INTEL 1.4 GHz Itanium2 (4 cpus/node) 54.54 1.07 22.22 2.03 1.26 0.67

fork ¿¡ ºñÇØ¼­ ¾²·¹µå°¡ ´õ ºü¸¥ ¼öÇà´É·ÂÀ» º¸ÀÌ´Â ÀÌÀ¯´Â fork °¡ ±âº»ÀûÀ¸·Î ¸ðµç ¸Þ¸ð¸®¿Í ¸ðµç ±â¼úÀÚ(ÆÄÀϱâ¼úÀÚµî)À» copy-on-write ¹æ½ÄÀ¸·Î ÀڽĿ¡°Ô º¹»çÇϴµ¥ ºñÇØ¼­ ¾²·¹µå´Â ¸¹Àº ºÎºÐÀ» °øÀ¯Çϱ⠶§¹®ÀÌ´Ù. copy-on-write ÀÚü°¡ È¿À²ÀûÀ̱ä ÇÏÁö¸¸, ¸Þ¸ð¸® ÀÚ¿øÀ» °øÀ¯ÇÏ´Â °Íº¸´Ù´Â ´À¸± ¼ö ¹Û¿¡ ¾ø´Ù.

¾Æ·¡´Â ¾²·¹µå »ý¼º°ú ÇÁ·Î¼¼½º »ý¼ºÀÇ ¼º´É¿¡ ´ëÇÑ ¶Ç´Ù¸¥ ÀÚ·á´Ù.

http://www.ibm.com/developerworks/kr/library/l-rt7/c07-fig1.gif

http://www.ibm.com/developerworks/kr/library/l-rt7/c07-fig2.gif

Ãâó : http://www.ibm.com/developerworks/kr/library/l-rt7

¹Ý¸é ´ÜÁ¡µµ °¡Áö°í Àִµ¥, ¸ðµç ¾²·¹µå°¡ °°Àº ¸Þ¸ð¸® °ø°£À» °øÀ¯ÇÏ°Ô µÇ¹Ç·Î, ÇϳªÀÇ ¾²·¹µå°¡ À߸øµÈ ¸Þ¸ð¸®¿¬»êÀ» ÇÏ°Ô µÇ¸é, ¸ðµç ÇÁ·Î¼¼½º°¡ ±× ¿µÇâÀ» ¹Þ°Ô µÈ´Ù´Â °ÍÀÌ´Ù. fork µîÀ» ÅëÇÑ ÇÁ·Î¼¼½º »ý¼º¹æ½Ä¿¡ À־´Â OS °¡ °¡°¢ÀÇ ÇÁ·Î¼¼½º¸¦ º¸È£ÇØÁÜÀ¸·Î ÇÑ ÇÁ·Î¼¼½ºÀÇ ¹®Á¦´Â ÇØ´ç ÇÁ·Î¼¼½ºÀÇ ¹®Á¦·Î ³¡³ª°Ô µÈ´Ù. ±×·¯³ª ¾²·¹µå´Â ÀÌ·¯ÇÑ ÇÁ·Î¼¼½º º¸È£¸¦ ±â´ëÇÒ¼ö ¾ø´Ù. ÇϳªÀÇ ¾²·¹µå¿¡ ¹®Á¦°¡ »ý±â¸é Àüü ¾²·¹µå¿¡ ¹®Á¦°¡ »ý±æ°¡´É¼ºÀÌ Å©´Ù. ÀÌ·± ÀÌÀ¯·Î ¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥Àº Á»´õ ÁÖÀǸ¦ ±â¿ï¿©¼­ ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¶Ç´Ü ÇϳªÀÇ È帧À» °¡Áö´Â ´ÜÀÏ ÇÁ·Î¼¼½º ÇÁ·Î±×·¥°ú ´Þ¸®, ¿©·¯°³ÀÇ È帧À¸·Î ºÐ¸®°¡ µÇ±â ¶§¹®¿¡, µð¹ö±ëÀ» ÇϱⰡ ±î´Ù·Ó´Ù´Â ¹®Á¦µµ °¡Áø´Ù.

¾²·¹µåÀÇ ÀϹÝÀûÀÎ °³³äÀ» Á¤¸®Çß´Ù.
  • ±â¼úÀûÀ¸·Î thread´Â ¿î¿µÃ¼Á¦¿¡¼­ ½ºÄÉÁ층ÀÌ °¡´ÉÇÑ µ¶¸³µÈ ¸í·É(instructions)È帧ÀÇ ´ÜÀ§ÀÌ´Ù. ¿©±â¿¡¼­ µ¶¸³µÈ ¸í·É ´ÜÀ§¸¦ º¸Åë ¹®¸ÆÀ̶ó°í Ç¥±âÇÑ´Ù. ½ºÄÉÁ층 °¡´ÉÇÑ ¹®¸Æ ȤÀº ÄÚµåÁ¶°¢ À¸·Î ÀÌÇØÇÏ¸é µÉ °Í °°´Ù.
  • ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚ¿¡°Ô À־ thread´Â main ÇÁ·Î±×·¥À¸·Î ºÎÅÍ µ¶¸³ÀûÀ¸·Î ½ÇÇàµÉ ¼ö ÀÖ´Â procedure·Î º¸´Â°Ô ÀÌÇØ°¡ ´õ ½¬¿ï ¼ö ÀÖÀ» °Í °°´Ù.
  • main ÇÁ·Î±×·¥Àº ¿©·¯°³ÀÇ µ¶¸³ÀûÀ¸·Î ½ÇÇà °¡´ÉÇÑ ÇÁ·Î½ÃÁ® Áï ¾²·¹µå¸¦ Æ÷ÇÔÇÒ ¼ö Àִµ¥, À̵éÀ» µ¿½Ã¿¡ ¿î¿ëÇÒ °æ¿ì À̸¦ multi thread ÇÁ·Î±×·¥À̶ó°í ÇÑ´Ù.

¾Æ·¡´Â ¾²·¹µå°£¿¡ ¼­·Î °øÀ¯ÇÏ´Â ÀÚ¿øµéÀ» ³ª¿­ÇÑ °ÍÀÌ´Ù.
  • ÀÛ¾÷µð·ºÅ丮
  • ÆÄÀÏÁö½ÃÀÚµé
  • ´ëºÎºÐÀÇ Àü¿ªº¯¼ö¿Í µ¥ÀÌŸµé
  • UID ¿Í GID
  • signal
´ÙÀ½Àº °¢°¢ÀÇ ¾²·¹µå°¡ °íÀ¯ÇÏ°Ô °¡Áö´Â ÀÚ¿øµéÀ» ³ª¿­ÇÑ °ÍÀÌ´Ù.
  • ¿¡·¯¹øÈ£(errno)
  • ¾²·¹µå ¿ì¼±¼øÀ§
  • ½ºÅÃ
  • ¾²·¹µå ID
  • ·¹Áö½ºÅÍ ¹× ½ºÅÃÁö½ÃÀÚ
´ÙÀ½Àº ¸ÖƼ¾²·¹µå ÇÁ·Î¼¼½º°¡ ¾î¶»°Ô °¢Á¾ ÀÚ¿øÀ» °øÀ¯ÇÏ´ÂÁö¸¦ ³ªÅ¸³½°ÍÀÌ´Ù.

http://www.joinc.co.kr/albums/album01/abg.gif

ÆÄÀÏÀº ±âº»ÀûÀ¸·Î °øÀ¯Çϸç, ¸Þ¸ð¸® ¿µ¿ªÁß¿¡ »ó´çºÎºÐÀ» °øÀ¯ÇÑ´Ù´Â°É º¼¼ö ÀÖÀ»°ÍÀÌ´Ù.

thread ÇÁ·Î±×·¡¹ÖÀÇ ÁÖ¿ä ¿ä¼Òµé

º´·Ä ÇÁ·Î±×·¡¹Ö

ÃÖ±×µé¾î - 2009³â 11¿ù ÇöÀç - ¸ÖƼ cpu ÄÄÇ»ÅͰ¡ ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â Ãß¼¼·Î Á¢¾îµé°í ÀÖ´Ù. °ú°Å¿¡´Â ±â¾÷¿¡¼­ ¿î¿ëÇÏ´Â ¼­¹ö±Þ ÄÄÇ»ÅÍ¿¡¼­³ª multi cpu¸¦ º¼ ¼ö ÀÖ¾úÁö¸¸ ÀÌÁ¦ °³ÀÎ PCµµ multi cpu¸¦ »ç¿ëÇÏ´Â°É ¾î·ÆÁö ¾Ê°Ô º¼ ¼ö ÀÖ´Ù. multi cpu°¡ »ç¿ëµÇ¸é¼­, º´·ÄÇÁ·Î±×·¡¹Ö ±â¹ýÀÇ Á߿伺ÀÌ ´õ¿í Ä¿Áö°í ÀÖ´Ù.

ÇÏÁö¸¸ º´·ÄÇÁ·Î±×·¥ÀÇ ÀÛ¼º¿¡´Â °í·ÁÇØ¾ßÇÒ ¿©·¯°¡Áö »çÇ×µéÀÌ ÀÖ´Ù. ¶§¶§·Î À̵éÀº ÇÁ·Î±×·¥ÀÇ ÀÛ¼ºÀ» ¸Å¿ì ¾î·Æ°Ô ¸¸µé±âµµ ÇÑ´Ù.
  • ·Îµå ¹ë·±½Ì
  • Data dependencies
  • µ¿±âÈ­ ±×¸®°í race conditions
  • ¸Þ¸ð¸® À̽´
  • IO À̽´
  • ÇÁ·Î±×·¥ÀÇ º¹Àâµµ Áõ°¡
  • °³¹ß½Ã°£°ú ºñ¿ëÀÇ Áõ°¡

ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â ¾²·¹µå ÇÁ·Î±×·¥ ¸ðµ¨Àº ´ÙÀ½°ú °°´Ù.
  • Manager/worker
    boss/worker ¸ðµ¨À̶ó°í ºÎ¸£±âµµ ÇÑ´Ù. ÀϹÝÀûÀ¸·Î Manager ¾²·¹µå°¡ ¸ðµç ÀÔ·ÂÀ» Á¦¾îÇÏ°í °¢ ¾²·¹µå¿¡ ÀÛ¾÷À» ¹èºÐÇÑ´Ù. server & client ¸ðµ¨À» »ç¿ëÇÏ´Â ³×Æ®¿öÅ© ÇÁ·Î±×·¥ÀÇ Á¦ÀÛ¿¡ ³Î¸® »ç¿ëµÈ´Ù. Manager ¾²·¹µå¿¡¼­ clientÀÇ accept¸¦ ¹Þ¾ÆµéÀÌ°í »õ·Î¿î worker ¾²·¹µå¸¦ »ý¼ºÇؼ­ input (¿¬°á)À» Àü´ÞÇÏ´Â ¹æ½ÄÀÌ´Ù.
  • pipeline
    task°¡ ¿©·¯°³ÀÇ suboperation À¸·Î ³ª´µ¾î¼­ ¼öÇàÀÌ µÈ´Ù. °¢ task°¡ ó¸®ÇÑ °á°ú¸¦ ´ÙÀ½ task¿¡ ³Ñ°Ü¼­ ó¸®Çϰí ÃÖÁ¾ÀûÀ¸·Î main thread´Â ¿ÏÀüÈ÷ ó¸®µÈ µ¥ÀÌÅ͸¦ ³Ñ°Ü¹Þ´Â ½ÄÀÌ´Ù. ÀԷµ¥ÀÌÅͰ¡ long stream ÀÏ °æ¿ì¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÚµ¿Â÷ Á¶¸³ ¶óÀΰú ºñ½ÁÇÏ´Ù. Á¶¸³¶óÀÌÀ» ÄÁÅ×ÀÌ³Ê º§Æ®½ÄÀ¸·Î ¸¸µé°Ô µÊÀ¸·Î ½ÇÁ¦ Á¶¸³¶óÀο¡´Â ¿©·¯´ëÀÇ ÀÚµ¿Â÷°¡ Á¸ÀçÇÏ°Ô µÈ´Ù.
  • peer
    Manager/worker ¸ðµ¨°ú ºñ½ÁÇÏ´Ù. ±×·¯³ª main ¾²·¹µå´Â ´ÜÁö »õ·Î¿î ¾²·¹µå¸¦ »ý¼ºÇϱ⸸ ÇÑ´Ù. »ý¼ºµÈ ¾²·¹µå°¡ µ¶¸³ÀûÀ¸·Î ÀÚ½ÅÀÇ ÀÛ¾÷À» ¼öÇàÇÑ´Ù. ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹ÖÀ¸·Î º¸ÀÚ¸é, °¢°¢ÀÇ »ý¼ºµÈ ¾²·¹µå°¡ client accept()¸¦ ±â´Ù¸®´Â ¹æ½ÄÀ̶ó°í º¸¸é µÈ´Ù.

shared memory ¸ðµ¨

¸ðµç ¾²·¹µå°¡ Àü¿ª ¸Þ¸ð¸®°ø°£À» °øÀ¯ÇÏ´Â ¹æ½ÄÀÌ´Ù. ÇÁ·Î±×·¡¸Ó´Â Àü¿ª ¸Þ¸ð¸® °ø°£¿¡ ´ëÇÑ Access µ¿±âÈ­¿¡ Ư½Ã ½Å°æÀ» ½áÁà¾ß ÇÑ´Ù. ÀÌµé °ø°£¿¡ ´ëÇØ¼­

thread safeness

¾²·¹µå´Â °øÀ¯ÇÏ´Â ¸Þ¸ð¸®°ø°£¿¡ ´ëÇØ¼­ ¼­·Î Á¦¾î±ÇÀ» ¾ò±âÀ§Çؼ­ °æÀïÇÏ´Â »óÅ¿¡ ³õÀÏ ¼ö ÀÖ´Ù. ÀÌµé ¾²·¹µå°¡ ÀÚ¿øÀ» ³õ°í °æÀïÇÏ´Â °ÍÀ» Á¦¾îÇÏÁö ¾ÊÀ¸¸é ¾²·¹µå°¡ ¾ÈÀü - safeness - ÇÏÁö ¾ÊÀº »óÅ¿¡ ³õÀÌ°Ô µÈ´Ù.

¿¹¸¦µé¾î ¿©·¯°³ÀÇ ¾²·¹µå°¡ µ¿ÀÏÇÑ library ·çƾÀ» ÀÌ¿ëÇØ¼­ ´ÙÀ½°ú °°Àº ÀÛ¾÷À» ÇÑ´Ù°í °¡Á¤Çغ¸ÀÚ.
  1. ¶óÀ̺귯¸®°¡ ¸Þ¸ð¸®ÀÇ Àü¿ª ±¸Á¶Ã¼¸¦ ¿¢¼¼½º ÇÑ´Ù.
  2. °ÅÀÇ °°Àº ½Ã°£¿¡ ¾²·¹µå°¡ Àü¿ª ±¸Á¶Ã¼ÀÇ µ¥ÀÌÅ͸¦ Àаí/¾²·Á°í ÇÑ´Ù.
  3. À̶§ º¸È£ÇϰíÀÚ ÇÏ´Â µ¥ÀÌÅÍ¿µ¿ª¿¡ ´ëÇÑ µ¿±âÈ­ÀåÄ¡°¡ ¸¶·ÃµÇ¾î ÀÖÁö ¾Ê¾Ò´Ù¸é, thread safe ÇÏÁö ¾ÊÀº ¶óÀ̺귯¸®°¡ µÈ´Ù.
ÀÌ ¹®Á¦´Â ¸ÖƼ¾²·¹µå ÇÁ·Î±×·¡¹Ö½Ã ¹ß»ýÇÏ°Ô µÇ´Âµ¥, 100% thread-safe ÇÏÁö ¾ÊÀº ¿ÜºÎ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ°Ô µÉ°æ¿ì ÇÁ·Î±×·¥¿¡ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ¿ÜºÎ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ¶§´Â thread-safe ÇÑÁö¸¦ È®ÀÎÇØº¼ Çʿ䰡 ÀÖ´Ù. ´ëºÎºÐÀÇ Àß Á¤ÀÇµÈ ¶óÀ̺귯¸®´Â thread-safe ÇÑÁö¸¦ ¸í½ÃÇϰí ÀÖ´Ù.

POSIX thread

ÈçÈ÷ Pthread ¶ó°í ºÒ¸®¿ì¸ç, POSIX ¿¡¼­ Ç¥ÁØÀ¸·Î Á¦¾ÈÇÑ thread ÇÔ¼ö¸ðÀ½À¸·Î thread ¸¦ Áö¿øÇϱâÀ§ÇÑ C Ç¥ÁØ ¶óÀ̺귯¸® ¼ÂÀ» Á¦°øÇÑ´Ù. ÀÌÈÄ ¸ðµç ¿¹Á¦´Â Pthread ¸¦ ÅëÇØ¼­ ±¸ÇöÇÏ°í ¼³¸íÇÏ°Ô µÉ°ÍÀÌ´Ù.

¾²·¹µåÀÇ »ý¼º°ú Á¾·á

¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥ÀÌ Ã³À½ ½ÃÀ۵ǾúÀ»¶§ ±×°ÍÀº main()ÇÔ¼ö¸¦ ½ÇÇàÇÏ´Â ´ÜÀÏ ÇÁ·Î¼¼½º »óÅ·ΠÀÛµ¿ÇÏ°Ô µÉ°ÍÀÌ´Ù. À̰ÍÀº ±× ÀÚü·Î ÇϳªÀÇ ¿ÏÀüÇÑ ¾²·¹µåÀÌ´Ù. ÀÌ »óÅ¿¡¼­ ¿ì¸®´Â pthread_create(3) ÇÔ¼ö¸¦ ºÎ¸§À¸·Î½á »õ·Î¿î ¾²·¹µå¸¦ »ý¼ºÇÒ¼ö ÀÖ´Ù.

¾²·¹µå¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¥Àº ±âº»ÀûÀ¸·Î ¾Æ·¡¿Í °°Àº ¼ø¼­·Î ÀÛµ¿ÇÏ°Ô µÈ´Ù.
     Master Thread 
           | 
           |             pthread_create() ¿¡ ÀÇÇØ¼­ worker »ý¼º 
           | 
     +---+----+---+      worker ½ÃÀÛ 
     |   |    |   | 
     |   |    |   |      °¢°¢ÀÇ worker´Â ±×µéÀÇ ÀÛ¾÷À» ¼öÇàÇÑ´Ù. 
     |   |    |   | 
     +---+----+---+      worker ¸¦ Á¾·áÇÑ´Ù.   
           | 
           |             pthread_join()¿¡ ÀÇÇØ¼­ worker ¸¦ join ÇÑ´Ù. 
           | 
     Master Thread 
 

worker Àº ¾²·¹µå·Î ¹Ù²Ù¾î »ý°¢ÇÒ¼öµµ ÀÖ´Ù.

¾Æ·¡´Â ¾²·¹µå ÇÁ·Î±×·¥ÀÇ °¡Àå °£´ÜÇÑ ¿¹ÀÌ´Ù.
#include <stdio.h> 
#include <unistd.h> 
#include <pthread.h> 

void* do_loop(void *data)
{
    int i;

    int me = *((int *)data);
    for (i = 0; i < 10; i++)
    {
        printf("%d - Got %d\n", me, i);
        sleep(1);
    }
}

int main()
{
    int       thr_id;
    pthread_t p_thread[3];
    int status;
    int a = 1;
    int b = 2;      
    int c = 3;      

    thr_id = pthread_create(&p_thread[0], NULL, do_loop, (void *)&a);
    thr_id = pthread_create(&p_thread[1], NULL, do_loop, (void *)&b);
    thr_id = pthread_create(&p_thread[2], NULL, do_loop, (void *)&c);

    pthread_join(p_thread[0], (void **) &status);
    pthread_join(p_thread[1], (void **) &status);
    pthread_join(p_thread[2], (void **) &status);

    printf("programing is end\n");
    return 0;
}

À§ÀÇ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ½Ã۱â À§Çؼ± pthread ¶óÀ̺귯¸®¸¦ ¸µÅ©½ÃÄÑÁà¾ß ÇÑ´Ù.
[yundream@localhost test]# gcc -o thread thread.c -lpthread 
 
ÃÖÃÊ¿¡ main() ¾²·¹µå°¡ ½ÃÀÛµÇ°í ³ª¼­ pthread_create ¸¦ ÀÌ¿ëÇØ¼­ 3°³ÀÇ ¾²·¹µå¸¦ »ý¼º ½ÃÄÖ´Ù. °¢°¢ÀÇ ¾²·¹µå´Â do_loop Äڵ带 ½ÇÇàÇÑ´Ù. ¾²·¹µå°¡ ¸ðµç ÀÛ¾÷À» ¸¶ÃÆ´Ù¸é, pthread_join À» ÀÌ¿ëÇØ¼­ ´Ù¸¥ ¾²·¹µå°¡ Á¾·áµÉ¶§±îÁö ±â´Ù¸®°í, ¸ðµç ¾²·¹µå°¡ Á¾·áµÇ¾ú´Ù¸é, main()¾²·¹µå°¡ Á¾·áµÇ°í ÇÁ·Î¼¼½º´Â ¿ÏÀüÈ÷ ³¡³ª°Ô µÈ´Ù.

¾²·¹µåÀÇ »ý¼ºÀº pthread_create()¸¦ È£ÃâÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù. ù¹øÂ° ¾Æ±Ô¸ÕÆ®´Â pthread_t µ¥ÀÌŸ ±¸Á¶Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ µ¹·ÁÁִµ¥, ¾²·¹µå¿¡ ´ëÇÑ Áö½Ã°ªÀÌ µé¾î ÀÖ´Ù. °¢°¢ÀÇ ¾²·¹µå´Â °¢°¢ÀÇ À¯ÀÏÇÑ pthread_t ¸¦ °¡Áö°í ÀÖ¾î¾ß¸¸ ÇÑ´Ù. À§ÀÇ ÇÁ·Î±×·¥¿¡¼­ ¿ì¸®´Â °¢°¢ÀÇ ¾²·¹µå°¡ À¯ÀÏÇÑ p_thread ¸¦ °¡Áöµµ·Ï Çϱâ À§Çؼ­ »ý¼ºÇÒ ¾²·¹µåÀÇ ¼ö¸¸Å­(3)À» ¹è¿­·Î ¸¸µé¾ú´Ù. 2¹øÂ° ¾Æ±Ô¸ÕÆ®´Â ¾²·¹µå°¡ ¸¸µé¾îÁú¶§ÀÇ Å¸ÀÔÀÌ´Ù.

(½ºÄÉÁ층 ¿ì¼±¼øÀ§ °°Àº). º¸ÅëÀº NULL °ªÀ» »ç¿ëÇÑ´Ù. ¾²·¹µå ŸÀÔ¿¡ ´ëÇÑ ³»¿ëÀº pthread_attr_init(3) À» ÂüÁ¶Çϱ⠹ٶõ´Ù. 3¹øÂ° ¾Æ±Ô¸ÕÆ®°¡ ¹Ù·Î ¾²·¹µå°¡ ½ÇÇàÇÒ ÄÚµåÀÌ´Ù. 4¹øÂ° ¾Æ±Ô¸ÕÆ®´Â ¾²·¹µå¿¡ ³Ñ°ÜÁÖ°í ½ÍÀº °ªÀ» ¸í½ÃÇØÁÖ¸é µÈ´Ù. ¿©±â¿¡¼­´Â °¢ ¾²·¹µå¿¡ ¹øÈ£¸¦ ºÎ¿©ÇϱâÀ§ÇÑ int °ªÀ» ³Ñ°å´Ù.

°¢ ¾²·¹µå´Â 1ºÎÅÍ 10±îÁö Áõ°¡ ½ÃŲ´ÙÀ½¿¡ ¾²·¹µå¸¦ Á¾·áÇϵµ·Ï µÇ¾î ÀÖ´Ù.

±×µ¿¾È ¸ÞÀÎ ¾²·¹µå´Â pthread_join À» È£ÃâÇÏ¿©¼­ °¢°¢ÀÇ ¾²·¹µå°¡ Á¾·áÇÒ¶§±îÁö ±â´Ù¸°´Ù. 3°³ÀÇ ¾²·¹µå°¡ ¸ðµÎ Á¾·á°¡ µÈ´Ù¸é ¸ÞÀÎ ¾²·¹µå´Â "programing is end" ¸Þ½ÃÁö¸¦ Ãâ·ÂÇϰí ÇÁ·Î±×·¥À» ¿ÏÀüÈ÷ Á¾·áÇÏ°Ô µÉ°ÍÀÌ´Ù.

pthread_join Àº fork ÀÇ wait(2) ¿Í ºñ½ÁÇÏ´Ù°í º¼¼ö ÀÖ´Ù. fork ¿¡¼­µµ ÀÚ½ÄÇÁ·Î¼¼½º°¡ ¸ðµÎÁ×°í ³ª¼­ ºÎ¸ðÇÁ·Î¼¼½º°¡ Á×¾î¾ß ÇϵíÀÌ(¿¹¿Ü¸¦ ¸¸µé¼öµµ ÀÖÁö¸¸), ¾²·¹µåµµ ¸ðµç »ý¼ºµÈ ¾²·¹µå°¡ Á¾·áµÈ ´ÙÀ½¿¡ ¸ÞÀÎ ¾²·¹µå°¡ Á¾·áµÇ¾î¾ß ÇÑ´Ù.

pthread_join À» »ç¿ëÇÏ°Ô µÇ¸é ¸ÞÀÎ ¾²·¹µå´Â pthread_join ¿¡ ¸í½ÃµÈ ¾²·¹µå°¡ Á¾·áÇÒ¶§±îÁö ÀáÀڸ鼭(sleep)±â´Ù¸®°Ô µÈ´Ù. ÀÌ´Â ¸ðµç ¾²·¹µå°¡ Á¾·áÇϱâ Àü¿¡ ºÎ¸ð¾²·¹µå°¡ Á¾·áÇÏ´Â »çŸ¦ ¸·±â À§Çؼ­ »ç¿ëµÈ´Ù. ÇϳªÀÇ ¾²·¹µå°¡ ¸ðµçÀÏÀ» Á¾·áÇϰí, pthread_join À» ±ú¿ì°Ô µÇ¸é, ¾²·¹µå°¡ °¡Áö°í ÀÖ´ø ÀÚ¿øµéÀ» ¸ðµÎ µÇµ¹·ÁÁÖ°Ô µÈ´Ù (free). ¸¸¾à ½ÇÇàµÇ°í ÀÖ´Â ¾²·¹µå¸¦ Áï½Ã ÁßÁöÇÏ±æ ¿øÇÑ´Ù¸é pthread_cancel() °ú pthread_testcancel()À» »ç¿ëÇÏ¸é µÈ´Ù.

°ø¿ëÀ¸·Î »ç¿ëµÇ´Â ÀÚ¿øÀÇ µ¿±âÈ­

À§¿¡¼­ ¿ì¸®´Â ¾²·¹µå¸¦ »ç¿ëÇÒ°æ¿ì »ó´çÈ÷ ¸¹Àº ÀÚ¿øÀ» ¼­·Î °øÀ¯ÇÏ°Ô µÊÀ¸·Î ¾ò´Â ¿©·¯°¡Áö ÀÌÁ¡¿¡ ´ëÇØ¼­ ¾Ë¾ÆºÃ¾ú´Ù. ±×·¯³ª ÇϳªÀÇ ÀÚ¿øÀ» ¿©·¯°³ÀÇ ¾²·¹µå°¡ µ¿½Ã¿¡ °øÀ¯ÇÏ°Ô µÊÀ¸·Î ÀÚ¿øÈ¹µæ¿¡ °üÇÑ ¹®Á¦°¡ ¹ß»ýÇÒ¼ö ÀÖ´Ù. ½ÇÁö·Î ¾²·¹µå¸¦ »ç¿ëÇÏ°Ô µÉ°æ¿ì °¡Àå ÁÖÀÇÇØ¾ß ÇÒÁ¡ Áß Çϳª°¡ ¹Ù·Î ÀÚ¿øÀÇ µ¿½Ã Á¢±Ù¿¡ ´ëÇÑ Á¦¾îÀÌ´Ù.

±âº»ÀûÀ¸·Î ÇϳªÀÇ ¾²·¹µå°¡ ÇϳªÀÇ ÀÚ¿ø¿¡ Á¢±ÙÇϰí ÀÖÀ»¶§, ´Ù¸¥ ¾²·¹µå´Â ±× ÀÚ¿ø¿¡ ´ëÇÑ ÀÌÀü ¾²·¹µåÀÇ ÀÛ¾÷ÀÌ ¸ðµÎ ³¡³ª±âÀü¿£ Á¢±ÙÇÏ¸é ¾ÈµÉ°ÍÀÌ´Ù.

ÀÌ·±ÇÑ °øÀ¯µÇ´Â ÀÚ¿ø¿¡ ´ëÇÑ Á¢±ÙÁ¦¾î´Â IPC ¼³ºñÀÇ ¼¼¸¶Æ÷¾î¿Í ¸Å¿ì ºñ½ÁÇÑ Á¡ÀÌ ÀÖ´Ù. ¾²·¹µå¿¡¼­´Â ÀÌ·¯ÇÑ °øÀ¯µÇ´Â ÀÚ¿øÀÇ Á¢±Ù Á¦¾ó¸£ À§Çؼ­ Mutexe ¶ó´Â °ÍÀ» Á¦°øÇÑ´Ù. Mutexe ´Â ´Ù·ç¾î¾ßÇÒ ³»¿ëÀÌ ²Ï ¸¹À½À¸·Î ´ÙÀ½¹ø °­Á¿¡¼­ ´Ù·çµµ·Ï ÇϰڴÙ.
category_system
programing
category__4
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.