原作:徐敏捷 (Jeffrey Hsu) The FreeBSD Project
原文链接(PDF格式):http://people.freebsd.org/~hsu/publications/smpreasoning.pdf
尽管关于 SMP 上锁原语这样的主题, 已经在许多教材 [Val][Schm][Bald][Leh] 中进行了详尽的讨论,但关于上锁的原理,以及对这些锁原语的应用方面的讨论则相对较少。这导致了一种本末倒置的现象,即,大量使内核能够在多处理器环境下正确运行的工作建立在这些锁原语之上,但在具体的内核子系统中如何以及在何处上锁,则缺少指导性的原则说明。在这篇论文中,我们将讨论在 FreeBSD 内核中的 SMP 上锁方面取得的经验,并对内核中正确和不正确的 SMP 上锁进行讨论。我们希望这能够帮助其他开发人员在为其他内核子系统进行上锁时,帮助他们理解内核中已经存在的一系列细锁。在这篇论文中,我们将从常规的上锁策略开始,随后讨论许多由于错误的 SMP 上锁方式导致的竞态条件,并针对这些代码给出正确的上锁方式。我们所举的全部例子,均来自于已经提交的 FreeBSD 源代码的历史版本。
我们的第一个指导性规则,建立于分析局部性思考和全局性思考的差异的基础之上。引用关于分布式系统的一句名言[Lamp],SMP 上锁的过程中,你会发现甚至你没有听说过的代码会导致局部代码出现问题。
原则 #1:全局性地思考。