zoukankan      html  css  js  c++  java
  • 操作系统真相还原不明白的地方

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

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

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

  • 相关阅读:
    MySql 踩坑小记
    Redux 实现过程的推演
    正则表达式的一些探索(偏JavaScript)
    [python工具] 如何使用plotly制作散列图
    使用epoll实现一个udp server && client
    python 实现一个简单tcp epoll socket
    [原创]差分放大器阻抗匹配计算+阻抗计算小工具
    将博客搬至CSDN
    [转]谈NAND Flash的底层结构和解析
    [原创]Fashion汽车定位器拆解
  • 原文地址:https://www.cnblogs.com/caiyao/p/11085445.html
Copyright © 2011-2022 走看看