Skip to content

定义Definition

互斥

施工中 · 内容逐步修订

Mutual exclusion

临界区任意时刻至多容纳一个进程;完整问题通常另规定进入进展条件。

形式陈述 ​

在描述整个系统的状态机中,设每个进程循环经过 remainder、entry、critical 与 exit 区。互斥的安全条件是

∀ reachable states,#{i:i 位于 critical section}≤1.

完整互斥问题通常另要求无死锁、无饥饿或有界等待等进展性质;这些并不蕴含于上式。

直觉

互斥是临界区占用数至多一的不变量,而“有人最终能进去”“每个等待者最终能进去”分别是更强的活性与公平条件。把这些性质拆开,可以看清一个算法是因冲突规则错误破坏安全,还是因调度、崩溃或服务顺序失去进展。互斥锁是带获取、释放与所有权的同步对象;互斥规格也可由消息令牌或其他原子对象实现,二者不能互作同义词。

例子与边界

单个布尔变量 busy 上的“先读 false,再写 true”若读写之间非原子,两个线程可同时通过,违反互斥。Peterson 两进程算法在顺序一致且读写原子的模型下保证互斥安全;进展还要求提出请求的进程持续获得执行步骤,且临界区持有者最终退出。这些结论不能不加说明地移植到弱内存或任意数量进程。

具体锁实现的边界由自旋锁页承接:TAS 依赖原子读改写,ticket lock 增加请求顺序,却仍受抢占、缓存争用和调度假设影响。持锁线程停止时互斥安全性仍可成立,而阻塞、死锁与恢复属于锁对象及执行模型的进展分析。

若允许初始寄存器已经损坏,Dijkstra自稳定令牌环从可能有多个特权的配置恢复唯一特权,随后持续轮转。它预先有特殊根,并采用明确的中央原子调度;恢复期间可能有多个特权,所以其最终互斥不能被误读为任意损坏前缀都满足本页安全公式。

推论与应用

互斥本身是一条安全性与活性中的安全性质:任何时刻至多一个进程在临界区。无死锁、无饥饿和有限等待属于不同强度的活性条件。

把计数信号量初始化为一,并令 P/wait 与 V/signal 原子化,可以实现临界区入口的互斥:成功减到零的线程进入,其余线程等待,退出时再释放。该实现只给出容量约束;公平唤醒、优先级反转、进程崩溃后的许可恢复和可重入性仍需额外协议。

共享内存系统可用原子操作维护互斥不变量,读改写原语则实现具体锁入口。阻塞 mutex与忙等锁共享互斥目标,却采用不同等待策略;死锁和饥饿/公平再分别刻画全局等待闭环与个体服务保证。

数据库和操作系统还需把互斥与优先级反转、故障恢复及临界区粒度共同设计。这些工程约束不改变“临界区至多一人”的核心公式,却决定实现能否持续提供服务。

参考资料
  • Maurice Herlihy and Nir Shavit, The Art of Multiprocessor Programming, rev. 1st ed., Morgan Kaufmann, 2012,Chs. 2, 7。
  • Hagit Attiya and Jennifer Welch, Distributed Computing: Fundamentals, Simulations, and Advanced Topics, 2nd ed., Wiley, 2004,Chs. 4–5。
关系图谱16 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系