是一个具有不同容量、成本和访问时间的存储设备的层次结构。
寄存器 | CPU寄存器保存最常用的数据 | 快 | 0个周期 |
高速缓存存储器 cache memory |
作为主存储器中的数据和指令的缓冲区域 | 4-75个周期 | |
主存储器 main memory |
作为磁盘的缓冲区域 | 相对慢速 | 百+个周期 |
磁盘 | 作为通过网络中其他机器上数据的缓冲区域 | 容量大、速度慢 | 千万+周期 |
远程设备中的存储器 | 慢 |
计算机程序的一个基本而持久的思想:如果你理解了系统是如何将数据在存储器层次结构中上上下下移动的,那么你可以编写自己的程序,使它的数据项存储在层次结构中较高的地方,这样CPU可以快速访问到它们。
访问主存
数据流通过称为总线(bus)的共享电子电路在处理器和DRAM主存之间来来回回。
每次CPU和主存之间的数据传送都是通过一系列步骤来完成的,这些步骤称为总线事物(bus transaction)
总线是一组并行的导线,能携带地址、数据和控制信号。取决于总线的设计,数据和地址信号可以共享同一组导线,也可以使用不同的。同时,两个以上的设备也能共享同一个总线。
具有良好局部性的程序倾向于一次又一次地访问相同的数据项集合,或是倾向于访问邻近的数据项集合。具有良好局部性的程序比局部性差的程序更多地倾向于从存储器层次结构中较高层次处访问数据项。
- 常用来作为高速缓存存储器
- 一个桌面系统的SRAM不会超过几兆字节
- 可以在CPU芯片上,也可以在片外
- SRAM将每个位存储在一个双稳态的bistable存储器单元里。每个单元是用一个六晶体管电路来实现的。这个电路有一个属性:它可以无限期地保持在两个不同的电压配置configuration或状态state中。
- 由于SRAM存储器单元的双稳态特性,只要有电,它就会永远地保持它的值。即使有干扰(e.g. 电子噪音)来扰乱电压,当干扰消除时,电路就会恢复到稳定值
- 常用来作为主存以及图形系统的帧缓冲区
- 可以拥有几百-几千兆字节
- DRAM将每个位存储为对一个电容的充电。这个电容非常小,通常只有大约30毫微微法拉(femtofarad)
- DRAM存储器可以制造得非常密集-每个单元由一个电容和一个访问晶体管组成。
- DRAM对干扰非常敏感,当电容的电压被扰乱之后,它就永远不会恢复了。暴露在光线下会导致电容电压改变(实际上,数码照相机和摄影机中的传感器本质上就是DRAM单元的阵列)
ROM是以它们能够被重编程(写)的次数和对它们进行重编程所用的机制来区分的
- 每个存储器单元有一种熔丝(fuse),只能用高电流熔断一次
- 有一个透明的石英窗口,允许光达到存储单元
- 紫外线光照射过窗口,EPROM单元就被清除为0
- 对EPROM编程是通过使用一种把1写入EPROM的特殊设备来完成的
- EPROM能够被擦除和重编程的1000次
- 类似EPROM,但它不需要一个物理上独立的编程设备,因此可以直接在印制电路卡上编程
- EEPROM 能够被编程 10**5次
- 一类非易易失性存储器,基于RRPROM
- 位大量电子设备提供快速而持久的非易失性存储
- SSD就是基于闪存的磁盘驱动器
存储在ROM设备中的程序通常被称为固件(firmware)。当一个计算机系统通电以后,它会运行存储在ROM中的固件。一些系统在固件中提供了少量基本的输入和输出函数
从磁盘上读信息的时间为毫秒级,比从DRAM读慢10万倍,比SRAM读慢100万倍
磁盘有盘片(platter)构成。每个盘片有两面或者称为表面(surface),表面覆盖着磁性记录材料。磁盘通常包含一个/多个这样的盘片,并封装在一个密封的容器中。
盘片中央有个可以旋转的主轴(spindler),它使盘片以固定的旋转速率(rotational rate)旋转,通常是5.4K-15K转每分钟(Revolution Per Minute, RPM)。
每个surface是由一组称为磁道(track)的同心圆组成的。每个track被划分为一组扇区(sector)
每个sector包含相等数量的数据位(通常是512bytes)
sector之间由一些间隙(gap)分隔开,这些gap中不存储数据位。gap存储用来标识sector的格式化位
柱面(cylinder)用来描述多个盘片驱动器的构造,柱面是所有盘片表面上到主轴中心的距离相等的track的集合。
磁盘容量是由这些技术因素决定的:
磁盘容量公式:
磁盘容量=(字节数/扇区)*(平均扇区数/track)*(track数/surface)*(surface数/platter)*(platter数/磁盘)练习题6.2 计算这样一个磁盘的容量,它有2个盘片,10,000个柱面,每条track平均有400个sector,每个sector有512字节
磁盘用读/写头(read/write head)来读写存储在磁性表面的位,而读写头连接到一个传动臂(actuator arm)一端。
寻道(seek):通过沿着半径轴前后移动这个传动臂,驱动器可以将读/写头定位在盘面上的任何track上。一旦读/写头定位到了期望的track上,那么当track上的每个位通过它的下面时,读/写头可以感知到这个位的值(读该位),也可以修改这个位的值(写该位)。
有多个盘片的磁盘针对每个盘面都有一个独立的读/写头。
磁盘以扇区大小的块来读写数据,对扇区的访问时间(access time)有三个主要的部分
磁盘控制器 - 磁盘封装中一个小的硬件/固件设备,维护逻辑块号和实际(物理)磁盘扇区之间的映射关系。(一个B个山区大小的逻辑块的序列,编号为0…B-1)
当操作系统想要执行一个I/O操作时,操作系统会法送一个命令到磁盘控制器,让它读/写某个逻辑块号。
e.g. 读一个磁盘扇区的数据到主存
控制器上的固件执行一个快速表查找,将一个个逻辑块号翻译成一个[盘面、track、扇面]的三元组,这个三元组唯一地标识了对应的物理扇区。控制器上的硬件会解释这个三元组,将读/写头移动到适当的柱面,等待扇区移动到读写头下,将读写头感知到的位放到控制器上的一个小缓冲区中,
将位复制到主存中。
格式化的磁盘容量
磁盘控制器必须对磁盘进行格式化,然后才能在磁盘上存储数据。
格式化包括:
因为存在备用柱面,所以磁盘制造商所说的格式化容量比最大容量要小。
输入/输出(I/O)设备,都是通过I/O总线,例如intel的外围设备互联(Peripheral Component Interconnect,PCI)总线连接到CPU和主存的。
PCIe
PCI模型中,系统中所有的设备共享总线,一个时刻只能有一台设备访问这些线路
PCIe(PCI express)- 一组高速串行、通过开关连接的点到点链路最大吞吐率:PCIe 16GB/s,PCI 533MB/s
系统总线和内存总线是和CPU有关的,但PCI这样的I/O总线是与底层CPU无关。
虽然I/O总线比系统总线&内存总线慢,但是它可以容纳种类繁多的第三方I/O设备,如:
CPU从磁盘读取数据时发生的步骤
1、CPU通过将命令、逻辑块号、目的内存地址写到与磁盘相关联的内存映射地址,发起一个磁盘读
2、磁盘控制器读扇区,并执行到主存的DMA传送
3、当DMA传送完成后,磁盘控制器用中断的方式通知CPU
Solid State Disk - 一种基于闪存的存储技术,用于处理来自CPU的读写逻辑磁盘块的请求。
一个SSD封装由一个/多个闪存芯片和闪存翻译层(flash translation layer)组成:
举个栗子
一个闪存由B个块的序列组成
每个块由P页组成
----/-----
数据以页为单位读写
只有在一页所属的块整个被擦除之后,才能写这一页(通常指这块中所有位都被设置为1)
一旦一个块被擦除,块中每个页都可以不需要再进行擦除就写一次。
在进行~100,000次重复写之后,块就会磨损坏。
一旦一个快磨损,就不能再使用了。
随机写慢,原因:
1、擦除块需要相对较长时间,1ms级
2、如果写操作试图修改一个包含已有数据的页p,那么这个块中所有带有数据的页都必须被复制到一个新块,然后才能对对页p进行写。(制造商有做过优化了,但总的来说还是不可能像随机读一样快)