看小林的操作系统图解时对于进程上下文和cpu上下文有了一些疑问,就是cpu上下文切换时提到保存cpu相关的数据,而在进程上下文切换时又说要保存替换虚拟内存中的相关数据,所以就有了一个疑问,我感觉这两者不是一个东西。之后重新阅读再加上看了些别人的文章便有了下面的理解。
cpu上下文切换
大多数操作系统都是多任务,通常支持大于 CPU 数量的任务同时运行。任务是交给 CPU 运行的,那么在每个任务运行前,CPU 需要知道任务从哪里加载,又从哪里开始运行。
所以,操作系统需要事先帮 CPU 设置好 CPU 寄存器和程序计数器。
CPU 寄存器和程序计数是 CPU 在运行任何任务前,所必须依赖的环境,这些环境就叫做 CPU 上下文。
CPU 上下文切换就是先把前一个任务的 CPU 上下文(CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。
上面提到的任务可以是进程、线程和中断。所以根据任务的不同,cpu上下文可以分为进程上下文、线程上下文和中断上下文。
进程上下文切换
进程是由内核管理和调度的,所以进程的切换只能发生在内核态。进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源。
通常,会把交换的信息保存在进程的 PCB,当要运行另外一个进程的时候,我们需要从这个进程的 PCB 取出上下文,然后恢复到 CPU 中,这使得这个进程可以继续执行。
疑问的解答
这些任务都是由cpu加载运行的,所以cpu的寄存器和计数器是任何任务都需要有的且是独一无二的。所以做任何任务的切换都需要将cpu相关的信息进行保存。而如果任务由一个笼统称呼精确到是进程、线程或中断时,由于这三者运行的环境有所不同,所以要额外保存一些必要的相关内容才能进行切换。