c - 什么时候 preempt_count() & PREEMPT_ACTIVE == 0?

标签 c linux linux-kernel scheduler preemption

我正在查看 Linux 中的调度程序代码:

if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
    if (unlikely(signal_pending_state(prev->state, prev))) {
        prev->state = TASK_RUNNING;
    } else {
        deactivate_task(rq, prev, DEQUEUE_SLEEP);
        prev->on_rq = 0;

据我了解,如果 prev 任务是不可中断的,则此代码将停用所提供的任务(并从运行队列中删除)

preempt_count() & PREEMPT_ACTIVE == 0

谁能给我解释一下 thread_info 中的 preempt_count 是什么,什么时候满足或不满足这个条件?

最佳答案

preempt_countpreempt_disable()preempt_enable() 使用的计数器,可以嵌套使用。 preempt_count 的高阶位用于 hardirq 和 softirq 计数器,一个 NMI 位和一个 PREEMPT_ACTIVE 位。这些在 include/linux/preempt_mask.h 中定义。在 x86 架构中,PREEMPT_NEED_RESCHED 位也用在 preempt_count 中,用于优化重新安排的决定。

现在,我不清楚 preempt_countPREEMPT_ACTIVE 位的确切需要。在我开发的内核版本 3.17 中,PREEMPT_ACTIVE 在调用 __schedule() 之前在 preempt_count 中设置,并在调用后立即重置,在所有情况下,从 schedule() 调用时除外。这意味着,在 __schedule() 中,PREEMPT_ACTIVE 设置在 preempt_count 中,当调用 __schedule() 时,因为内核抢占,即不是有意用于某些其他操作系统功能,这些功能将使用 schedule()。此类“其他操作系统功能”会有所不同,具体取决于您是使用 CONFIG_PREEMPTCONFIG_PREEMPT_VOLUNTARY 还是 CONFIG_PREEMPT_NONE 构建内核,但它包括在互斥量上显式阻塞。

关于c - 什么时候 preempt_count() & PREEMPT_ACTIVE == 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40333700/

相关文章:

C header : compiler specific vs library specific?

c++ - 指向存储在结构中的数组的指针在哪里?

检查 wait() 是否失败

Linux, ARM : Why is gpiochip<num> only created if I2C GPIO Expander is present at boot?

linux - spi_driver.id_table 和 spi_driver.driver.of_match_table 的区别

c - 如何将字节内存从内核模块映射到用户空间应用程序?

c - 访问全局数组会导致段错误

c - Visual Studio 2008不显示结构指针的成员值

c - 如何在 Linux 上的 C 中设置鼠标光标位置?

php - Centos 7/Apache/PHP - mkdir() : Permission denied