第 2 章 锁定说明

本章由 FreeBSD SMP 下一代项目维护。

本文档概述了 FreeBSD 内核中使用的锁定,以允许在内核中有效地进行多处理。锁定可以通过多种方式实现。数据结构可以通过互斥锁或 lockmgr(9) 锁来保护。一些变量只是通过始终使用原子操作来访问它们来保护。

2.1. 互斥锁

互斥锁只是一个锁,用于保证互斥。具体来说,互斥锁一次只能由一个实体拥有。如果另一个实体希望获取一个已经被拥有的互斥锁,它必须等待直到互斥锁被释放。在 FreeBSD 内核中,互斥锁由进程拥有。

互斥锁可以递归地获取,但它们旨在保持很短的时间。具体来说,一个人在持有互斥锁时不能睡眠。如果您需要在睡眠期间保持一个锁,请使用 lockmgr(9) 锁。

每个互斥锁都有一些有趣的属性

变量名

内核源代码中 struct mtx 变量的名称。

逻辑名称

mtx_init 为其分配的互斥锁的名称。此名称显示在 KTR 跟踪消息和见证错误和警告中,用于在见证代码中区分互斥锁。

类型

互斥锁的类型,以 MTX_* 标志表示。每个标志的含义与其在 mutex(9) 中记录的含义有关。

MTX_DEF

一个睡眠互斥锁

MTX_SPIN

一个自旋互斥锁

MTX_RECURSE

允许此互斥锁递归。

受保护对象

此条目保护的数据结构或数据结构成员的列表。对于数据结构成员,名称将采用 结构名称.成员名称 的形式。

依赖函数

只有在持有此互斥锁时才能调用的函数。

表 1. 互斥锁列表
变量名逻辑名称类型受保护对象依赖函数

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 锁"

MTX_DEF

vm86pcb

vm86_bioscall

Giant

"Giant"

MTX_DEF | MTX_RECURSE

几乎所有内容

很多

callout_lock

"调用锁"

MTX_SPIN | MTX_RECURSE

callfree, callwheel, nextsoftcheck, proc.p_itcallout, proc.p_slpcallout, softticks, ticks

2.2. 共享排它锁

这些锁提供基本的读写类型功能,可以由一个正在睡眠的进程持有。目前,它们由 lockmgr(9) 支持。

表 2. 共享排它锁列表
变量名受保护对象

allproc_lock

allproc zombproc pidhashtbl proc.p_list proc.p_hash nextpid

proctree_lock

proc.p_children proc.p_sibling

2.3. 原子保护变量

原子保护变量是一个特殊的变量,没有由显式锁保护。相反,对变量的所有数据访问都使用 atomic(9) 中描述的特殊原子操作。很少有变量以这种方式处理,尽管其他同步原语(如互斥锁)是用原子保护变量实现的。

  • mtx.mtx_lock


最后修改时间: 2024 年 3 月 9 日 由 Danilo G. Baio