小结

总结一下,不管是哪种场景导致的上下文切换,你都应该知道:

  1. CPU 上下文切换,是保证 Linux 系统正常工作的核心功能之一,一般情况下不需要我们特别关注。

  2. 但过多的上下文切换,会把CPU时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,从而缩短进程真正运行的时间,导致系统的整体性能大幅下降。

1、多任务竞争CPU,cpu变换任务的时候进行CPU上下文切换(context switch)。CPU执行任务有4种方式:进程、线程、或者硬件通过触发信号导致中断的调用。
2、当切换任务的时候,需要记录任务当前的状态和获取下一任务的信息和地址(指针),这就是上下文的内容。因此,上下文是指某一时间点CPU寄存器(CPU register)和程序计数器(PC)的内容, 广义上还包括内存中进程的虚拟地址映射信息.
3、上下文切换的过程:
(1)记录当前任务的上下文(即寄存器和计算器等所有的状态);
(2)找到新任务的上下文并加载;
(3)切换到新任务的程序计算器位置,恢复其任务。
4、根据任务的执行形式,相应的下上文切换,有进程上下文切换、线程上下文切换、以及中断上下文切换三类。
5、进程和线程的区别:
进程是资源分配和执行的基本单位;线程是任务调度和运行的基本单位。线程没有资源,进程给指针提供虚拟内存、栈、变量等共享资源,而线程可以共享进程的资源。
6、进程上下文切换:是指从一个进程切换到另一个进程。
(1)进程运行态为内核运行态和进程运行态。内核空间态资源包括内核的堆栈、寄存器等;用户空间态资源包括虚拟内存、栈、变量、正文、数据等
(2)系统调用(软中断)在内核态完成的,需要进行2次CPU上下文切换(用户空间-->内核空间-->用户空间),不涉及用户态资源,也不会切换进程。
(3)进程是由内核来管理和调度的,进程的切换只能发生在内核态。所以,进程的上下文不仅包括了用户空间的资源,也包括内核空间资源。
(4)进程的上下文切换过程:
(a)接收到切换信号,挂起进程,记录当前进程的虚拟内存、栈等资源存储;
(b)将这个进程在 CPU 中的上下文状态存储于起来;
(c)然后在内存中检索下一个进程的上下文;
(d)并将其加载到 CPU的寄存器中恢复;
(3)还需要刷新进程的虚拟内存和用户栈;
(f)最后跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程。
(5)、下列将会触发进程上下文切换的场景:
(a)、根据调度策略,将CPU时间划片为对应的时间片,当时间片耗尽,当前进程必须挂起。
(b)、资源不足的,在获取到足够资源之前进程挂起。
(c)、进程sleep挂起进程。
(d)、高优先级进程导致当前进度挂起
(e)、硬件中断,导致当前进程挂起
7、线程上下文切换:
(1)、不通进程之间的线程上下文切换,其过程和进程上下文切换大致相同。
(2)、进程内部的线程进上下文切换。不需要切换进程的用户资源,只需要切换线程私有的数据和寄存器等。这会比进程上下文进程切换消耗的资源少,所以多线程相比多进程的优势。
8、中断上下文切换
快速响应硬件的事件,中断处理会打断进程的正常调度和执行。同一CPU内,硬件中断优先级高于进程。切换过程类似于系统调用的时候,不涉及到用户运行态资源。但大量的中断上下文切换同样可能引发性能问题。

最新文章

  1. 我创建了一个网站,专门分享公众号的文章 https://asyons.com
  2. 巧用array_map()和array_reduce()替代foreach循环
  3. CSS3动画产生圆圈由小变大向外扩散的效果
  4. python学习之for语句
  5. 一个高度压缩的bit位图字典的实现
  6. table表格某一td内容太多导致样式混乱的解决方案
  7. 给MD5加上salt随机盐值加密算法实现密码安全的php实现
  8. 无限极分类,传递一个子ID得到所有父集,用于在前台分层显示标题
  9. Hex Editor实现Notepad++16进制编辑功能
  10. Controllers
  11. Tsinsen A1516. fx 数位dp
  12. 解决Item控件抢占焦点
  13. OD调试6—使未注册版软件的功能得以实现
  14. 数位dp——hud3652
  15. Openstack虚拟机在线迁移(Live Migration)
  16. 【转】所有版本chrome、chromedriver、firefox下载链接
  17. 栈溢出原理与 shellcode 开发
  18. 第15章:MongoDB-聚合操作--聚合管道--$match
  19. WPF中的Style(风格,样式)
  20. .Net WebAPI文档自动化

热门文章

  1. Python 超级玛丽代码实现:人物行走和碰撞检测
  2. OSS上传图片无法在线预览的解决方案
  3. 我该如何学习spring源码以及解析bean定义的注册
  4. c++ beep 演奏一次质量不高的天空之城
  5. vnpy源码阅读学习(3):学习vnpy的界面的实现
  6. doT的高级用法及loadData的使用
  7. js css html加载顺序
  8. AVR单片机教程——PWM调光
  9. 前端.解决form-contral总是换行问题
  10. numpy 数值的修改