10ms定时中断与中断嵌套的关系(只针对多线程OS)

来源:互联网 发布:设计价格表的软件 编辑:程序博客网 时间:2024/06/16 15:50

        10ms定时中断的目的是执行线程切换,操作过程是:保存旧线程的状态,恢复新线程的状态。至于是否将这些状态保存到旧线程的栈上,则视情况而定。现在我们来分析,在可能出现中断嵌套的情况下,10ms定时中断如何完成线程切换。


        有一个链表,链表头是旧线程,链表尾是新线程,链表中间有多个独立中断、多个嵌套中断,被嵌套中断会在这个链表中的多个位置出现,独立中断只会在1个位置出现。10ms定时中断可能作为独立中断、也可能作为被嵌套中断出现。分如下2种情况讨论:

        (1)链表中只有多个独立中断;

        (2)链表中有大于等于1个的嵌套中断;


1.链表中只有多个独立中断的情况下,10ms定时中断如何实现线程切换?

        由于链表中只有独立中断,10ms定时中断也作为其中一员,它可能位于链表头部、中部、尾部。那么事实上,10ms定时中断可独立保存旧线程的状态、独立恢复新线程的状态,在恢复新线程的状态之后,其实已经切换到新线程了,但新线程却被立刻中断,所以又执行了一些中断之后,才最终切换为新线程。


2.链表中有大于等于1个的嵌套中断的情况下,10ms定时中断如何实现线程切换?

        此时10ms定时中断本身可能是独立中断,也可能是被嵌套中断。对于任何一个被嵌套的中断而言,在被嵌套之后,无论嵌套多少层,最后都会退回到被嵌套的代码处。所以无论10ms定时中断本身是独立中断,还是被嵌套中断,都无关紧要。重要的是,如果10ms定时中断位于某个最古老中断的嵌套中间环节(它可能被嵌套多次),由于之后会退回到这个中断,并由这个中断恢复先前保存的状态,因此在10ms定时中断更新线程切换信息后,应由这个中断使用更新后的线程切换信息来执行线程切换。此时这个操作为什么不能由10ms定时中断执行?原因是一旦由它执行,则前一个被嵌套中断的状态将被错误地恢复。另一种情况是,10ms定时中断不位于任何被嵌套中断的中间环节,此时无论10ms定时中断本身是独立中断,还是被嵌套中断,都应由它自己执行线程切换。两种情况下,只要切换完成,之后的任何中断,无论它是独立中断还是被嵌套中断,都可被当作是对新线程的中断。所以如果为了简单化,我们可将10ms定时中断的硬件优先级设为最低,使得只可能出现这里说的第2种情况。





0 0
原创粉丝点击