::: °­ÁÂ/¼Ò½º/¹®¼­ :::

°­ÁÂ/¼Ò½º/¹®¼­ ¼º°Ý¿¡ ¸ÂÁö ¾Ê´Â ±¤°í,ºñ¹æ,Áú¹®ÀÇ ±ÛÀº Áï½Ã »èÁ¦Çϸç
³»¿ëÀ» º¹»çÇÏ¿© »ç¿ëÇÒ °æ¿ì ¹Ýµå½Ã ÀÌ°÷(http://www.howto.pe.kr)À» Ãâó·Î ¸í½ÃÇÏ¿© ÁÖ¼¼¿ä


Category

  ±è¿µ´ë(2003-07-17 16:37:42, Hit : 12739, Vote : 2427
 [thread] POSIX thread ¿¡ °üÇÑ ¸î°¡Áö Âü°í»çÇ×

1// Á¦   ¸ñ: POSIX thread ¿¡ °üÇÑ ¸î°¡Áö Âü°í»çÇ×
// ÀÛ¼ºÀÚ: ±è¿µ´ë( http://www.howto.pe.kr )

1.¾²·¹µå
1) ¾²·¹µå°£¿¡ °øÀ¯ÇÏ´Â ÀÚ¿ø
   .work directory,
   .heap
   .global/static variable
   .UID/GID
   .code segment
   .file/socket descriptor
   .signal
2) ¾²·¹µå °íÀ¯ ÀÚ¿ø
   .errno
   .¾²·¹µå ¿ì¼±¼øÀ§
   .stack
   .¾²·¹µå ID
   .register (PC, SP, ¡¦)

2.ÇÁ·Î±×·¡¹Ö °üÁ¡¿¡¼­ÀÇ ¾²·¹µå ºÐ·ù
(ÁÖÀÇ) ¸¹Àº ¹®¼­µé¿¡¼­ Ä¿³Î ¾²·¹µå ¸¦ ³íÇÒ ¶§ ¿ë¾î¿¡ È¥µ·ÀÌ ¿Ã ¼ö ÀÖ´Ù
       ÀüÅëÀûÀÎ O/SÀÇ Kernel Thread ´Â O/S ¿µ¿ª¿¡ À§Ä¡ÇÏ¿© Kernel Scheduler¿¡ ÀÇÇØ ½ºÄÉÁÙ¸µµÇ´Â
       ¾²·¹µå¸¦ ÀǹÌÇÏÁö¸¸ ÇÁ·Î±×·¡¹Ö½ÃÀÇ Ä¿³Î ¾²·¹µå´Â LWP ÀڷᱸÁ¶¸¦ ÅëÇÏ¿© Kernel Thread ¿¡
       bound µÇ¾î »ç¿ëµÇ´Â »ç¿ëÀÚ ÇÁ·Î¼¼½ºÀÇ ¾²·¹µå¸¦ Ä¿³Î ¾²·¹µå¶ó ÇÏ°í ÀÖ´Ù
       ±×·¡¼­ ÀÌÇÏ O/SÀÇ Ä¿³Î ¾²·¹µå¸¦ 'Kernel Thread' ¶ó ÇÏ°í ÇÁ·Î±×·¡¹Ö½ÃÀÇ Ä¿³Î ¾²·¹µå´Â ±×³É
       'Ä¿³Î ¾²·¹µå'¶ó ĪÇÑ´Ù

1.»ç¿ëÀÚ ·¹º§ ¾²·¹µå, user-level thread  (project Andrew)
  .»ç¿ëÀÚ ¾²·¹µå ¹æ½ÄÀÌ Ä¿³Î ¾²·¹µåº¸´Ù ¿À¹öÇìµå°¡ ÀûÀº ÀÌÀ¯´Â ¾²·¹µå°£ context switching½Ã
   Ä¿³Î ½ºÄÉÁÙ·¯¸¦ È£ÃâÇÒ ÇÊ¿ä°¡ ¾øÀÌ ¶óÀ̺귯¸®¿¡ ÀÇÇØ Á¦°øµÇ´Â »ç¿ëÀÚÂÊ ½ºÄÉÁÙ·¯¿¡ ÀÇÇØ Ã³¸®µÈ´Ù
  .»ç¿ëÀÚ ¾²·¹µåÀÇ ´ÜÁ¡Àº ÇÁ·Î¼¼½º³»ÀÇ ÇÑ ¾²·¹µå°¡ Ä¿³Î·Î ÁøÀÔÇÏ´Â ¼ø°£ ³ª¸ÓÁö ¾²·¹µåµéµµ ÀüºÎ
   blockingµÈ´Ù. Ä¿³Î ¾²·¹µåÀÇ °æ¿ì´Â Kernel Thread¿¡ bound µÇ¾î Kernel Scheduler¿¡ ÀÇÇØ ½ºÄÉÁÙ¸µ
   µÇ¹Ç·Î blocking ÀÌ ¹ß»ýÇÏÁö ¾Ê´Â´Ù. ±×·¯¹Ç·Î ÇÁ·Î±×·¡¹Ö½Ã read/write °°Àº ½Ã½ºÅÛÄÝÀÌ ¸¹Àº °æ¿ì´Â
   Ä¿³Î ¾²·¹µå¸¦ »ç¿ëÇÏ´Â °ÍÀÌ À¯¸®ÇÏ´Ù
  .¶Ç´Ù¸¥ ´ÜÁ¡Àº CPU°¡ ¾Æ¹«¸® ¸¹´õ¶óµµ »ç¿ëÀÚ ¾²·¹µå´Â Ä¿³Î¿¡ÀÇÇØ ÀνĵÇÁö ¾Ê´Â ¾²·¹µå À̹ǷÎ
   »ç¿ëÀÚ ¾²·¹µå°¡ À§Ä¡ÇÑ ÇÁ·Î¼¼½º ´ÜÀ§·Î ½ºÄÉÁÙ¸µÀÌ ÀÌ·ç¾î Áö¹Ç·Î ÇÑ ÇÁ·Î¼¼½º³»ÀÇ ¸ðµç »ç¿ëÀÚ
   ¾²·¹µå´Â 1°³ÀÇ CPU ¸¸ ÇÒ´ç¹Þ°Ô µÈ´Ù(SMP:Symmetric Multi Processor »ç¿ë¸øÇÔ).
  .¶óÀ̺귯¸®¿¡ ÀÇÇÑ ºü¸¥ context switching (Ä¿³ÎÀÚ¿ø »ç¿ë ÃÖ¼ÒÈ­)
  .system call È£Ãâ½Ã À¯Àú ¸ðµå¿¡¼­ Ä¿³Î ¸ðµå·Î Àüȯ½Ã task ³»ÀÇ ¸ðµç thread °¡ block µÊ
  .unfair scheduling (preemption, non-preemption)
          
2.Ä¿³Î ·¹º§ ¾²·¹µå, kernel-level thread  (Windows NT, MACH, OS/2)
  .Ä¿³Î ¾²·¹µå´Â Kernel Scheduler¿¡ ÀÇÇØ CPU¸¦ ÇÒ´ç¹Þ¾Æ »ç¿ëÇϹǷΠÇÁ·Î±×·¥¿¡¼­ ½Ã½ºÅÛÄÝÀ» »ç¿ë½Ã
   blocking µÇÁö ¾Ê°í ¶ÇÇÑ dual/quad µî º¹¼ö CPU ½Ã ¸ðµç CPU¸¦ ½ºÄÉÁÙ¸µ ¹Þ¾Æ »ç¿ëÇÑ´Ù(SMP »ç¿ë).
  .¾²·¹µå°£ context switchÇÒ ¶§¸¶´Ù Kernel Scheduler¸¦ È£ÃâÇØ¾ß ÇϹǷΠKernel Scheduler·Î ÁøÀÔÇÏ·Á¸é
   ÇÁ·Î¼¼¼­ ¸ðµå¸¦ »ç¿ëÀÚ ¸ðµå¿¡¼­ Ä¿³Î ¸ðµå·Î ÀüȯÇØ¾ß Çϴµ¥, À̶§ »ç¿ëÀÚÂÊ Çϵå¿þ¾î ·¹Áö½ºÅ͸¦
   ÀüºÎ ÀúÀå½ÃÅ°°í, Ä¿³Î ·¹Áö½ºÅ͸¦ º¹±¸ÇÏ°í, ±âŸ µîµî...ÀÇ overhead °¡ ÀϾ´Ù.
  .°¢ thread º°·Î schedule µÉ ¼ö ÀÖÀ½
  .¹®¸ÆÀüȯ(context switch) ½Ã kernel scheduler ·Î ÁøÀÔÇϱâÀ§ÇÑ(user mode -> kernel mode)
   overhead ¹ß»ý (user-level thread ¿¡ ºñÇØ 10¹è)
  .°¢ thread °¡ µ¿½Ã¿¡ system call ÇÒ ¼ö ÀÖÀ½
        
3.ÇÏÀ̺긮µå ¾²·¹µå, hybrid thread (Solaris 2)
  .3-levels of thread (user-level thread, LWP, kernel-level thead)
  .°¢ task (process)´Â ÃÖ¼ÒÇÑ ÇϳªÀÇ LWP ¿¡ bound µÊ
  .kernelÀº LWP ´ÜÀ§·Î ½ºÄÉÁÙ¸µÇÏ°í, LWP´Â ´ë±âÁßÀÎ thread¸¦ °ñ¶ó¼­(bound) ½ÇÇà
  .LWP (Lightweight Process) ´Â thread library ¿¡ ÀÇÇØ Á¶À۵Ǹç
   LWP ´Â register data, accounting info, memory info ¸¦ Æ÷ÇÔÇÑ ÀÏÁ¾ÀÇ PCB(Process Control Block)
  .LWPÀÇ context switching ºñ¿ëÀº kernel-level threas º¸´Ù °áÄÚ ½ÎÁö ¾Ê½À´Ï´Ù
  .´ÙÁß CPU¿¡¼­ È¿À²ÀûÀÏ·Á¸é °¢ Thread´Â °¢°¢ ´Ù¸¥ LWP¿¡ ÇÒ´çµÇ¾î¾ß ÇÑ´Ù.
  .°¢ ThreadÀÇ LWP ÇÒ´ç°ú LWPÀÇ CPU ÇÒ´çÀº º°°³·Î¼­ ÀÌ·ç¾îÁö±â ¶§¹®¿¡, °¢ Thread°¡ ¼­·Î´Ù¸¥ CPU¿¡
   ÇÒ´çµÉ·Á¸é ÀÌ·¸°Ô ÀÛµ¿ÇÏ°Ú²û ÇÏ´Â ¸ÅÄ¿´ÏÁòÀÌ µû·Î Á¸ÀçÇÏ¿©¾ß ÇÑ´Ù.

  1).PTHREAD_SCOPE_PROCESS - It is not lightweight
    .pthread_attr_setscope() ÇÔ¼ö¿¡¼­ PTHREAD_SCOPE_PROCESS ·Î ÁöÁ¤
    .ÇϳªÀÇ LWP¸¦ °øÀ¯ÇÏ¿©(N:1) thread pooleÀ» ÀÌ·ç¾î ¶óÀ̺귯¸®¿¡ ÀÇÇØ ½ºÄÉÁÙ¸µ µÇ¹Ç·Î LWP¿Í °°Àº ÀÚ¿øÀ»
     ´ú »ç¿ëÇÏ°í context overhead °¡ Àû´Ù.
    .LWP°¡ BlockingÀÌ µÇ¸é ÀÌ LWP¿¡ bound µÈ ¾²·¹µåµéµµ µ¿½Ã¿¡ BlockingÀÌ µÈ´Ù
    
  2).PTHREAD_SCOPE_SYSTEM - multiplexes threads to kernel ones
    .pthread_attr_setscope() ÇÔ¼ö¿¡¼­ PTHREAD_SCOPE_SYSTEM ·Î ÁöÁ¤
    .thread ´ç LWP °¡ ¿µ±¸ÀûÀ¸·Î ÇÒ´çµÇ¾î(1:1) Kernel Thread ¿¡ bound µÇ¾î Ä¿³Î°ú ¿¬°áµÈ´Ù

3.Ç÷§Æûº° Pthread Áö¿ø ÇöȲ
* JAVAÀÇ °æ¿ì´Â JVM ÀÌ native thread ¸¦ »ç¿ëÇϹǷΠÇ÷§Æû¿¡ ÀÇÁ¸ÀûÀÌ´Ù

1) Linux
   .clone() ½Ã½ºÅÛ ÄÝÀ» ±â¹ÝÇϹǷÎ(kernel basedÀÇ LWP ¹æ½Ä) PTHREAD_SCOPE_SYSTEM ¸¸ Áö¿øÇÑ´Ù
   .PTHREAD_SCOPE_SYSTEM ¸¸ Áö¿øµÇ¹Ç·Î default µµ PTHREAD_SCOPE_SYSTEM ÀÌ´Ù.
   .¾²·¹µå ÇÁ·Î±×·¡¹ÖÀÇ µð¹ö±ëÀÌ ºÒÆíÇÏ´Ù

2) IBM - AIX
   . kernel based(PTHREAD_SCOPE_SYSTEM), library based(PTHREAD_SCOPE_PROCESS) ¸ðµÎ Áö¿øÇÑ´Ù
   . PTHREAD_SCOPE_PROCESS °¡ default ÀÌ´Ù

3) SUN - Soalris
   . kernel based(PTHREAD_SCOPE_SYSTEM), library based(PTHREAD_SCOPE_PROCESS) ¸ðµÎ Áö¿øÇÑ´Ù
   . PTHREAD_SCOPE_PROCESS °¡ default ÀÌ´Ù
   .¾²·¹µå ÇÁ·Î±×·¡¹ÖÀÇ µð¹ö±ëÀÌ ÆíÇÏ´Ù

4) FreeBSD
   . library based(PTHREAD_SCOPE_PROCESS) ¸¸ Áö¿øÇÑ´Ù
   .PTHREAD_SCOPE_PROCESS ¸¸ Áö¿øµÇ¹Ç·Î default µµ PTHREAD_SCOPE_PROCESS ÀÌ´Ù.
   .¾²·¹µå ÇÁ·Î±×·¡¹ÖÀÇ µð¹ö±ëÀÌ ÆíÇÏ´Ù





  [º´·Ä ÇÁ·Î±×·¡¹Ö] [thread] POSIX thread ¿¡ °üÇÑ ¸î°¡Áö Âü°í»çÇ×  ±è¿µ´ë 2003/07/17 12739 2427
6   [º´·Ä ÇÁ·Î±×·¡¹Ö] [MPI] MPICH 1.2.5 ¼³Ä¡  ±è¿µ´ë 2003/04/09 14868 2214
5   [º´·Ä ÇÁ·Î±×·¡¹Ö] [OpenMP] Parallelizing the Mandelbrot Set  ±è¿µ´ë 2003/03/15 8953 2326
4   [º´·Ä ÇÁ·Î±×·¡¹Ö] [MPI] Parallelizing the Mandelbrot Set  ±è¿µ´ë 2003/03/15 8261 1928
3   [º´·Ä ÇÁ·Î±×·¡¹Ö] [MPI] N-Body Problem  ±è¿µ´ë 2003/03/15 8573 9001
2   [º´·Ä ÇÁ·Î±×·¡¹Ö] [MPI] Prime Number Generation  ±è¿µ´ë 2003/03/15 7862 1960
1   [º´·Ä ÇÁ·Î±×·¡¹Ö] [MPI] Game of Life (Conway`s Game of Life)  ±è¿µ´ë 2003/03/15 8899 1944

1
 

Copyright 1999-2025 Zeroboard / skin by zero