操作系统真相还原不明白的地方

线程调度里thread_block方法在执行当前线程状态更新前把中断给关上了,然后调用schedule函数执行切换,schedule函数会将当前线程换下,从就绪队列里再pop队首线程上处理器执行,现在有两种情况,如果此时队首是一个新线程,则新线程会开中断,所以理论上就绪队列里的所有线程都有机会上处理器执行,但是如果此时队首的线程是已经执行过的,那该线程是不会开中断的,这样就会出现新换上的线程会一直执行,不会被中断打断,直到改线程结束,但是结束也有问题,多线程调度里并没有写线程什么时候结束。

 

这个感觉是个bug,或者我还没有读到。 在线程调度代码里,当执行schedule时,会关掉中断,然后切换到新的线程,如果新的线程是第一次上CPU执行,代码里会在kernel_thread里打开中断,这个没有问题,但是如果新的线程不是第一次上CPU执行,就会出现schedule里关掉了中断,但是在后面没有打开中断,导致无法通过时钟中断调度的问题,但是奇怪的是后面这个程序跑起来了,没有问题,所有估计部分代码作者没有贴全

我靠,找到了,之前学的没有记住,在7.4.2里说中断发生时的压栈是说过,在中断发生时,CPU会自动按照顺序压栈EIP/CS/EFLAGS,然后在执行完中断处理程序以后会再按照顺序把栈里的数据按照顺序给弹到对应寄存器里,所以在中断处理程序中没有显示的开中断。

posted @ 2019-06-25 20:37  Birding  阅读(410)  评论(0编辑  收藏  举报