1.什么叫做CPU上下文
CPU上下文指的就是CPU寄存器与程序计数器。
加载新的任务之前,现需要把前一个任务的CPU上下文(寄存器与程序计数器)保存起来,然后加载新的任务的上下文值到寄存器与程序计数器中,然后跳转到程序计数器所指的位置,执行新的任务。
CPU上下文切换分为以下三类:
- 进程上下文切换
- 线程上下文切换
- 中断上下文切换
2.进程上下文切换
系统调用:从用户态到内核态的转变,需要通过系统调用来完成。在系统调用的过程中,并不会涉及到虚拟内存等进程用户态的资源,也不会切换进程,只会有硬件上下文的切换(寄存器和程序计数器),系统调用的过程在同一个进程内完成的。通常所说的进程上下文切换是指从一个进程切换到另一个进程运行。因此,系统调用过程通常称为特权模式切换,属于同进程内的CPU上下文切换。
进程上下文切换:
进程是由内核来管理和调度的,进程的切换只能发生在内核态。进程的上下文不仅包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态。
进程上下文切换比系统调用多了一步:在保存内核态资源(当前进程的内核状态和CPU寄存器)之前,需要先把用户资源(虚拟内存、栈等)保存起来;加载了下一个进程的内核态后,还需要刷新新进程的虚拟内存和用户栈。
当虚拟内存更新后,TLB也需要刷新。
发生进程上下文切换的场景
1.进程调度。当某个进程的时间片耗尽后,就会被系统挂起,切换到其他正在等待CPU的进程。
2.进程休眠。通过休眠函数wait等,添加到等待队列中,然后重新调度。
3.有更高优先级进程运行时,
4.发生硬件中断时,CPU上的进程会被挂起,转而执行内核中的中断服务程序
其实就是中断、异常与系统调用三种情况。中断包含时间片中断与I/O中断
3.线程上下文切换
当进程拥有多个线程时,这些线程会共享相同的虚拟内存和全局变量等资源,这些资料在上下文切换时是不需要的修改的。线程有自己的私有数据,比如栈和寄存器,这些在上下文切换时是需要保存的。
1.当前后两个线程属于同一个进程时。虚拟内存时共享的,所以在切换时,虚拟内存资源就保持不动,只需要切换线程的私有数据、寄存器等。
2.前后两个线程属于不同进程。因为资源不共享,所以此时跟进程切换一致。
4.中断上下文切换
中断发生以后,中断处理会打断进程的正常调度和执行,转而调用中断处理程序。打断其他进程时,需要将进程的当前状态保存下来,中断结束以后,进程仍然可以从原来的状态恢复运行。
跟进程上下文不