0

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

#define get_cpu_var(var)                                                \
(*({                                                                    \
        preempt_disable();                                              \
        this_cpu_ptr(&var);                                             \
})) 

为什么我们禁用抢占?当您在内核中时,抢占不是不会发生的事情吗?(因为内核是做抢占的)

4

1 回答 1

3

为什么我们禁用抢占?

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

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

当还有一个大的内核锁时,情况确实如此。拥有一个全局锁意味着如果您在内核中阻塞,则没有其他线程可以进入内核。现在,有了更细粒度的锁定,在内核中休眠是可能的。Linux 可以在构建时配置为其他抢占模型,例如CONFIG_PREEMPT.

虽然您的普通桌面内核可能配置了 . CONFIG_PREEMPT_VOLUNTARY,但某些发行版还CONFIG_PREEMPT作为单独的低延迟内核包提供,例如用于音频。对于实时用例,preempt_rt 补丁集甚至使大多数自旋锁可抢占(因此得名)。

于 2018-03-21T19:37:55.197 回答