上下文切换
简而言之,就是将上一个任务的寄存器和程序计数器的资源保存起来,然后加载下一个任务的寄存器和程序计数器等,最后跳转到新任务的地址运行。
CPU的上下文切换情况可分为:
- 系统调用上下文切换
- 进程上下文切换
- 线程上下文切换
- 中断上下文切换
1 系统调用上下文切换
进程可通过系统调用从用户态进入到内核态,这个过程存在用户空间和内核空间之间的上下文切换。并且在系统调用结束后需要切换回用户态,因此这样就会存在两次上下文切换。这个过程并没有发生进程的切换,也被称为“特权模式切换”。
2 进程上下文切换
进程的调度由内核完成,因此进程上下文切换只存在内核空间,需要切换的资源包括虚拟内存、栈、全局变量等用户空间的资源以及内核堆栈、寄存器等内核空间资源。
虚拟内存的切换必然涉及到 MMU 中 TLB 快表的操作,这会影响内存访问速度。频繁的进程上下文切换可能耗费大量CPU时间在资源的保护和恢复上,影响CPU使用率。
3 线程上下文切换
一个进程内的所有线程共享虚拟内存和全局变量等资源,因此同一个进程内的两个线程之间发生上下文切换时只需要切换自己的私有数据,如栈和寄存器。但如果切换的两个线程不在同一进程内,则其上下文切换与进程上下文切换是一样的。
4 中断上下文切换
当硬件中断信号产生时,正在运行的进程将被打断而进入内核态的中断处理程序,此时中断处理程序无权操作当前用户态进程的用户空间内存,因此此时的上下文切换也不涉及用户空间的资源切换,