网易首页 > 网易号 > 正文 申请入驻

CPU 是如何读写内存的?

0
分享至

如果你觉得这是一个非常简单的问题,那么你真应该好好读读本文,我敢保证这个问题绝没有你想象的那么简单。注意,一定要完本文,否则可能会得出错误的结论

闲话少说,让我们来看看CPU在读写内存时底层究竟发生了什么。


谁来告诉CPU读写内存

我们第一个要搞清楚的问题是:谁来告诉CPU去读写内存?答案很明显,是程序员,更具体的是编译器。

CPU只是按照指令按部就班的执行,机器指令从哪里来的呢?是编译器生成的,程序员通过高级语言编写程序,编译器将其翻译为机器指令,机器指令来告诉CPU去读写内存。

在精简指令集架构下会有特定的机器指令,Load/Store指令来读写内存,以x86为代表的复杂指令集架构下没有特定的访存指令。

精简指令集下,一条机器指令操作的数据必须来存放在寄存器中,不能直接操作内存数据,因此RISC下,数据必须先从内存搬运到寄存器,这就是为什么RISC下会有特定的Load/Store访存指令,明白了吧。


而x86下无此限制,一条机器指令操作的数据可以来自于寄存器也可以来自内存,因此这样一条机器指令在执行过程中会首先从内存中读取数据。

两种内存读写

现在我们知道了,是特定的机器指令告诉CPU要去访问内存。不过,值得注意的是,不管是RISC下特定的Load/Store指令还是x86下包含在一条指令内部的访存操作,这里读写的都是内存中的数据,除此之外还要意识到,CPU除了从内存中读写数据外,还要从内存中读取下一条要执行的机器指令。

毕竟,我们的计算设备都遵从冯诺依曼架构:程序和数据一视同仁,都可以存放在内存中


现在,我们清楚了CPU读写内存其实是由两个因素来驱动的:

  • 程序执行过程中需要读写来自内存中的数据

  • CPU需要访问内存读取下一条要执行的机器指令

然后CPU根据机器指令中包含的内存地址或者PC寄存器中下一条机器指令的地址访问内存。

这不就完了吗?有了内存地址,CPU利用硬件通路直接读内存就好了,你可能也是这样的想的。

真的是这样吗?别着急,我们接着往下看,这两节只是开胃菜,正餐才刚刚开始。


急性子吃货 VS 慢性子厨师

假设你是一个整天无所事事的吃货,整天无所事事,唯一的爱好就是找一家餐厅吃吃喝喝,由于你是职业吃货,因此吃起来非常职业,1分钟就能吃完一道菜,但这里的厨师就没有那么职业了,炒一道菜速度非常慢,大概需要1小时40分钟才能炒出一道菜,速度比你慢了100倍,如果你是这个吃货,大概率会疯掉的。

而CPU恰好就是这样一个吃货,内存就是这样一个慢吞吞的厨师,而且随着时间的推移这两者的速度差异正在越来越大:


在这种速度差异下,CPU执行一条涉及内存读写指令时需要等“很长一段时间”数据才能“缓缓的”从内存读取到CPU中,在这种情况你还认为CPU应该直接读写内存吗

无处不在的28定律

CPU执行指令符合28定律,大部分时间都在执行那一少部分指令,这一现象的发现奠定了精简指令集设计的基础。

而程序操作的数据也符合类似的定律,只不过不叫28定律,而是叫principle of locality,程序局部性原理

如果我们访问内存中的一个数据A,那么很有可能接下来再次访问到,同时还很有可能访问与数据A相邻的数据B,这分别叫做时间局部性空间局部性


如图所示,该程序占据的内存空间只有一少部分在程序执行过程经常用到

有了这个发现重点就来了,既然只用到很少一部分,那么我们能不能把它们集中起来呢?就像这样:


集中起来然后呢?放到哪里呢?当然是放到一种比内存速度更快的存储介质上,这种介质就是我们熟悉的SRAM,普通内存一般是DRAM,这种读写速度更快的介质充当CPU和内存之间的Cache,这就是所谓的缓存。

四两拨千斤

我们把经常用到的数据放到cache中存储,CPU访问内存时首先查找cache,如果能找到,也就是命中,那么就赚到了,直接返回即可,找不到再去查找内存并更新cache。

我们可以看到,有了cache,CPU不再直接与内存打交道了


但cache的快速读写能力是有代价的,代价就是Money,造价不菲,因此我们不能把内存完全替换成cache的SRAM,那样的计算机你我都是买不起的

因此cache的容量不会很大,但由于程序局部性原理,因此很小的cache也能有很高的命中率,从而带来性能的极大提升,有个词叫四两拨千斤,用到cache这里再合适不过。

天下没有免费的午餐

虽然小小的cache能带来性能的极大提升,但,这也是有代价的。这个代价出现在写内存时。当CPU需要写内存时该怎么办呢?

现在有了cache,CPU不再直接与内存打交道,因此CPU直接写cache,但此时就会有一个问题,那就是cache中的值更新了,但内存中的值还是旧的,这就是所谓的不一致问题,inconsistent。

就像下图这样,cache中变量的值是4,但内存中的值是2。


同步缓存更新

常用 redis 的同学应该很熟悉这个问题,可是你知道吗?这个问题早就在你读这篇文章用的计算设备其包含的CPU中已经遇到并已经解决了。

最简单的方法是这样的,当我们更新cache时一并把内存也更新了,这种方法被称为 write-through,很形象吧。

可是如果当CPU写cache时,cache中没有相应的内存数据该怎么呢?这就有点麻烦了,首先我们需要把该数据从内存加载到cache中,然后更新cache,再然后更新内存。


这种实现方法虽然简单,但有一个问题,那就是性能问题,在这种方案下写内存就不得不访问内存,上文也提到过CPU和内存可是有很大的速度差异哦,因此这种方案性能比较差。有办法解决吗?答案是肯定的。

异步更新缓存

这种方法性能差不是因为写内存慢,写内存确实是慢,更重要的原因是CPU在同步等待,因此很自然的,这类问题的统一解法就是把同步改为异步。

异步的这种方法是这样的,当CPU写内存时,直接更新cache,然后,注意,更新完cache后CPU就可以认为写内存的操作已经完成了,尽管此时内存中保存的还是旧数据。

当包含该数据的cache块被剔除时再更新到内存中,这样CPU更新cache与更新内存就解耦了,也就是说,CPU更新cache后不再等待内存更新,这就是异步,这种方案也被称之为write-back,这种方案相比write-through来说更复杂,但很显然,性能会更好。


现在你应该能看到,添加cache后会带来一系列问题,更不用说cache的替换算法,毕竟cache的容量有限,当cache已满时,增加一项新的数据就要剔除一项旧的数据,那么该剔除谁就是一个非常关键的问题,限于篇幅就不在这里详细讲述了。

多级cache

现代CPU为了增加CPU读写内存性能,已经在CPU和内存之间增加了多级cache,典型的有三级,L1、L2和L3,CPU读内存时首先从L1 cache找起,能找到直接返回,否则就要在L2 cache中找,L2 cache中找不到就要到L3 cache中找,还找不到就不得不访问内存了。

因此我们可以看到,现代计算机系统CPU和内存之间其实是有一个cache的层级结构的


越往上,存储介质速度越快,造价越高容量也越小;越往下,存储介质速度越慢,造价越低但容量也越大。

现代操作系统巧妙的利用cache,以最小的代价获得了最大的性能。但是,注意这里的但是,要想获得极致性能是有前提的,那就是程序员写的程序必须具有良好的局部性,充分利用缓存

鉴于cache的重要性,现在增大cache已经成为提升CPU性能的重要因素,因此你去看当今的CPU布局,其很大一部分面积都用在了cache上。


你以为这就完了吗?哈哈,哪有这么容易的,否则也不会是终面题目了。那么当CPU读写内存时除了面临上述问题外还需要处理哪些问题呢?

多核,多问题

当摩尔定律渐渐失效后鸡贼的人类换了另一种提高CPU性能的方法,既然单个CPU性能不好提升了,我们还可以堆数量啊,这样,CPU进入多核时代,程序员开始进入苦逼时代。

拥有一堆核心的CPU其实是没什么用的,关键需要有配套的多线程程序才能真正发挥多核的威力,但写过多线程程序的程序员都知道,能写出来不容易,能写出来并且能正确运行更不容易 。

CPU开始拥有多个核心后不但苦逼了软件工程师,硬件工程师也不能幸免。

前文提到过,为提高CPU访存性能,CPU和内存之间会有一个层cache,但当CPU有多个核心后新的问题来了:


现在假设内存中有一变量X,初始值为2。

系统中有两个CPU核心C1和C2,现在C1和C2要分别读取内存中X的值,根据cache的工作原理,首次读取X不能命中cache,因此从内存中读取到X后更新相应的cache,现在C1 cache和C2 cache中都有变量X了,其值都是2。

接下来C 1需要对X执行+2操作,同样根据cache的工作原理,C1从cache中拿到X的值+2后更新cache,在然后更新内存,此时C1 cache和内存中的X值都变为了4。


然后C2也许需要对X执行加法操作,假设需要+4,同样根据cache的工作原理,C2从cache中拿到X的值+4后更新cache,此时cache中的值变为了6(2+4),再更新内存,此时C2 cache和内存中的X值都变为了6。


看出问题在哪里了吗?一个初始值为2的变量,在分别+2和+4后正确的结果应该是2+2+4=8,但从上图可以看出内存中X的值却为6,问题出在哪了呢?

多核cache一致性

有的同学可能已经发现了,问题出在了内存中一个X变量在C1和C2的cache中有共计两个副本,当C1更新cache时没有同步修改C2 cache中X的值


解决方法是什么呢?显然,如果一个cache中待更新的变量同样存在于其它核心的cache,那么你需要一并将其它cache也更新好。

现在你应该看到,CPU更新变量时不再简单的只关心自己的cache和内存,你还需要知道这个变量是不是同样存在于其它核心中的cache,如果存在需要一并更新。

当然,这还只是简单的读,写就更加复杂了,实际上,现代CPU中有一套协议来专门维护缓存的一致性,比较经典的包括MESI协议等。

为什么程序员需要关心这个问题呢?原因很简单,你最好写出对cache一致性协议友好的程序因为cache频繁维护一致性也是有性能代价的

作者:小风哥

来源:码农的荒岛求生

编辑:endlesscliff

转载内容仅代表作者观点

不代表中科院物理所立场

如需转载请联系原公众号

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
宇宙到底有多大?不敢想象,看了之后会让你疯狂!

宇宙到底有多大?不敢想象,看了之后会让你疯狂!

宇宙时空
2025-11-02 09:37:51
比张本还嚣张!松岛辉空创造历史 韩乒全员回家 没想到赛后他这样表现

比张本还嚣张!松岛辉空创造历史 韩乒全员回家 没想到赛后他这样表现

好乒乓
2025-11-03 12:25:39
中共中央批准,开除王建军党籍

中共中央批准,开除王建军党籍

新京报政事儿
2025-11-03 11:13:13
浙江一小三被原配活活砍死,原配判刑后给丈夫留了8个字

浙江一小三被原配活活砍死,原配判刑后给丈夫留了8个字

纪实录
2024-06-29 20:59:07
几乎全是假货!利润高达2400%,为何消费者还前赴后继争相购买?

几乎全是假货!利润高达2400%,为何消费者还前赴后继争相购买?

以茶带书
2025-09-17 14:10:04
笑掉大牙!我们是老了不是瞎了,同角色对比,来看什么叫降维打击

笑掉大牙!我们是老了不是瞎了,同角色对比,来看什么叫降维打击

阿废冷眼观察所
2025-10-24 12:13:04
哭灵人李美珍:一场3000,跪出两套房一辆车,却没人敢碰她

哭灵人李美珍:一场3000,跪出两套房一辆车,却没人敢碰她

君好伴读
2025-10-30 14:41:42
热搜上炸裂的“小鱼丸子”事件:“假富家千金”翻车,坑惨多少人

热搜上炸裂的“小鱼丸子”事件:“假富家千金”翻车,坑惨多少人

小椰子专栏
2025-10-22 13:05:54
东部再无全胜队!尼克斯送公牛首败 布伦森9000分里程碑吉迪三双

东部再无全胜队!尼克斯送公牛首败 布伦森9000分里程碑吉迪三双

醉卧浮生
2025-11-03 10:27:36
她这大体格 真的很少见,五官精致绝美,气质非凡,一脸旺夫相

她这大体格 真的很少见,五官精致绝美,气质非凡,一脸旺夫相

阿废冷眼观察所
2025-11-03 14:41:22
6旬富豪专好''吃阴枣'',包养4个19岁女学生,民警破门后:禽兽不如

6旬富豪专好''吃阴枣'',包养4个19岁女学生,民警破门后:禽兽不如

悬案解密档案
2025-10-22 09:26:05
57年江西工地挖出一具戴脚镣遗骨,经查证,是刘少奇找了两年的人

57年江西工地挖出一具戴脚镣遗骨,经查证,是刘少奇找了两年的人

丞丞故事汇
2025-11-02 13:44:10
Lisa被曝靠在三公子肩膀上撒娇,网友:两人会结婚吗?

Lisa被曝靠在三公子肩膀上撒娇,网友:两人会结婚吗?

韩小娱
2025-11-01 07:56:19
“胯宽腰粗”的身材太有看点了,黑色瑜伽裤,穿出霸气十足高级感

“胯宽腰粗”的身材太有看点了,黑色瑜伽裤,穿出霸气十足高级感

小乔古装汉服
2025-09-19 15:20:20
中共中央批准,开除徐宪平党籍

中共中央批准,开除徐宪平党籍

新京报
2025-11-03 11:15:27
自称“昆仑童子”“玉皇大帝”“紫薇圣人”,敛财超500万、奸淫妇女10人!起底“天道鸿元”

自称“昆仑童子”“玉皇大帝”“紫薇圣人”,敛财超500万、奸淫妇女10人!起底“天道鸿元”

新京报
2025-11-03 07:53:33
开打!联合国终于不再忍耐,维和部队对以色列开火,法军开第一枪

开打!联合国终于不再忍耐,维和部队对以色列开火,法军开第一枪

音乐时光的娱乐
2025-11-03 14:55:19
新冠病毒5大结局已经不可避免,64岁以上的老年人尤其要注意

新冠病毒5大结局已经不可避免,64岁以上的老年人尤其要注意

小舟谈历史
2025-10-15 09:27:29
媒体人讨论中超29轮:假球疑云重重,反腐不力,浙江队处境堪忧

媒体人讨论中超29轮:假球疑云重重,反腐不力,浙江队处境堪忧

逗比演员说体育
2025-11-03 12:39:29
水库放生猫后续:警方已追查,知情人曝黑幕,这哪是行善?是作恶

水库放生猫后续:警方已追查,知情人曝黑幕,这哪是行善?是作恶

奇思妙想草叶君
2025-11-03 02:47:31
2025-11-04 00:23:00
中科院物理所 incentive-icons
中科院物理所
爱上物理,改变世界。
9534文章数 136342关注度
往期回顾 全部

科技要闻

余承东内部信:鸿蒙下一步要实现上亿覆盖

头条要闻

57名储户在银行大厅受骗损失千万本金 当地成立调查组

头条要闻

57名储户在银行大厅受骗损失千万本金 当地成立调查组

体育要闻

开拓者官宣召回杨瀚森 队记解析核心原因

娱乐要闻

男导演曝丑闻 蒋欣的含金量还在上升

财经要闻

最新省市GDP:谁在飙升,谁掉队了?

汽车要闻

环比增长28.7% 方程豹品牌10月销量31052辆

态度原创

游戏
亲子
旅游
手机
时尚

TES惨败T1后再次发文:糟糕的对局辜负了大家的期待

亲子要闻

陪宝宝山顶飙车,小星星弯道超车太帅了,新秋名山车神诞生!

旅游要闻

“粤享暖冬 乐游广东”消费季推出四大活动五大品牌六大优惠

手机要闻

华为突然推送3.68GB大更新:Pura 80获推,你收到更新了吗?

这些才是适合普通人的穿搭!多穿基础款和半身裙,简约又得体

无障碍浏览 进入关怀版