什么是CPU上下文切换

什么是CPU上下文切换

  • 系统任务
  • 进程上下文切换
    • 系统调用
    • 系统调用的步骤
    • 进程上下文切换步骤
    • 进程上下文切换代价
    • 进程上下文切换的时机
    • 进程调度场景
  • 线程上下文切换
    • 线程和进程最大区别
    • 线程上下文切换的两种情况
    • 总结
  • 中断上下问切换
    • 中断和进程上下文区别
    • 总结

系统任务

系统中有三种任务:

  1. 线程
  2. 进程
  3. 硬件触发信号,导致中断处理

根据任务不同,CPU上下文切换也分为三种

  1. 线程上下文切换
  2. 进程上下文切换
  3. 中断处理上下文切换

进程上下文切换

从一个进程切换到另一个进程运行,而系统调用是同一个进程的用户态和内核态切换。

系统调用

进程拥有用户态和内核态两种空间,进程可以在用户空间运行也可以在内核空间运行。进程从用户态转变到内核态运行时,需要通过系统调用完成。

系统调用的步骤

1.CPU寄存器里原来用户态的指令位置先保存,执行内核代码,CPU寄存器需要更新为内核态指令的位置,调到内核态运行内核任务。
2.系统调用结束后,CPU寄存器回复原来保存的用户态,切换到用户控件,继续运行进程。
系统调用总结:一次系统调用的过程,发生两次PCU上下文切换。但不会涉及到虚拟内存等进程用户态的资源,一直在同一个进程中运行,也不会切换进程。所以系统调用通常称为特权模式切换,而不是上下文切换。

进程上下文切换步骤

1.保存进程的虚拟内存、栈等保存,然后保存进程内核状态和CPU寄存器
2.加载下一个进程的内核态,刷新进程的虚拟内存和用户栈

进程上下文切换代价

1.寄存器、内核栈以及虚拟内存的保存和恢复每次需要即使纳秒到数微妙的CPU时间。
2.TLB(Translation Lookaside Buffer)管理虚拟内存到物理内存的映射关系。虚拟内存更新后,TLB需要刷新,内存访问变慢。多处理系统,缓存是多处理器共享,刷新缓存影响其他处理起的进程。

进程上下文切换的时机

只有在进程调度的时候才需要切换上下文。

Linux为每个CPU都维护一个就绪队列,将活跃进程(正在运行和正在等待CPU的进程)按照优先级和等待CPU的时间排序,然后选择优先级最高和等待CPU时间最长的的进程运行。

进程调度场景

1.CPU被划分为一段段时间片,轮流分给各个进程。进程时间片耗尽,被系统挂起,从就绪队列中拿一个新的进程运行
2.进程资源不足(内存不足)时,等待资源满足才运行,这时也会被挂起,系统调度其他进程运行
3.进程调用sleep休眠函数主动挂起
4.更高优先级的进程运行,当前进程被挂起
5.发生硬件中断时,CPU上进程被挂起,转而执行内核中断服务程序

线程上下文切换

线程和进程最大区别

线程是调度的基本单位,而进程则是资源拥有的基本单位。内核中的任务调度,实际上调度的对象是线程;而进程只是给线程提供了虚拟内存、全局变量等资源。
1.当进程只有一个线程时,可以任务进程等于线程
2.当进程拥有多个线程时,这些线程会共享相同的虚拟内存和全局变量等资源。这些资源在同一个进程的多个线程上线文切换时不需要修改
3.线程有自己的私有数据,如栈和寄存器,在线程上下文切换时需要保存

线程上下文切换的两种情况

1.不同进程的线程切换。资源不共享,所以切换过程跟进程上下文切换是一样的
2.一个进程中的线程切换。共享进程资源,虚拟内存和全局变量等资源保持不变,只需切换线程私有数据,栈和寄存器数据。

总结

线程上下文切换中,同进程的线程切换,比进程间切换消耗资源更少,多线程比多进程更有优势。

中断上下问切换

为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件。而在打断其他进程时,需要将进程当前的状态保存下来,在中断结束后,进程仍然可以从原来的状态恢复运行。

中断和进程上下文区别

中断上下文切换并不涉及到进程的用户态。所以即便过程中打断了一个正处在用户态进程,也不需要保存和恢复这个进程的虚拟内存、全局变量等用户态资源。
中断上线文,其实只包括内核态终端服务程序执行所必须的状态,包括CPU寄存器、内核堆栈、硬件中断参数等。

对于一个CPU来说,中断处理比进程拥有更高的优先级,所以中断上下文切换并不会与进程上下文同时发生。
中断会打断正常进程的调度和执行,所以大部分中断处理程序都短小精悍,以便尽可能快的执行结束。
中断上下文切换也需要消耗CPU,切换次数哦过多也会耗费大量CPU,甚至严重降低系统的整体性能

总结

  1. CPU上下文切换,是保证Linux系统正常工作的核心功能之一,一般不需要特别关注
  2. 过多的上下文切换,会把CPU时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,从而缩短进程真正运行的时间,导致系统的整体性能大幅下降。

你可能感兴趣的:(操作系统)