首页 存档 技术 查看内容

追根究底内存与缓存

2018-3-30 13:00 |来自: 互联网 281 0

摘要: 来源:小土刀原文地址:http://wdxtub.com/2016/04/16/thin-csapp-3/ 我们知道,速度越快的存储,价格也就越贵。计算机作为工程的结晶,是如何从一条规则出发,做到『物美价廉』的呢?这条规则又是什么呢?这一讲 ...

来源:小土刀
原文地址:http://wdxtub.com/2016/04/16/thin-csapp-3/


我们知道,速度越快的存储,价格也就越贵。计算机作为工程的结晶,是如何从一条规则出发,做到『物美价廉』的呢?这条规则又是什么呢?这一讲我们从不同的存储讲起,看看『带着镣铐跳舞』的最高境界。


学习目标
  • 了解存储相关的概念

  • 理解传统机械硬盘的工作机制以及如何通过总线进行数据传输

  • 掌握局部性原理

  • 了解内存的不同层级以及具体的应用方法

  • 掌握缓存的机制,如何存储、载入和替换

缓存是一个非常精妙的系统,利用有限的资源给系统带来了显著的性能提升。这一讲前半部分主要是存储系统相关的概念介绍,之后我们会深入研究缓存系统并用实际的例子来学习如何最大程度利用好缓存。

概念学习

随机存取存储器

了解存储设备所用的技术以及发展趋势,对我们理解内存层级背后的原因很有帮助。

随机存取存储器(RAM, Random-Access Memory) 有两种类型:SRAM(Static RAM) 和 DRAM(Dynamic RAM),SRAM 非常快,也不需要定期刷新,通常用在处理器做缓存,但是比较贵;DRAM 稍慢一点(大概是 SRAM 速度的十分之一),需要刷新,通常用作主内存,相比来说很便宜(是 SRAM 价格的百分之一)。

无论是 DRAM 还是 SRAM,一旦不通电,所有的信息都会丢失。如果想要让数据持久化,可以考虑 ROM, PROM, EPROM, EEPROM 等介质。固件程序会存储在 ROM 中(比如 BIOS,磁盘控制器,网卡,图形加速器,安全子系统等等)。另外一个趋势就是 SSD 固态硬盘,取消了机械结构,更稳定速度更快更省电。

传统机械硬盘

虽然现在越来越多电脑已经改为使用固态硬盘,但是还是有必要了解一下硬盘的组成的。传统的机械硬盘有许多不同的部件:

机械硬盘有许多片磁盘(platter)组成,每一片磁盘有两面;每一面由一圈圈的磁道(track)组成,而每个磁道会被分隔成不同的扇区(sector)。这里概念层层递进,可以结合下图仔细辨析清楚。


上图是一个磁盘的视图,多个磁盘组合起来是这样的:


硬盘的容量指的是最大能存储的比特数,通常用 GB 来做单位。1 GB 相当于 10 的 9 次方个 Byte。与硬盘的结构分层类似,容量取决于下面三个方面:

  • 记录密度(bits/in):track 中 1 英寸能保存的字节数

  • 磁道密度(tracks/in):1 英寸直径能保存多少条 track

  • Areal 密度(bits/in 的平方):上面两个数值的乘积

现在硬盘会把相邻的若干个磁道切分成小块,每一块叫做记录区(recording zone)。记录区中的每条磁道都包含同样数量的扇区(sector);但是每个记录区中包含的扇区和磁道的数目是不一样的,外层的更多,内层的更少;正因为如此,我们计算容量是,用的是平均的数值。

容量 Capacity = 每个扇区的字节数(bytes/sector) x 磁道上的平均扇区数(avg sectors/track) x 磁盘一面的磁道数(tracks/surface) x 磁盘的面数(surfaces/platter) x 硬盘包含的磁盘数(platters/disk)

举个例子,假如一个硬盘有:

  • 512 bytes/sector

  • 300 sectors/track (平均)

  • 20000 tracks/surface

  • 2 surfaces/platter

  • 5 platters/disk

总的容量为 = 512 x 300 x 20000 x 2 x 5 = 30,720,000,000 = 30.72 GB


假设我们现在已经从蓝色区域读取完了数据,接下来需要从红色区域读,首先需要寻址,把读取的指针放到红色区域所在的磁道,然后等待磁盘旋转,旋转到红色区域之后,才可以开始真正的数据传输过程。

总的访问时间 Taccess = 寻址时间 Tavg seek 旋转时间 Tavg rotation 传输时间 Tavg transfer

  • 寻址时间 Tavg seek 因为物理规律的限制,一般是 3-9 ms

  • 旋转延迟 Tavg rotation 取决于硬盘具体的转速,一般来说是 7200 RPM

  • 传输时间 Tavg tranfer 就是需要读取的扇区数目

举个例子,假设转速是 7200 RPM,平均寻址时间 9ms,平均每个磁道的 sector 数目是 400,那么我们有:

  • Tavg rotation = 1/2 x (60 secs / 7200 RPM) x 1000 ms/sec = 4 ms

  • Tavg transfer = 60 / 7200 RPM x 1/400 secs/track x 1000 ms/sec = 0.02 ms

  • Taccess = 9 ms 4 ms 0.02 ms

从这里可以看出,主要决定访问时间的是寻址时间和旋转延迟;读取一个扇区的第一个比特是非常耗时的,之后的都几乎可以忽略不计;硬盘比 SRAM 慢 40,000 倍,比 DRAM 慢 2500 倍。

最后需要知道的就是逻辑分区和实际的物理分区的区别,为了使用方便,会用连续的数字来标志所有可用的扇区,具体的映射工作由磁盘控制器完成。

固态硬盘

接下来介绍一下固态硬盘,内部结构如下


固态硬盘中分成很多的块(Block),每个块又有很多页(Page),大约 32-128 个,每个页可以存放一定数据(大概 4-512KB),页是进行数据读写的最小单位。但是有一点需要注意,对一个页进行写入操作的时候,需要先把整个块清空(设计限制),而一个块大概在 100,000 次写入之后就会报废。

与传统的机械硬盘相比,固态硬盘在读写速度上有很大的优势。但是因为设计本身的约束,连续访问会比随机访问快,而且如果需要写入 Page,那么需要移动其他 Page,擦除整个 Block,然后才能写入。现在固态硬盘的读写速度差距已经没有以前那么大了,但是仍然有一些差距。

不过与机械硬盘相比,固态硬盘存在一个具体的寿命限制,价格也比较贵,但是因为速度上的优势,越来越多设备开始使用固态硬盘。

总线

总线是用来传输地址、数据和控制信号的一组平行的电线,通常来说由多个设备共享,类似于不同城市之间的高速公路,可以传输各类数据。CPU 通过总线和对应的接口来从不同的设备中获得所需要的数据,放入寄存器中等待运算,像下面这样:


假设 CPU 需要从硬盘中读取一些数据,会给定指令,逻辑块编号和目标地址,并发送给磁盘控制器。然后磁盘控制器会读取对应的数据,并通过 DMA(direct memory access)把数据传输到内存中;传输完成后,磁盘控制器通过中断的方式通知 CPU,然后 CPU 完成之后的工作。

总线上连接的各个设备,其访问速度有天壤之别,不同的技术发展速度不同,更加剧了这个情况


比方说磁盘的读写速度,30 年大概只提高了一个数量级多一点,所以固态硬盘的出现,以下拯救了劳苦大众(提高了两个数量级),DRAM 的发展,一路从 DDR12345 发展来,速度大概提高了一个数量级,不过 SRAM 则是在同一个起点愣是多跑了一个数量级,总体来说是跟着 CPU 的发展走的。不过 CPU 的发展在 2003 年也遇到了问题(单个核心基本到极限),不过多核的出现以及技术优化,总体来说还是使得执行速度越来越快。

那么这么大的时间差距,怎么办呢?难道根据木桶理论,都要取决于最慢的那个吗?不一定!局部性原理(Locality)可以在一定程度上拯救世界。

局部性原理 Locality

局部性的思路很简单[2]:

  • 时间局部性(Temporal Locality): 如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。程序循环、堆栈等是产生时间局部性的原因。

  • 空间局部性(Spatial Locality): 在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的

  • 顺序局部性(Order Locality): 在典型程序中,除转移类指令外,大部分指令是顺序进行的。顺序执行和非顺序执行的比例大致是5:1。此外,对大型数组访问也是顺序的。指令的顺序执行、数组的连续存放等是产生顺序局部性的原因。

举个例子:


sum = 0;
for (i = 0; i

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部