V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yinusxxxx
V2EX  ›  问与答

关于操作系统进程切换的小疑问

  •  
  •   yinusxxxx · 2021-09-18 05:35:46 +08:00 · 1132 次点击
    这是一个创建于 923 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有进程 A 和 B,A 在运行,切换进程的时候需要把此刻 A 进程相关的寄存器的值放入系统内核栈或者别的什么地,然后把 B 进程相关的上下文填回寄存器,然而操作系统本身也是一个进程,那在这切换的过程中,操作系统的上下文放在了哪里?

    书本没有很好的描述这块,我知道中间有硬件的参与,但是书里只说了 CPU 有切换上下文的能力,所以想各位彦祖验证我的想法是

    1. 当中断发生时,硬件读取并执行中断处理程序,然后保存 A 进程的寄存器的值到某个存储空间 S
    2. 硬件把内核进程的上下文信息填回寄存器
    3. 内核进程把在某个地方的 A 的上下文保存到自己的内核栈
    4. 切换 TLB 等其他操作
    5. 内核从自己的内核栈中读取进程 B 的上下文放到某个存储空间 S
    6. 硬件从存储空间 S 把值填回寄存器
    xiadong1994
        1
    xiadong1994  
       2021-09-18 06:22:01 +08:00 via iPhone
    我的理解是非抢占式内核是不需要上下文的,每次陷入内核空间都不需要“从离开的地方开始”,而是根据陷入的条件从头开始处理。抢占式内核会有一小部分代码来保存 /恢复内核上下文,这一小部分代码自身也是可抢占的(自己可以保存恢复自己),所以总有机会不被抢占地完成任务(不需要保存 /恢复上下文)。
    yinusxxxx
        2
    yinusxxxx  
    OP
       2021-09-18 07:34:01 +08:00
    @xiadong1994 我又查了一些资料,是不是说并不能把操作系统理解为一个进程,而是操作系统对外的表现就是一些控制代码和数据结构,只能被动唤醒,然后进程之间切换只是硬件执行了某个代码片段,保存恢复用户进程上下文,优先级调度,刷新 TLB 的工作都是这个片段在做
    yinusxxxx
        3
    yinusxxxx  
    OP
       2021-09-18 07:39:36 +08:00
    @xiadong1994 我一开始陷入一个误区,就是操作系统是一个进程的话,它就有它自己的 PCB,我很疑惑这个 PCB 该被保存在哪里,又该怎么被调度
    xbtu
        4
    xbtu  
       2021-09-18 07:44:41 +08:00
    定时器->时间中断信号->CPU 根据中断号执行固定代码( os 启动时就设置好了在某个固定的 MEM 区域上)。
    中断代码完成以下工作:
    1.将 A 的上下文保存到 A 的栈顶
    2.将恢复 B 的上下文到寄存器
    3.设置寄存器,使 CPU 开始执行 B 的代码
    xiadong1994
        5
    xiadong1994  
       2021-09-18 08:11:24 +08:00 via iPhone
    @yinusxxxx 进程是内核所定义的概念,(宏)内核本身不能理解成一个进程
    yinusxxxx
        6
    yinusxxxx  
    OP
       2021-09-18 08:15:07 +08:00
    @xiadong1994 是的,非常感谢答疑
    ch2
        7
    ch2  
       2021-09-18 10:25:56 +08:00
    os 有自己的内核线程干一些例行的活,这种有自己的栈
    你的想法 3 里“内核进程”实际上是进程 A 的内核态
    比如说 A 要读取一个文件,是它自己切换身份为内核态,去执行高权限的代码
    如果此时需要等待磁头就位,就把此时的寄存器等数据保存在 A 自己的内核栈上
    os 不会用一个单独的“内核进程”去保存你设想中的其它进程的状态
    yinusxxxx
        8
    yinusxxxx  
    OP
       2021-09-18 10:53:16 +08:00
    @ch2 感谢答疑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3548 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:52 · PVG 12:52 · LAX 21:52 · JFK 00:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.