中断轮询如何执行上下文切换?

时间:2017-02-03 12:06:28

标签: multithreading kernel interrupt polling context-switching

考虑一个非常老的单核CPU,它不支持硬件中断,让我们说我想编写一个多任务操作系统。使用硬件计时器,可以轮询IRQ线以确定计时器是否已经过去,如果是,则切换线程/进程。

但是,为了能够轮询,内核必须得到CPU的执行注意。对于支持硬件中断的CPU,如果中断是由上下文切换定时器,则在中断时调用ISR并且(如果我错了,请纠正),相应的ISR调用处理上下文切换的内核代码。

如果CPU不支持硬件中断(如果我错了,再次纠正我),那么内核必须反复检查中断,并在内核空间中调用相应的ISR。

但是,如果用户线程当前正在这个假设的处理器上执行,那么线程必须手动向内核执行,以便能够检查上下文切换是否到期。计时器通过适当的IRQ线。这可以通过调用适当的内核函数来完成。

有没有办法在只支持软件中断的单核处理器上实现非合作多线程?我的想法是正确的,还是我遗漏了什么?

1 个答案:

答案 0 :(得分:2)

嗯,你通常是正确的,内核不能进行多任务处理,直到它获得CPU的控制权。这是通过中断或用户代码进行系统调用时发生的。

特别是定时器中断用于抢占时间切片。我认为很难找到一个不支持定时器中断的整个CPU,你不必用穿孔卡或交换机进行编程。中断比多核或虚拟内存或DMA或任何花哨的东西都要老得多。

有些SoC具有这种限制的实时子组件(如Beaglebone),如果你在FPGA中编写一个小型CPU,它可能会出现。

没有中断,你必须等待系统调用,这基本上变成了协作式多任务处理。