【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
记得在读书的时候,操作系统的老师就告诉我们,在cpu处理中断的时候,是不能进行上下文切换的。至于原因是什么,就说是影响中断啦、影响性能什么的。再往下深层次一点,就没有了。当然了,对老师的话,我们当然是深信不疑的。
等到后来自己port ucos2实时系统的时候发现,原来在中断返回的时候是可以进行中断上下文切换的。为什么呢?因为cpu刚刚处理了中断,而原来某个高优先级的任务可能刚刚在中断里面被唤醒,它需要理解被执行,所以在中断返回前通过必要的手段切换到这个新的实时任务运行。到了这里,我又想起了老师说过不可以在中断上下文切换的啊,为什么这里又可以了。
后来等到自己有能力阅读linux代码的时候,发现原来linux在中断返回kernel模式之前也是可以进行上下文切换的。ucos和linux都是广泛使用的代码,既然它们都在中断中进行了上下文切换,那么难到真的老师讲错了吗?
后来一天晚上,自己看书的时候,忽然顿悟了。老师说的中断里面不能上下文切换,应该是不能在中断处理到一半的时候进行上下文切换。那如果非要这么做,会带来什么后果呢?我想大约有这么几点,第一,被中断的任务会收到无端的牵连,因为如果中断不发生,它本来有机会继续运行的,现在这种切换反而会导致cpu调度的不公平,但是不会紊乱;第二,嵌套的中断也会因为cpu无端的上下文切换没有得到及时地处理,从而性能大幅度下降,某些硬件行为甚至变得不可测;第三,中断上下文切换花费时间较长,影响cpu处理其他中断,及时性有损失。
这么说来,老师没有说错,linux和ucos也没有错,这是我们自己没有找到root cause而已。这也告诉我自己,学习从来不只是获得知识而已,它还是一个思考和辨析的过程。