时钟中断,调度器,任务切换

时钟中断,调度器,任务切换

总的关系是硬件触发时钟中断,时钟中断调用调度器,调度器完成任务的选择和切换。

1) 时钟中断

计算机的处理是离散的,不是连续的。这涉及到计算精度、时钟的问题。

现代的操作系统都是多任务分时系统,也就是以时间片为单位进行运转的。

多任务的切换必然要判断涉及到时间信息,操作系统可以从时钟中断获取。

另外,任务执行的时间片的数量也可以用来进行任务级别的划分。

计算强度大的可以多占用时间片,IO多的就少占用。

2) 调度器

比例公平调度,完全公平调度,EAS调度器,实时调度…等等调度方法,都是在时钟中断时触

发的。不同调度策略侧重点不同,有的重视性能,想要提高处理器利用率,有的希望任务的

频繁切换,有的想节能,有的需要硬实时。

调度器不同的地方在于对任务的负载、处理器的模型化描述,以及next任务的选择依据。

处理器的模型化描述表示了处理器的性能,任务的负载联合起来描述了处理器的负载,

这两个决定了处理器间的任务调度,next任务的选择依据在单核上最为重要。

(单一计算机上的任务调度)

3) 任务切换

任务切换在调度器完成next任务的选择之后进行的。

同一特权级下的任务切换:

最关键的地方在于,A任务在向B任务切换时,A的全部push操作针对A的

栈来运行,而A的全部pop操作针对B的栈操作。其实就是,A进行的

上下文恢复,恢复的是B任务,当然A并不知道。最后结束上下文切换,

执行jmp/call/ret指令,完成了任务代码的切换。

上面的想法引发了一个问题,对于一个新任务来说,从任务A切换到new任务,

需要恢复new任务的上下文环境,然而new任务是新创建的,没有上下文。

怎么办? 程序员需要直接捏造一个上下文环境存放到new任务的栈中。

所以os第一个任务是手动创建的,之后的任务便可以直接fork它了。

注意:在任务没有彻底完成切换时,还在本任务运行。

不同特权级下的任务切换:

与单一特权级不同的是,低特权的任务需要记录多个栈,比如3特权级需要

记录0,1,2一共4个栈。在切换到内核或者其他任务时,需要恢复不同的栈。

猜你喜欢

转载自blog.csdn.net/zhangshuaiisme/article/details/86651701