【问题标题】:Linux kernel: why preemption is disabled when use per-CPU variable?Linux内核:为什么在使用per-CPU变量时禁用抢占?
【发布时间】:2018-03-21 18:57:50
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux-kernel preemptive


    【解决方案1】:

    为什么我们禁用抢占?

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

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

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

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

    【讨论】:

    • 我明白了,上次我在 linux 内核上工作是在 2.6 或 2.4 版本中,所以在旧版本中就是这种情况(没有抢占),它只是针对新版本进行了更改,对吗?
    • @tomer.z Linux v2.6.39 删除了大内核锁。你的内核是否可抢占取决于配置,如果你使用的是普通桌面发行版的内核,它应该配置为CONFIG_PREEMPT_VOLUNTARY。非自愿抢占是面向音频或实时使用的。
    • 那么它到底是如何工作的呢?我是一个用户空间线程,我正在运行然后进行系统调用,所以我跳转到内核,在那里运行做一些事情,那么为什么当我在内核中时我会突然被抢占?因为我的时间片用完了?如果是这样,我如何抢占先机?当时间片运行我们的或...时触发的时钟中断的处理程序? @a3f
    • @tomer.z 自愿抢占 = 整个内核都有抢占点 (might_sleep)。强制抢占 = 每个中断(包括时间片用完时的定时器中断)都是一个可能的抢占点。
    • preempt_disable(); 会阻止强制抢占吗?我记得当内核有一个大锁时,当你在内核中运行时,你根本不能被抢占,当你完成你的业务并即将返回用户空间时,你的时间片被检查,如果它您是否转到另一个进程而不是返回用户空间,所以我试图了解这个动态现在是如何工作的@a3f
    猜你喜欢
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2010-10-23
    • 2018-06-05
    • 1970-01-01
    相关资源
    最近更新 更多