Linux 内核:为什么在使用 per-CPU 变量时禁用抢占?
Linux kernel: why preemption is disabled when use per-CPU variable?
我正在查看来自 linux 内核的这个宏,它与处理 cpu-特定变量有关
#define get_cpu_var(var) \
(*({ \
preempt_disable(); \
this_cpu_ptr(&var); \
}))
为什么要禁用抢占?当您在内核中时,抢占不是不能发生的事情吗? (因为内核是抢占者)
Why do we disable preemption?
避免线程在不同的处理器内核上被抢占和重新安排。
Isnt preemption something that cant happen when you are in the kernel?
当还有一个大的内核锁时,这是真的。拥有一个全局锁意味着如果你阻塞 in-kernel,则没有其他线程可以进入内核。现在,有了更多 fine-grained 锁定,就可以在内核中休眠了。 Linux 可以在 build-time 处配置为 other preemption models,例如CONFIG_PREEMPT
.
虽然您的普通桌面内核可能配置有 CONFIG_PREEMPT_VOLUNTARY
,但某些发行版也将 CONFIG_PREEMPT
作为单独的 low-latency 内核包提供,例如用于音频。对于 real-time 用例,preempt_rt 补丁集甚至使大多数自旋锁可抢占(因此得名)。
我正在查看来自 linux 内核的这个宏,它与处理 cpu-特定变量有关
#define get_cpu_var(var) \
(*({ \
preempt_disable(); \
this_cpu_ptr(&var); \
}))
为什么要禁用抢占?当您在内核中时,抢占不是不能发生的事情吗? (因为内核是抢占者)
Why do we disable preemption?
避免线程在不同的处理器内核上被抢占和重新安排。
Isnt preemption something that cant happen when you are in the kernel?
当还有一个大的内核锁时,这是真的。拥有一个全局锁意味着如果你阻塞 in-kernel,则没有其他线程可以进入内核。现在,有了更多 fine-grained 锁定,就可以在内核中休眠了。 Linux 可以在 build-time 处配置为 other preemption models,例如CONFIG_PREEMPT
.
虽然您的普通桌面内核可能配置有 CONFIG_PREEMPT_VOLUNTARY
,但某些发行版也将 CONFIG_PREEMPT
作为单独的 low-latency 内核包提供,例如用于音频。对于 real-time 用例,preempt_rt 补丁集甚至使大多数自旋锁可抢占(因此得名)。