一、为什么要进行上下文切换?
Linux多任务特性,把CPU分为较短的时间片,线程或进程在时间片结束后会进行上下文切换
二、有哪些上下文切换,什么时候进行?
特权模式切换(系统调用):
1、进程既可以运行在用户空间,又可以运行在内核空间。当进行系统调用时,会陷入到内核空间,发生上下文切换
2、寄存器用户态的指令保存起来,内核态的指令加载到寄存器中,然后执行内核任务。系统调用结束后,则执行相反动作
3、同一个进程内不同模式下的调用,发生两次上下文切换。
进程上下文切换:
1、不同进行间的上下文切换,在时间片结束,调用sleep函数或者等待资源时,会发生进程上下文切换,进程上下文切换只会发生在内核态。
2、先保存虚拟内存(逻辑内存)、栈信息,然后保存内核状态和CPU寄存器
3、加载下一个进程内核态时,还需要刷新虚拟内存和用户态
线程上下文切换:
1、进程内部的线程共享进程的内存资源,因此切换时不需要进行虚拟内存的保存和刷新
2、线程有自己的栈和程序计数器等私有数据,切换时需要保存和刷新
中断上下文切换:
1、硬中断会打断进程的正常调度和执行,转而调用中断处理程序,此时需要将进程当前状态保存下来。
2、软中断是硬中断的下半部分,也会由进程产生,查询中断向量表调用对应的中断处理程序
三、上下文切换都做什么工作?
1、每个任务(process)运行前,CPU需要知道从哪里加载(内存首址)、从哪里开始运行(第一条指令)。因此需要设置好寄存器和程序计数器
2、每个任务暂停运行前,要把寄存器和程序计数器的值保存着内存栈中