第 8 章 SMPng 设计文档

写作:John BaldwinRobert Watson.
翻译:.
目录
8.1. 绪论
8.2. 基本工具与上锁的基础知识
8.3. 架构与设计概览
8.4. 特定数据的锁策略
8.5. 实现说明
8.6. 其它话题
术语表

8.1. 绪论

这份文档对目前 SMPng 架构的设计与实现进行了介绍。 它首先介绍了基本的原语和相关工具, 其后是关于 FreeBSD 内核的同步与执行模型, 接下来讨论了具体系统中的锁策略, 并描述了在各个子系统中引入细粒度的同步和实现并行化的步骤, 最后是详细的实现说明, 用以解释最初做出某些设计决策的动机, 并使读者了解使用特定的原语所可能产生的重大影响。

这份文档仍在撰写当中, 并将不断更新以反映与 SMPng 项目有关的最新设计与实现的情况。 其中有许多小节目前还只是提纲, 但我们会逐渐为其充实内容。 关于这份文档的更新和建议, 请发给文档编辑。

SMPng 的目标是使内核能够并发执行。 基本上, 内核是一个很大而复杂的程序。 要让内核能够多线程地执行, 我们需要使用某些其它多线程程序在实现时所用到的工具, 这包括互斥体(mutex)、 共享/排他锁(shared/exclusive lock)、 信号量(semaphores) 和条件变量(condition variable)。 如果希望了解它们以及其它 SMP 术语, 请参阅本文的 术语表 一节。

术语表

原子

当遵循适当的访问协议时, 如果一操作的效果对其它所有 CPU 均可见, 则称其为原子操作。 狭义的原子操作是机器直接提供的。 就更高的抽象层次而言, 如果结构体的多个成员由一个锁保护, 则如果对它们的操作都是在上锁后、 解锁前进行的, 也可以称其为原子操作。

参见操作.

阻塞

线程等待锁、 资源或条件时被阻塞。 这一术语也因此被赋予了太多的意涵。

参见休眠.

临界区

不允许发生抢占的代码段。 使用 critical_enter(9) API 来表示进入和退出临界区。

MD

表示与机器/平台有关。

参见MI.

内存操作

内存操作包括读或写内存中的指定位置。

MI

表示与机器/平台无关。

参见MD.

操作

见内存操作.

主中断上下文

主中断上下文表示当发生中断时所执行的那段代码。 这些代码可以直接运行某个中断处理程序, 或调度一异步终端线程, 以便为给定的中断源执行中断处理程序。

实时内核线程

一种高优先级的内核线程。 目前, 只有中断线程属于实时优先级的内核线程。

参见线程.

休眠

当进程由条件变量或通过 msleeptsleep 阻塞并进入休眠队列时, 称其进入休眠状态。

参见阻塞.

可休眠锁

可休眠锁是一种在进程休眠时仍可持有的锁。 锁管理器 (lockmgr) 锁和 sx 锁是目前 FreeBSD 中仅有的可休眠锁。 最终, 某些 sx 锁, 例如 allproc (全部进程) 和 proctree (进程树) 锁将成为不可休眠锁。

参见休眠.

线程

由 struct thread 所表达的内核线程。 线程可以持有锁, 并拥有独立的执行上下文。

等待通道

线程可以在其上休眠的内核虚拟地址。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.