首先先来理解一下什么是进程切换?线程切换?
无论是在多核还是单核系统中,一个CPU看上去都像是在并发的执行多个进程,这是通过处理器在进程间切换来实现的。
- 操作系统实现这种交错执行的机制称为上下文切换;
- 操作系统保持跟踪 进程运行所需要的状态信息,这种状态,就是上下文。
在任何一个时刻,单处理器系统都只能执行一个进程的代码。
当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进行上下文切换,即保存当前进程的上下文,恢复新进程的上下文,然后将控制权传递到新进程,新进程就会从上次停止的地方开始.
再来理解一下什么是上下文切换?
内核为每一个进程维持一个上下文。**上下文就是内核重新启动一个被抢占的线程所需的状态。**包括以下内容:
- 通用目的寄存器
- 浮点寄存器
- 状态寄存器
- 程序计数器:存储下一条将要执行的指令
- 用户栈
- 内核栈
- 各种内核数据结构:比如描绘地址空间的页表,包含有关当前进程信息的进程表,以及包含进程已打开文件的信息的文件表。
在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。
那么线程切换和进程切换有什么区别呢?
每个进程都有自己的虚拟地址空间,进程内的所有线程共享进程的虚拟地址空间。那么其中最主要的一个区别在于进程切换涉及虚拟地址空间的切换而线程不会。
那么为什么虚拟地址空间切换会比较耗时呢?
因为进程有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找表,页表查找很慢,所以通过有个cache就是TLB。
那么显然每个进程都有自己的页表,那么当进程切换后页表也要进行切换,页表切换后TLB就失效了。所以线程切换要比进程切换要大。