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

2021-09-18 05:35:46 +08:00
 yinusxxxx

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/802661

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX