【发布时间】:2018-07-01 05:06:49
【问题描述】:
我正在阅读 Linux 源代码以了解调度的工作原理。我了解到在可抢占内核(设置了CONFIG_PREEMPT)中,通过调用preempt_schedule_irq 从中断处理程序返回内核空间后有机会进行抢占。
不过,我也在preempt_schedule_irq中找到了如下代码sn-p
do {
preempt_disable();
local_irq_enable(); //why enable interrupt here?
__schedule(true); //interrupt would be disabled inside it
local_irq_disable();
sched_preempt_enable_no_resched();
} while (need_resched());
里面有一个local_irq_enable() 调用,这让我很困惑。既然at the start of __schedule it would disabled again,为什么还要在这里开启中断?
我的猜测是,这让优先级更高的进程有机会首先被调度。但是,这并没有意义,因为在preempt_schedule_irq中已经禁用了抢占,即使有中断,也不会重新安排抢占。
那么在这里抢占调度程序到底有什么意义呢?我想我一定错过了什么,但我不明白。
【问题讨论】:
-
不是和优先级倒置有关吗?
-
感谢提供线索,我不知道,所以我会调查一下。
-
@Jean-BaptisteYunès 嗨,我昨天做了一些搜索,但我仍然不太明白它与优先级反转的关系。我看不到它的优先级在哪里改变,启用中断如何帮助防止这种情况?假设有 3 个进程,其优先级为 A
-
我自己不明白这一切的目的是什么,但你认为这可能与高优先级优先调度有关,我想到了优先级反转问题。乍一看,这一切似乎很奇怪而且没有用,但我怀疑它是。
标签: c linux linux-kernel interrupt