¡¡¡¡ÓëÐí¶àÆäËü¶àÏß³Ì UNIX® ÄÚºËËù²ÉÈ¡µÄģʽÀàËÆ£¬ FreeBSD »á¸³ÓèÖжϴ¦Àí³ÌÐò¶ÀÁ¢µÄÏß³ÌÉÏÏÂÎÄ£¬ ÕâÑù×öÄܹ»ÈÃÖжÏÏß³ÌÔÚÓöµ½ËøÊ±×èÈû¡£ µ«ÎªÁ˱ÜÃâ²»±ØÒªµÄÑÓ³Ù£¬ ÖжÏÏß³ÌÔÚÄÚºËÖУ¬ ÊÇÒÔʵʱÏ̵߳ÄÓÅÏȼ¶ÔËÐеġ£ Òò´Ë£¬ Öжϴ¦Àí³ÌÐò²»Ó¦Ö´Ðйý¾Ã£¬ ÒÔÃâ¶öËÀÆäËüÄÚºËÏ̡߳£ ´ËÍ⣬ ÓÉÓÚ¶à¸ö´¦Àí³ÌÐò¿ÉÒÔ·ÖÏíͬһÖжÏỊ̈߳¬ Öжϴ¦Àí³ÌÐò²»Ó¦ÐÝÃߣ¬ »òʹÓÿÉÄܵ¼ÖÂÐÝÃßµÄËø£¬ ÒÔ±ÜÃ⽫ÆäËüÖжϴ¦Àí³ÌÐò¶öËÀ¡£
¡¡¡¡Ä¿Ç°ÔÚ FreeBSD ÖеÄÖжÏÏß³ÌÊÇÖ¸ÖØÁ¿¼¶ÖжÏÏ̡߳£ ÕâÑù³ÆºôËüÃǵÄÔÒòÔÚÓÚ£¬ תµ½ÖжÏÏß³ÌÐèÒªÖ´ÐÐÒ»´ÎÍêÕûµÄÉÏÏÂÎÄÇл»²Ù×÷¡£ ÔÚ×î³õµÄʵÏÖÖУ¬ Äں˲»ÔÊÐíÇÀÕ¼£¬ Òò´ËÖжÏÔÚ´ò¶ÏÄÚºËÏß³Ì֮ǰ£¬ ±ØÐëµÈ´ýÄÚºËÏß³Ì×èÈû»ò·µ»ØÓû§Ì¬Ö®ºó²ÅÄÜÖ´ÐС£
¡¡¡¡ÎªÁ˽â¾öÏìӦʱ¼äÎÊÌ⣬ FreeBSD ÄÚºËÏÖÔÚ²ÉÓÃÁËÇÀռʽµ÷¶È²ßÂÔ¡£ Ŀǰ£¬ Ö»ÓÐÊÍ·ÅÐÝÃß mutex »ò·¢ÉúÖжÏʱ²ÅÄÜÇÀ¶ÏÄÚºËỊ̈߳¬ µ«×îÖÕÄ¿±êÊÇÔÚ FreeBSD ÉÏʵÏÖÏÂÃæËùÃèÊöµÄÈ«ÇÀռʽµ÷¶È²ßÂÔ¡£
¡¡¡¡²¢·ÇËùÓеÄÖжϴ¦Àí³ÌÐò¶¼ÔÚ¶ÀÁ¢µÄÏß³ÌÉÏÏÂÎÄÖÐÖ´ÐС£ Ïà·´£¬
ijЩ´¦Àí³ÌÐò»áÖ±½ÓÔÚÖ÷ÖжÏÉÏÏÂÎÄÖÐÖ´ÐС£ ÕâЩÖжϴ¦Àí³ÌÐò£¬ ÏÖÔÚ±»´íÎóµØÃüÃûΪ ¡°¿ìËÙ¡±
Öжϴ¦Àí³ÌÐò£¬ ÒòΪÔçÆÚ°æ±¾µÄÄÚºËÖÐʹÓÃÁË INTR_FAST
±êÖ¾À´±ê¼ÇÕâЩ´¦Àí³ÌÐò¡£ ĿǰֻÓÐʱÖÓÖжϺʹ®¿Ú I/O É豸ÖжϲÉÓÃÕâÒ»ÀàÐÍ¡£
ÓÉÓÚÕâЩ´¦Àí³ÌÐòûÓжÀÁ¢µÄÉÏÏÂÎÄ£¬ Òò¶øËüÃǶ¼²»ÄÜ»ñµÃ×èÈûÐÔËø£¬ Òò´ËÒ²¾ÍÖ»ÄÜʹÓÃ×ÔÐý
mutex¡£
¡¡¡¡×îºó£¬ »¹ÓÐÒ»ÖÖ³ÆÎªÇáÁ¿¼¶ÉÏÏÂÎÄÇл»µÄÓÅ»¯£¬ ¿ÉÒÔÔÚ MD ´úÂëÖÐʹÓᣠÒòΪÖжÏÏ̶߳¼ÊÇÔÚÄÚºËÉÏÏÂÎÄÖÐÖ´Ðеģ¬ ËùÒÔËü¿ÉÒÔ½èÓÃÈÎÒâ½ø³ÌµÄ vmspace (ÐéÄâÄÚ´æµØÖ·¿Õ¼ä)¡£ Òò´Ë£¬ ÔÚÇáÁ¿¼¶ÉÏÏÂÎÄÇл»ÖУ¬ Çл»µ½ÖжÏÏ̲߳¢²»Çл»¶ÔÓ¦µÄ vmspace£¬ ¶øÊǽèÓñ»ÖжÏÏß³ÌµÄ vmspace¡£ Ϊȷ±£±»ÖжÏÏß³ÌµÄ vmspace ²»ÔÚÖжϴ¦Àí¹ý³ÌÖÐÏûʧ£¬ ±»ÖжÏÏß³ÌÔÚÖжÏÏ̲߳»ÔÙ½èÓÃÆä vmspace ֮ǰÊDz»ÔÊÐíÖ´Ðеġ£ ¸Õ²ÅÌáµ½µÄÇé¿ö¿ÉÄÜÔÚÖжÏÏß³Ì×èÈû»òÍê³Éʱ·¢Éú¡£ Èç¹ûÖжÏÏ̷߳¢Éú×èÈû£¬ ÔòËüÔٴνøÈë¿ÉÔËÐÐ״̬ʱ½«Ê¹ÓÃ×Ô¼ºµÄÉÏÏÂÎÄ£¬ ÕâÑùÒ»À´£¬ ¾Í¿ÉÒÔÊͷű»ÖжϵÄÏß³ÌÁË¡£
¡¡¡¡ÕâÖÖÓÅ»¯µÄ»µ´¦ÔÚÓÚËüÃǺÍÓ²¼þ½ôÃÜÏà¹Ø£¬ ¶øÇÒʵÏֱȽϸ´ÔÓ£¬ Òò´ËÖ»ÓÐÔÚÕâÑù×öÄÜ´øÀ´´ó·ùÐÔÄܸÄÉÆÊ±²ÅÓ¦²ÉÓᣠĿǰÕâÑù˵¿ÉÄÜ»¹ÎªÊ±¹ýÔ磬 ¶øÇÒÊÂʵÉÏ¿ÉÄܻᷴ¶øµ¼ÖÂÐÔÄÜϽµ£¬ ÒòΪ¼¸ºõËùÓеÄÖжϴ¦Àí³ÌÐò¶¼»áÁ¢¼´±»È«¾ÖËø (Giant) ×èÈû£¬ ¶øÕâÖÖ×èÈû½«½ø¶øÐèÒªÏß³ÌÐÞÕý¡£ ÁíÍ⣬ Mike Smith ÌáÒé²ÉÓÃÁíÒ»ÖÖ·½Ê½À´´¦ÀíÖжÏỊ̈߳º
ÿ¸öÖжϴ¦Àí³ÌÐò·ÖΪÁ½²¿·Ö£¬ Ò»¸öÔÚÖ÷ÖжÏÉÏÏÂÎÄÖÐÔËÐеÄÖ÷Ìå (predicate) ºÍÒ»¸öÔÚ×Ô¼ºµÄÏß³ÌÉÏÏÂÎÄÖÐÖ´ÐеĴ¦Àí³ÌÐò (handler)¡£
Èç¹ûÖжϴ¦Àí³ÌÐòÓµÓÐÖ÷Ì壬 Ôòµ±´¥·¢ÖжÏʱ£¬ Ö´ÐиÃÖ÷Ìå¡£ Èç¹ûÖ÷Ìå·µ»ØÕ棬 ÔòÈÏΪ¸ÃÖжϱ»´¦ÀíÍê±Ï£¬ Äں˴ÓÖжϷµ»Ø¡£ Èç¹ûÖ÷Ìå·µ»Ø¼Ù£¬ »òÕßÖжÏûÓÐÖ÷Ì壬 Ôòµ÷¶ÈÔËÐÐÏß³Ìʽ´¦Àí³ÌÐò¡£
¡¡¡¡ÔÚÕâһģʽÖÐÊʵ±µØ²ÉÓÃÇáÁ¿¼¶ÉÏÏÂÎÄÇл»¿ÉÄÜÊǷdz£¸´Ôӵġ£ ÒòΪÎÒÃÇ¿ÉÄÜ»áÏ£ÍûÔÚδÀ´¸Ä±äÕâһģʽ£¬ Òò´ËÏÖÔÚ×îºÃµÄ·½°¸£¬ Ó¦¸ÃÊÇÔÝÊ±ÍÆ³ÙÔÚÇáÁ¿¼¶ÉÏÏÂÎÄÇл»Ö®ÉϵŤ×÷£¬ ÒÔ±ã½øÒ»²½ÍêÉÆÖжϴ¦Àí¼Ü¹¹£¬ ËæºóÔÙ¿¼²ìÇáÁ¿¼¶ÉÏÏÂÎÄÇл»ÊÇ·ñÊÊÓá£
¡¡¡¡ÄÚºËÇÀÕ¼µÄ¸ÅÄîºÜ¼òµ¥£¬ Æä»ù±¾Ë¼ÏëÊÇ CPU ×ÜÓ¦Ö´ÐÐÓÅÏȼ¶×î¸ßµÄ¹¤×÷¡£ µ±È»£¬ ÖÁÉÙÔÚÀíÏëÇé¿öÏÂÊÇÕâÑù¡£ ÓÐЩʱºò£¬ ´ï³ÉÕâÒ»ÀíÏëµÄ´ú¼Û»áÊ®·Ö¸ß°º£¬ ÒÔÖÁÓÚÔÚÕâЩÇé¿öÏÂÇÀÕ¼»áµÃ²»³¥Ê§¡£
¡¡¡¡ÊµÏÖÍêÈ«µÄÄÚºËÇÀռʮ·Ö¼òµ¥£º ÔÚµ÷¶È½«ÒªÖ´ÐеÄÏ̲߳¢·ÅÈëÔËÐжÓÁÐʱ£¬ ¼ì²éËüµÄÓÅÏȼ¶ÊÇ·ñ¸ßÓÚĿǰÕýÔÚÖ´ÐеÄÏ̡߳£ Èç¹ûÊÇÕâÑùµÄ»°£¬ Ö´ÐÐÒ»´ÎÉÏÏÂÎÄÇл»²¢Á¢¼´¿ªÊ¼Ö´ÐиÃÏ̡߳£
¡¡¡¡¾¡¹ÜËøÄܹ»ÔÚÇÀռʱ±£»¤¶àÊýÊý¾Ý£¬ µ«Äں˲¢²»ÊÇ¿ÉÒÔ°²È«µØ´¦´¦ÇÀÕ¼µÄ¡£ ÀýÈ磬
Èç¹û³ÖÓÐ×ÔÐý mutex µÄÏ̱߳»ÇÀÕ¼£¬ ¶øÐÂÏß³ÌÒ²³¢ÊÔ»ñµÃͬһ×ÔÐý mutex£¬
ÐÂÏ߳̾ͿÉÄÜÒ»Ö±×ÔÐýÏÂÈ¥£¬ ÒòΪ±»ÖжϵÄÏ߳̿ÉÄÜÓÀԶûÓлú»áÔËÐÐÁË¡£ ´ËÍ⣬ ijЩ´úÂ룬
ÀýÈçÔÚ Alpha É쵀 exec
¶Ô½ø³ÌµØÖ·¿Õ¼ä±àºÅ½øÐи³ÖµµÄ´úÂëÒ²²»Äܱ»ÇÀ¶Ï£¬ ÒòΪËü±»ÓÃÀ´Ö§³Öʵ¼ÊµÄÉÏÏÂÎÄÇл»²Ù×÷¡£
ÔÚÕâЩ´úÂë¶ÎÖУ¬ »áͨ¹ýʹÓÃÁÙ½çÇøÀ´ÁÙʱ½ûÓÃÇÀÕ¼¡£
¡¡¡¡ÁÙ½çÇø API µÄÔðÈÎÊDZÜÃâÔÚÁÙ½çÇøÄÚ·¢ÉúÉÏÏÂÎÄÇл»¡£ ¶ÔÓÚÍêÈ«ÇÀռʽÄں˶øÑÔ£¬
³ýÁ˵±Ç°Ïß³ÌÖ®ÍâµÄÆäËüÏ̵߳Äÿ¸ö setrunqueue
¶¼ÊÇÇÀ¶Ïµã¡£
critical_enter
µÄÒ»ÖÖʵÏÖ·½Ê½ÊÇÉèÖÃÒ»Ïß³Ì˽Óбê¼Ç£¬
²¢ÓÉÆä¶ÔÓ¦·½Çå³ý¡£ Èç¹ûµ÷Óà setrunqueue
ʱÉèÖÃÁËÕâ¸ö±êÖ¾£¬
ÔòÎÞÂÛÐÂÏ̺߳͵±Ç°Ïß³ÌÏà±ÈÆäÓÅÏȼ¶¸ßµÍ£¬ ¶¼²»»á·¢ÉúÇÀÕ¼¡£ È»¶ø£¬ ÓÉÓÚÁÙ½çÇø»áÔÚ×ÔÐý mutex
ÖÐÓÃÓÚ±ÜÃâÉÏÏÂÎÄÇл»£¬ ¶øÇÒÄܹ»Í¬Ê±»ñµÃ¶à¸ö×ÔÐý mutex£¬ Òò´ËÁÙ½çÇø API ±ØÐëÖ§³ÖǶÌס£
ÓÉÓÚÕâ¸öÔÒò£¬ ĿǰµÄʵÏÖÖвÉÓÃÁËǶÌ×¼ÆÊý£¬ ¶ø²»½ö½öÊǵ¥¸öµÄÏ̱߳êÖ¾¡£
¡¡¡¡ÎªÁ˾¡¿ÉÄÜËõ¶ÌÏìӦʱ¼ä£¬ ÔÚÁÙ½çÇøÖеÄÇÀÕ¼±»ÍƳ٣¬ ¶ø²»ÊÇÖ±½Ó¶ªÆú¡£ Èç¹ûÏß³ÌÓ¦±»ÇÀ¶Ï£¬ ²¢±»ÖÃΪ¿ÉÔËÐУ¬ ¶øµ±Ç°Ï̴߳¦ÓÚÁÙ½çÇø£¬ Ôò»áÉèÖÃÒ»Ïß³Ì˽ÓбêÖ¾£¬ ±íʾÓÐÒ»¸öÉÐδ½øÐеÄÇÀ¶Ï²Ù×÷¡£ µ±×îÍâ²ãÁÙ½çÇøÍ˳öʱ£¬ »á¼ì²éÕâÒ»±êÖ¾£¬ Èç¹ûËü±»ÖÃ룬 Ôòµ±Ç°Ï̻߳ᱻÇÀ¶Ï£¬ ÒÔÔÊÐí¸ü¸ßÓÅÏȼ¶µÄÏ߳̿ªÊ¼ÔËÐС£
¡¡¡¡ÖжϻáÒý·¢Ò»¸öºÍ×ÔÐý mutex ÓйصÄÎÊÌâ¡£ Èç¹ûµÍ¼¶Öжϴ¦Àí³ÌÐòÐèÒªËø£¬
Ëü¾Í²»ÄÜÖжÏÈκÎÐèÒª¸ÃËøµÄ´úÂ룬 ÒÔ±ÜÃâ¿ÉÄÜ·¢ÉúµÄËð»µÊý¾Ý½á¹¹µÄÇé¿ö¡£
Ŀǰ£¬ÕâÒ»»úÖÆÊÇ͸¹ýÁÙ½çÇø API ÒÔ cpu_critical_enter
ºÍ
cpu_critical_exit
º¯ÊýµÄÐÎʽʵÏֵġ£ ĿǰÕâÒ» API »áÔÚËùÓÐ
FreeBSD ËùÖ§³ÖµÄƽ̨ÉϽûÓúÍÖØÐÂÆôÓÃÖжϡ£ ÕâÖÖ·½·¨²¢²»ÊÇ×îÓŵģ¬ µ«Ëü¸üÒ×Àí½â£¬
Ò²¸üÈÝÒ×ÕýÈ·µØÊµÏÖ¡£ ÀíÂÛÉÏ£¬ ÕâÒ»¸¨Öú API Ö»ÐèÒªÅäºÏÔÚÖ÷ÖжÏÉÏÏÂÎÄÖеÄ×ÔÐý mutex ʹÓá£
È»¶ø£¬ ΪÁËÈôúÂë¸üΪ¼òµ¥£¬ Ëü±»ÓÃÔÚÁËÈ«²¿×ÔÐý mutex£¬ ÉõÖÁ°üÀ¨ËùÓÐÁÙ½çÇøÉÏ¡£ ½«Æä´Ó MI
API ÖаþÀë³öÀ´·ÅÈë MD API£¬ ²¢Ö»ÔÚÐèҪʹÓÃËüµÄ MI API µÄ×ÔÐý mutex
ʵÏÖÖÐʹÓÿÉÄÜ»áÓиüºÃµÄЧ¹û¡£ Èç¹ûÎÒÃÇ×îÖÕ²ÉÓÃÁËÕâÖÖʵÏÖ·½Ê½£¬ Ôò MD API ¿ÉÄÜÐèÒª¸ÄÃû£¬
ÒÔÕÃÏÔÆäΪһµ¥¶À API ÕâÒ»ÊÂʵ¡£
¡¡¡¡ÈçÇ°ÃæÌáµ½µÄ£¬ µ±ÍêÈ«ÇÀÕ¼²¢·Ç×ÜÄÜÌṩ×î¼ÑÐÔÄÜʱ£¬ ²ÉÈ¡ÁËһЩÕÛÖԵĴëÊ©¡£
¡¡¡¡µÚÒ»´¦ÕÛÖÔÊÇ£¬ ÇÀÕ¼´úÂë²¢²»¿¼ÂÇÆäËü CPU µÄ´æÔÚ¡£ ¼ÙÉèÎÒÃÇÓÐÁ½¸ö CPU£¬ A ºÍ B£¬ ÆäÖÐ A ÉÏÏ̵߳ÄÓÅÏȼ¶Îª 4£¬ ¶ø B ÉÏÏ̵߳ÄÓÅÏȼ¶ÊÇ 2¡£ Èç¹û CPU B ÁîÒ»ÓÅÏȼ¶Îª 1 µÄÏ߳̽øÈë¿ÉÔËÐÐ״̬£¬ ÔòÀíÂÛÉÏ£¬ ÎÒÃÇÏ£Íû CPU A Çл»ÖÁÕâÒ»ÐÂỊ̈߳¬ ÕâÑù¾ÍÓÐÁ½¸öÓÅÏȼ¶×î¸ßµÄÏß³ÌÔÚÔËÐÐÁË¡£ È»¶ø£¬ È·¶¨Äĸö CPU ÔÚÇÀռʱ¸üºÏÊÊ£¬ ²¢Í¨¹ý IPI ÏòÄǸö CPU ·¢³öÐźţ¬ ²¢Íê³ÉÏà¹ØµÄͬ²½¹¤×÷µÄ´ú¼ÛÊ®·Ö¸ß°º¡£ Òò´Ë£¬ ĿǰµÄ´úÂë»áÇ¿ÖÆ CPU B Çл»ÖÁ¸ü¸ßÓÅÏȼ¶µÄÏ̡߳£ Çë×¢ÒâÕâÑù×öÈÔ»áÈÃϵͳ½øÈë¸üºÃµÄ״̬£¬ ÒòΪ CPU B »áÈ¥Ö´ÐÐÓÅÏȼ¶Îª 1 ¶ø²»ÊÇ 2 µÄÄǸöÏ̡߳£
¡¡¡¡µÚ¶þ´¦ÕÛÖÔÊÇÏÞÖÆ¶ÔÓÚʵʱÓÅÏȼ¶µÄÄÚºËÏ̵߳ÄÁ¢¼´ÇÀÕ¼¡£ ÔÚÇ°ÃæËù¶¨ÒåµÄÇÀÕ¼²Ù×÷µÄ¼òµ¥ÇéÐÎÖУ¬ µÍÓÅÏȼ¶×ܻᱻÁ¢¼´ÇÀ¶Ï (»òÔÚÆäÍ˳öÁÙ½çÇøºó±»ÇÀ¶Ï)¡£ È»¶ø£¬ Ðí¶àÔÚÄÚºËÖÐÖ´ÐеÄỊ̈߳¬ ÓкܶàÖ»»áÖ´Ðк̵ܶÄʱ¼ä¾Í»á×èÈû»ò·µ»ØÓû§Ì¬¡£ Òò´Ë£¬ Èç¹ûÄÚºËÇÀ¶ÏÕâЩÏ̲߳¢Ö´ÐÐÆäËü·ÇʵʱµÄÄÚºËỊ̈߳¬ ÔòÄں˿ÉÄÜ»áÔÚÕâЩÏß³ÌÂíÉÏÒªÐÝÃß»òÖ´ÐÐÍê±Ï֮ǰÇл»³öÈ¥¡£ ÕâÑùÒ»À´£¬ CPU ¾Í±ØÐëµ÷Õû¿ìÈ¡»º´æÒÔÅäºÏÐÂÏ̵߳ÄÖ´ÐС£ µ±Äں˷µ»Øµ½±»ÇÀ¶ÏµÄÏß³Ìʱ£¬ ËüÓÖÐèÒªÖØÐÂÌî³ä֮ǰ¶ªÊ§µÄ¿ìÈ¡»º´æÐÅÏ¢¡£ ´ËÍ⣬ Èç¹ûÄÚºËÄܹ»½«¶Ô½«×èÈû»ò·µ»ØÓû§Ì¬µÄÄǸöÏ̵߳ÄÇÀ¶ÏÑÓ³Ùµ½ÕâÖ®ºóµÄ»°£¬ »¹Äܹ»ÃâÈ¥Á½´Î¶îÍâµÄÉÏÏÂÎÄÇл»¡£ Òò´Ë£¬ ĬÈÏÇé¿öÏ£¬ Ö»ÓÐÔÚÓÅÏȼ¶½Ï¸ßµÄÏß³ÌÊÇʵʱÏß³Ìʱ£¬ ÇÀÕ¼´úÂë²Å»áÁ¢¼´Ö´ÐÐÇÀ¶Ï²Ù×÷¡£
¡¡¡¡ÆôÓÃÕë¶ÔËùÓÐÄÚºËÏ̵߳ÄÍêÈ«ÇÀÕ¼¶ÔÓÚµ÷ÊԷdz£ÓаïÖú£¬ ÒòΪËü»á±©Â¶³ö¸ü¶àµÄ¾ºÌ¬Ìõ¼þ (race conditions)¡£ ÔÚÄÑÒÔÄ£ÄâÕâЩ¾ºÌ¬Ìõ¼þµÄµ¥´¦ÀíÆ÷ϵͳÖУ¬ ÕâÏÔµÃÓÈÆäÓÐÓᣠÒò´Ë£¬ ÎÒÃÇÌṩÁËÄÚºËÑ¡Ïî FULL_PREEMPTION À´ÆôÓÃÕë¶ÔËùÓÐÄÚºËÏ̵߳ÄÇÀÕ¼£¬ ÕâһѡÏîÖ÷ÒªÓÃÓÚµ÷ÊÔÄ¿µÄ¡£
¡¡¡¡¼òµ¥µØËµ£¬ Ï̴߳ÓÒ»¸ö CPU ÒÆ¶¯µ½ÁíÒ»¸öÉϵĹý³Ì³Æ×÷Ç¨ÒÆ¡£ ÔÚ·ÇÇÀռʽÄÚºËÖУ¬
ÕâÖ»»áÔÚÃ÷È·¶¨ÒåµÄµã£¬ ÀýÈçµ÷Óà msleep
»ò·µ»ØÖÁÓû§Ì¬Ê±²Å»á·¢Éú¡£ µ«ÊÇ£¬ ÔÚÇÀռʽÄÚºËÖУ¬ ÖжϿÉÄÜ»áÔÚÈκÎʱºòÇ¿ÖÆÇÀ¶Ï£¬
²¢µ¼ÖÂÇ¨ÒÆ¡£ ¶ÔÓÚ CPU ˽ÓеÄÊý¾Ý¶øÑÔÕâ¿ÉÄÜ»á´øÀ´Ò»Ð©¸ºÃæÓ°Ï죬 ÒòΪ³ý curthread
ºÍ curpcb
ÒÔÍâµÄÊý¾Ý¶¼¿ÉÄÜÔÚÇ¨ÒÆ¹ý³ÌÖз¢Éú±ä»¯¡£ ÓÉÓÚ´æÔÚDZÔÚµÄÏß³ÌÇ¨ÒÆ£¬ ʹµÃδÊܱ£»¤µÄ CPU
˽ÓÐÊý¾Ý·ÃÎʱäµÃÎÞÓᣠÕâ¾ÍÐèÒªÔÚijЩ´úÂë¶Î½ûÖ¹Ç¨ÒÆ£¬ ÒÔ»ñµÃÎȶ¨µÄ CPU ˽ÓÐÊý¾Ý¡£
¡¡¡¡Ä¿Ç°ÎÒÃDzÉÓÃÁÙ½çÇøÀ´±ÜÃâÇ¨ÒÆ£¬ ÒòΪËüÃÇÄܹ»×èÖ¹ÉÏÏÂÎÄÇл»¡£ µ«ÊÇ£¬ ÕâÓÐʱ¿ÉÄÜÊÇÒ»ÖÖ¹ýÓÚÑÏÀ÷µÄÏÞÖÆ£¬ ÒòΪÁÙ½çÇøÊµ¼ÊÉÏ»á×èÖ¹µ±Ç°´¦ÀíÆ÷ÉϵÄÖжÏÏ̡߳£ Òò¶ø£¬ ÌṩÁËÁíÒ»¸ö API£¬ ÓÃÒÔָʾµ±Ç°½ø³ÌÔÚ±»ÇÀ¶Ïʱ£¬ ²»Ó¦Ç¨ÒƵ½ÁíÒ» CPU¡£
¡¡¡¡Õâ×é API Ò²½ÐÏß³ÌÇ£ÖÆ£¬ ËüÓɵ÷¶ÈÆ÷Ìṩ¡£ Õâ×é API °üÀ¨Á½¸öº¯Êý£º sched_pin
ºÍ sched_unpin
¡£
ÕâÁ½¸öº¯ÊýÓÃÓÚ¹ÜÀíÏß³Ì˽ÓеļÆÊý td_pinned
¡£
Èç¹ûǶÌ×¼ÆÊý´óÓÚÁ㣬 ÔòÏ߳̽«±»Ëø×¡£¬ ¶øÏ߳̿ªÊ¼ÔËÐÐʱÆäǶÌ×¼ÆÊýΪÁ㣬
±íʾ´¦ÓÚÎ´Ç£ÖÆ×´Ì¬¡£ ËùÓеĵ÷¶ÈÆ÷ʵÏÖÖУ¬ ¶¼ÒªÇó±£Ö¤Ç£ÖÆÏß³ÌÖ»ÔÚËüÃÇÊ״ε÷Óà sched_pin
ʱËùÔÚµÄ CPU ÉÏÔËÐС£ ÓÉÓÚÖ»ÓÐÏß³Ì×Ô¼º»áдǶÌ×¼ÆÊý£¬
¶øÖ»ÓÐÆäËüÏß³ÌÔÚÊÜÇ£ÖÆÏß³ÌûÓÐÖ´ÐУ¬ ÇÒ³ÖÓÐ sched_lock
ËøÊ±²Å»á¶ÁǶÌ×¼ÆÊý£¬ Òò´Ë·ÃÎÊ td_pinned
²»±ØÉÏËø¡£
sched_pin
º¯Êý»áʹǶÌ×¼ÆÊýµÝÔö£¬ ¶ø sched_unpin
ÔòʹÆäµÝ¼õ¡£ ×¢Ò⣬ ÕâЩº¯ÊýÖ»²Ù×÷µ±Ç°Ị̈߳¬
²¢½«Æä°ó¶¨µ½ÆäÖ´ÐÐËüʱËù´¦µÄ CPU ÉÏ¡£ Òª½«ÈÎÒâḬ̈߳󶨵½Ö¸¶¨µÄ CPU ÉÏ£¬ ÔòӦʹÓÃ
sched_bind
ºÍ sched_unbind
¡£
¡¡¡¡Äں˻úÖÆ timeout
ÔÊÐíÄں˷þÎñ×¢²áº¯Êý£¬ ÒÔ×÷Ϊ
softclock
Èí¼þÖжϵÄÒ»²¿·ÖÀ´Ö´ÐС£
ʼþ½«»ùÓÚËùÏ£ÍûµÄʱÖÓàÖવÄÊýÄ¿½øÐУ¬ ²¢ÔÚ´óÔ¼Ö¸¶¨µÄʱ¼ä»Øµ÷Óû§ÌṩµÄº¯Êý¡£
¡¡¡¡Î´¾ö timeout (³¬Ê±) ʼþµÄÈ«¾Ö±íÊÇÓÉһȫ¾Ö mutex£¬ callout_lock
±£»¤µÄ£» ËùÓÐ¶Ô timeout ±íµÄ·ÃÎÊ£¬ ¶¼±ØÐëÊ×ÏÈÄõ½Õâ¸ö
mutex¡£ µ± softclock
»½ÐÑʱ£¬ Ëü»áɨÃèδ¾ö³¬Ê±±í£¬
²¢ÕÒ³öÓ¦Æô¶¯µÄÄÇЩ¡£ Ϊ±ÜÃâËøÄæÐò£¬ softclock
Ï̻߳áÔÚµ÷ÓÃËùÌṩµÄ timeout
»Øµ÷º¯ÊýʱÊ×ÏÈÊÍ·Å
callout_lock
mutex¡£ Èç¹ûÔÚ×¢²áʱûÓÐÉèÖà CALLOUT_MPSAFE
±êÖ¾£¬ ÔòÔÚµ÷Óõ÷³öº¯Êý֮ǰ£¬ »¹»áץȡȫ¾ÖËø£¬
²¢ÔÚÖ®ºóÊÍ·Å¡£ Æäºó£¬ callout_lock
mutex
»áÔÚ¼ÌÐø´¦ÀíǰÔٴλñµÃ¡£ softclock
´úÂëÔÚÊÍ·ÅÕâ¸ö mutex
ʱ»á·Ç³£Ð¡Ðĵر£³Ö±íµÄÒ»ÖÂ״̬¡£ Èç¹ûÆôÓÃÁË DIAGNOSTIC
£¬
Ôòÿ¸öº¯ÊýµÄÖ´ÐÐʱ¼ä»á±»¼Ç¼£¬ Èç¹û³¬¹ýÁËijһãÐÖµ£¬ Ôò»á²úÉú¾¯¸æ¡£
±¾ÎĵµºÍÆäËüÎĵµ¿É´ÓÕâÀïÏÂÔØ£ºftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
Èç¹û¶ÔÓÚFreeBSDÓÐÎÊÌ⣬ÇëÏÈÔĶÁÎĵµ£¬Èç²»Äܽâ¾öÔÙÁªÏµ<questions@FreeBSD.org>.
¹ØÓÚ±¾ÎĵµµÄÎÊÌâÇë·¢ÐÅÁªÏµ <doc@FreeBSD.org>.