Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CPU的缓存L1、L2、L3与缓存行填充

CPU的缓存L1、L2、L3与缓存行填充

作者头像
chengcheng222e
发布于 2021-11-04 06:56:38
发布于 2021-11-04 06:56:38
2.7K0
举报
文章被收录于专栏:简栈文化简栈文化

L1,L2,L3 指的都是CPU的缓存,他们比内存快,但是很昂贵,所以用作缓存,CPU查找数据的时候首先在L1,然后看L2,如果还没有,就到内存查找一些服务器还有L3 Cache,目的也是提高速度。

高速缓冲存储器Cache是位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快。在Cache中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从Cache中调用,从而加快读取速度。由此可见,在CPU中加入Cache是一种高效的解决方案,这样整个内存储器(Cache+内存)就变成了既有Cache的高速度,又有内存的大容量的存储系统了。CacheCPU的性能影响很大,主要是因为CPU的数据交换顺序和CPUCache间的带宽引起的。

高速缓存的工作原理
1. 读取顺序

CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入Cache中,可以使得以后对整块数据的读取都从Cache中进行,不必再调用内存。

正是这样的读取机制使CPU读取Cache的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在Cache中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先Cache后内存。

2. 缓存分类

前面是把Cache作为一个整体来考虑的,现在要分类分析了。IntelPentium开始将Cache分开,通常分为一级高速缓存L1二级高速缓存L2

在以往的观念中,L1 Cache是集成在CPU中的,被称为片内Cache。在L1中还分数据Cache(I-Cache)和指令Cache(D-Cache)。它们分别用来存放数据和执行这些数据的指令,而且两个Cache可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能。

在P4处理器中使用了一种先进的一级指令Cache——动态跟踪缓存。它直接和执行单元及动态跟踪引擎相连,通过动态跟踪引擎可以很快地找到所执行的指令,并且将指令的顺序存储在追踪缓存里,这样就减少了主执行循环的解码周期,提高了处理器的运算效率。

以前的L2 Cache没集成在CPU中,而在主板上或与CPU集成在同一块电路板上,因此也被称为片外Cache。但从PⅢ开始,由于工艺的提高L2 Cache被集成在CPU内核中,以相同于主频的速度工作,结束了L2 Cache与CPU大差距分频的历史,使L2 CacheL1 Cache在性能上平等,得到更高的传输速度。L2Cache只存储数据,因此不分数据Cache和指令Cache。在CPU核心不变化的情况下,增加L2 Cache的容量能使性能提升,同一核心的CPU高低端之分往往也是在L2 Cache上做手脚,可见L2 Cache的重要性。现在CPUL1 CacheL2 Cache惟一区别在于读取顺序。

3. 读取命中率

CPUCache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中),CPU才访问内存。从理论上讲,在一颗拥有2级CacheCPU中,读取L1 Cache的命中率为80%。也就是说CPUL1 Cache中找到的有用数据占数据总量的80%,剩下的20%从L2 Cache读取。由于不能准确预测将要执行的数据,读取L2的命中率也在80%左右(从L2读到有用的数据占总数据的16%)。那么还有的数据就不得不从内存调用,但这已经是一个相当小的比例了。在一些高端领域的CPU(像IntelItanium)中,我们常听到L3 Cache,它是为读取L2 Cache后未命中的数据设计的—种Cache,在拥有L3 CacheCPU中,只有约5%的数据需要从内存中调用,这进一步提高了CPU的效率。

为了保证CPU访问时有较高的命中率,Cache中的内容应该按一定的算法替换。一种较常用的算法是“最近最少使用算法”(LRU算法),它是将最近一段时间内最少被访问过的行淘汰出局。因此需要为每行设置一个计数器,LRU算法是把命中行的计数器清零,其他各行计数器加1。当需要替换时淘汰行计数器计数值最大的数据行出局。这是一种高效、科学的算法,其计数器清零过程可以把一些频繁调用后再不需要的数据淘汰出Cache,提高Cache的利用率。

缓存行填充

CPU访问内存时,并不是逐个字节访问,而是以字长为单位访问。比如32位的CPU,字长为4字节,那么CPU访问内存的单位也是4字节。

这么设计的目的,是减少CPU访问内存的次数,加大CPU访问内存的吞吐量。比如同样读取8个字节的数据,一次读取4个字节那么只需要读取2次。

我们来看看,编写程序时,变量在内存中是否按内存对齐的差异。有2个变量word1、word2

图如下:

我们假设CPU4字节为单位读取内存。如果变量在内存中的布局按4字节对齐,那么读取a变量只需要读取一次内存,即word1;读取b变量也只需要读取一次内存,即word2

而如果变量不做内存对齐,那么读取a变量也只需要读取一次内存,即word1;但是读取b变量时,由于b变量跨越了2个word,所以需要读取两次内存,分别读取word1word2的值,然后将word1偏移取后3个字节,word2偏移取前1个字节,最后将它们做或操作,拼接得到b变量的值。

显然,内存对齐在某些情况下可以减少读取内存的次数以及一些运算,性能更高。

另外,由于内存对齐保证了读取b变量是单次操作,在多核环境下,原子性更容易保证。

但是内存对齐提升性能的同时,也需要付出相应的代价。由于变量与变量之间增加了填充,并没有存储真实有效的数据,所以占用的内存会更大。这也是一个典型的空间换时间的应用场景。

参考文章
  • https://blog.csdn.net/karamos/article/details/80126704
  • https://pengrl.com/p/20020/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 简栈文化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微信小程序官方组件展示之表单组件textarea源码
以下将展示微信小程序之表单组件textarea源码官方组件能力,组件样式仅供参考,开发者可根据自身需求定义组件样式,具体属性参数详见小程序开发文档。
软件事业部
2022/09/26
1.3K0
微信小程序_02创建一个简单的工程
这个时候运行一些 应该会报错,因为在myPage.js 里面没有写任何东西,程序找不到执行的函数
酷走天涯
2018/09/14
6240
微信小程序_02创建一个简单的工程
微信小程序【事件绑定】入门一篇就搞定
上述代码就四行,首先是一个 input 输入框,目的是用来输入一些值,同时下面标签就会显示,接着是两个 button 用来分别执行 +1 或者 -1 的操作,最后一个 view 标签就是为了 进行数据输入或变化的回显
BWH_Steven
2020/09/10
2.3K0
微信小程序【事件绑定】入门一篇就搞定
微信小程序-如何获取用户表单控件中的值
在小程序开发中,经常有用到表单,我们往往需要在小程序端获取用户表单输入框中的值(通常用户输入的有:switch,input,checkbox,slider,radio,picker)等,通过触发事件,然后提交给后端处理
itclanCoder
2020/10/28
7.9K0
微信小程序-如何获取用户表单控件中的值
零基础微信小程序开发——WXML 模板语法之事件绑定(保姆级教程+超详细)
在小程序开发中,事件是渲染层(Webview)到逻辑层(JsCore)的通讯方式。简单来说,当用户与小程序界面进行交互时(如点击按钮、滑动页面等),这些交互行为会被捕获并转化为特定的事件。这些事件随后被发送给逻辑层,逻辑层接收到事件后,会根据预定义的回调函数来处理这些事件,并执行相应的业务逻辑。
小白的大数据之旅
2025/05/16
1560
零基础微信小程序开发——WXML 模板语法之事件绑定(保姆级教程+超详细)
微信小程序入门《三》实例:简易form、本地存储
实例内容 登陆界面 处理登陆表单数据 处理登陆表单数据(异步) 清除本地数据 实例一: 登陆界面 在app.json中添加登陆页面pages/login/login,并设置为入口。 保存后,自动生成相
极乐君
2018/02/05
1.7K0
微信小程序入门《三》实例:简易form、本地存储
微信小程序开发实战(9):单行输入和多行输入组件
input组件用于录入单行文本,尽管input的基本功能是文本录入,但该组件的属性还是比较多的,也比较复杂。下面是input属性的属性及其含义。
蒙娜丽宁
2020/07/16
3.3K0
微信小程序开发实战(9):单行输入和多行输入组件
微信小程序开发笔记
  因为前段时间一直在做关于微信小程序方面的项目,作为一名后端的攻城狮而言做一些简单的前端页面数据操作和管理还是比较容易快上手的,当然前提是要理解微信小程序的基本语法和请求原理。该篇博客主要记录的是在编写微信小程序时使用比较频繁,实用的一些方法和一些基本原理的概括。个人觉得把这些方法掌握好了,开发一个小型的微信小程序那是绰绰有余的啦。当然我这里并没有深入的对一些语言进行详细的概述,纯属个人总结,假如需要详细的微信小程序语法文档请移驾到:[https://developers.weixin.qq.com/miniprogram/dev/]
追逐时光者
2019/08/28
2.1K0
微信小程序开发笔记
微信小程序零基础入门--->绑定事件
一、demo1.wxml <!-- 1、bindinput为绑定事件,给input表单进行时间的绑定 2、hadnInput为事件名称,事件在js中填写 3、bindtap点击事件 -->
用户5899361
2020/12/07
8380
微信小程序零基础入门--->绑定事件
全栈开发工程师微信小程序-上(下)
nodes 文本节点:type = text,全局支持class和style属性,不支持id属性。
达达前端
2019/07/03
1.6K0
全栈开发工程师微信小程序-上(下)
如何使用小程序表单组件
上一篇文章中,我们给大家介绍了小程序的视图容器及基础内容组件,该组件主要应用是输出内容。接下来这篇文章中,我们将继续介绍小程序最常用的表单组件,该组件主要应用是获取输入内容。表单组件分为11个组件,我们将对这11个组件使用做详细的介绍。
此昵称已隐藏_
2018/11/06
5.6K0
小程序弹出框详解
标题图 小程序弹出框详解 qjlx: function() { var itemList = ['病假', '事假']; wx.showActionSheet({ itemList: itemList, success: function(res) { console.log(res); console.log(itemList[res.tapIndex]); }, fail: function(res) {
达达前端
2019/07/04
3.9K0
微信小程序的动态表单,实现房屋租赁的多租客录入
本文将介绍如何使用微信小程序编写动态表单,最终实现房屋租赁系统中多租客录入的业务。
Designer 小郑
2023/08/01
4660
微信小程序的动态表单,实现房屋租赁的多租客录入
开发一个微信小程序(4):查询天气-获取某个城市的实时天气
从这一篇开始介绍如何实现一个查询天气小程序 准备工作: 1、申请和风天气开发者账号,并创建一个 Web API 类型的应用 (要调用和风天气 api 获取天气,关于如何使用和风天气api需要自行查阅文档,传送门:和风天气开发平台
冰霜
2023/02/24
3.7K0
开发一个微信小程序(4):查询天气-获取某个城市的实时天气
微信小程序添加视频组件
video组件 一、示例: wxml <View>1.播放网络视频</View> <view > <video style="width: 100%;height=400px;margin:1px;
江一铭
2022/06/16
3.1K0
微信小程序添加视频组件
轻应用小程序有哪些平台
小程序(Mini Program)是微信,支付宝、京东、抖音、等国内比较流行国民应用上的轻量级应用程序,可以通过应用内置的框架进行开发,无需下载和安装,可以直接基于在应用本身中使用。下面是一个简单的微信小程序开发示例,通过小程序获取用户输入并输出到页面上。
成都众联思索科技有限公司
2023/06/30
7100
轻应用小程序有哪些平台
小程序留言板块引入emoji表情
最近准备给博客小程序添加一个留言板功能,考虑到如果只是纯文本留言有点过于简陋了,所以准备按照仿微信风格,在评论时可以添加emoji表情发送,实际上为了简化开发,原本找到了github一个插件WxEmojiView,可以快速引入项目实现emoji表情的渲染,但是由于几个缺点放弃了使用这个插件,首先这个插件实际上是用户选择emoji表情时转换成一串对应的字符串拼接到文本中,这样输入文本的显示效果我觉得不是很理想,第二点是插件坐着没有继续维护,所以担心某一天出问题不好处理,所以最终决定自己实现文本插入emoji表情的效果。我们可以先简单看下本篇文章最终要实现的效果:
创译科技
2019/11/24
4K0
手把手教你微信小程序如何设置密码输入框
源代码 .josn 弹出框用了vant小程序的ui,需要下载。也可以不用,抽取关键代码即可。 vant-weapp:https://vant-contrib.gitee.io/vant-weapp/#/quickstart
江一铭
2022/06/17
2.8K0
手把手教你微信小程序如何设置密码输入框
[小程序]微信小程序获取input并发送网络请求
1. 获取输入框数据 wxml中的input上增加bindinput属性,和方法值 在js部分定义与之对应的方法,只要在输入的时候,数据就会绑定调用到该方法,存入data属性变量中
唯一Chat
2019/09/10
1.1K0
[小程序]微信小程序获取input并发送网络请求
小程序请假效果
var dateTimePicker = require('../../utils/dateTimePicker.js'); Page({ // 页面的初始数据 data: { date: '', winWidth: 0, winHeight: 0, // tab切换 currentTab: 0, }, //获取当前滑块的index bindchange: function(e) { const that = this; that.
达达前端
2022/04/29
4200
推荐阅读
相关推荐
微信小程序官方组件展示之表单组件textarea源码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档