内容提要
- CPU上下文切换都做了哪些事?
- CPU上下文切换都有哪些场景?
- 系统调用上下文切换都做了哪些事?
- 进程上下文切换都做了哪些事?
- 线程上下文切换都做了哪些事?
- 中断上下文切换都做了哪些事?
CPU上下文切换
-
什么是CPU上下文?
CPU的寄存器和程序计数器 -
CPU上下文切换要做哪些事?
- 保存前一个任务的CPU上下文;
- 加载新任务的CPU上下文到这些寄存器和程序计数器;
- 跳转到程序计数器所指的新位置,运行新任务;
注意:
这里提到的任务包括哪些?- 进程
- 线程
- 中断
-
根据任务的不同,CPU切换分为哪些场景?
- 进程上下文切换
- 线程上下文切换
- 中断上下文切换
系统调用上下文切换
-
系统调用过程中有发生CPU上下文切换吗?
有。 -
系统调用发生的CPU上下文切换过程是怎样的?
第一次CPU上下文切换- 保存进程用户态的指令位置;
- 更新CPU的寄存器为内核态指令的新位置;
- 跳转到内核态运行内核任务;
第二次CPU上下文切换
- 恢复CPU寄存器为之前保存的进程用户态的指令位置;
- 跳转到之前保存的进程用户态指令位置处,继续执行;
注意:
- 1次系统调用过程中有2次CPU上线文切换;
- 系统调用过程不涉及虚拟内存等进程用户态资源的保存;
- 系统调用过程没有发生进程的切换;
进程上下文切换
进程上下文切换要做哪些事?
- 先保存前一进程的虚拟内存、栈等用户空间的资源,然后保存该进程的内核状态和寄存器;
- 加载新进程的内核态,刷新该进程的虚拟内存和栈等用户态资源;
- 跳转到程序计数器所指的新位置,开始运行新进程;
什么时候会发生进程上下文切换?
- 进程因执行完终止了,系统从就绪队列中取出一个新的进程来运行
- 进程因时间片耗尽被挂起,系统切换其他正在等待CPU的进程来运行
- 进程因系统资源不足被挂起,系统调度其他进程来运行
- 进程通过sleep等方法主动挂起,系统调度其他进程来运行
- 进程因有更高优先级的进程要执行被挂起,系统执行高优先级进程
- 进程因发生硬件中断被挂起,系统转而执行内核中的中断服务程序
线程上下文切换
线程上下文切换要做哪些事?
如果切换前后的线程属于不同的进程,则参考进程上下文切换步骤;否则,由于切换前后同属一个进程,所以不用保存虚拟内存等共享资源。
- 保存前一线程的私有数据、寄存器等不共享的数据;
- 加载新线程的上下文到寄存器和程序计数器中;
- 跳转到程序计数器所指的新位置,开始运行新线程;
中断上下文切换
中断上下文切换都需要做哪些事?
- 不涉及前一进程的用户态,不需要保存前一进程的虚拟内存、全局变量等用户态资源,仅需要保存进程的内核态;
- 加载中断服务程序的内核态上下文,包括CPU寄存器、内核堆栈、硬件中断参数;
- 跳转到程序计数器所指的内核位置处,运行中断服务器程序。
网友评论