±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½²½âÁËLinuxϵÄLWP£¨ÇáÁ¿¼¶½ø³Ì£©¡¢½ø³Ì
¡¢ Ï̡߳¢Óû§¼¶Ï̡߳¢ÄÚºËÏ̵߳ĸÅÄî¡¢Çø±ðÓëÁªÏµ¡¢ÓÅȱµã¡¢·¢Õ¹µÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚCSDN£¬ÓÉ»ðÁú¹ûÈí¼þLinda±à¼¡¢ÍƼö¡£ |
|
Ò»¡¢¶¨Òå
ÔÙ¿´ÕýÎÄ֮ǰÎÒÒªÏÈÇ¿µ÷һϼ¸µã£º
1. LinuxÖÐûÓÐÕæÕýµÄỊ̈߳¬µ«windowsÖÐȷʵÓÐÏß³Ì
2. LinuxÖÐûÓеÄÏß³ÌÊÇÓɽø³ÌÀ´Ä£ÄâʵÏֵģ¨ÓÖ³Æ×÷£ºÇáÁ¿¼¶½ø³Ì£©
3. ËùÒÔÔÚLinuxÖУ¨ÔÚCPU½Ç¶È¿´£©½ø³Ì±»³Æ×÷ÇáÁ¿¼¶½ø³Ì£¨LWP£©
ÓÉÓÚLinuxÏÂûÓÐÕæÕýµÄỊ̈߳¬Ö»ÓÐËùνµÄÓû§¼¶Ị̈߳¬Ïß³ÌÔÚCPUµØÖ·¿Õ¼äÄÚÔËÐÐ
¹ØÓÚ½ø³Ì£¨PCB£©¡¢ÇáÁ¿¼¶½ø³Ì£¨LWP£©¡¢Ị̈߳¨TCB£©¡¢Óû§Ï̡߳¢ÄÚºËÏ̵͍߳Ò壬ÔÚÏÖ´ú²Ù×÷ϵͳÖУ¬½ø³ÌÖ§³Ö¶àÏß³Ì
¡£ ½ø³ÌÊÇ·ÖÅä×ÊÔ´£¨×ÊÔ´¹ÜÀí£©µÄ×îСµ¥Ôª£»¶øÏß³ÌÊǵ÷¶È×ÊÔ´£¨³ÌÐòÖ´ÐУ©µÄ×îСµ¥Ôª¡£ Ò»¸ö½ø³ÌµÄ×é³ÉʵÌå¿ÉÒÔ·ÖΪÁ½´ó²¿·Ö£ºÏ̼߳¯ºÏºÍ×ÊÔ´¼¯ºÏ¡£½ø³ÌÖеÄÏß³ÌÊǶ¯Ì¬µÄ¶ÔÏó£»´ú±íÁ˽ø³ÌÖ¸ÁîµÄÖ´ÐС£
a¡¢Ï̵߳ĸÅÄî
ÎÒÃÇÖªµÀ£¬½ø³ÌÔÚ¸÷×Ô¶ÀÁ¢µÄ¿Õ¼äÖÐÔËÐУ¬½ø³ÌÖ®¼ä¹²ÏíÊý¾ÝÐèÒªÓÃmmap»òÕß½ø³Ì¼äͨÐÅ»úÖÆ£¨IPC£©ÈçºÎÔÚÒ»¸ö½ø³Ì¿Õ¼äÖÐÖ´Ðжà¸öỊ̈߳¬ÓÐЩÇé¿öÐèÒªÔÚÒ»¸ö½ø³ÌÖÐͬʱִÐжà¸ö¿ØÖÆÁ÷³Ì£¬ÕâʱºòÏ߳̾ÍÅÉÉÏÁËÓ󡣬
Ï̵߳Ĵ´½¨£º
1 int pthread_create(pthread_t
*thread,NULL,void *(*start_routine)(void *),void*
arg);
|
Ï̹߳²ÏíÒÔϽø³ÌµÄ×ÊÔ´ºÍ»·¾³£º
1. **ÎļþÃèÊö·û±í**£¨Öص㣩
2. ÿÖÖÐźŵĴ¦Àí·½Ê½£¨SIG_IGN¡¢SIG_DFL»òÕß×Ô¶¨ÒåµÄÐźŴ¦Àíº¯Êý£©
3. µ±Ç°¹¤×÷Ŀ¼
4. Óû§idºÍ×éid |
Ïß³ÌÓÐ×Ô¼ºµÄ˽ÓÐÊý¾Ý£º
1. Ïß³Ìid
2. **ÉÏÏÂÎÄÐÅÏ¢£¬°üÀ¨¸÷ÖּĴæÆ÷µÄÖµ¡¢³ÌÐò¼ÆÊýÆ÷ºÍÕ»Ö¸Õë**£¨Öص㣩
3. **Õ»¿Õ¼ä£¨ÁÙʱ±äÁ¿´æ´¢ÔÚÕ»¿Õ¼äÖУ©**£¨Öص㣩
4. errno±äÁ¿
5. ÐÅºÅÆÁ±Î×Ö
6. µ÷¶ÈÓÅÏȼ¶ |
LinuxÉÏÏß³ÌλÓÚlibpthread¹²Ïí¿âÖУ¬Òò´ËÔÚ±àÒëʱҪ¼ÓÉÏ-lpthreadÑ¡Ï-l
:Ö¸Ã÷ËùÁ´½ÓµÄ¿â£©
b¡¢½ø³ÌÓëÏ̵߳ÄÁªÏµÓëÇø±ð
1. Ïß³ÌÊÇÔÚ½ø³ÌÄÚ²¿ÔËÐеÄÖ´ÐзÖÖ§
2. Ïß³ÌÊÇΪÁË×ÊÔ´¹²Ïí£¨¹²ÏíµØÖ·¿Õ¼ä£©£¬½ø³ÌÊÇΪÁË×ÊÔ´¶ÀÕ¼£¨Ë½ÓеØÖ·¿Õ¼ä£©
3. LinuxÏÂûÓÐÕæÕýµÄỊ̈߳¬ËüÊÇÀûÓýø³ÌÀ´´úÌæÊµÏÖµÄ
4. ½ø³ÌÊÇ·ÖÅä×ÊÔ´£¨×ÊÔ´¹ÜÀí£©µÄ×îСµ¥Ôª£»¶øÏß³ÌÊǵ÷¶È×ÊÔ´£¨³ÌÐòÖ´ÐУ©µÄ×îСµ¥Ôª
5. Ïß³ÌÓëÏß³ÌÖ®¼äÊǶÀÁ¢µÄ |
¶þ¡¢´«Í³½ø³ÌµÄȱµã
ÏÖʵÖÐÓкܶàÐèÒª²¢·¢´¦ÀíµÄÈÎÎñ£¬ÈçÊý¾Ý¿âµÄ·þÎñÆ÷¶Ë¡¢ÍøÂç·þÎñÆ÷¡¢´óÈÝÁ¿¼ÆËãµÈ¡£Ò»¸öÈÎÎñÊÇÒ»¸ö½ø³Ì£¬´«Í³µÄUNIX½ø³ÌÊǵ¥Ị̈߳¨Ö´ÐÐÁ÷£©µÄ£¬µ¥Ïß³ÌÒâζ×ųÌÐò±ØÐëÊÇ˳ÐòÖ´ÐУ¬µ¥¸öÈÎÎñ²»Äܲ¢·¢£»¼ÈÔÚÒ»¸öʱ¿ÌÖ»ÄÜÔËÐÐÔÚÒ»¸ö´¦ÀíÆ÷ÉÏ£¬Òò´Ë²»Äܳä·ÖÀûÓöദÀíÆ÷¿ò¼ÜµÄ¼ÆËã»ú¡£Èç¹û²ÉÓÃ¶à½ø³ÌµÄ·½·¨£¬¼´°ÑÒ»¸öÈÎÎñÓöà¸ö½ø³Ì½â¾ö£¬ÔòÓÐÈçÏÂÎÊÌ⣺
a. forkÒ»¸ö×Ó½ø³ÌµÄÏûºÄÊǺܴóµÄ£¬forkÊÇÒ»¸ö°º¹óµÄϵͳµ÷Ó㬼´Ê¹Ê¹ÓÃÏÖ´úµÄдʱ¸´ÖÆ(copy-on-write)¼¼Êõ¡£
b. ¸÷¸ö½ø³ÌÓµÓÐ×Ô¼º¶ÀÁ¢µÄµØÖ·¿Õ¼ä£¬½ø³Ì¼äµÄÐ×÷ÐèÒª¸´ÔÓµÄIPC£¨½ø³Ì¼äͨÐÅ£©¼¼Êõ£¬Èç***ÏûÏ¢¶ÓÁС¢¹²ÏíÄÚ´æ¡¢ÐźÅÁ¿***µÈ¡£ |
a¡¢¶àÏ̵߳ÄÓÅȱµã
Ị̈߳ºÆäʵ¿ÉÒÔÏȼòµ¥Àí½â³ÉcpuµÄÒ»¸öÖ´ÐÐÁ÷£¬Ö¸ÁîÐòÁС£¶àÖ§³Ö¶àÏ̵߳ijÌÐò(½ø³Ì)¿ÉÒÔÈ¡µÃÕæÕýµÄ²¢ÐÐ(parallelism)£¬ÇÒÓÉÓÚ¹²Ïí½ø³ÌµÄ´úÂëºÍÈ«¾ÖÊý¾Ý£¬¹ÊÏ̼߳äµÄͨÐÅÊÇ·½±ãµÄ¡£ËüµÄȱµãÒ²ÊÇÓÉÓÚÏ̹߳²Ïí½ø³ÌµÄµØÖ·¿Õ¼ä£¬Òò´Ë¿ÉÄܻᵼÖ¾ºÕù£¬Òò´Ë¶Ôijһ¿éÓжà¸öÏß³ÌÒª·ÃÎʵÄÊý¾ÝÐèҪһЩͬ²½¼¼Êõ¡£ |
b¡¢ÇáÁ¿¼¶½ø³ÌLWP
¼ÈÈ»³Æ×÷ÇáÁ¿¼¶½ø³Ì£¬¿É¼ûÆä±¾ÖÊÈÔÈ»Êǽø³Ì£¬ÓëÆÕͨ½ø³ÌÏà±È£¬LWPÓëÆäËü½ø³Ì¹²ÏíËùÓУ¨»ò´ó²¿·Ö£©Âß¼µØÖ·¿Õ¼äºÍϵͳ×ÊÔ´£¬Ò»¸ö½ø³Ì¿ÉÒÔ´´½¨¶à¸öLWP£¬ÕâÑùËüÃǹ²Ïí´ó²¿·Ö×ÊÔ´£»LWPÓÐËü×Ô¼ºµÄ½ø³Ì±êʶ·û£¬²¢ºÍÆäËû½ø³ÌÓÐן¸×Ó¹ØÏµ£»ÕâÊǺÍÀàUnix²Ù×÷ϵͳµÄϵͳµ÷ÓÃvfork()Éú³ÉµÄ½ø³ÌÒ»ÑùµÄ¡£LWPÓÉÄں˹ÜÀí²¢ÏñÆÕͨ½ø³ÌÒ»Ñù±»µ÷¶È¡£LinuxÄÚºËÊÇÖ§³ÖLWPµÄµäÐÍÀý×Ó¡£LinuxÄÚºËÔÚ
2.0.x°æ±¾¾ÍÒѾʵÏÖÁËÇáÁ¿½ø³Ì£¬Ó¦ÓóÌÐò¿ÉÒÔͨ¹ýÒ»¸öͳһµÄclone()ϵͳµ÷Óýӿڣ¬Óò»Í¬µÄ²ÎÊýÖ¸¶¨´´½¨ÇáÁ¿½ø³Ì»¹ÊÇÆÕͨ½ø³Ì£¬Í¨¹ý²ÎÊý¾ö¶¨×Ó½ø³ÌºÍ¸¸½ø³Ì¹²ÏíµÄ×ÊÔ´ÖÖÀàºÍÊýÁ¿£¬ÕâÑù¾ÍÓÐÁËÇáÖØÖ®·Ö¡£ÔÚÄÚºËÖУ¬
clone()µ÷Óþ¹ý²ÎÊý´«µÝºÍ½âÊͺó»áµ÷ÓÃdo_fork()£¬Õâ¸öºËÄÚº¯ÊýͬʱҲÊÇfork()¡¢vfork()ϵͳµ÷ÓõÄ×îÖÕʵÏÖ¡£
ÔÚ´ó¶àÊýϵͳÖУ¬LWPÓëÆÕͨ½ø³ÌµÄÇø±ðÒ²ÔÚÓÚËüÖ»ÓÐÒ»¸ö×îСµÄÖ´ÐÐÉÏÏÂÎĺ͵÷¶È³ÌÐòËùÐèµÄͳ¼ÆÐÅÏ¢£¬¶øÕâÒ²ÊÇËüÖ®ËùÒÔ±»³ÆÎªÇáÁ¿¼¶µÄÔÒò¡£
ÒòΪLWPÖ®¼ä¹²ÏíËüÃǵĴ󲿷Ö×ÊÔ´£¬ËùÒÔËüÔÚijЩӦÓóÌÐò¾Í²»ÊÊÓÃÁË£»Õâ¸öʱºò¾ÍҪʹÓöà¸öÆÕͨµÄ½ø³ÌÁË¡£ÀýÈ磬ΪÁ˱ÜÃâÄÚ´æÐ¹Â©£¨a
process can be replaced by another one£©ºÍʵÏÖÌØÈ¨·Ö¸ô£¨processes
can run under other credentials and have other permissions£©¡£
c¡¢Óû§Ïß³Ì
ÕâÀïµÄÓû§Ïß³ÌÖ¸µÄÊÇÍêÈ«½¨Á¢ÔÚÓû§¿Õ¼äµÄÏ߳̿⣬Óû§Ï̵߳Ľ¨Á¢£¬Í¬²½£¬Ïú»Ù£¬µ÷¶ÈÍêÈ«ÔÚÓû§¿Õ¼äÍê³É£¬²»ÐèÒªÄں˵İïÖú¡£Òò´ËÕâÖÖÏ̵߳IJÙ×÷ÊǼ«Æä¿ìËÙµÄÇÒµÍÏûºÄµÄ¡£

ÉÏͼÊÇ×î³õµÄÒ»¸öÓû§Ïß³ÌÄ£ÐÍ£¬´ÓÖпÉÒÔ¿´³ö£¬½ø³ÌÖаüº¬Ị̈߳¬Óû§Ïß³ÌÔÚÓû§¿Õ¼äÖÐʵÏÖ£¬Äں˲¢Ã»ÓÐÖ±½Ó¶ÔÓû§Ï߳̽ø³Ìµ÷¶È£¬Äں˵ĵ÷¶È¶ÔÏóºÍ´«Í³½ø³ÌÒ»Ñù£¬»¹Êǽø³Ì±¾Éí£¬Äں˲¢²»ÖªµÀÓû§Ï̵߳ĴæÔÚ¡£Óû§Ïß³ÌÖ®¼äµÄµ÷¶ÈÓÉÔÚÓû§¿Õ¼äʵÏÖµÄÏ߳̿âʵÏÖ¡£
ÕâÖÖÄ£ÐͶÔÓ¦×Å¿ÖÁúÊéÖÐÌáµ½µÄ¶à¶ÔÒ»Ïß³ÌÄ£ÐÍ£¬ÆäȱµãÊÇÒ»¸öÓû§Ïß³ÌÈç¹û×èÈûÔÚϵͳµ÷ÓÃÖУ¬ÔòÕû¸ö½ø³Ì¶¼½«»á×èÈû¡£
d¡¢ÄÚºËÏß³Ì
Óû§Ì¬Ï̺߳ÍÄÚºË̬Ị̈߳»Ö÷ÒªµÄÇø·Ö¾ÍÊÇ¡°ËÀ´¹ÜÀí¡±Ị̈߳¬Óû§Ì¬ÊÇÓû§¹ÜÀí£¬ÄÚºË̬ÊÇÄں˹ÜÀí£¨µ«¿Ï¶¨ÒªÌṩһЩAPI£¬ÀýÈç´´½¨£©¡£
Óû§Ïß³ÌÓëÄÚºËÏß³ÌÓÅÁÓÊÆ£º
1£©¿ÉÒÆÖ²ÐÔ£ºÒòΪULTÍêÈ«ÔÚÓû§Ì¬ÊµÏÖỊ̈߳¬Òò´ËÒ²¾ÍºÍ¾ßÌåµÄÄÚºËûÓÐʲô¹ØÏµ£¬¿ÉÒÆÖ²ÐÔ·½ÃæULTÂÔʤһ³ï£»
2£©¿ÉÀ©Õ¹ÐÔ£ºULTÊÇÓÉÓû§¿ØÖƵģ¬Òò´ËÀ©Õ¹Ò²¾ÍÈÝÒ×£»Ïà·´£¬KLTÀ©Õ¹¾ÍºÜ²»ÈÝÒ×£¬»ù±¾ÉÏÖ»ÄÜÊÜÖÆÓÚ¾ßÌåµÄ²Ù×÷ϵͳÄںˣ»
3£©ÐÔÄÜ£ºÓÉÓÚULTµÄÏß³ÌÊÇÔÚÓû§Ì¬£¬¶ÔÓ¦µÄÄں˲¿·Ö»¹ÊÇÒ»¸ö½ø³Ì£¬Òò´ËULT¾ÍûÓа취ÀûÓöദÀíÆ÷µÄÓÅÊÆ£¬¶øKLT¾Í¿ÉÒÔͨ¹ýµ÷¶È½«Ï̷ֲ߳¼ÔÚ¶à¸ö´¦ÀíÉÏÔËÐУ¬ÕâÑùKLTµÄÐÔÄܸߵöࣻÁíÍ⣬һ¸öULTµÄÏß³Ì×èÈû£¬ËùÓеÄÏ̶߳¼×èÈû£¬¶øKLTÒ»¸öÏß³Ì×èÈû²»»áÓ°ÏìÆäËüÏ̡߳£
4£©±à³Ì¸´ÔÓ¶È£ºULTµÄËùÓйÜÀí¹¤×÷¶¼ÒªÓÉÓû§À´Íê³É£¬¶øKLT½ö½öÐèÒªµ÷ÓÃAPI½Ó¿Ú£¬Òò´ËULTÒª±ÈKLT¸´ÔӵĶࡣ |
С½á
Æäʵ×î³õ¸ù±¾Ã»ÓÐÏ̵߳ĸÅÄֻÓнø³Ì£¬Ò»¸öÈÎÎñÒ»¸ö½ø³ÌÒ»¸öÖ´ÐÐÁ÷£¬¶àÈÎÎñ´¦Àí»ú¾ÍÊÇ¶à½ø³Ì¡£ºóÀ´Ìá³öÏ̵߳ĸÅÄµ«ÊÇÒªÈçºÎȥʵÏÖ£¬ÕâÀï¾ÍÓкܶàÖÖʵÏÖ·½·¨ÁË£¬¿ÉÒÔÏëµ½Á½ÖÖʵÏÖ·½·¨£¬Ò»ÖÖ¾ÍÊÇÉÏÃæËù˵µÄÓû§Ï̵߳ķ½·¨£¬ÆäÓÅȱµãÉÏÎÄÒÔ¼òÊö£»ÔÙÓоÍÊÇÓÃÇáÁ¿¼¶½ø³ÌȥģÄ⣬¼´ÎÒÃÇ¿ÉÒÔ°ÑLWP¿´³ÉÊÇÒ»¸öÏ̡߳£¾ÍÒòΪÕâ¸öʹµÃÏ̺߳ͽø³ÌµÄ¸ÅÄî»ìÏýÁË£¬ÓÐÈË˵ϵͳµ÷¶Èµ¥Î»Êǽø³Ì£¬ÓÖÓÐÈË˵ÊÇỊ̈߳¬Æäʵϵͳµ÷¶ÈµÄµ¥Î»Ò»Ö±¾ÍûÓиı䣬ֻÊǺóÀ´²¿·ÖÏ̺߳ͽø³ÌµÄ½çÏÞÄ£ºýÁË£¬ÖÁÉÙÉÏÎÄÖеÄÓû§Ï߳̾ø¶Ô²»Êǵ÷¶È¶ÔÏó£¬LWPÄ£ÄâµÄÏß³ÌÈ´Êǵ÷¶È¶ÔÏó¡£ |
Áí¸½£º
LinuxÏ̷߳¢Õ¹
Õâ¸ö¶ÔÓÚÀí½âLinux¶àÏ̺߳ÜÓаïÖú£¬¿Éϧ¡¶ÉîÈëÀí½âLinuxÄںˡ·Õâ±¾ÊéÖ»×ÖδÌᣬ¸ù±¾Ã»½²Linux¶àÏ̵߳ĻúÀí£¬ÖÁÉÙÎÒû¿´¶®¡£
Ò»Ö±ÒÔÀ´, linuxÄں˲¢Ã»ÓÐÏ̵߳ĸÅÄî. ÿһ¸öÖ´ÐÐʵÌå¶¼ÊÇÒ»¸ötask_struct½á¹¹, ͨ³£³ÆÖ®Îª½ø³Ì.
LinuxÄÚºËÔÚ 2.0.x°æ±¾¾ÍÒѾʵÏÖÁËÇáÁ¿½ø³Ì£¬Ó¦ÓóÌÐò¿ÉÒÔͨ¹ýÒ»¸öͳһµÄclone()ϵͳµ÷Óýӿڣ¬Óò»Í¬µÄ²ÎÊýÖ¸¶¨´´½¨ÇáÁ¿½ø³Ì»¹ÊÇÆÕͨ½ø³Ì¡£ÔÚÄÚºËÖУ¬
clone()µ÷Óþ¹ý²ÎÊý´«µÝºÍ½âÊͺó»áµ÷ÓÃdo_fork()£¬Õâ¸öºËÄÚº¯ÊýͬʱҲÊÇfork()¡¢vfork()ϵͳµ÷ÓõÄ×îÖÕʵÏÖ¡£ºóÀ´ÎªÁËÒýÈë¶àỊ̈߳¬Linux2.0~2.4ʵÏÖµÄÊÇË׳ÆLinuxThreadsµÄ¶àÏ̷߳½Ê½£¬µ½ÁË2.6£¬»ù±¾É϶¼ÊÇNPTLµÄ·½Ê½ÁË¡£ÏÂÃæÎÒÃÇ·Ö±ð½éÉÜ¡£
a¡¢Ä£ÐÍÒ» £ºLinuxThreads
×¢£ºÒÔÏÂÄÚÈÝÖ÷Òª²Î¿¼¡°ÑîɳÖÞ (mailto:pubb@163.net?subject=Linux
Ïß³ÌʵÏÖ»úÖÆ·ÖÎö&cc=pubb@163.net)¹ú·À¿Æ¼¼´óѧ¼ÆËã»úѧԺ¡±µÄ¡°Linux Ïß³ÌʵÏÖ»úÖÆ·ÖÎö¡±¡£
linux 2.6ÒÔǰ, pthreadÏ߳̿â¶ÔÓ¦µÄʵÏÖÊÇÒ»¸öÃû½ÐlinuxthreadsµÄlib.ÕâÖÖʵÏÖ±¾ÖÊÉÏÊÇÒ»ÖÖLWPµÄʵÏÖ·½Ê½£¬¼´Í¨¹ýÇáÁ¿¼¶½ø³ÌÀ´Ä£ÄâỊ̈߳¬Äں˲¢²»ÖªµÀÓÐÏß³ÌÕâ¸ö¸ÅÄÔÚÄں˿´À´£¬¶¼Êǽø³Ì¡£
Linux²ÉÓõġ°Ò»¶ÔÒ»¡±µÄÏß³ÌÄ£ÐÍ£¬¼´Ò»¸öLWP¶ÔÓ¦Ò»¸öÏ̡߳£Õâ¸öÄ£ÐÍ×î´óµÄºÃ´¦ÊÇÏ̵߳÷¶ÈÓÉÄÚºËÍê³ÉÁË£¬¶øÆäËûÏ̲߳Ù×÷£¨Í¬²½¡¢È¡Ïû£©µÈ¶¼ÊǺËÍâµÄÏ߳̿⺯ÊýÍê³ÉµÄ¡£
linuxÉϵÄÏ߳̾ÍÊÇ»ùÓÚÇáÁ¿¼¶½ø³Ì, ÓÉÓû§Ì¬µÄpthread¿âʵÏÖµÄ.ʹÓÃpthreadÒÔºó,
ÔÚÓû§¿´À´, ÿһ¸ötask_struct¾Í¶ÔÓ¦Ò»¸öÏß³Ì, ¶øÒ»×éÏß³ÌÒÔ¼°ËüÃÇËù¹²Í¬ÒýÓõÄÒ»×é×ÊÔ´¾ÍÊÇÒ»¸ö½ø³Ì.µ«ÊÇ,
Ò»×éÏ̲߳¢²»½ö½öÊÇÒýÓÃͬһ×é×ÊÔ´¾Í¹»ÁË, ËüÃÇ»¹±ØÐë±»ÊÓΪһ¸öÕûÌå.
¶Ô´Ë, POSIX±ê×¼Ìá³öÁËÈçÏÂÒªÇó:
1£º
²é¿´½ø³ÌÁбíµÄʱºò, Ïà¹ØµÄÒ»×étask_structÓ¦µ±±»Õ¹ÏÖΪÁбíÖеÄÒ»¸ö½Úµã;
2£º ·¢Ë͸øÕâ¸ö"½ø³Ì"µÄÐźÅ(¶ÔÓ¦killϵͳµ÷ÓÃ),
½«±»¶ÔÓ¦µÄÕâÒ»×étask_structËù¹²Ïí, ²¢ÇÒ±»ÆäÖеÄÈÎÒâÒ»¸ö"Ïß³Ì"´¦Àí;
3£º ·¢Ë͸øÄ³¸ö"Ïß³Ì"µÄÐźÅ(¶ÔÓ¦pthread_kill),
½«Ö»±»¶ÔÓ¦µÄÒ»¸ötask_struct½ÓÊÕ, ²¢ÇÒÓÉËü×Ô¼ºÀ´´¦Àí;
4£º µ±"½ø³Ì"±»Í£Ö¹»ò¼ÌÐøÊ±(¶ÔÓ¦SIGSTOP/SIGCONTÐźÅ),
¶ÔÓ¦µÄÕâÒ»×étask_struct״̬½«¸Ä±ä;
5£º µ±"½ø³Ì"ÊÕµ½Ò»¸öÖÂÃüÐźÅ(±ÈÈçÓÉÓڶδíÎóÊÕµ½SIGSEGVÐźÅ),
¶ÔÓ¦µÄÕâÒ»×étask_struct½«È«²¿Í˳ö;
6£º µÈµÈ(ÒÔÉÏ¿ÉÄܲ»¹»È«); |
ÔÚLinuxThreadsÖУ¬×¨ÃÅΪÿһ¸ö½ø³Ì¹¹ÔìÁËÒ»¸ö¹ÜÀíỊ̈߳¬¸ºÔð´¦ÀíÏß³ÌÏà¹ØµÄ¹ÜÀí¹¤×÷¡£µ±½ø³ÌµÚÒ»´Îµ÷ÓÃpthread_create()´´½¨Ò»¸öÏ̵߳Äʱºò¾Í»á´´½¨²¢Æô¶¯¹ÜÀíÏ̡߳£È»ºó¹ÜÀíÏß³ÌÔÙÀ´´´½¨Óû§ÇëÇóµÄÏ̡߳£Ò²¾ÍÊÇ˵£¬Óû§ÔÚµ÷ÓÃpthread_createºó£¬ÏÈÊÇ´´½¨Á˹ÜÀíỊ̈߳¬ÔÙÓɹÜÀíÏ̴߳´½¨ÁËÓû§µÄÏ̡߳£
linuxthreadsÀûÓÃÇ°ÃæÌáµ½µÄÇáÁ¿¼¶½ø³ÌÀ´ÊµÏÖÏß³Ì, µ«ÊǶÔÓÚPOSIXÌá³öµÄÄÇЩҪÇó, linuxthreads³ýÁ˵Ú5µãÒÔÍâ,
¶¼Ã»ÓÐʵÏÖ(ʵ¼ÊÉÏÊÇÎÞÄÜΪÁ¦):
1,
Èç¹ûÔËÐÐÁËA³ÌÐò, A³ÌÐò´´½¨ÁË10¸öÏß³Ì, ÄÇôÔÚshellÏÂÖ´ÐÐpsÃüÁîʱ½«¿´µ½11¸öA½ø³Ì,
¶ø²»ÊÇ1¸ö(×¢Òâ, Ò²²»ÊÇ10¸ö, ÏÂÃæ»á½âÊÍ);
2, ²»¹ÜÊÇkill»¹ÊÇpthread_kill, ÐźÅÖ»Äܱ»Ò»¸ö¶ÔÓ¦µÄÏß³ÌËù½ÓÊÕ;
3, SIGSTOP/SIGCONTÐźÅÖ»¶ÔÒ»¸öÏß³ÌÆð×÷ÓÃ; |
»¹ºÃlinuxthreadsʵÏÖÁ˵Ú5µã, ÎÒÈÏΪÕâÒ»µãÊÇ×îÖØÒªµÄ.
Èç¹ûij¸öÏ̡߳±¹Ò¡±ÁË, Õû¸ö½ø³Ì»¹ÔÚÈôÎÞÆäʵØÔËÐÐ×Å, ¿ÉÄÜ»á³öÏֺܶàµÄ²»Ò»ÖÂ״̬. ½ø³Ì½«²»ÊÇÒ»¸öÕûÌå,
¶øÏß³ÌÒ²²»ÄܳÆÎªÏß³Ì. »òÐíÕâÒ²ÊÇΪʲôlinuxthreadsËäÈ»ÓëPOSIXµÄÒªÇó²î¾àÉõÔ¶, È´Äܹ»´æÔÚ,
²¢ÇÒ»¹±»Ê¹ÓÃÁ˺ü¸ÄêµÄÔÒò°É~
µ«ÊÇ, linuxthreadsΪÁËʵÏÖÕâ¸ö¡±µÚ5µã¡±, »¹ÊǸ¶³öÁ˺ܶà´ú¼Û, ²¢ÇÒ´´ÔìÁËlinuxthreads±¾ÉíµÄÒ»´óÐÔÄÜÆ¿¾±.
½ÓÏÂÀ´ÒªËµËµ, ΪʲôA³ÌÐò´´½¨ÁË10¸öÏß³Ì, µ«ÊÇpsʱȴ»á³öÏÖ11¸öA½ø³ÌÁË. ÒòΪlinuxthreads×Ô¶¯´´½¨ÁËÒ»¸ö¹ÜÀíÏß³Ì.
ÉÏÃæÌáµ½µÄ¡±µÚ5µã¡±¾ÍÊÇ¿¿¹ÜÀíÏß³ÌÀ´ÊµÏÖµÄ.
µ±³ÌÐò¿ªÊ¼ÔËÐÐʱ, ²¢Ã»ÓйÜÀíÏ̴߳æÔÚ(ÒòΪ¾¡¹Ü³ÌÐòÒѾÁ´½ÓÁËpthread¿â, µ«ÊÇδ±Ø»áʹÓöàÏß³Ì).
³ÌÐòµÚÒ»´Îµ÷ÓÃpthread_createʱ, linuxthreads·¢ÏÖ¹ÜÀíÏ̲߳»´æÔÚ, ÓÚÊÇ´´½¨Õâ¸ö¹ÜÀíÏß³Ì.
Õâ¸ö¹ÜÀíÏß³ÌÊǽø³ÌÖеĵÚÒ»¸öÏß³Ì(Ö÷Ïß³Ì)µÄ¶ù×Ó.
È»ºóÔÚpthread_createÖÐ, »áͨ¹ýpipeÏò¹ÜÀíÏ̷߳¢ËÍÒ»¸öÃüÁî, ¸æËßËü´´½¨Ïß³Ì. ¼´ÊÇ˵,
³ýÖ÷Ïß³ÌÍâ, ËùÓеÄÏ̶߳¼ÊÇÓɹÜÀíÏß³ÌÀ´´´½¨µÄ, ¹ÜÀíÏß³ÌÊÇËüÃǵĸ¸Ç×.
ÓÚÊÇ, µ±ÈκÎÒ»¸ö×ÓÏß³ÌÍ˳öʱ, ¹ÜÀíÏ߳̽«ÊÕµ½SIGUSER1ÐźÅ(ÕâÊÇÔÚͨ¹ýclone´´½¨×ÓÏß³Ìʱָ¶¨µÄ).
¹ÜÀíÏß³ÌÔÚ¶ÔÓ¦µÄsig_handlerÖлáÅжÏ×ÓÏß³ÌÊÇ·ñÕý³£Í˳ö, Èç¹û²»ÊÇ, ÔòɱËÀËùÓÐÏß³Ì, È»ºó×Ôɱ.
ÄÇô, Ö÷Ïß³ÌÔõô°ìÄØ? Ö÷Ïß³ÌÊǹÜÀíÏ̵߳ĸ¸Ç×, ÆäÍ˳öʱ²¢²»»á¸ø¹ÜÀíÏ̷߳¢ÐźÅ. ÓÚÊÇ, ÔÚ¹ÜÀíÏ̵߳ÄÖ÷Ñ»·ÖÐͨ¹ýgetppid¼ì²é¸¸½ø³ÌµÄIDºÅ,
Èç¹ûIDºÅÊÇ1, ˵Ã÷¸¸Ç×ÒѾÍ˳ö, ²¢°Ñ×Ô¼ºÍйܸøÁËinit½ø³Ì(1ºÅ½ø³Ì). Õâʱºò, ¹ÜÀíÏß³ÌÒ²»áɱµôËùÓÐ×ÓÏß³Ì,
È»ºó×Ôɱ.
¿É¼û, Ï̵߳Ĵ´½¨ÓëÏú»Ù¶¼ÊÇͨ¹ý¹ÜÀíÏß³ÌÀ´Íê³ÉµÄ, ÓÚÊǹÜÀíÏ߳̾ͳÉÁËlinuxthreadsµÄÒ»¸öÐÔÄÜÆ¿¾±.
´´½¨ÓëÏú»ÙÐèÒªÒ»´Î½ø³Ì¼äͨÐÅ, Ò»´ÎÉÏÏÂÎÄÇл»Ö®ºó²ÅÄܱ»¹ÜÀíÏß³ÌÖ´ÐÐ, ²¢ÇÒ¶à¸öÇëÇó»á±»¹ÜÀíÏ̴߳®ÐеØÖ´ÐÐ.
ÕâÖÖͨ¹ýLWPµÄ·½Ê½À´Ä£ÄâÏ̵߳ÄʵÏÖ¿´ÆðÀ´»¹ÊDZȽÏÇÉÃîµÄ£¬µ«Ò²´æÔÚһЩ±È½ÏÑÏÖØµÄÎÊÌ⣺
1£©Ïß³ÌIDºÍ½ø³ÌIDµÄÎÊÌâ
°´ÕÕPOSIXµÄ¶¨Ò壬ͬһ½ø³ÌµÄËùÓеÄÏß³ÌÓ¦¸Ã¹²Ïíͬһ¸ö½ø³ÌºÍ¸¸½ø³ÌID£¬¶øLinuxµÄÕâÖÖLWP·½Ê½ÏÔÈ»²»ÄÜÂú×ãÕâÒ»µã¡£
2£©ÐźŴ¦ÀíÎÊÌâ
Òì²½ÐźÅÊÇÒÔ½ø³ÌΪµ¥Î»·Ö·¢µÄ£¬¶øLinuxµÄÏ̱߳¾ÖÊÉÏÿ¸ö¶¼ÊÇÒ»¸ö½ø³Ì£¬ÇÒûÓнø³Ì×éµÄ¸ÅÄËùÒÔijЩȱʡÐźÅÄÑÒÔ×öµ½¶ÔËùÓÐÏß³ÌÓÐЧ£¬ÀýÈçSIGSTOPºÍSIGCONT£¬¾ÍÎÞ·¨½«Õû¸ö½ø³Ì¹ÒÆð£¬¶øÖ»Äܽ«Ä³¸öÏß³Ì¹ÒÆð¡£
3£©Ïß³Ì×ÜÊýÎÊÌâ
LinuxThreads½«Ã¿¸ö½ø³ÌµÄÏß³Ì×î´óÊýÄ¿¶¨ÒåΪ1024£¬µ«Êµ¼ÊÉÏÕâ¸öÊýÖµ»¹Êܵ½Õû¸öϵͳµÄ×ܽø³ÌÊýÏÞÖÆ£¬ÕâÓÖÊÇÓÉÓÚÏß³ÌÆäʵÊǺËÐĽø³Ì¡£
4)¹ÜÀíÏß³ÌÎÊÌâ
¹ÜÀíÏß³ÌÈÝÒ׳ÉΪƿ¾±£¬ÕâÊÇÕâÖֽṹµÄͨ²¡£»Í¬Ê±£¬¹ÜÀíÏß³ÌÓÖ¸ºÔðÓû§Ï̵߳ÄÇåÀí¹¤×÷£¬Òò´Ë£¬¾¡¹Ü¹ÜÀíÏß³ÌÒѾÆÁ±ÎÁ˴󲿷ֵÄÐźţ¬µ«Ò»µ©¹ÜÀíÏß³ÌËÀÍö£¬Óû§Ï߳̾Ͳ»µÃ²»ÊÖ¹¤ÇåÀíÁË£¬¶øÇÒÓû§Ï̲߳¢²»ÖªµÀ¹ÜÀíÏ̵߳Ä״̬£¬Ö®ºóµÄÏ̴߳´½¨µÈÇëÇó½«ÎÞÈË´¦Àí¡£
5)ͬ²½ÎÊÌâ
LinuxThreadsÖеÄÏß³Ìͬ²½ºÜ´ó³Ì¶ÈÉÏÊǽ¨Á¢ÔÚÐźŻù´¡Éϵģ¬ÕâÖÖͨ¹ýÄں˸´ÔÓµÄÐźŴ¦Àí»úÖÆµÄͬ²½·½Ê½£¬Ð§ÂÊÒ»Ö±ÊǸöÎÊÌâ¡£
6£©ÆäËûPOSIX¼æÈÝÐÔÎÊÌâ
LinuxÖкܶàϵͳµ÷Ó㬰´ÕÕÓïÒå¶¼ÊÇÓë½ø³ÌÏà¹ØµÄ£¬±ÈÈçnice¡¢setuid¡¢setrlimitµÈ£¬ÔÚĿǰµÄLinuxThreadsÖУ¬ÕâЩµ÷Óö¼½ö½öÓ°Ïìµ÷ÓÃÕßÏ̡߳£
7£©ÊµÊ±ÐÔÎÊÌâ
Ï̵߳ÄÒýÈëÓÐÒ»¶¨µÄʵʱÐÔ¿¼ÂÇ£¬µ«LinuxThreadsÔÝʱ²»Ö§³Ö£¬±ÈÈçµ÷¶ÈÑ¡ÏĿǰ»¹Ã»ÓÐʵÏÖ¡£²»½öLinuxThreadsÈç´Ë£¬±ê×¼µÄLinuxÔÚʵʱÐÔÉÏ¿¼ÂǶ¼ºÜÉÙ
b¡¢Ä£ÐͶþ£ºNPTL
µ½ÁËlinux 2.6, glibcÖÐÓÐÁËÒ»ÖÖеÄpthreadÏ߳̿â¨CNPTL(Native POSIX
Threading Library).
±¾ÖÊÉÏÀ´Ëµ£¬NPTL»¹ÊÇÒ»¸öLWPµÄʵÏÖ»úÖÆ£¬µ«Ïà¶ÔÔÓÐLinuxThreadsÀ´Ëµ£¬×öÁ˺ܶàµÄ¸Ä½ø¡£ÏÂÃæÎÒÃÇ¿´Ò»ÏÂNPTLÈçºÎ½â¾öÔÓÐLinuxThreadsʵÏÖ»úÖÆµÄȱÏÝ
NPTLʵÏÖÁËÇ°ÃæÌáµ½µÄPOSIXµÄÈ«²¿5µãÒªÇó. µ«ÊÇ, ʵ¼ÊÉÏ, ÓëÆä˵ÊÇNPTLʵÏÖÁË, ²»Èç˵ÊÇlinuxÄÚºËʵÏÖÁË.
ÔÚlinux 2.6ÖÐ, ÄÚºËÓÐÁËÏß³Ì×éµÄ¸ÅÄî, task_struct½á¹¹ÖÐÔö¼ÓÁËÒ»¸ötgid(thread
group id)×Ö¶Î.
Èç¹ûÕâ¸ötaskÊÇÒ»¸ö¡±Ö÷Ï̡߳±, ÔòËüµÄtgidµÈÓÚpid, ·ñÔòtgidµÈÓÚ½ø³ÌµÄpid(¼´Ö÷Ï̵߳Äpid).
ÔÚcloneϵͳµ÷ÓÃÖÐ, ´«µÝCLONE_THREAD²ÎÊý¾Í¿ÉÒÔ°Ñнø³ÌµÄtgidÉèÖÃΪ¸¸½ø³ÌµÄtgid(·ñÔòнø³ÌµÄtgid»áÉèΪÆä×ÔÉíµÄpid).
ÀàËÆµÄXXidÔÚtask_structÖл¹ÓÐÁ½ ¸ö£ºtask->signal->pgid±£´æ½ø³Ì×éµÄ´òÍ·½ø³ÌµÄpid¡¢task->signal->session±£´æ»á»°
´òÍ·½ø³ÌµÄpid¡£Í¨¹ýÕâÁ½¸öidÀ´¹ØÁª½ø³Ì×éºÍ»á»°¡£
ÓÐÁËtgid, Äں˻òÏà¹ØµÄshell³ÌÐò¾ÍÖªµÀij¸ötast_structÊÇ´ú±íÒ»¸ö½ø³Ì»¹ÊÇ´ú±íÒ»¸öÏß³Ì,
Ò²¾ÍÖªµÀÔÚʲôʱºò¸ÃÕ¹ÏÖËüÃÇ, ʲôʱºò²»¸ÃÕ¹ÏÖ(±ÈÈçÔÚpsµÄʱºò, Ï߳̾Ͳ»ÒªÕ¹ÏÖÁË).
¶øgetpid(»ñÈ¡½ø³ÌID)ϵͳµ÷Ó÷µ»ØµÄÒ²ÊÇtast_structÖеÄtgid, ¶øtast_structÖеÄpidÔòÓÉgettidϵͳµ÷ÓÃÀ´·µ»Ø.
ÔÚÖ´ÐÐpsÃüÁîµÄʱºò²»Õ¹ÏÖ×ÓỊ̈߳¬Ò²ÊÇÓÐһЩÎÊÌâµÄ¡£±ÈÈç³ÌÐòa.outÔËÐÐʱ£¬´´½¨ ÁËÒ»¸öÏ̡߳£¼ÙÉèÖ÷Ï̵߳ÄpidÊÇ10001¡¢×ÓÏß³ÌÊÇ10002£¨ËüÃǵÄtgid¶¼ÊÇ10001£©¡£ÕâʱÈç¹ûÄãkill
10002£¬ÊÇ¿ÉÒÔ°Ñ10001ºÍ10002ÕâÁ½¸öÏß³ÌÒ»ÆðɱËÀµÄ£¬¾¡¹ÜÖ´ÐÐpsÃüÁîµÄʱºò¸ù±¾¿´²»µ½10002Õâ¸ö½ø³Ì¡£Èç¹ûÄã²»ÖªµÀlinuxÏ̱߳³
ºóµÄ¹ÊÊ£¬¿Ï¶¨»á¾õµÃÓöµ½ÁéÒìʼþÁË¡£
ΪÁËÓ¦¸¶¡±·¢Ë͸ø½ø³ÌµÄÐźš±ºÍ¡±·¢Ë͸øÏ̵߳ÄÐźš±, task_structÀïÃæÎ¬»¤ÁËÁ½Ì×signal_pending,
Ò»Ì×ÊÇÏß³Ì×é¹²ÏíµÄ, Ò»Ì×ÊÇÏ̶߳ÀÓеÄ.
ͨ¹ýkill·¢Ë͵ÄÐźű»·ÅÔÚÏß³Ì×é¹²ÏíµÄsignal_pendingÖÐ, ¿ÉÒÔÓÉÈÎÒâÒ»¸öÏß³ÌÀ´´¦Àí;
ͨ¹ýpthread_kill·¢Ë͵ÄÐźÅ(pthread_killÊÇpthread¿âµÄ½Ó¿Ú, ¶ÔÓ¦µÄϵͳµ÷ÓÃÖÐtkill)±»·ÅÔÚÏ̶߳ÀÓеÄsignal_pendingÖÐ,
Ö»ÄÜÓɱ¾Ïß³ÌÀ´´¦Àí.
µ±Ïß³ÌÍ£Ö¹/¼ÌÐø, »òÕßÊÇÊÕµ½Ò»¸öÖÂÃüÐźÅʱ, Äں˻Ὣ´¦Àí¶¯×÷Ê©¼Óµ½Õû¸öÏß³Ì×éÖÐ.
NGPT
ÉÏÃæÌáµ½µÄÁ½ÖÖÏ߳̿âʹÓõͼÊÇÄں˼¶Ïß³Ì(ÿ¸öÏ̶߳¼¶ÔÓ¦ÄÚºËÖеÄÒ»¸öµ÷¶ÈʵÌå), ÕâÖÖÄ£ÐͳÆÎª1:1Ä£ÐÍ(1¸öÏ̶߳ÔÓ¦1¸öÄں˼¶Ïß³Ì);
¶øNGPTÔò´òËãʵÏÖM:NÄ£ÐÍ(M¸öÏ̶߳ÔÓ¦N¸öÄں˼¶Ïß³Ì), Ò²¾ÍÊÇ˵Èô¸É¸öÏ߳̿ÉÄÜÊÇÔÚͬһ¸öÖ´ÐÐʵÌåÉÏʵÏÖµÄ.
Ï߳̿âÐèÒªÔÚÒ»¸öÄÚºËÌṩµÄÖ´ÐÐʵÌåÉϳéÏó³öÈô¸É¸öÖ´ÐÐʵÌå, ²¢ÊµÏÖËüÃÇÖ®¼äµÄµ÷¶È. ÕâÑù±»³éÏó³öÀ´µÄÖ´ÐÐʵÌå³ÆÎªÓû§¼¶Ïß³Ì.
´óÌåÉÏ, Õâ¿ÉÒÔͨ¹ýΪÿ¸öÓû§¼¶Ï̷߳ÖÅäÒ»¸öÕ», È»ºóͨ¹ýlongjmpµÄ·½Ê½½øÐÐÉÏÏÂÎÄÇл». (°Ù¶Èһϡ±setjmp/longjmp¡±,
Äã¾ÍÖªµÀ.)
µ«ÊÇʵ¼ÊÉÏÒª´¦ÀíµÄϸ½ÚÎÊÌâ·Ç³£Ö®¶à. ĿǰµÄNGPTºÃÏñ²¢Ã»ÓÐʵÏÖËùÓÐÔ¤ÆÚµÄ¹¦ÄÜ, ²¢ÇÒÔÝʱҲ²»×¼±¸È¥ÊµÏÖ.
Óû§¼¶Ï̵߳ÄÇл»ÏÔȻҪ±ÈÄں˼¶Ï̵߳ÄÇл»¿ìһЩ, ǰÕß¿ÉÄÜÖ»ÊÇÒ»¸ö¼òµ¥µÄ³¤Ìø×ª, ¶øºóÕßÔòÐèÒª±£´æ/×°ÔØ¼Ä´æÆ÷,
½øÈëÈ»ºóÍ˳öÄÚºË̬. (½ø³ÌÇл»Ôò»¹ÐèÒªÇл»µØÖ·¿Õ¼äµÈ.)
¶øÓû§¼¶Ïß³ÌÔò²»ÄÜÏíÊܶദÀíÆ÷, ÒòΪ¶à¸öÓû§¼¶Ï̶߳ÔÓ¦µ½Ò»¸öÄں˼¶Ïß³ÌÉÏ, Ò»¸öÄں˼¶Ïß³ÌÔÚͬһʱ¿ÌÖ»ÄÜÔËÐÐÔÚÒ»¸ö´¦ÀíÆ÷ÉÏ.
²»¹ý, M:NµÄÏß³ÌÄ£ÐͱϾ¹ÌṩÁËÕâÑùÒ»ÖÖÊÖ¶Î, ¿ÉÒÔÈò»ÐèÒª²¢ÐÐÖ´ÐеÄÏß³ÌÔËÐÐÔÚÒ»¸öÄں˼¶Ï̶߳ÔÓ¦µÄÈô¸É¸öÓû§¼¶Ïß³ÌÉÏ,
¿ÉÒÔ½ÚÊ¡ËüÃǵÄÇл»¿ªÏú.¾Ý˵һЩÀàUNIXϵͳ(ÈçSolaris)ÒѾʵÏÖÁ˱ȽϳÉÊìµÄM:NÏß³ÌÄ£ÐÍ,
ÆäÐÔÄÜ±ÈÆðlinuxµÄÏ̻߳¹ÊÇÓÐ×ÅÒ»¶¨µÄÓÅÊÆ.
|