我正在查看 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_count
是 preempt_disable()
和 preempt_enable()
使用的计数器,可以嵌套使用。 preempt_count
的高阶位用于 hardirq 和 softirq 计数器,一个 NMI 位和一个 PREEMPT_ACTIVE
位。这些在 include/linux/preempt_mask.h
中定义。在 x86 架构中,PREEMPT_NEED_RESCHED
位也用在 preempt_count
中,用于优化重新安排的决定。
现在,我不清楚 preempt_count
中 PREEMPT_ACTIVE
位的确切需要。在我开发的内核版本 3.17 中,PREEMPT_ACTIVE
在调用 __schedule()
之前在 preempt_count
中设置,并在调用后立即重置,在所有情况下,从 schedule()
调用时除外。这意味着,在 __schedule()
中,PREEMPT_ACTIVE
设置在 preempt_count
中,当调用 __schedule()
时,因为内核抢占,即不是有意用于某些其他操作系统功能,这些功能将使用 schedule()
。此类“其他操作系统功能”会有所不同,具体取决于您是使用 CONFIG_PREEMPT
、CONFIG_PREEMPT_VOLUNTARY
还是 CONFIG_PREEMPT_NONE
构建内核,但它包括在互斥量上显式阻塞。
关于c - 什么时候 preempt_count() & PREEMPT_ACTIVE == 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40333700/