linux进程上下文切换,Linux 性能分析总结之 CPU 上下文切换(二)-程序员宅基地

技术标签: linux进程上下文切换  

0x00 前言

上一篇笔记中我讲到了,在寻找 CPU 的性能瓶颈的问题的时候,首先会查看整台机器的平均负载是否高,然后再使用 pidstat 等工具判断到底是哪种情况导致的平均负载升高,主要情况有三种:

CPU 密集型

IO 密集型

大量进程的场景

前面两种情况我们都很好理解,但是大量的进程怎么也会导致 CPU 出现瓶颈呢?这是因为我们的 CPU 核心在执行任务的时候,仍然是单任务的,只不过它执行的很快,让每个进程交替着执行,所以在人类眼中看上去像是多个线程在并行执行。然而不同的线程交替的切换着执行时需要成本的,当进程数量很多的时候,CPU Context Swith 就很频繁了,那么就会导致 CPU 出现性能瓶颈。CPU Context Swith 可以分为以下几种场景:

进程上下文切换

线程上下文切换

中断上下文切换

0x01 进程上下文切换

首先,Linux 按照特权等级,把进程的运行空间分为内核态和用户态,CPU 特权等级为 0-3 数字越小权限越高。

bVbxrzf

那么问题来了,由于 Linux 现在只用到了两个特权等级,分别是 Ring 0 内核态和 Ring 3 用户态,所以运行在不同的特权等级上的进程上下文切换主要有两种:

用户态进程之间的切换

用户态进程陷入到内核态,即系统调用

那用户态进程陷入内核态进程与用户态空间之间的切换有何不同呢?不同之处在于用户态在进行系统调用的时候,会发生两次 CPU 的上下文切换,分别是:

用户态进程调用系统调用,并陷入到内核态

内核进程执行完调用后再恢复原来的用户态的进程执行

如此说来,那么在系统调用的时候,当前用户态进程并不会切换成其他的用户态进程,它只是进行了系统调用(即切换到内核态)又恢复了,所以我们把为了好区分,把系统调用说成特权模式切换,用户态之间的进程切换说成上下文切换。

系统调用与上下文切换有何区别?

上下文切换相比系统调用会保存进程的虚拟内存和栈,所以会消耗更多的时间

何时会进行进程上下文切换?

CPU 时间片结束,CPU 是划分为多个时间片的给不同进程使用的

进程运行需要的资源不够,如等待IO,Memory insufficient 等等

进程主动挂起,如 sleep 函数

有优先级更高的进程执行,如硬中断

0x02 线程上下文切换

线程与进程的区别是什么?线程是调度的基本单位,进程是资源拥有的基本单位。也就是说线程是实际上干活的,是内核实际调度的对象,但是干活你需要工具和场地,而进程就是给线程提供了虚拟内存、全局变量等资源。所以可以这么理解:

进程 = 所有线程 + 资源

如果进程只有一个线程,那么可以认为这个线程就代表整个进程

如果一个进程有多个线程,所有线程共享这个进程的资源,在上下文切换的时候这些资源也不需要切换

线程有自己的私有数据,如 stack,Register等,这些需要保存

那么线程的情况分为两种:

前后线程属于一个进程,那么资源是共享的,所以只需要切换线程的私有数据

如果前后线程属于不同的进程,那么切换的情况和进程是一样的

0x03 中断上下文切换

中断是外部事件对 CPU 执行过程打的打断,中断程序也是需要执行的,它会保存被打断的进程的状态,这样中断程序执行完后,原来的进程还能接着执行,既然要切换进程那么自然中断也需要上下文切换,也会消耗 CPU 的资源。但是由于中断并不涉及到切换用户态进程,所以进程的资源是不需要保存和恢复的。

0x04 总结

从上个笔记中我说到了根据 CPU 升高的情况下,会有三种原因导致 CPU使用情况升高。这里我接着针对的是第三种大量进程切换的情况,而这种情况又可以分为三种情况,分别是:

进程上下文切换(进程切换就是特殊情况的线程切换)

系统调用

进程上下文切换

线程上线文切换

中断上下文切换

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34966468/article/details/116594782

智能推荐

【AJAX学习笔记四】ajax响应服务器端的JSON数据_ajax 后端 responsejson-程序员宅基地

文章浏览阅读277次。ajax响应服务器端的JSON数据+nodemon启动_ajax 后端 responsejson

Elasticsearch和Kibana版本对应关系-程序员宅基地

文章浏览阅读3k次。1.elasticsearch和Kibana版本关系**在使用Kibana时,需要注意Kibana的版本号必须和ES的版本相互对应,不然会出现Kibana和ES不兼容的问题,导致Kibana安装后不能使用。**具体的版本对应问题,可以参考官网:elasticsearch和Kibana版本关系ElasticsearchKibanaX-PackBeats^*Elastic Agent^*Logstash^*ES-Hadoop (jar)*****APM ServerApp SearchEn

实验1 构建实验环境_1.在构建好的实践环境中什么是虚拟机?什么是主机?-程序员宅基地

文章浏览阅读655次。实验1 构建实验环境【实验目的】(1)掌握实验环境构建方法。(2)掌握实验工具使用方法。【实验原理/实验基础知识】VMWare Workstation 是一款功能强大的桌面虚拟计算机软件,提供用户在单一的桌面上同时运行不同的操作系统,例如,可同时Windows、DOS、LINUX系统。与“多启动”系统相比,VMWare采用了完全不同的概念。“多启动”系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。VMWare是真正“同时”运行,多个操作系统在主系统的平台上,就像标准Wi.._1.在构建好的实践环境中什么是虚拟机?什么是主机?

PowerPC 汇编_powerpc汇编手册-程序员宅基地

文章浏览阅读477次,点赞2次,收藏5次。PowerPC 上加载和存储的艺术https://www.ibm.com/developerworks/cn/linux/l-powasm2.htmlNX bithttps://en.wikipedia.org/wiki/NX_bitLinux 可加载内核模块剖析https://www.ibm.com/developerworks/cn/linux/l-lkm/index.ht..._powerpc汇编手册

OAK-D-PRO-POE相机跑通ORB_SLAM3双目实例-程序员宅基地

文章浏览阅读644次,点赞17次,收藏29次。4.1在dai_ws工作区下运行roslaunch depthai_examples stereo_node.launch指令,打开另外一个终端输入rostopic list 指令。此指令代表启动depthai_examples包下的stereo_node.launch节点,如下图所示。则将指令中 ORBvoc.txt和oak-d-pro-poe.yaml的路径改为绝对路径。4.3编写oak-d-pro-poe相机的内参文件 oak-d-pro-poe.yaml。5.1在dai_ws工作区中启动双目节点。

Leetcode 160. 相交链表-程序员宅基地

文章浏览阅读239次。题目解答解法一:两个栈倒序弹出具体如下:使用两个栈保存两个链表的遍历结果。然后同时弹栈,如果两个栈弹出的结点不同,那么前一个结点就是最近的共同结点。复杂度:O(m + n) 的时间,O(m + n) 的空间代码/** * Definition for singly-linked list. * public class ListNode { * int v...

随便推点

delphi XE Android四大组件ContentProvider:delphi XE可调用的Android ContentProvider有哪些?_delphi 调用安卓接口-程序员宅基地

文章浏览阅读1.2k次。delphi XE Android四大组件ContentProvider:delphi XE可调用的Android ContentProvider有哪些?delphi XE用Android SDK方法开发App(二)运用Android四大组件之ContentProviderunit Androidapi.JNI.Provider;interfaceuses Andro..._delphi 调用安卓接口

8、RTP OVER RTSP/TCP的RTSP服务器-程序员宅基地

文章浏览阅读855次。一、RTP OVER RTSP(TCP)的实现1.1 发送RTP包方式对于RTP OVER UDP 的实现,我们使用TCP连接来发送RTSP交互,然后创建新的UDP套接字来发送RTP包,和建新的UDP套接字来发送RTCP包。对于RTP OVER RTSP(TCP)来说,我们会复用使用原先发送RTSP的socket来发送RTP包和RTCP包。1.2 如何区分RTSP、RTP、RTCP..._rtp over rtsp

软件定义的车辆(SDV)技术深入研析(二)-程序员宅基地

文章浏览阅读431次,点赞7次,收藏19次。点击蓝字 关注我们在软件定义的车辆(SDV)技术深入研析(一)中,我们介绍了什么是SDV,以及汽车SOA化能给我们带来的好处。今天我们将把目光转移到目前汽车行业SDV/SOA化的进展方面,关注目前出现并被积极讨论的SOA解决方案。汽车E/E架构变迁史SDV概念的提出是随着E/E架构的不断演进而诞生的,由过去的分布式ECU架构在向域集中式架构进化过程中形成的,因此简要回顾一下E/E架构的变迁史就显得...

leetcode:403. 青蛙过河【经典dfs+记忆化搜索】_dfs记忆化搜索青蛙过河-程序员宅基地

文章浏览阅读90次。动态规划题两种思路正向dp不好写的话 扔给 记忆化dfs。_dfs记忆化搜索青蛙过河

EasyUI(1) 使用方法、引入、创建组件、LinkButton、panel、tree、Menu_easyui panel 动态加载 linkbutton-程序员宅基地

文章浏览阅读2.1k次。第一步:点击去官网下载EasyUI第二步:项目中导入easyui所需东西第三步:引入EasyUI <!-- easyui样式支持 --> <link rel="stylesheet" type="text/css" href="../easyui/themes/default/easyui.css"> <!-- easyui图标..._easyui panel 动态加载 linkbutton

基于HTML5 canvas的jQuery刮刮卡效果-程序员宅基地

文章浏览阅读2.5k次。ScratchIt是一款基于HTML5 canvas的jQuery刮刮卡效果插件。这个刮刮卡效果使用两张图片和canvas来制作,可以使用鼠标擦除上面的图片,将下面的图片显露出来,模拟现实的刮刮卡效果。效果演示:http://www.htmleaf.com/Demo/201506071985.html下载地址:http://www.htmleaf.com/html5/html5-can

推荐文章

热门文章

相关标签