2.2. Ticket 自旋锁

系统设计的关键是要保证进程不会更改另一个进程使用的内存。无法控制的内存更改可导致数据污染和系统崩溃。要防止此类情况出现,操作系统要允许进程锁定一个内存片段,执行操作,然后解锁或者“释放”内存。
内存锁定的常见使用是通过自旋锁实现的,它可让进程一直检查是否有可用的锁,并在所可用时立即使用。如果有多个进程竞争同一锁,那么在该锁被释放后第一个请求该锁定进程会得到它。当所有进程有对内存相同的访问时,这个方法是“公平”的且运作良好。
遗憾的是,在 NUMA 系统中,不是所有进程都对所有对等的访问。与该锁处于同一 NUMA 节点中的进程明显可以优先获得该锁。远程 NUMA 节点中的进程可能会有锁不足和性能下降的问题。
为解决这个问题,红帽企业版 Linux 采用 ticket 自旋锁。这个功能为锁添加了预留队列机制,可让所有进程根据其提出请求的时间顺序使用锁。这样可以消除计时问题以及不公平的锁请求利益。
虽然 ticket 自旋锁负担比普通自旋锁要高,但它缩放比例更大,并可在 NUMA 系统中提供更好的性能。

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。