上下文切换(进程和线程)

657 阅读2分钟

1.进程的上下文切换

各个进程之间是共享 CPU 资源的,在不同的时候进程之间需要切换,让不同的进程可以在 CPU 执行,那么这个一个进程切换到另一个进程运行,称为进程的上下文切换

进程是由内核管理和调度的,所以进程的切换只能发生在内核态。

所以,进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源。

通常,会把交换的信息保存在进程的 PCB,当要运行另外一个进程的时候,我们需要从这个进程的 PCB 取出上下文,然后恢复到 CPU 中,这使得这个进程可以继续执行

2.CPU的上下文切换:

CPU 上下文切换就是先把前一个任务的 CPU 上下文**(CPU 寄存器和程序计数器)**保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。

系统内核会存储保持下来的上下文信息,当此任务再次被分配给 CPU 运行时,CPU 会重新加载这些上下文,这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。

3.线程的上下文切换

这还得看线程是不是属于同一个进程:

  • 当两个线程不是属于同一个进程,则切换的过程就跟进程上下文切换一样;

  • 当两个线程是属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据

所以,线程的上下文切换相比进程,开销要小很多。

4.父进程终止了,子进程会终止吗?

不一定,有时候会终止,有时候不会终止,linux里面就不会终止,子进程会变成孤儿进程; 但是看文章的时候,有些又说会终止,可能是不同系统的实现不一样

5.比如我开一万个线程,就有一万个寄存器跑出来?

A:CPU里面吧,可能是L1 L2缓存里面,当我要调度下一个线程,就从缓存中把相应的程序计数寄存器读取出来(我的说法容易引起歧义,寄存器是一个个物理的、真实存在的元件)
Q:(解释了一通)寄存器应该是轮流占坑的东西