zl程序教程

您现在的位置是:首页 >  系统

当前栏目

操作系统:存储器——存储技术

操作系统 存储器 存储技术
2023-09-27 14:29:25 时间

前言

作为一个程序员,你需要理解存储器层次结构,因为它对应用程序的性能有着巨大的影响。如果你的程序需要的数据是存储在CPU寄存器中的,那么在指令的执行期间,在0个周期内就能访问到它们。如果存储在高速缓存中,需要4~75个周期。如果存储在主存中,需要上百个周期。而如果存储在磁盘上,需要大约几千万个周期!

一、存储技术

1. 随机访问存储器(部分)

随机访问存储器(Random-Access Memory,RAM)分为两类:静态的和动态的。

静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵得多。 SRAM 用来作为高速缓存存储器,既可以在CPU芯片上,也可以在片下。DRAM用来作为主存以及图形系统的帧缓冲区。典型地,一个桌面系统的SRAM不会超过几兆字节,但是 DRAM却有几百或几千兆字节。

1.1 静态RAM

SRAM将每个位存储在一个双稳态的(bistable)存储器单元里每个单元是用一个六晶体管电路来实现的。这个电路有这样一个属性,它可以无限期地保持在两个不同的电压配置(configuration)或状态(state)之一。其他任何状态都是不稳定的——从不稳定状态开始,电路会迅速地转移到两个稳定状态中的一个。这样一个存储器单元类似于图中画出的倒转的钟摆。

在这里插入图片描述

当钟摆倾斜到最左边或最右边时,它是稳定的。从其他任何位置,钟摆都会倒向一边或另一边。原则上,钟摆也能在垂直的位置无限期地保持平衡,但是这个状态是亚稳态的(metastable)—最细微的扰动也能使它倒下,而且一旦倒下就永远不会再恢复到垂直的位置。
由于SRAM存储器单元的双稳态特性,只要有电,它就会永远地保持它的值。即使有干扰(例如电子噪音)来扰乱电压,当干扰消除时,电路就会恢复到稳定值。

1.2 动态RAM

DRAM将每个位存储为对一个电容的充电。这个电容非常小,通常只有大约30毫微微法拉(femtofarad.)——30×10^-15法拉。不过,回想一下法拉是一个非常大的计量单位。DRAM存储器可以制造得非常密集—―每个单元由一个电容和一个访问晶体管组成。但是,与SRAM 不同,DRAM存储器单元对干扰非常敏感。当电容的电压被扰乱之后,它就永远不会恢复了。暴露在光线下会导致电容电压改变。

图中总结了SRAM和 DRAM存储器的特性。只要有供电,SRAM就会保持不变。与DRAM不同,它不需要刷新。SRAM的存取比DRAM 快。SRAM对诸如光和电噪声这样的干扰不敏感。代价是SRAM单元比DRAM单元使用更多的晶体管,因而密集度低,而且更贵,功耗更大。

在这里插入图片描述

1.3 内存模块

DRAM芯片封装在内存模块( memory module)中,它插到主板的扩展槽上。Corei7系统使用的240个引脚的双列直插内存模块(Dual Inline Memory Module,DIMM),它以64位为块传送数据到内存控制器和从内存控制器传出数据。

如图展示了一个内存模块的基本思想。示例模块用8个64 Mbit的8M × 8的 DRAM芯片,总共存储64MB(兆字节),这8个芯片编号为0~7。每个超单元存储主存的一个字节,而用相应超单元地址为(i,j)的8个超单元来表示主存中字节地址A处的64位字。在图6-5的示例中,DRAMO存储第一个(低位)字节,DRAM1存储下一个字节,依此类推。
要取出内存地址A处的一个字,内存控制器将A转换成一个超单元地址(i,j),并将它发送到内存模块,然后内存模块再将主和j广播到每个 DRAM。作为响应,每个DRAM输出它的(i,j)超单元的8位内容。模块中的电路收集这些输出,并把它们合并成一个64位字,再返回给内存控制器。

在这里插入图片描述

1.4 访问主存

数据流通过称为总线(bus)的共享电子电路在处理器和DRAM主存之间来来回回。次CPU和主存之间的数据传送都是通过一系列步骤来完成的,这些步骤称为总线事务(bus transaction)。读事务(read transaction)从主存传送数据到CPU。写事务(write transaction)从 CPU传送数据到主存。

在这里插入图片描述

2. 磁盘存储

磁盘是广为应用的保存大量数据的存储设备,存储数据的数量级可以达到几百到几千千兆字节,而基于RAM的存储器只能有几百或几千兆字节。不过,从磁盘上读信息的时间为毫秒级,比从 DRAM读慢了10万倍,比从SRAM读慢了100万倍。

2.1 磁盘构造

磁盘是由盘片(platter)构成的。每个盘片有两面或者称为表面(surface),表面覆盖着磁性记录材料。盘片中央有一个可以旋转的主轴(spindle),它使得盘片以固定的旋转速率(rotational rate)旋转,通常是5400~15000转每分钟(Revolution Per Minute,RPM)。磁盘通常包含一个或多个这样的盘片,并封装在一个密封的容器内。

图a展示了一个典型的磁盘表面的结构。每个表面是由一组称为磁道(track)的同心圆组成的。每个磁道被划分为一组扇区(sector)。每个扇区包含相等数量的数据位(通常是512字节),这些数据编码在扇区上的磁性材料中。扇区之间由一些间隙(gap)分隔开,这些间隙中不存储数据位。间隙存储用来标识扇区的格式化位。

磁盘是由一个或多个叠放在一起的盘片组成的,它们被封装在一个密封的包装里,如图b所示。整个装置通常被称为磁盘驱动器(disk drive),我们通常简称为磁盘(disk)。有时,我们会称磁盘为旋转磁盘(rotating disk),以使之区别于基于闪存的固态硬盘(SSD),SSD是没有移动部分的。

在这里插入图片描述

2.2 磁盘容量

一个磁盘上可以记录的最大位数称为它的最大容量,或者简称为容量。磁盘容量是由以下技术因素决定的:

  1. 记录密度(recording density)(位/英寸):磁道一英寸的段中可以放入的位数。
  2. 磁道密度(track density)(道/英寸):从盘片中心出发半径上一英寸的段内可以有的磁道数。
  3. 面密度(areal density)(位/平方英寸):记录密度与磁道密度的乘积。

计算公式:
在这里插入图片描述

2.3 磁盘操作

磁盘用读/写头(read/write head)来读写存储在磁性表面的位,而读写头连接到一个传动臂(actuator arm)一端,如图a所示。通过沿着半径轴前后移动这个传动臂,驱动器可以将读/写头定位在盘面上的任何磁道上。这样的机械运动称为寻道(seek)。一旦读/写头定位到了期望的磁道上,那么当磁道上的每个位通过它的下面时,读/写头可以感知到这个位的值(读该位),也可以修改这个位的值(写该位)。有多个盘片的磁盘针对每个盘面都有一个独立的读/写头,如图b所示。读/写头垂直排列,一致行动。在任何时刻,所有的读/写头都位于同一个柱面上。

在这里插入图片描述

2.4 访问磁盘

CPU使用一种称为内存映射I/O(memory-mapped I/O)的技术来向I/O设备发射命令。在使用内存映射I/O的系统中,地址空间中有一块地址是为与I/O设备通信保留的。每个这样的地址称为一个1/O端口(I/O port)。当一个设备连接到总线时,它与一个或多个端口相关联(或它被映射到一个或多个端口)。

在这里插入图片描述

3. 固态硬盘

固态硬盘(Solid State Disk,SSD)是一种基于闪存的存储技术,在某些情况下是传统旋转磁盘的极有吸引力的替代产品。SSD封装插到I/O总线上标准硬盘插槽(通常是USB或SATA)中,行为就和其他硬盘一样,处理来自CPU的读写逻辑磁盘块的请求。一个SSD 封装由一个或多个闪存芯片和闪存翻译层(flash translation layer)组成,闪存芯片替代传统旋转磁盘中的机械驱动器,而闪存翻译层是一个硬件/固件设备,扮演与磁盘控制器相同的角色,将对逻辑块的请求翻译成对底层物理设备的访问。

在这里插入图片描述

读SSD比写要快。随机读和写的性能差别是由底层闪存基本属性决定的。如所示,一个闪存由B个块的序列组成,每个块由Р页组成。通常,页的大小是512字节~4KB,块是由32~128页组成的,块的大小为16KB~512KB。数据是以页为单位读写的。只有在一页所属的块整个被擦除之后,才能写这一页(通常是指该块中的所有位都被设置为1)。不过,一旦一个块被擦除了,块中每一个页都可以不需要再进行擦除就写一次。在大约进行100 000次重复写之后,块就会磨损坏。一旦一个块磨损坏之后,就不能再使用了。

在这里插入图片描述

随机写很慢,有两个原因。首先,擦除块需要相对较长的时间,1ms级的,比访问页所需时间要高一个数量级。其次,如果写操作试图修改一个包含已经有数据(也就是不是全为1)的页p,那么这个块中所有带有用数据的页都必须被复制到一个新(擦除过的)块,然后才能进行对页p的写。制造商已经在闪存翻译层中实现了复杂的逻辑,试图抵消擦写块的高昂代价,最小化内部写的次数,但是随机写的性能不太可能和读一样好。

end

节选自

《深入理解计算机系统》