¡¡¡¡ÕâÒ»ÕÂÓÉ FreeBSD SMP Next Generation Project ά»¤¡£ Ç뽫ÆÀÂۺͽ¨Òé·¢Ë͸øFreeBSD ¶Ô³Æ¶à´¦Àí (SMP) ÓʼþÁбí.
¡¡¡¡ÕâÆªÎĵµÌá¸ÙêüÁìµÄ½²ÊöÁËÔÚFreeBSDÄÚºËÖеÄËø£¬ÕâÐ©ËøÊ¹µÃÓÐЧµÄ¶à´¦Àí³ÉΪ¿ÉÄÜ¡£ Ëø¿ÉÒÔÓü¸ÖÖ·½Ê½»ñµÃ¡£Êý¾Ý½á¹¹¿ÉÒÔÓÃmutex»òlockmgr(9)±£»¤¡£ ¶ÔÓÚΪÊý²»¶àµÄÈô¸É¸ö±äÁ¿£¬¼ÙÈç×ÜÊÇʹÓÃÔ×Ó²Ù×÷·ÃÎÊËüÃÇ£¬ÕâЩ±äÁ¿¾Í¿ÉÒԵõ½±£»¤¡£
ÒëÕß×¢: ½ö¶Á±¾ÕÂÄÚÈÝ£¬»¹²»×ãÒÔÕÒ³ö¡°mutex¡± ºÍ¡°¹²Ïí»¥³âËø¡±µÄÇø±ð¡£ËƺõËüÃǵŦÄÜÓÐÖØµþÖ®´¦£¬ ǰÕ߱ȺóÕߵŦÄÜÑ¡Ïî¸ü¶à¡£ËüÃÇËÆºõ¶¼ÊÇlockmgr(9)µÄ×Ó¼¯¡£
¡¡¡¡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>.