每个CPU变量上的锁定

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每个CPU变量上的锁定相关的知识,希望对你有一定的参考价值。

我正在阅读Robert Love的Linux Kernel Development,并试图了解内核同步机制。我试图理解与书中提到的锁定机制有关的一些要点,如下所示-


“某些情况不需要自旋锁,但确实需要禁用内核抢占。这些情况中最常见的是每个处理器的数据。如果数据对于每个处理器都是唯一的,则可能不需要使用锁定,因为只有一个处理器可以访问该数据。如果没有旋转自旋锁,则内核是抢占式内核,新调度的任务可能会访问该变量。

因此,即使这是一台单处理器计算机,也可以通过多个进程伪并行地访问该变量。通常,此变量需要自旋锁(以防止在多处理机上真正并发)。但是,如果这是每个处理器的变量,则可能不需要锁定。要解决此问题,可以通过preempt_disable()“]禁用内核抢占。


所以在这里考虑多处理器系统-我了解到,虽然当前进程正在操纵每个cpu变量,但由于SMP可能会安排另一个进程,并尝试操纵相同的每个cpu变量,因此需要如书中所述禁用先占功能。但是我无法理解的一点是,如果我们仅禁用内核抢占,并且当前进程正在尝试处理每个CPU数据,并且同时在当前处理器上发生了中断,因为该中断尚未被执行,该怎么办?禁用后,CPU停止当前任务并开始执行中断处理程序。现在,该处理程序还希望操作相同的per-cpu变量。那么在这种情况下,变量可能最终包含不一致的数据?

因此,如果还从中断处理程序中访问了每个cpu变量,这是否意味着也需要在当前处理器上禁用该中断?

平台:x86上的Linux

我正在阅读Robert Love的Linux Kernel Development,并试图了解内核同步机制。我试图了解与锁定机制相关的一些要点,即...

答案

所以在这里考虑一个多处理器系统-我知道per-cpu变量正在由当前进程操纵,另一个SMP可能会安排进程,并尝试对其进行操作每个cpu变量,因此需要禁用抢占功能,因为在书中解释。

以上是关于每个CPU变量上的锁定的主要内容,如果未能解决你的问题,请参考以下文章

linux 每-CPU 的变量

Java内存模型与Volatile,Happen-Before原则等

RFO计入英特尔CPU上的原子添加操作和缓存线锁定?

8.变量内存CPU原理

qt多线程中怎样锁定一个指定的变量?

Java同步方法锁定对象还是方法?