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 ÀÌ´Ù.
.¾²·¹µå ÇÁ·Î±×·¡¹ÖÀÇ µð¹ö±ëÀÌ ÆíÇÏ´Ù
|
|