Linux性能学习(1.1):CPU_CPU缓存

news2024/9/24 19:22:10

文章目录

  • 1 简介
  • 2 工作机制
  • 3 Cache Line

参考资料:
1.
https://www.makeuseof.com/tag/what-is-cpu-cache/
2.
https://zhuanlan.zhihu.com/p/80672073
3.CPU Cache 机制以及 Cache miss
4.性能优化方法和技巧

在日常的嵌入式开发中,查看一些SOC的datasheet总会看到 “32KB I/D cache”“L1 cache”“L2 cache”等字样,但是不知道是什么意思,查询了一些资料,记录一下。

1 简介

CPU的运算是需要数据的,因此就需要从内存中读写一些数据来进行运算。但是CPU的运算速度很快,而内存的读写速率相比较于CPU的运行速率就比较慢,因此CPU就需要花费时间等待内存的数据到来或者把数据写入内存,这种操作就无法发挥CPU的全部功力。

因此,一种新的读写速度更快的内存—“缓存”被设计出来,用来存储一些需要频繁被访问的数据,这样CPU会先从速度更快的缓存中来读写数据,加快CPU的运算。

缓存本质上还是内存,只不过读写速度会比内存快很多。

缓存又分为一级缓存L1、二级缓存L2、三级缓存L3:
L1容量最小,但是速度最快,L1又针对指令和数据分为数据缓存和指令缓存;
L2容量比L1大,但是速度会比L1慢些;
L3容量比L2大,速度也相应比L2慢。
每一个核单独有自己的L1和L2,L3属于所有核共享的。
在这里插入图片描述

关于访问速度,查询资料,大致如下:

CPU访问一次L1,大约需要4个时钟周期;
CPU访问一次L2,大约需要11个时钟周期;
CPU访问一次L3,大约需要39个时钟周期;
CPU访问一次内存,大约需要107个时钟周期;

从上可以看出,加入了缓存机制,大大提高了CPU的工作效率,防止CPU摸鱼。

在linux下可通过如下指令查看缓存的大小:


# getconf -a | grep CACHE
LEVEL1_ICACHE_SIZE                 32768
LEVEL1_ICACHE_ASSOC                8
LEVEL1_ICACHE_LINESIZE             64
LEVEL1_DCACHE_SIZE                 32768
LEVEL1_DCACHE_ASSOC                8
LEVEL1_DCACHE_LINESIZE             64
LEVEL2_CACHE_SIZE                  262144
LEVEL2_CACHE_ASSOC                 4
LEVEL2_CACHE_LINESIZE              64
LEVEL3_CACHE_SIZE                  12582912
LEVEL3_CACHE_ASSOC                 16
LEVEL3_CACHE_LINESIZE              64
LEVEL4_CACHE_SIZE                  0
LEVEL4_CACHE_ASSOC                 0
LEVEL4_CACHE_LINESIZE              0

2 工作机制

缓存的工作机制是比较复杂的,在这里简单的描述下。

当程序执行时,会将内存中的数据载入到L3中,然后再载入L2,最后再载入L1。如果CPU需要数据,则先会在L1中寻找,然后依次是L2、L3、内存中寻找。

如果在L1中找到需要的数据,就叫做“缓存命中”。

当在L1/L2/L3中没有找到数据后,会从内存中读取数据到CPU,并会将这些数据写入到缓存中,防止后续CPU会再次使用,而不需要从内存中读取。

因为缓存的大小是有限的,而CPU会不断执行不同任务,或者CPU需要不同的数据,因此缓存中的数据会按照算法进行替换,将一些不再需要的数据淘汰出缓存,将一些频繁需要的数据放进缓存。

3 Cache Line

CPU将数据加载进缓存中,不会按照一个字节一个字节的方式进行加载,一般按照固定大小的块的进行加载,叫做缓存行即“Cache Line”。
在我的电脑中的Cache Line的大小为64Bytes。

# cat /sys/devices/system/cpu/cpu0/cache/index1/coherency_line_size 
64	

也可通过指令


# getconf -a | grep CACHE_LINESIZE
LEVEL1_ICACHE_LINESIZE             64
LEVEL1_DCACHE_LINESIZE             64
LEVEL2_CACHE_LINESIZE              64
LEVEL3_CACHE_LINESIZE              64
LEVEL4_CACHE_LINESIZE              0

关于缓存的加载策略,可参考上面链接2,本文只是简单介绍下缓存相关的内容,使对缓存有大致的了解。

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

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

相关文章

想学习编程,该怎么开始,需要多长时间?

想学习编程,该怎么开始,需要多长时间? 其实学编程也没有啥特别的方法,和我们没基础学驾照差不多。 考A照、B照还是C照,我们先得拎清,它们的用途存在一定差异 。一样的,学编程是学C,Java、Pyth…

命令行在服务器的Oracle新建、修改用户并授权

1.前提解说 由于我是使用docker拉取的Oracle,这里截图的Oracle用户是原本安装好的Oracle用户。 2.步骤 1.Linux服务器切换到Oracle su oracle 2. 进入SQL sqlplus / as sysdba 3.新建用户(一定要加“;”) create user 用户名 identified by 密码; 若是修…

Tableau可视化设计案例-02Tableau数据处理、折线图

文章目录Tableau可视化设计案例02Tableau数据处理、折线图1.数据前处理2.绘制折线图2.1 创建电影数据变化折线图2.2创建电影票房变化折线图2.3 20215年的电影数量与票房比较分析Tableau可视化设计案例 本文是Tableau的案例,为B站视频的笔记,B站视频 参考…

Java集合/泛型面试题

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Java面试题…

作为文科生,如何才能学好一门编程语言?

学习新知识的过程总是痛苦和逆人性的,古往今来皆是如此,否则也不会有十年寒窗苦读一说。 相信此刻看这篇文章的你,经历的寒窗绝对不止十年。 从小学开始算起到大学毕业,绝大多数人起码经历了16年(跳级的神童与学霸除…

5G无线技术基础自学系列 | 单站点验证测试

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 单站点验证工作是通过测试来进行功能性…

二级MS Office真题第8套完整解析

全国计算机等级考试二级新增预测第一套 一、文字处理 公司将于今年举办“创新产品展示说明会”,市场部助理小王需要将会议邀请函制作完 成,并寄送给相关的客户。现在,请你按照如下需求,在Word.docx文档中完成制作工作:…

非零基础自学Golang 第11章 文件操作 11.1 目录基本操作 11.1.1 列目录

非零基础自学Golang 文章目录非零基础自学Golang第11章 文件操作11.1 目录基本操作11.1.1 列目录第11章 文件操作 计算机文件是以硬盘为载体的信息存储集合,文件可以是文本、图片、程序等。在编写程序时,我们经常会和文件打交道,比如从文件读…

推送github一直超时以及输入密码提示2021年8月以后密码不能用解决

最近推送github常常出现443端口超时,查询了很多办法最后用了如下方法解决 首先电脑设置里面搜索代理服务器设置,记住这个端口 用上面的地址和端口运行如下命令 git config --global http.proxy http://127.0.0.1:31181 git config --global https.pro…

小学生C++画图 Go C 编程 第8课 魔法计时器(魔法学院的奇幻之旅 Go C编程绘图)

Goc编程第一课 Goc编程第一课_哔哩哔哩_bilibili Goc编程第一课扩展加复习 Goc编程第一课扩展加复习_哔哩哔哩_bilibili Goc编程第二课 Goc编程第二课_哔哩哔哩_bilibili Goc编程第三课 Goc编程第三课_哔哩哔哩_bilibili Goc编程第四课 Goc编程第四课_哔哩哔哩_bilibili G…

JSCharting JavaScript 3.3.X 12/17/2022 Crack

JSCharting JavaScript 图表库 每个 JSCharting 许可证包括全套 150 多种高级图表类型以及交互式股票图表、无缝网格和日历支持、JavaScript 地图、甘特图、JavaScript 组织结构图和微型图表,企鹅Ω578867473。 画廊 在每台设备上满足每一种需求的图表类型! 包括条形…

【前端开发学习】6.MySQL

文章目录1 MySQL 指令1.1 数据库管理(文件夹)1.2 数据表管理(文件)1.3 数据行操作总结2 案例:员工管理2.1 创建表结构2.2 Python 操作 MySQL1. 创建数据2. 查询数据3. 删除4. 修改总结3 案例: Flask 前端 …

JVM类加载/双亲委派模型

类加载是一个复杂的过程, 那么我们平时说的类加载到底是干啥的呢? 一. 类加载是干啥的 我们都知道Java程序在运行之前, 需要进行编译, 由 .java > .class文件(二进制字节码文件) , 而在运行的时候呢, Java进程(JVM), 就会读取对应的 .class文件, 并且解析他的内容, 在内存…

MySQL --- 函数大全 8

目录 1.返回一个字符串在出现指定数量的分隔符之前的子字符串 SUBSTRING_INDEX() 2.减去时间 SUBTIME() 3.返回总和 SUM() 4.返回函数执行的时间 SYSDATE() 5.返回参数的切线 TAN() 6.提取表达式传递的时间部分 TIME() 7.格式…

ZY_BMP280大气压模块的使用和stm32程序

在搞设计时,用到了大气压模块BMP280,这玩意也不难,主要是淘宝店老板特别der一问三不知,真服了,而且资料里面没有给例程,只有51的例程,利用IIC通信,而且给的例程里面,乱七…

说说 fiber、DOM、ReactElement、实例对象之间的引用关系

大家好,我是前端西瓜哥。 本文探究 fiber、DOM、ReactElement、类组件实例之间的引用关系说明。 React 版本为 18.2.0 原生组件 fiber 原生组件 fiber,指的就是 type 为 “span”、“div” 的 fiber。 fiber.stateNode 指向真实 DOM 节点;n…

Tableau可视化设计案例-03基本表、树形图、气泡图、词云

文章目录Tableau可视化设计案例03基本表、树形图、气泡图、词云1.基本表1.1基本表的使用1.2凸显表的使用1.3二值凸显表2.树形图2.1不同类型酒店数量与评价人数2.2油尖旺不同类型酒店数量与价格3.气泡图与词云3.1不同地区酒店数量与平均价格气泡图3.2动作电影动态气泡图3.3词云图…

Dubbo 4 Dubbo 高级特性 4.2 Dubbo 常用高级配置 4.2.1 序列化

Dubbo 【黑马程序员Dubbo快速入门,Java分布式框架dubbo教程】 4 Dubbo 高级特性 文章目录Dubbo4 Dubbo 高级特性4.2 Dubbo 常用高级配置4.2.1 序列化4.2 Dubbo 常用高级配置 4.2.1 序列化 【一个问题】 两个机器传输数据,如何传输Java对象&#xff…

【YOLOv7-环境搭建⑥】PyTorch安装

下载链接: 来源:(博主)唐三. 链接:https://pan.baidu.com/s/1y6s_EScOqvraFcx7iPSy1g 提取码:m1oa 安装步骤: 在命令指示符中输入以下命令: activate→conda activate py37→输入以下命令&#xff08…