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,然后在执行完中断处理程序以后会再按照顺序把栈里的数据按照顺序给弹到对应寄存器里,所以在中断处理程序中没有显示的开中断。

  • 相关阅读:
    Ext架构分析(6)最简单的layout:AnchorLayout
    Ext架构分析(4)Container之旅
    ext学习资源汇总
    DomQuery v1.1 高级
    Ext 2.0 教程 目录
    HDOJ2006 ( 求奇数的乘积 ) 【水题】
    HDOJ2017 ( 字符串统计 ) 【水题】
    状态模式(State)
    HDOJ2002 ( 计算球体积 ) 【水题】
    HDOJ2007 ( 平方和与立方和 ) 【水题】
  • 原文地址:https://www.cnblogs.com/caiyao/p/11085445.html
Copyright © 2011-2022 走看看