有进程 A 和 B,A 在运行,切换进程的时候需要把此刻 A 进程相关的寄存器的值放入系统内核栈或者别的什么地,然后把 B 进程相关的上下文填回寄存器,然而操作系统本身也是一个进程,那在这切换的过程中,操作系统的上下文放在了哪里?
书本没有很好的描述这块,我知道中间有硬件的参与,但是书里只说了 CPU 有切换上下文的能力,所以想各位彦祖验证我的想法是
1
xiadong1994 2021-09-18 06:22:01 +08:00 via iPhone
我的理解是非抢占式内核是不需要上下文的,每次陷入内核空间都不需要“从离开的地方开始”,而是根据陷入的条件从头开始处理。抢占式内核会有一小部分代码来保存 /恢复内核上下文,这一小部分代码自身也是可抢占的(自己可以保存恢复自己),所以总有机会不被抢占地完成任务(不需要保存 /恢复上下文)。
|
2
yinusxxxx OP @xiadong1994 我又查了一些资料,是不是说并不能把操作系统理解为一个进程,而是操作系统对外的表现就是一些控制代码和数据结构,只能被动唤醒,然后进程之间切换只是硬件执行了某个代码片段,保存恢复用户进程上下文,优先级调度,刷新 TLB 的工作都是这个片段在做
|
3
yinusxxxx OP @xiadong1994 我一开始陷入一个误区,就是操作系统是一个进程的话,它就有它自己的 PCB,我很疑惑这个 PCB 该被保存在哪里,又该怎么被调度
|
4
xbtu 2021-09-18 07:44:41 +08:00
定时器->时间中断信号->CPU 根据中断号执行固定代码( os 启动时就设置好了在某个固定的 MEM 区域上)。
中断代码完成以下工作: 1.将 A 的上下文保存到 A 的栈顶 2.将恢复 B 的上下文到寄存器 3.设置寄存器,使 CPU 开始执行 B 的代码 |
5
xiadong1994 2021-09-18 08:11:24 +08:00 via iPhone
@yinusxxxx 进程是内核所定义的概念,(宏)内核本身不能理解成一个进程
|
6
yinusxxxx OP @xiadong1994 是的,非常感谢答疑
|
7
ch2 2021-09-18 10:25:56 +08:00
os 有自己的内核线程干一些例行的活,这种有自己的栈
你的想法 3 里“内核进程”实际上是进程 A 的内核态 比如说 A 要读取一个文件,是它自己切换身份为内核态,去执行高权限的代码 如果此时需要等待磁头就位,就把此时的寄存器等数据保存在 A 自己的内核栈上 os 不会用一个单独的“内核进程”去保存你设想中的其它进程的状态 |