小林图解系统-二.硬件结构 2.5CPU是如何执行任务的?

CPU如何读取数据的?

CPU访问L1 Cache速度比访问内存快100倍,有高速缓存的目的:把Cache作为CPU与内存之间的缓存层,减少对内存的访问频率

所有CPU Cache Line是CPU从内存读取数据到Cache的单位。 64字节

CPU加载数组里面连续的多个数据到Cache里,因此应该按照物理内存地址分布的顺序去访问元素,Cache命中率就会提高。在我们不使用数组,而是使用单独的变量的时候,会由Cache伪共享的问题,Cache伪共享问题上是一个性能杀手,我们应该规避。

伪共享是什么,如何避免?

双核心CPU两个CPU核心并行运行两个不同线程,同时从内存读取两个不同数据,分别是类型为long的变量A和B,这个两个数据的地址在物理内存上是连续的,如果Cache Line 是64字节,并且变量A在Cache Line的开头,那么这两个数据位于同一个Cache Line 中,因为Cpu Cache Line是CPU从内存读取数据到Cache的单位,所以这两个数据被同时读入到两个CPU核心中各自Cache中。

分析伪共享的问题

分析MESI协议:

1.最开始变量A和B都还不在Cache里面,假设1号核心绑定了线程A,2号核心绑定线程B,线程A只会读写变量A,线程B只会读写变量B

2.1号核心读取变量A,由于CPU从内存读取数据到Cache的单位是Cache Line,也正好A和B同属一个Cache Line,所以A和B的数据都会加载到Cache,并标记Cache Line 为独占

3.2号核心开始从内存里读取变量B,同样读取Cache Line大小的数据到Cache,也包含了A和B,此时1和2号核心的Cache Line变为共享

4.1号核心需要修改变量A,发现是共享状态,广播给2号核心,通知2号核心把Cache中对应的Cache Line标记为[已失效],然后1号核心对应的Cache Line状态变成已修改,并修改变量A。

5.2号核心修改变量B,发现2号核心的Cache 对应的Cache Line已失效,另外1号核心也有相同数据,且为已修改,所以要先把1号核心的Cache 对应的Cache Line写回内存,然后2号核心再从内存读取Cache line大小的数据到Cache,最后把变量B修改到2号核心的Cache,并标记为已修改。

虽然变量 A 和 B 之间其实并没有任何的关系,但是因为同时归属于一个 Cache Line ,这个 Cache Line 中的任意数据被修改后,都会相互影响,从而出现 ④ 和 ⑤ 这两个步骤。

因此,这种因为多个线程同时读写同一个Cache Line的不同变量时,而导致CPU Cache失效的现象称为伪共享

避免伪共享的方法

对于经常修改的数据,避免放在同一个Cache Line中,否则就会伪共享

Linux中,__cacheline_aligned_in_smp宏定义,用于解决伪共享问题。

  • 如果在多核系统中,该宏定义是__cacheline_aligned,也就是Cache Line的大小;
  • 而在单核系统里,该宏定义是空的

举例:

struct test {
    int a;
    int b;
}

a,b物理地址连续,可能位于同意个Cache Line

为了防止伪共享

struct test {
    int a;
    int b __cacheline_aligned_in_smp;
}

这样就不会再同一个Cache line中了,消耗空间,提升性能


CPU是如何选择线程的?

Linux内核中,进程和线程都是用task_struct结构体表示的,区别在于线程的task_struct结构体里部分资源是共享了进程已创建的资源,如内存地址空间,代码段,文件描述符等。Linux的线程被称为轻量级进程。

没有创建线程的进程,只有单个执行流,被称为主线程。如果想让进程处理多个事情,可以创建多个线程分别去处理,但不管怎样,它们对应到内核里都是task_struct

所以,Linux内核里的 调度器,调度的对象就是task_struct,把这个数据结构称为任务

根据任务优先级以及相应要求分为两种,优先级的数值越小,优先级越高

  • 实时任务,对系统的响应时间要求很高,也就是要尽可能快的执行实时任务,优先级在0-99
  • 普通任务,响应时间没有很高要求,优先级在100-139

调度类

分为了这几种调度类,如下图。

Deadline和Realtime这两个调度类,都是应用于实时任务的,这两个调度类的调度策略合起来由这三种,作用如下:

SCHED_DEADLINE:按照deadline进行调度,举例当前时间点最近的deadline的任务会优先调度

SCHED_FIFO:对于相同优先级的任务,按先来先服务,但是优先级更高的任务可以插队

SCHED_RR:对于相同优先级的任务,轮流的运行,每个任务有一定的时间片,当完成时间片的任务会被放到队列尾部,保证相同优先级任务的公平性,但是高优先级的任务依然可以插队。

Fair调度类是应用与普通任务,都是由CFS调度器管理的,分为两种调度策略:

SCHED_NORMAL:普通任务使用的调度策略

SCHED_BATCH:后台任务的调度策略,不和终端进行交互,因此在不影响其他需要交互的任务,可以适当降低优先级。

完全公平的调度
基于CFS的调度算法,完全公平调度(Completely Fair Scheduling)。

想让分配给每个任务的CPU时间是一样的,于是它为每个任务安排了一个虚拟运行时间vruntime,运行越久,该任务的vruntime会越大,而没有被运行的任务,Vruntim 是不会变化的。

在CFS算法调度的时候,会优先选择vruntime少的任务,同时计算虚拟运行时间还要考虑普通任务的权重值(nice级别越低,权重值越大)

CPU运行队列

多任务的数量基本都远超CPU核心数量,因此需要排队

事实上,每个CPU都有自己的运行队列(Run Queue,rq),用于描述在此CPU上所运行的所有进程,其队列包含三个运行队列,Deadline运行队列dl_rq,实时任务运行队列rt_rq和CFS运行队列cfs_rq,其中cfs_rq是用红黑树来描述的,按Vruntime大小来排序的,最左侧的叶子节点,就是下次会被调度的任务。

调整优先级

如果启动任务,默认都是普通任务,调度类是Fair,由CFS调度器管理:实现任务运行的公平性,保障每个任务的运行的时间差不多的。

总结

理解 CPU 是如何读写数据的前提,是要理解 CPU 的架构,CPU 内部的多个 Cache + 外部的内存和磁盘都就构成了金字塔的存储器结构,在这个金字塔中,越往下,存储器的容量就越大,但访问速度就会小。

CPU 读写数据的时候,并不是按一个一个字节为单位来进行读写,而是以 CPU Cache Line 大小为单位,CPU Cache Line 大小一般是 64 个字节,也就意味着 CPU 读写数据的时候,每一次都是以 64 字节大小为一块进行操作。

因此,如果我们操作的数据是数组,那么访问数组元素的时候,按内存分布的地址顺序进行访问,这样能充分利用到 Cache,程序的性能得到提升。但如果操作的数据不是数组,而是普通的变量,并在多核 CPU 的情况下,我们还需要避免 Cache Line 伪共享的问题。

所谓的 Cache Line 伪共享问题就是,多个线程同时读写同一个 Cache Line 的不同变量时,而导致 CPU Cache 失效的现象。那么对于多个线程共享的热点数据,即经常会修改的数据,应该避免这些数据刚好在同一个 Cache Line 中,避免的方式一般有 Cache Line 大小字节对齐,以及字节填充等方法。

系统中需要运行的多线程数一般都会大于 CPU 核心,这样就会导致线程排队等待 CPU,这可能会产生一定的延时,如果我们的任务对延时容忍度很低,则可以通过一些人为手段干预 Linux 的默认调度策略和优先级。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes入门-Kubernetes集群构成

目录 前言 控制面板节点与工作节点 控制面板节点 工作节点 被托管的Kubernetes 用kubectl命令行工具管理Kubernetes 前言 前面说过,Kubernetes是云的操作系统顾名思义,它位于应用和基础设施之间Kubernetes运行在基础设施上,而应用运行…

【Linux安装Conda环境的详细教程】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

服务器流量收发测试

文章目录 一、概述二、实现方式一:编码1. 主要流程2. 核心代码3. 布署 三、实现方式二:脚本1.脚本编写2. 新增crontab任务 四、查看结果 一、概述 我们在安装vnStat、wondershaper便想通过实际的数据收发来进行测试。 二、实现方式一:编码 …

外包干了2年,彻底废了...

先说一下自己的情况。大专生,17年通过校招进入湖南某软件公司,干了接近2年的点点点,今年年上旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了五年的功能测试…

UniAudio 1.5:大型语言模型(LLMs)驱动的音频编解码器

大型语言模型(LLMs)在文本理解和生成方面展示了卓越的能力,但它们不能直接应用于跨模态任务,除非进行微调。本文提出了一种跨模态上下文学习方法,使未进行进一步训练的LLMs能够在少量示例的情况下,无需任何…

面向机电工程和制造项目数字管理-项目一体化解决方案

一、专业面向机电工程和制造项目管理 1、项目范围管理 大多数企业有这样的经历,项目做了很久感觉做不完,就像是个无底洞。项目中哪些该做,哪些不该做,做到什么程度没有一个实际的把控。这里就会涉及到“范围管理”的概念。 2、…

[机器学习算法]决策树

1. 理解决策树的基本概念 决策树是一种监督学习算法,可以用于分类和回归任务。决策树通过一系列规则将数据划分为不同的类别或值。树的每个节点表示一个特征,节点之间的分支表示特征的可能取值,叶节点表示分类或回归结果。 2. 决策树的构建…

【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt窗口 | 标准对话框 | 颜色对话框QColorDialog 文章编号:…

IFM易福门SV7500SV4200涡街流量计型号都是进口的。

IFM易福门SV7500SV4200涡街流量计型号都是进口的。工程余料。

【docker安装rabbitmq】

docker安装rabbitmq 1.查阅rabbitmq的Dokcer Hub官方说明 rabbitmq地址,因为我们需要使用的是带管理界面的rabbitmq服务。所以我们需要下载的rabbitmq:management镜像 docker pull rabbitmq:management2.启动rabbitmq 2.1.快速启动 One of the important thing…

新火种AI|实属罕见!四大AI顶流同台,有哪些关键信息值得关注?

作者:小岩 编辑:彩云 在有着“AI春晚”之称的2024年智源大会上,非常难得的一幕出现了:当下国内的四大AI顶流公司——月之暗面,百川智能,智谱AI,面壁智能齐聚一堂,十分罕见的同台了…

PHP转Go系列 | 变量常量的使用姿势

大家好&#xff0c;我是码农先森。 变量 在 PHP 语言中&#xff0c;初始化变量虽然只有一行&#xff0c;其实包含了两步&#xff0c;一是声明变量&#xff0c;二是赋值给变量&#xff0c;同一个变量可以任意再赋值任何类型的数据。 <?php// 初始化变量 $name "man…

白酒:酒文化的地域特色与差异

中国的白酒文化&#xff0c;作为一种深深植根于人们生活中的文化现象&#xff0c;其发展历程深受地域特色的影响&#xff0c;从而形成了丰富多样的地域特色与差异。云仓酒庄的豪迈白酒&#xff0c;作为中国白酒的品牌&#xff0c;其背后所蕴含的地域特色与差异更是值得我们去探…

【pytorch01】简单回归问题

1.梯度下降&#xff08;Gradient Descent&#xff09; y x 2 ∗ s i n ( x ) yx^{2}*sin(x) yx2∗sin(x) y ′ 2 ∗ x ∗ s i n ( x ) x 2 ∗ c o s ( x ) y2*x*sin(x) x^{2}*cos(x) y′2∗x∗sin(x)x2∗cos(x) 求最小值要求导 梯度下降定义&#xff1a;梯度下降要迭代计…

Python接口测试实战之搭建自动化测试框架

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一.数据分离:从Excel中读取数据 之前的用例中&#xff0c;数据直接写在代码文件里&#xff0c;不…

【UML用户指南】-19-对基本行为建模-用例图

目录 1、组成结构 2、表示法 3、一般用法 3.1、对主题的语境建模 3.2、对主题的需求建模 4、常用建模技术 4.1、对系统的语境建模 4.1.1、设计过程 4.2、对系统的需求建模 4.2.1、设计过程&#xff1a; 5、正向工程 UML 中的用例图是对系统的动态方面建模的 5 种图之…

202483读书笔记|《牵牛花浮世无篱笆:千代尼俳句250》——被红叶染红的只有一侧山坡之山 啊,单恋

202483读书笔记|《牵牛花浮世无篱笆&#xff1a;千代尼俳句250》——被红叶染红的只有一侧山坡之山 啊&#xff0c;单恋 春之句夏之句秋之句冬之句 历史读过的俳句列表: 202318读书笔记|《芭蕉芜村一茶&#xff1a;俳句三圣新译300》——樱花——让一整个春夜亮起来&#xff0…

idea的右边栏maven不见了(丢了)解决方案以及idea无法识别maven项目

前言 众所周知&#xff0c;idea是java开发中不可缺少的利器&#xff0c;但是由于功能过多&#xff0c;导致奇怪的问题也很多 问题汇总 idea的右边栏maven丢了 idea无法识别maven项目 对应的解决办法 idea的右边栏maven丢了 原因可能是被自己手动移除了 或者 项目没被正确…

实现rtos操作系统 【一】基本任务切换实现

一、实现 PendSV 中断 PendSV是什么 我们先引用《Cortex-M3权威指南》对PendSV的介绍&#xff1a; PendSV&#xff08;可悬起的系统调用&#xff09;&#xff0c;它是一种CPU系统级别的异常&#xff0c;它可以像普通外设中断一样被悬起&#xff0c;而不会像SVC服务那样&#…

百度一下首页制作(HTML+CSS)

部分代码展示&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>百度一下&#xff0c;你就知道</title><style type"text/css">/*清除元素默认性质*/body { margin: 0;padding: 0;list-…