这一章由 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被持有时才可以被调用的函数
| 变量名 | 逻辑名 | 类型 | 保护对象 | 依赖函数 |
|---|---|---|---|---|
| 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>.