现代CPU使用了很多技术来降低对内存存取数据的延时,因为CPU执行的速度实在是太快了,在从内存存取数据的约120ns中,可以执行数百条指令。

其中多级的缓存架构就是为了减少这种延时,来提高CPU的利用率。

在SMP系统使消息传递协议来保证缓存的一致性。但是CPU运行实在是太快了,人类总是很贪婪,想尽各种办法榨取CPU的性能,因此在缓存体系统,还存在的其它一些不怎么被人熟悉的Buffer。

这其中有Write back buffer, Line fill buffer, 而本文要介绍的是Write combining Buffer, 至于另外两个Buffer,来日方长,待我想明白怎么表白了再来写。

CPU缓存是高效的非链式Hash Map, 每一块通常是64个字节,常称为缓存行。缓存行是与内存操作的基本单元。内存中某一地址的内容,通过Hash 映射到缓存中的某一个缓存行。

当CPU需要操作内存中的一块数据,而这块数据又不在缓存中,而缓存中相应位置存储的其它内存块的内容则需要被释放。长江后浪推前浪,老数据还是要为新数据让道。

当CPU执行一个Store操作时,它将会把数据写到离CPU最近的L1的数据缓存,如果这个时候发生Write miss, 则CPU将会去L2缓存。这个时候,Write Combining Buffer就来了,为了减少Write Miss带来的性能开销,Intel和其它很多型号的CPU都引入了Write Combining 技术。Write Combining Buffer不是编程时内存里的Buffer,而是CPU里面真实的存储单元,是硬件。

当发生L1 Write Miss时,WC 可以把多个对同一缓存行Store操作的数据放在WC中,在程序对相应缓存行(或者理解为这些数据)读之前先合并,等到需要读取时再一次性写入来减少写的次数和总线的压力。此时,CPU可以在把数据放入WC后继续执行指令,减少了很多时钟周期的浪费。不同的CPU, WC的数量可能是不一样的。Intel的CPU中,其实只有4个WC可以真正被我们同时使用。

这几个Buffer 非常有意思的是要求后续的写操作都要对同一缓存行进行写操作,这样后续的写操作才可以被放到一起提交到L2 缓存。WC中的每个字节有64位来表示其状态,以供后续需要写到缓存时知道哪些字节是需要传送到L2的。

转载于:https://www.cnblogs.com/coderex2522/p/8057980.html

Write Combining Buffer相关推荐

  1. 原子变量、锁、内存屏障,写得非常好!

    突然想聊聊这个话题,是因为知乎上的一个问题多次出现在了我的Timeline里:请问,多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?可惜的是很多高票答案语焉不详,甚至有所错漏 ...

  2. Java程序员需要掌握的计算机底层知识(一):CPU基本组成、指令乱序执行、合并写技术、非同一访问内存 NUMA

    一些书籍 读书的原则:不求甚解,观其大略 你如果进到庐山里头,二话不说,蹲下头来,弯下腰,就对着某棵树某棵小草猛研究而不是说先把庐山的整体脉络跟那研究清楚了,那么你的学习方法肯定效率巨低而且特别痛苦, ...

  3. 第六十四期:聊聊原子变量、锁、内存屏障那点事

    突然想聊聊这个话题,是因为知乎上的一个问题多次出现在了我的Timeline里:请问,多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?可惜的是很多高票答案语焉不详,甚至有所错漏 ...

  4. Java需要掌握的底层知识_Java程序员应该掌握的底层知识

    缓存 缓存行: 缓存行越大,局部性空间效率越高,但读取时间慢 缓存行越小,局部性空间效率越低,但读取时间快 取一个折中值,目前多用: 64字节 public class CacheLinePaddin ...

  5. NVDIMM原理与应用之一:基本原理

    NVDIMM概述 1.简介 顾名思义,NVDIMM是Non-Volatile DIMM(非易失性内存)的简称.作为系统掉电后仍然保证数据不丢失的重要硬件,NVDIMM和NVRAM的功能类似,都是在系统 ...

  6. Vol3 Chapter 11 缓存控制

    文章目录 11.1 内部缓存.TLB和缓冲区 11.2 相关术语 11.3 可用的缓存方法 11.3.1 写合并内存地址的缓存 11.3.2 如何选择内存类型 11.3.3 在不可缓存内存中获取代码 ...

  7. 并发面试必备系列之并发基础与内存模型

    坐标上海松江高科技园,诚聘高级前端工程师/高级 Java 工程师,有兴趣的看 JD:https://www.lagou.com/jobs/6361564.html 并发面试必备系列之并发基础与内存模型 ...

  8. 文件系统源码分析之buffer.c

    buffer是在内存里开辟一块空间做缓存,他是应用层和硬盘之间的一层缓存,主要是为了不用每次都访问硬盘,提高效率.缓存的结构由两部分组成,一个是哈希链表,一个是双向循环链表,第一个链表是使用数据的时候 ...

  9. okio篇 1.Buffer

    总览: Okio的两个基本概念:Source和Sink.Source对标基础io库中的InputStream,负责读数据.Sink对标OutputStream,负责写数据. Source和Sink的内 ...

最新文章

  1. 动态代理的两种方式_动态代理是基于什么原理?
  2. 【知识图谱】知识表示与知识建模
  3. 7.Eclipse中创建新Maven项目
  4. 获取存储过程返回值及代码中获取返回值
  5. yelee主题修改博客左侧文章目录的按钮字体
  6. 【转】21世纪律师办公自动化的一个调查
  7. ubuntu下使用yocto制作龙芯文件系统
  8. Spark dataframe【KV格式】模拟实现Map操作
  9. 若后台的Activity被系统回收...
  10. 用java写一个用户登陆界面的代码分享
  11. 服务器闪黄灯硬盘可以修复吗,ibmx3850x5服务器故障|硬盘亮黄灯更换处理过程
  12. 电力线载波通信(PLC)简介
  13. C6678/C6657+ZYNQ/K7/A7 FPGA+AD+北斗的软硬件设计方案
  14. 如何选择和阅读科技论文
  15. DTOJ3026 geronimo
  16. Good Luck in CET-4 Everybody! HDU - 1847
  17. 在 RedHat、 CentOS、 Fedora 上安装 Teamviewer 9(转)
  18. SWAPIDC服务器销售模板,记录利用swapidc搭建IDC销售网站教程
  19. sap客户信贷_SAP SD 信贷控制范围-特别总账控制的信贷更新
  20. 十三:python知识总结(更新中)

热门文章

  1. 2021年缆索式起重机司机考试内容及缆索式起重机司机理论考试
  2. 平面视觉(二):一键还原父母儿时的记忆
  3. java生成唯一订单号
  4. WPF UserControl响应PreviewKeyDown事件方法
  5. vue2.0中的退出登录问题
  6. 钢铁侠材质制作——2、线条轮廓部分的制作
  7. 2022第四届中国(山东)国际大健康产业博览会,即将开幕
  8. ZXing.Net条形码二维码标签编辑打印软件
  9. 幸福人生在于正确选择
  10. 删除xml或者图像文件夹多余的文件