这份文档对目前 SMPng 架构的设计与实现进行了介绍。 它首先介绍了基本的原语和相关工具, 其后是关于 FreeBSD 内核的同步与执行模型, 接下来讨论了具体系统中的锁策略, 并描述了在各个子系统中引入细粒度的同步和实现并行化的步骤, 最后是详细的实现说明, 用以解释最初做出某些设计决策的动机, 并使读者了解使用特定的原语所可能产生的重大影响。
这份文档仍在撰写当中, 并将不断更新以反映与 SMPng 项目有关的最新设计与实现的情况。 其中有许多小节目前还只是提纲, 但我们会逐渐为其充实内容。 关于这份文档的更新和建议, 请发给文档编辑。
SMPng 的目标是使内核能够并发执行。 基本上, 内核是一个很大而复杂的程序。 要让内核能够多线程地执行, 我们需要使用某些其它多线程程序在实现时所用到的工具, 这包括互斥体(mutex)、 共享/排他锁(shared/exclusive lock)、 信号量(semaphores) 和条件变量(condition variable)。 如果希望了解它们以及其它 SMP 术语, 请参阅本文的 术语表 一节。
当遵循适当的访问协议时, 如果一操作的效果对其它所有 CPU 均可见, 则称其为原子操作。 狭义的原子操作是机器直接提供的。 就更高的抽象层次而言, 如果结构体的多个成员由一个锁保护, 则如果对它们的操作都是在上锁后、 解锁前进行的, 也可以称其为原子操作。
参见操作.
线程等待锁、 资源或条件时被阻塞。 这一术语也因此被赋予了太多的意涵。
参见休眠.
不允许发生抢占的代码段。 使用 critical_enter(9) API 来表示进入和退出临界区。
表示与机器/平台有关。
参见MI.
内存操作包括读或写内存中的指定位置。
表示与机器/平台无关。
参见MD.
见内存操作.
主中断上下文表示当发生中断时所执行的那段代码。 这些代码可以直接运行某个中断处理程序, 或调度一异步终端线程, 以便为给定的中断源执行中断处理程序。
一种高优先级的内核线程。 目前, 只有中断线程属于实时优先级的内核线程。
参见线程.
当进程由条件变量或通过 msleep
或
tsleep
阻塞并进入休眠队列时, 称其进入休眠状态。
参见阻塞.
可休眠锁是一种在进程休眠时仍可持有的锁。 锁管理器 (lockmgr) 锁和 sx 锁是目前 FreeBSD 中仅有的可休眠锁。 最终, 某些 sx 锁, 例如 allproc (全部进程) 和 proctree (进程树) 锁将成为不可休眠锁。
参见休眠.
由 struct thread 所表达的内核线程。 线程可以持有锁, 并拥有独立的执行上下文。
线程可以在其上休眠的内核虚拟地址。
本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读
文档,如不能解决再联系
<questions@FreeBSD.org>.
关于本文档的问题请发信联系
<doc@FreeBSD.org>.