【发布时间】:2015-08-05 20:15:55
【问题描述】:
以下是我读到的关于进程 A 和进程 B 之间的上下文切换的描述。我不明白内核堆栈的用途。假设有一个每个进程的内核堆栈。我正在阅读的描述谈到将 A 的寄存器保存到 A 的内核堆栈中,并将 A 的寄存器保存到 A 的进程结构中。将寄存器保存到内核堆栈和进程结构到底有什么意义?为什么两者都需要?
上下文切换在概念上很简单:操作系统所要做的就是保存 当前正在执行的进程的一些寄存器值(到它的 内核堆栈,例如)并为 即将执行的进程(来自其内核堆栈)。通过这样做, 操作系统因此确保当从陷阱返回指令最终 执行,而不是返回到正在运行的进程, 系统恢复执行另一个进程...
进程 A 正在运行,然后被定时器中断中断。 硬件保存它的寄存器(到它的内核栈上)并进入 内核(切换到内核模式)。在定时器中断处理程序中, 操作系统决定从正在运行的进程 A 切换到进程 B。 点,它调用 switch() 例程,它小心地保存当前 寄存器值(进入A的进程结构),恢复 进程 B 的寄存器(来自其进程结构条目),然后 切换上下文,特别是通过更改要使用的堆栈指针 B 的内核堆栈(而不是 A 的)。最后,操作系统从陷阱中返回, 这会恢复 B 的寄存器并开始运行它。
【问题讨论】:
-
Stack Overflow 不是学习操作系统内部知识的好网站。
-
概念!=现实。内核切换到自己的堆栈,以免将自己的内部堆栈要求强加到它管理的每个线程的堆栈上。无论如何,内核堆栈不是像 GP 寄存器那样存储线程上下文数据的地方——必须有一个单独的结构来存储每个线程的上下文。典型的堆栈上下文比中断线程的 GP 寄存器和/或堆栈指针大得多。
标签: process operating-system stack kernel context-switch