linux进程上下文切换,Linux 性能分析总结之 CPU 上下文切换(二)

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使用情况升高。这里我接着针对的是第三种大量进程切换的情况,而这种情况又可以分为三种情况,分别是:

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

系统调用

进程上下文切换

线程上线文切换

中断上下文切换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​ArduinoYun教程之ArduinoYun硬件介绍

2019独角兽企业重金招聘Python工程师标准>>> ArduinoYun教程之ArduinoYun硬件介绍 ArduinoYun的电源插座 Arduino Yun有两排插座,这些插座可以按类型分为三类:电源、数字IO和模拟输入。电源部分主要集中在如图1.7所示的部分。 图1.7 电源集中…

Java从零开始(二) Tomacat

什么是Tomacat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器。 ---//快速搭建步骤 第一步:安装JDK和Tomacat 1,安装JDK:官网下载,直接运行jdk-8u31-windows-i586.exe可执行程序,默认安装即可。 2,…

3%7python_Centos7 Python2 升级到Python3

1. 从Python官网到获取Python3的包, 切换到目录/usr/local/srcwget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz2. 使用命令如下命令进行解压缩:xz -d Python-3.7.2.tar.xztar -xf Python-3.7.2.tar3. 在/usr/local路径下创建目录--py…

.NET Nuget包 汉化工具

汉化前汉化后一键汉化附带150M数据库,包含.NET6及EFCore等常用库的翻译数据,可离线运行。使用时建议注册一个百度翻译的账号。注册地址 https://fanyi-api.baidu.com/。注意: 不是“百度云”!!! 不是“百度云”!!! 不是“百度云”!!!是“百度翻译”&…

php 计时器microtime 以及去掉数组重复值array_unique

php计时器可以计算代码执行时间,如下: 计时器 $start_time1 microtime(true); /*中间插入代码*/ $end_time1 microtime(true); echo 执行时间为:.($end_time1-$start_time1). s; 其中在注释那插入代码即可计算时间。 php去掉数组重复值可…

数据结构基础:栈(Stack)

什么是栈? 栈是限制插入和删除只能在同一个位置上进行的表,这个位置就是栈的顶端,对于栈的操作主要有三种形式:入栈(将元素插入到表中),出栈(将表最后的元素删除,也就是栈顶的元素),返回栈顶元素…

Apache错误日志提示AH02004: SSL Proxy: Peer certificate is expired

1 、问题 apache错误日志提示如下 AH02004: SSL Proxy: Peer certificate is expired 接下来日志会打印ssl握手失败 然后抓包分析的时候错误提示如下 Level: Fatal, Description: Certificate Unkonw 2 、open ssl命令探测服务器证书日期 我们用open ssl命令探测服务器证书…

【ArcGIS遇上Python】窗体版Python批量处理地理数据--栅格裁剪

一、说明 之前写过用Python代码块处理地理数据的例子,如裁剪、投影、格式转换等,曾想过用C#制作个窗体,嵌入Python代码,今天无意发现Python也能用tKinter构建简单的窗体,眼前一亮,先写个批量裁剪的例子吧。这样就不用对数据路径改来改去了,只需确定元数据路径,掩膜数据…

缺少linux内核,Linux内核缺页

整个缺页异常的处理过程非常复杂,我们这里只简单介绍一下缺页涉及到的内核函数。当CPU产生一个异常时,将会跳转到异常处理的整个处理流程中。对于缺页异常,CPU将跳转到page_fault异常处理程序中,该异常处理程序会调用do_page_faul…

简单好用的Adapter---ArrayAdapter

2019独角兽企业重金招聘Python工程师标准>>> ListView中比较简单但又非常方便的ArrayAdapter。 ArrayAdapter是BaseAdapter的派生类,在BaseAdapter的基础上,添加了一项重大的功能:可以直接使用泛型构造。 先来看一个简单的例子: Overrideprot…

表单数据自动录入_Excel总表录入、分表自动更新,只要数据透视表和一个快捷键就行...

合并多个分表到一个总表中,这样的操作很常见。但,有时候我们也需要反过来,即将一个总表拆分成多个子表,并且在总表中录入/修改数据后,每个分表都可以自动更新数据。如以下资金流动表。除了资金流水,我们还特…

php 字符串打散为数组,用逗号分隔出数组

字符串打散为数组 <?php $str "Hello world. I love php!"; print_r (explode(" ",$str)); ?> 使用explode可以将一段字符串打散成一个数组&#xff0c;不过&#xff0c;explode使用某个字符打乱&#xff0c;例如以上例子&#xff0c;我在explo…

.net Core中如何限制接口请求次数

.net core中如何限制接口请求次数像AspNetCoreRateLimit这种轮子我前面有给大家介绍过&#xff0c;今天就不说了&#xff0c;我们来聊聊背后的原理&#xff0c;欢迎各位大佬指正&#xff01;像我们经常看的一些APi请求接口网站&#xff1a;拿请求国外主要城市的七日接口举例&am…

[老老实实学WCF] 第二篇 配置WCF

老老实实学WCF 第二篇 配置WCF 在上一篇中&#xff0c;我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它。先回顾一下服务端的代码&#xff1a; [csharp] view plaincopy using System; using System.Collections.Generic; using System.Linq; using System.Te…

linux之setsid命令

1 setsid命令 setsid主要是重新创建一个session,子进程从父进程继承了SessionID、进程组ID和打开的终端,子进程如果要脱离父进程&#xff0c;不受父进程控制&#xff0c;我们可以用这个setsid命令 2 测试 比如我们ping baidu.com setsid ping baidu.com 这个时候我们再ctrl…

【ArcGIS遇上Python】三种利用Python批量处理地理数据的方法——以栅格数据投影转换为例

时至今日,笔者已经总结了三种用Python语言结合ArcGIS10.x提供的接口去批量处理地理空间数据的方法。即: 1. 用IDLE、Python Tools for Visual Studio等去编写独立的py脚本文件; 2. 用Python提供的tKinter模块去构建可视化窗体,并将其打包成exe可执行文件; …

【深入JAVA】java注解

在阅读的过程中有不论什么问题&#xff0c;欢迎一起交流 邮箱&#xff1a;1494713801qq.com QQ&#xff1a;1494713801 1、什么是java注解 注解&#xff0c;顾名思义&#xff0c;注解,就是对某一事物进行加入凝视说明&#xff0c;会存放一些信息。这些信息可能对以后某…

vlan跨交换机 udp广播_【详解】VLAN和VXLAN有何区别?VXLAN运用场景有哪些?

随着网络技术的发展&#xff0c;云计算凭借其系统利用率高、人力/管理成本低以及灵活性/扩展性方面展现的优势&#xff0c;已经成为目前各大行业IT建设的新趋势。而服务器的虚拟化作为云计算的核心技术之一&#xff0c;也得到了越来越多的应用&#xff0c;从而极大的增加了数据…

linux tcp 内核模块,C – Linux – 内核模块 – TCP头

我正在尝试创建linux内核模块,它将检查传入的数据包.目前,我正在提取数据包的TCP标头并读取源和目标端口 – >但是我得到的值不正确.我有钩功能&#xff1a;unsigned int hook_func(unsigned int hooknum,struct sk_buff *skb,const struct net_device *in,const struct net…

C#11:原始字符串

这一直以来是我写代码的一个痛点&#xff0c;C#11终于解决了&#xff0c;那就是我想把一个整齐的格式的json字符串转出&#xff0c;但不能如愿&#xff0c;要不用一个三方库来搞定&#xff0c;要不就加各种双引号&#xff0c;如果有变量还得小心处理{}&#xff0c;因为在C#stri…