µÚ2Õ ¡¡ÄÚºËÖеÄËø

Ŀ¼
2.1 Mutex
2.2 ¹²Ïí»¥³âËø
2.3 Ô­×Ó±£»¤±äÁ¿
·­Ò룺intron@intron.ac.

¡¡¡¡ÕâÒ»ÕÂÓÉ FreeBSD SMP Next Generation Project ά»¤¡£ Ç뽫ÆÀÂۺͽ¨Òé·¢Ë͸øFreeBSD ¶Ô³Æ¶à´¦Àí (SMP) ÓʼþÁбí.

¡¡¡¡ÕâÆªÎĵµÌá¸ÙêüÁìµÄ½²ÊöÁËÔÚFreeBSDÄÚºËÖеÄËø£¬ÕâÐ©ËøÊ¹µÃÓÐЧµÄ¶à´¦Àí³ÉΪ¿ÉÄÜ¡£ Ëø¿ÉÒÔÓü¸ÖÖ·½Ê½»ñµÃ¡£Êý¾Ý½á¹¹¿ÉÒÔÓÃmutex»òlockmgr(9)±£»¤¡£ ¶ÔÓÚΪÊý²»¶àµÄÈô¸É¸ö±äÁ¿£¬¼ÙÈç×ÜÊÇʹÓÃÔ­×Ó²Ù×÷·ÃÎÊËüÃÇ£¬ÕâЩ±äÁ¿¾Í¿ÉÒԵõ½±£»¤¡£

ÒëÕß×¢: ½ö¶Á±¾ÕÂÄÚÈÝ£¬»¹²»×ãÒÔÕÒ³ö¡°mutex¡± ºÍ¡°¹²Ïí»¥³âËø¡±µÄÇø±ð¡£ËƺõËüÃǵŦÄÜÓÐÖØµþÖ®´¦£¬ ǰÕ߱ȺóÕߵŦÄÜÑ¡Ïî¸ü¶à¡£ËüÃÇËÆºõ¶¼ÊÇlockmgr(9)µÄ×Ó¼¯¡£

2.1 Mutex

¡¡¡¡Mutex¾ÍÊÇÒ»ÖÖÓÃÀ´½â¾ö¹²Ïí/ÅÅËüì¶ÜµÄËø¡£ Ò»¸ömutexÔÚÒ»¸öʱ¿ÌÖ»¿ÉÒÔ±»Ò»¸öʵÌåÓµÓС£Èç¹ûÁíÒ»¸öʵÌåÒª»ñµÃÒѾ­±»ÓµÓеÄmutex£¬ ¾Í»á½øÈëµÈ´ý£¬Ö±µ½Õâ¸ömutex±»ÊÍ·Å¡£ÔÚFreeBSDÄÚºËÖУ¬mutex±»½ø³ÌËùÓµÓС£

¡¡¡¡Mutex¿ÉÒÔ±»µÝ¹éµÄË÷Òª£¬µ«ÊÇmutexÒ»°ãÖ»±»Ò»¸öʵÌåÓµÓн϶̵ÄÒ»¶Îʱ¼ä£¬ Òò´ËÒ»¸öʵÌå²»ÄÜÔÚ³ÖÓÐmutexʱ˯Ãß¡£Èç¹ûÄãÐèÒªÔÚ³ÖÓÐmutexʱ˯Ãߣ¬ ¿ÉʹÓÃÒ»¸ö lockmgr(9) µÄËø¡£

¡¡¡¡Ã¿¸ömutexÓм¸¸öÁîÈ˸ÐÐËȤµÄÊôÐÔ:

±äÁ¿Ãû

ÔÚÄÚºËÔ´´úÂëÖÐstruct mtx±äÁ¿µÄÃû×Ö

Âß¼­Ãû

Óɺ¯Êýmtx_initÖ¸ÅɵÄmutexµÄÃû×Ö¡£ Õâ¸öÃû×ÖÏÔʾÔÚKTR¸ú×ÙÏûÏ¢ºÍwitness³ö´íÓ뾯¸æÐÅÏ¢Àï¡£ Õâ¸öÃû×Ö»¹ÓÃÓÚÇø·Ö±êʶÔÚwitness´úÂëÖеĸ÷¸ömutex

ÀàÐÍ

MutexµÄÀàÐÍ£¬ÓñêÖ¾MTX_*±íʾ¡£ ÿ¸ö±êÖ¾µÄÒâÒåÔÚmutex(9)ÓÐËùÃèÊö¡£

MTX_DEF

Ò»¸ö˯Ãßmutex

MTX_SPIN

Ò»¸öÑ­»·mutex

MTX_RECURSE

Õâ¸ömutexÔÊÐíµÝ¹é

±£»¤¶ÔÏó

Õâ¸öÈë¿ÚËùÒª±£»¤µÄÊý¾Ý½á¹¹Áбí»òÊý¾Ý½á¹¹³ÉÔ±ÁÐ±í¡£ ¶ÔÓÚÊý¾Ý½á¹¹³ÉÔ±£¬½«°´ÕÕ ½á¹¹Ãû.³ÉÔ±ÃûµÄÐÎʽÃüÃû¡£

ÒÀÀµº¯Êý

½öµ±mutex±»³ÖÓÐʱ²Å¿ÉÒÔ±»µ÷Óõĺ¯Êý

±í 2-1. MutexÁбí

±äÁ¿Ãû Âß¼­Ãû ÀàÐÍ ±£»¤¶ÔÏó ÒÀÀµº¯Êý
sched_lock ¡°sched lock¡±(µ÷¶ÈÆ÷Ëø) MTX_SPIN | MTX_RECURSE _gmonparam, cnt.v_swtch, cp_time, curpriority, mtx.mtx_blocked, mtx.mtx_contested, proc.p_procq, proc.p_slpq, proc.p_sflag, proc.p_stat, proc.p_estcpu, proc.p_cpticks proc.p_pctcpu, proc.p_wchan, proc.p_wmesg, proc.p_swtime, proc.p_slptime, proc.p_runtime, proc.p_uu, proc.p_su, proc.p_iu, proc.p_uticks, proc.p_sticks, proc.p_iticks, proc.p_oncpu, proc.p_lastcpu, proc.p_rqindex, proc.p_heldmtx, proc.p_blocked, proc.p_mtxname, proc.p_contested, proc.p_priority, proc.p_usrpri, proc.p_nativepri, proc.p_nice, proc.p_rtprio, pscnt, slpque, itqueuebits, itqueues, rtqueuebits, rtqueues, queuebits, queues, idqueuebits, idqueues, switchtime, switchticks setrunqueue, remrunqueue, mi_switch, chooseproc, schedclock, resetpriority, updatepri, maybe_resched, cpu_switch, cpu_throw, need_resched, resched_wanted, clear_resched, aston, astoff, astpending, calcru, proc_compare
vm86pcb_lock ¡°vm86pcb lock¡±(ÐéÄâ8086ģʽ½ø³Ì¿ØÖÆ¿éËø) MTX_DEF vm86pcb vm86_bioscall
Giant ¡°Giant¡±(¾ÞËø) MTX_DEF | MTX_RECURSE ¼¸ºõ¿ÉÒÔÊÇÈκζ«Î÷ Ðí¶à
callout_lock ¡°callout lock¡±(ÑÓʱµ÷ÓÃËø) MTX_SPIN | MTX_RECURSE callfree, callwheel, nextsoftcheck, proc.p_itcallout, proc.p_slpcallout, softticks, ticks  

±¾ÎĵµºÍÆäËüÎĵµ¿É´ÓÕâÀïÏÂÔØ£ºftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Èç¹û¶ÔÓÚFreeBSDÓÐÎÊÌ⣬ÇëÏÈÔĶÁÎĵµ£¬Èç²»Äܽâ¾öÔÙÁªÏµ<questions@FreeBSD.org>.
¹ØÓÚ±¾ÎĵµµÄÎÊÌâÇë·¢ÐÅÁªÏµ <doc@FreeBSD.org>.