Linux kernel Linux内核:为什么在使用每个CPU变量时禁用抢占?

Linux kernel Linux内核:为什么在使用每个CPU变量时禁用抢占?,linux-kernel,preemptive,Linux Kernel,Preemptive,我正在从linux内核查看这个宏,它与处理cpu特定变量有关 #define get_cpu_var(var) \ (*({ \ preempt_disable();

我正在从linux内核查看这个宏,它与处理cpu特定变量有关

#define get_cpu_var(var)                                                \
(*({                                                                    \
        preempt_disable();                                              \
        this_cpu_ptr(&var);                                             \
})) 
为什么我们要禁用先占权?当您在内核中时,抢占不是不能发生的事情吗?(因为内核是执行抢占的内核)

为什么我们要禁用先占权

避免线程在不同的处理器内核上被抢占和重新调度

当您在内核中时,抢占不是不能发生的事情吗

当仍然有一个大的内核锁时,这是真的。拥有一个全局锁意味着,如果在内核中阻塞,那么其他线程就不能进入内核。现在,通过更细粒度的锁定,可以在内核中休眠。Linux可以在构建时配置,例如
CONFIG\u PREEMPT

虽然您的普通桌面内核可能配置了
CONFIG\u PREEMPT\u
,但一些发行版也将
CONFIG\u PREEMPT
作为一个单独的低延迟内核包提供,例如用于音频使用。对于实时用例,preempt\u rt补丁集甚至使大多数自旋锁可抢占(因此得名)

为什么我们要禁用先占权

避免线程在不同的处理器内核上被抢占和重新调度

当您在内核中时,抢占不是不能发生的事情吗

当仍然有一个大的内核锁时,这是真的。拥有一个全局锁意味着,如果在内核中阻塞,那么其他线程就不能进入内核。现在,通过更细粒度的锁定,可以在内核中休眠。Linux可以在构建时配置,例如
CONFIG\u PREEMPT


虽然您的普通桌面内核可能配置了
CONFIG\u PREEMPT\u
,但一些发行版也将
CONFIG\u PREEMPT
作为一个单独的低延迟内核包提供,例如用于音频使用。对于实时用例,preempt\u rt补丁集甚至使大多数自旋锁都是可抢占的(因此得名)。

我知道,上次我在linux内核上工作时是在2.6或2.4版本,所以在旧版本中也是如此,对吗(没有抢占),它只是为新版本做了更改?@tomer.z linux v2.6.39删除了大的内核锁。内核是否可抢占取决于配置,如果您使用的是普通桌面发行版的内核,则应使用
CONFIG\u PREEMPT\u
配置。非自愿的抢占式是面向音频或实时使用的。那么这到底是如何工作的呢?我是一个用户空间线程,我在运行,然后进行系统调用,所以我跳到内核,在那里运行,做一些事情,那么为什么我在内核中突然被抢占了呢?因为我的时间片用完了?如果是这样的话,我怎么能先发制人呢?当时间片运行时触发的时钟中断处理程序,或@a3f@tomer.z自愿抢占=整个内核都有抢占点(
maybe\u sleep
)。强制抢占=每个中断(包括时间片用完时的计时器中断)都是一个可能的抢占点防止强制抢占?我记得当内核有一个大锁时,当你在内核中运行时,你根本不能被抢占,当你完成你的业务并准备返回用户空间时,你的时间片会被检查,如果它完成了,你会转到另一个进程,而不是返回用户空间,所以我现在想了解这个动态是如何工作的@a3fI看,我上一次在linux内核上工作是在2.6或2.4版本,所以在旧版本中是这样的,对吗(没有抢占),它只是为新版本做了更改,对吗?@tomer.z linux v2.6.39删除了大的内核锁。内核是否可抢占取决于配置,如果您使用的是普通桌面发行版的内核,则应使用
CONFIG\u PREEMPT\u
配置。非自愿的抢占式是面向音频或实时使用的。那么这到底是如何工作的呢?我是一个用户空间线程,我在运行,然后进行系统调用,所以我跳到内核,在那里运行,做一些事情,那么为什么我在内核中突然被抢占了呢?因为我的时间片用完了?如果是这样的话,我怎么能先发制人呢?当时间片运行时触发的时钟中断处理程序,或@a3f@tomer.z自愿抢占=整个内核都有抢占点(
maybe\u sleep
)。强制抢占=每个中断(包括时间片用完时的计时器中断)都是一个可能的抢占点防止强制抢占?我记得当内核有一个大锁时,当你在内核中运行时,你根本不能被抢占,当你完成你的业务并准备返回用户空间时,你的时间片会被检查,如果它完成了,你会转到另一个进程,而不是返回用户空间,因此,我试图理解这个动态是如何在a3f中工作的