每个程序员应该了解的内存系统知识

传统上,RAM或随机存取存储器用于描述一种存储器,该存储器为其所有存储器位置提​​供相同的访问延迟。 现代DRAM系统几乎没有这种情况。 在这篇文章中,我描述了现代DRAM如何工作的一万英尺观点,希望它能帮助程序员明智地选择其算法和数据结构。

在传统的观点中,内存是具有固定访问延迟的扁平整体结构。 当今的计算机系统使用页面模式寻址和智能内存调度,这使得这种平面视图看起来很幼稚。 我认为,每个程序员都必须熟悉四个概念:页面,库,行冲突和FR-FCFS。

页数
DRAM中的数据以页面粒度存储。 典型页面的大小在4K到16K之间。 从理论上讲,此大小与通常每个4KB的OS页面无关。 实际上,大多数DRAM使用的页面比OS页面大,以提高行缓冲区的位置(如下所述)。

银行业务
为了减少访问延迟,内存被分成多个相等大小的单元,称为存储体。 今天,大多数DRAM芯片具有8至16个存储体。 每个银行存储数万页。 以下是DRAM如何分割4 GB(32位)物理地址的实际示例(贷给我的朋友Khubaib)。 位12-0标识8KB页中的字节。 位16-13标识系统应将此地址用于16个存储通道中的哪个。 位20-17标识将在地址中找到16个存储体中的哪一个,而位32-21标识将访问存储体中的哪一行。 通道位用于在DRAM模块之间拆分存储体,以增加DRAM的带宽。 记忆库一次只能处理一个请求。 对同一银行的任何其他访问都必须等待先前的访问完成,这被称为银行冲突。 相反,对不同存储体的内存访问可以并行进行(称为存储体级并行性)。

行缓冲区
每个DRAM存储区都有一个行缓冲区,该结构提供对在存储区中打开的页面的访问。 在读取存储位置之前,将打开包含该存储位置的整个页面并将其读入行缓冲区 页面停留在行缓冲区中,直到显式关闭它为止。 如果对打开页面的访问到达存储区,则可以在单个存储周期内从行缓冲区立即对其进行服务。 这种情况称为行缓冲区命中(通常少于十个处理器周期)。 但是,如果到达对另一行的访问,则必须关闭当前行并打开新行,然后才能为请求提供服务。 这称为行缓冲区冲突。 行缓冲区冲突导致DRAM的大量延迟(通常为70+个处理器周期)。

帧频
内存访问不会按照内核发送的顺序发送到DRAM。 而是将它们缓冲在片上内存请求缓冲区中,并按照内存调度程序指定的顺序分发给DRAM。 为了最大化内存系统的吞吐量,当今的内存调度程序采用了一种称为“先行先到先服务(FR-FCFS)”的策略。 想法是优先访问当前打开的页面,以最大程度地减少行冲突的数量。 尽管这有助于提高内存吞吐量,但它进一步增加了行缓冲区冲突的代价。 根据经验,行缓冲区冲突至少要花费行缓冲区命中时间的3倍。 重要的是要注意,所有已知的内存调度算法都完全独立地调度每个存储体的请求,因此,对存储体级并行性没有影响。

程序员可以做什么?

避免访问内存:我对此不太强调。 就存储而言,内存似乎是免费的,但如果工作数据集的大小大于高速缓存或可用的DRAM,则其性能成本将大大提高。 最终尽可能地减少内存占用量是一个好主意,尤其是在嵌入式设备上。

银行冲突:通常,应用程序程序员使用虚拟地址,而DRAM在物理地址上运行。 因此,程序员无法减少诸如银行冲突之类的危险,因为他们无法控制物理内存中的数据放置。 但是,在某些特殊情况下程序员可以提供帮助。 例如,大多数ISA现在都引入了高达1GB的虚拟页面。 允许程序员在这些大页面内进行自己的映射。 这使程序员可以更好地控制将数据发送到哪个存储区,并且他们可以使用此控件来提高存储区级的并行度。

行缓冲区冲突:程序员还可以通过增加行缓冲区中的空间局部性来提供帮助,即尝试使连续的内存访问尽可能地彼此接近。 这通常意味着打包可能在连续的内存位置中一起访问的数据,例如,构建数组结构通常具有更好的性能。 顺便说一句,这还意味着应尽可能避免促进随机访问的链接数据结构,因为每个行缓冲区冲突的延迟都大于100次计算。

实验数据
在这篇文章中对ARM Cortex A8进行了一项实验 ,结果显示顺序访问仅花费20个处理器周期,而随机访问则花费接近180个周期。 在i7上进行的相同实验使顺序访问的速度提高了约2倍。

结论
编程人员可以通过支持DRAM的编程节省电池并提高性能。 这样的优化可能并非在所有情况下都可行,但是了解基本的DRAM结构可以帮助程序员识别现有或潜在的性能瓶颈,尤其是在iPhone等受限制的平台上。

参考: Future Chips博客上的 每个程序员都应该从我们的JCG合作伙伴 Aater 了解到有关存储系统的知识。

相关文章 :

翻译自: https://www.javacodegeeks.com/2011/08/what-every-programmer-should-know-about.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值