我们知道,锁定自旋锁会禁用相关处理器上的抢占。现在,假设执行的内核代码调用了一个使进程休眠的函数。尽管抢占停用,Linux内核会把处理器交给另一个线程吗?

最佳答案

这要看情况。有一系列cond_resched()函数正在检查是否设置了抢占位,从而禁用重新调度:

/*
* Returns true when we need to resched and can (barring IRQ state).
*/
static __always_inline bool should_resched(void)
{
    return unlikely(!preempt_count() && tif_need_resched());
}

int __sched _cond_resched(void)
{
    if (should_resched()) {
        __cond_resched();
        return 1;
    }
    return 0;
}

但并不是所有的内核例程都这样做。即互斥直接调用schedule_preempt_disabled(),忽略原子性检查。在这种情况下,schedule()会尝试将cpu分配给另一个任务,但会抱怨“在原子级时调度”。

关于linux - 自旋锁原子上下文中的抢占和休眠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29602296/

10-11 18:50