FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章与书籍
  • UNIX 四分之一世纪
  • Unix 痛恨者手册
  • FreeBSD 架构手册翻译项目
  • 商标
  • 概述
  • 第一部分 内核
    • 第 1 章 引导和内核初始化
    • 第 2 章 内核中的锁
    • 第 3 章 内核对象
    • 第 4 章 jail 子系统
    • 第 5 章 SYSINIT 框架
    • 第 6 章 TrustedBSD MAC 框架
    • 第 7 章 虚拟内存系统
    • 第 8 章 SMPng 设计文档
    • 第 9 章 编写 FreeBSD 设备驱动程序
    • 第 10 章 ISA 设备驱动程序
    • 第 11 章 PCI 设备
    • 第 12 章 公共存取模型 SCSI 控制器
    • 第 13 章 USB 设备
    • 第 14 章 Newbus
    • 第 15 章 声音子系统
    • 第 16 章 PC 卡
  • 第二部分 附录
    • 参考文献
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
  • 2.1. 互斥锁(Mutexes)
  • 表 1. 互斥锁列表
  • 2.2. 共享独占锁(Shared Exclusive Locks)
  • 表 2. 共享独占锁列表
  • 2.3. 原子保护变量(Atomically Protected Variables)
在GitHub上编辑
导出为 PDF
  1. 第一部分 内核

第 2 章 内核中的锁

上一页第 1 章 引导和内核初始化下一页第 3 章 内核对象

最后更新于26天前

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

本文档概述了 FreeBSD 内核中用于实现有效多处理的锁机制。锁定可以通过多种方式实现。数据结构可以通过互斥锁(mutex)或 锁来保护。有些变量则通过始终使用原子操作来访问,从而保护它们。

2.1. 互斥锁(Mutexes)

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

互斥锁可以递归获取,但它们的目的是短时间持有。具体来说,持有互斥锁时不能休眠。如果需要在休眠期间持有锁,请使用 锁。

每个互斥锁有几个重要属性:

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

  • 逻辑名称:通过 mtx_init 分配给它的互斥锁名称。此名称会显示在 KTR 跟踪消息和 witness 错误及警告中,用于区分 witness 代码中的互斥锁。

  • 类型:互斥锁的类型,使用 MTX_* 标志表示。每个标志的含义与 中的文档相关。

    • MTX_DEF:一个睡眠互斥锁

    • MTX_SPIN:一个自旋互斥锁

    • MTX_RECURSE:此互斥锁允许递归

  • 保护对象:此条目所保护的数据结构或数据结构成员的列表。对于数据结构成员,名称格式为 结构体名.成员名。

  • 依赖函数:只有在持有此互斥锁时,才能调用的函数。

表 1. 互斥锁列表

变量名
逻辑名称
类型
保护对象
依赖函数

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"

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

2.2. 共享独占锁(Shared Exclusive Locks)

表 2. 共享独占锁列表

变量名
保护对象

allproc_lock

allproc, zombproc, pidhashtbl, proc.p_list, proc.p_hash, nextpid

proctree_lock

proc.p_children, proc.p_sibling

2.3. 原子保护变量(Atomically Protected Variables)

  • mtx.mtx_lock

这些锁提供基本的读写锁类型功能,可以由睡眠中的进程持有。目前,它们是由 支持的。

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

lockmgr(9)
lockmgr(9)
mutex(9)
lockmgr(9)
atomic(9)