存储系统的基本概念
存储器的基本结构
辅存中的数据要调入主存后才能被CPU访问。
主存--辅存:由硬件+操作系统完成,实现了虚拟存储系统,解决了主存容量不够的问题
cache--主存:由硬件自动完成,解决了主存与CPU速度不匹配的问题。
存储器的分类
按层次进行分类:
- 高速缓存cache
- 主存储器(主存、内存)
- 辅助存储器(辅存、外存)
存储器的功能:存放二进制信息
按存储介质分类:
- 半导体存储器--主存、cache
- 磁表面存储器(以磁性材料存储信息)--磁盘、磁带
- 光存储器(以光介质存储信息)
按存取方式分类:
- 随机存取存储器(RAM):读写任何一个存储单元所需时间都相同,与存储单元所在物理位置无关
- 顺序存取存储器(SAM):读写一个存储单元所需时间取决于存储单元所在的物理位置
- 直接存取存储器(DAM):既有随机存取特性,又有顺序存取特性。先直接选取信息所在区域,然后顺序方式存取。
- 相联存储器(CAM):可以按内容访问的存储器,可以按照内容检索到存储位置进行读写
按信息可更改性:
- 读写存储器(RAM)
- 只读存储器(ROM)
按信息的可保存性:
- 易失性存储器:断电后,存储信息消失的存储器
- 非易失性存储器:断电后,存储信息依然保持的存储器
- 破坏性读出:信息读出后,原存储信息被破坏
- 非破坏性读出:信息读出后,原存储信息不被破坏
存储器的性能指标
存储容量:存储字数*字长
单位成本:每位价格=总成本/总容量
存储速度:数据传输率=数据的宽度(存储字长)/存储周期
主存带宽:又称数据传输率,表示每秒从主存进出信息的最大数量
主存储器的基本组成
MOS管可以理解位一种电控开关,输入电压达到某个阈值时,MOS管就可以接通。
头上划线表示该信号低电平有效
CS 芯片选择信号 CE 芯片使能信号 WE 允许写 OE 允许读
如果时一根读写线 WE 低电平写,高电平读
上面的每根线都会对应一个金属引脚,另外还有供电引脚和接地引脚等
8*8位的存储芯片---》 8位存储单元,8位存储字长
DRAM 和SRAM
DRAM:动态RAM,用于主存
SRAM:静态RAM,用于cache
存储元件不同导致的特性差异
DRAM芯片:使用栅极电容存储信息--电容放电信息被破坏,是破坏性读出,读出后应有重写操作
SRAM芯片:使用双稳态触发器存储信息--是非破坏性读出,无需重写
核心区别在于存储元不一样
电容内的电荷只能维持2ms,即使不断电,2ms后信息也会消失
DRAM的刷新
刷新周期:一般为2ms
以行为单位,每次刷新一行存储单元
如何刷新:由硬件支持,读出一行的信息后重新写入,占用一个读/写周期
在什么时候进行刷新:
- 分散刷新,每次读写完都刷新一行
- 集中刷新:2ms内集中安排时间全部刷新,有一段时间专门用于刷新,称为访存”死区“
- 异步刷新:2ms内每行刷新一次即可。----》2ms/128=15.5us,每15.6us内有0.5us的”死时间“
DRAM的地址线复用技术
行地址和列地址分两次送出,用同一地址线,减少地址线的数量。
只读存储器ROM
RAM芯片--易丢失,断电后数据消失
ROM芯片--非易丢失,断电后数据不会消失
MROM--掩模式只读存储器
厂家按照客户需求,在芯片生产过程中直接写入信息,之后任何人不可重写(只能读出)。
可靠性高、灵活性差、生产周期长,只适合批量定制。
PROM--可编程只读存储器
用户可用专门的PROM写入器写入数据,写一次之后就不能更改
EPROM--可擦除可编程只读存储器
允许用户写入信息,之后用某种方法擦除数据,可进行多次重写。
UVEPROM--用紫外线照射8-20分钟,擦除所有信息
EEPROM--可用”电擦除“的方式,擦除特定的字
闪存--flash memory
闪速存储器--U盘、SD卡
在EEPROM基础上发展而来,断电后也能保存信息,且可进行多次快速擦除重写。
注意:由于闪存需要先擦除再写入,由此闪存的写比读的速度更慢
每个存储元制只需要单个MOS管,位密度比RAM高
SSD--固态硬盘
由控制单元+存储单元(flash芯片)构成,与闪存存储器的核心区别在于控制单元不一样,单存储介质都类似,可进行多次快速擦除重写。
SSD速度快、功耗低、价格高。目前个人电脑上常用SSD代替传统的机械硬盘。
计算机内重要的ROM
主板上的BIOS芯片(ROM),存储了”自举装入程序“,负责引导装入操作系统(开机)。
逻辑上,主存由RAM+ROM组成,且二者常同一编址
双端口RAM和多模块存储器
双端口RAM
需要由两组完全独立的数据线、地址线、控制线。
解决两个CPU读写冲突:置”忙“信号为0,由判断逻辑决定展示关闭一个端口,未被关闭的端口正常访问,被关闭的端口延长一个很短的时间后再访问。
多体并行存储器
一个存储器中划分多个存储块,每个模块都有相同的容量和存取速度。每个模块都有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交叉工作。
高位交叉编制---用高位区分存储块
低位交叉编制---用低位区分存储块
外部存储器
计算机的外存储器又称为辅助存储器,目前主要使用磁表面存储器。
所谓”磁表面存储器“,是指把某些磁性材料薄薄的涂在金属铝或塑料表面上作为载磁体来存储信息。
磁盘存储器
优点:
- 存储容量大,位价格低
- 记录介质可以重复使用
- 记录信息可以长期保存而不丢失,甚至可以脱机存档
- 非破坏性读出,读出时不需要再生
缺点:
- 存取速度慢
- 机械结构复杂
- 对工作环境要求高
外存储器既可以作为输入设备,又可以作为输出设备
磁盘设备的组成
存储区域
一块硬盘含有若干个记录面,每个记录面划分为若干个磁道,而每条磁道又划分为若干个扇区,扇区(也称块)时磁盘读写的最小单位,也就是说磁盘按块存取。
磁头数:即记录面数,表示硬盘总共有多少个磁头,磁头用于读取/写入盘片上记录面的信息,一个记录面对应一个磁头。
柱面数:表示硬盘每一面盘片上有多少条磁道。在一个盘组重,不同记录面的相同编号(位置)的诸磁道构成一个圆柱面。
扇区面:表示每一条磁道上有多少个扇区。
硬盘存储器
硬盘存储器有硬盘驱动器、硬盘控制器和盘片组成。
硬盘驱动器:核心部件时磁头组件和盘片组件,温彻斯特盘时一种可移动头固定盘片的硬盘存储器。
硬盘控制器:时硬盘存储器和主机的接口,主流的标准有IDE、SCSI、SATA
磁盘的性能指标
磁盘的容量:一个磁盘所能存储的字节总数称为磁盘容量。磁盘容量有非格式化容量和格式化容量之分。
- 非格式化容量是指磁记录表面可以利用的磁化单位容量
- 格式化容量是指按照某种特定的记录格式所能存储信息的总量
记录密度:记录密度是指盘片面积上记录的二进制的信息量,通常以道密度、位密度和面密度表示。
- 道密度是沿磁盘半径方向单位长度上的磁道数
- 位密度是磁道单位长度上能记录的二进制代码位数
- 面密度时道密度和位密度的乘积
!磁盘所有磁道记录的信息量一定是相等的,并不是圆越大信息越多,所以每个磁道的位密度都不同。
平均存取时间:
平均存取时间 = 寻道时间(磁头移动道目的磁道) + 旋转延迟时间(磁头定位到所在磁道) + 传输时间(传输数据所花费的时间)
!旋转延迟时间一般用转半圈的时间代替
数据传输率:磁盘存储器在单位时间内向主机传送数据的字节数,称为数据传输率
假设磁盘转速为r(转/秒),每条磁道容量为N个字节,则数据传输率D = rN
磁盘地址
主机向磁盘控制器发送寻址信息,磁盘的地址一般如图所示:
驱动器号 | 柱面(磁道)号 | 盘面号 | 扇区号 |
---|
磁盘的工作过程
磁盘的主要操作时寻址、读盘、写盘。每个操作都对应一个控制字,硬盘工作时,第一步时取控制字,第二步是执行控制字。
硬盘属于机械式部件,其读写操作时串行的,不可能在同一个时间即读又写,也不不可能在同一个时刻读两组数据或写两组数据。
磁盘阵列
RAID(廉价冗余磁盘阵列)是将多个独立的物理磁盘组成一个独立的逻辑盘,数据在多个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性和安全性。
RAID0:无冗余和无校验的磁盘阵列
把连续多个数据块交替的存放在不同物理磁盘的扇区重,几个磁盘交叉并行读写,不仅扩大了存储通量,而且提高了磁盘数据存取速度,单RAID0没有容错能力。
RAID1:镜像磁盘阵列
是为了提高可靠性,使两个硬盘同时进行读写,互为备份,如果一个磁盘出现故障,可从另一个磁盘中读出数据。两个磁盘当一个磁盘使用,意味着容量少一半。
RAID2:采用纠错的海明码的磁盘阵列
RAID3:位交叉奇偶校验的磁盘阵列
RAID4:块交叉奇偶校验的磁盘阵列
RAID5:无独立校验的奇偶校验磁盘阵列
RAID通过同时使用多个磁盘,提高了传输率;通过在多个磁盘上并行存取来大幅提高存储系统的数据吞吐量;通过镜像功能,可以提高安全性。通过数据校验,提高容错能力。
固态硬盘SSD
SSD是基于闪存技术,属于电可擦ROM
SSD组成
闪存翻译层:负责翻译逻辑块号,找到对应页
存储介质:多个闪存芯片,每个芯片包含多个块(16KB-512KB),每个块包含多个页(512B-4KB),SSD以页为读写单位。
SSD读写性能特性
- 以页为单位读写--相当于磁盘的扇区
- 以块为单位擦除,擦干净的块,其中的每页都可以写一次,读无数次
- 支持随机访问,系统给定一个逻辑地址,闪存翻译层可通过电路迅速定位到对应的物理地址。
- 读块、写慢。要写的页如果有数据就不能写入,需要将块内其他页的数据复制到一个新的块中,在写入新的页。
和机械硬盘相比的特点
- SSD读写速度块,随机访问性能高,用电路控制访问位置;机械硬盘通过移动磁臂旋转磁盘控制访问位置,有寻道时间和旋转延迟
- SSD安静噪声、耐摔抗震、能耗低、造假更高
- SSD的一个块被擦除次数太多可能会坏掉,而机械硬盘的扇区不会因为写的次数太多而坏掉
磨损均衡技术
思想:将擦除平均分布在各个块上,以提高使用寿命
动态磨损均衡-----写入数据时,优先选择累计擦除次数少的新闪存块
静态磨损均衡-----SSD监测并自动进行数据分配、迁移,让老旧的闪存块承担以读为主的储存任务,让较新的闪存块承担更多的写任务
Cache
cache的基本原理
cache被集成在CPU内部,cache用SRAM实现,速度快,成本高。
空间局部性:在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是临近的。
时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息。
基于局部性原理,可以把CPU目前访问的地址“周围”的部分数据放到cache中
命中率H:CPU欲访问的信息已在cache中的比率
缺失率(未命中率)M:1-H
先访问cache,若cache未命中再访问主存
cache--主存 系统的平均访问时间t = Htc + (1 - H)(tc + tm)
同时访问cache与主存,若cache命中则中断访问主存
系统的平均访问时间t = Htc + (1 - H)tm
如何界定数据的周围范围?
将主存的存储系统分块,主存与cache之间以块为单位进行数据交换。
如何区分cache与主存的数据块对应关系? ---- cache与主存的映射方式
cache很小,主存很大。如果cache满了怎么办? ----替换算法
CPU修改了cache中的数据副本,如何确保主存中数据母本的一致性? ----cache写策略
Cache和主存的映射方式
如何区分cache中存放的是哪个主存块?
- 给每个cache块增加一个标记,记录对应的主存块数。还需要增加“有效位”
!标记为通过内部硬件实现
假设某个计算机的主存地址空间大小位256MB,按字节编址,其数据cache有8个cache行,行长为64B。
全相联映射
主存块可以放在Cache的任意位置
优点:cache存储空间利用充分,命中率高
缺点:查找“标记”最慢,有可能需要对比所有行的标记
有效位(1位) | 标记位(22位) |
---|
主存
主存块号 | 块内地址 |
---|---|
22位 | 6位 |
直接映射
每个主存块只能放到一个特定的位置
cache块号 = 主存块号 % cache总块数
优点:对于任意一个地址,只需要对比一个标记,速度最快
缺点:cache存储空间利用不充分,命中率低
有效位(1位) | 标记位(19位) |
---|
主存块号
主存块号 | 块内地址 |
---|---|
22位 | 6位 |
19位标记 /3位行号 | 6位块内地址 |
组相联映射
cache块分为若干组,每个主存块可放到特定分组中的任意一个位置
组号 = 主存块号 % 分组数
优点:另外两种办法的折中,综合效果最好
n路组相联映射----以n个cache行为一组
(2块为一组)
有效位(1位) | 标记位(20位) |
---|
主存块号
主存块号 | 块内地址 |
---|---|
22位 | 6位 |
20位标记 /2位组号 | 6位块内地址 |
Cache替换算法
随机算法RAND
若cache已满,则随机选择一块替换
实现简单,但完全没有考虑局部性原理,命中率低。
先进先出算法FIFO
若cache已满,则替换最先被调入cache的块
实现简单,但依然没考虑局部性原理,最先被调入cache的块有可能是被频繁访问的
抖动现象:频繁的换入换出现象(刚被替换的块很快又被调入)
近期最少使用LRU
为每一个cache块设置一个“计数器”,用于记录每个cache块已经有多久没有被访问了。当cache满后替换计数器最大的。
计数器工作:
- 命中时,所命中的行的计数器清零,比其计数器的值低的计数器加1,其余不变;
- 未命中且还有空闲行时,新装入的行的计数器置0,其余非空闲行全加1;
- 未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装行的块的计数器置0,其余全加1;
!不能同时访问两个内存块,因此不会出现计数值相等的情况
cache块的总数为2^n,则计数器只需要n位,且cache装满后所有计数器的值一定不重复。
如果被频繁访问的主存块数值大于cache的行数,则有可能发生“抖动”
最近不经常使用LFU
为每个cache块设置一个“计数器”,用于记录每个cache块被访问过几次,当cache满后替换“计数器”最小的。
若有多个计数器最小的行,可按行号递增、或FIFO策略进行选择
Cache写策略
读操作不会导致cache和主存的数据不一致
现代计算机常采用多级cache,离CPU越近速度越快,容量越小,离CPU越远速度越慢,容量越大。
写命中
CPU对某个地址进行写,并且这个地址所对应的主存块已经被调入cache当中,发生了命中
全写法
当CPU对cache写命中时,必须把数据同时写入cache和主存,一般使用写缓冲。
访存次数增加,速度变慢,但更能保证数据一致性。
写缓冲---SRAM实现的FIFO队列,先把cache写入的数据存在队列中,再写入主存块。
使用写缓冲,CPU写的速度很快,若写操作不频繁,则效果很好。若写操作很频繁,可能会因为写缓冲饱和而发生阻塞。
写回法
当CPU对cache写命中时,值修改cache的内容,而不立即写入主存,只有当此块被换出时才写回主存。未被修改的块不必写回。
“脏位”:让硬件区分哪个cache行的数据被修改过(1/0)
减少了访存次数,但存在数据不一致的隐患。------多核CPU的每个核的cache都有这块主存块的副本,每个cache写回主存顺序不同。
写不命中
写分配法
当CPU对cache写不命中时,把主存中的块调入cache,再cache中修改。通常搭配写回法使用。
非写分配法
当CPU对cache写不命中时,不调入cache,搭配全写法使用。
页式存储器
分页---4KB的程序被分为4个“页”,每个页面的大小和“物理块”的大小相同。
页式存储系统---一个程序(进程)再逻辑上被分为若干个大小相等的“页面”,“页面”大小与“块”的大小相同。每个页面可以离散地放入不同地主存块。
逻辑地址(虚地址):程序员视角看到的地址
逻辑页号 | 页面地址 |
---|---|
若干位 | 10位 |
物理地址(实地址):实际在主存中地地址
页表:页表数据在主存中
逻辑页号 | 主存块号 |
---|
CPU执行的机器指令中,使用的是“逻辑地址”,因此需要通过“页表”将逻辑地址转为物理地址。
页表的作用:记录了每个逻辑页面存放在哪个主存块中
页表基址寄存器:存放页表基地址,指明了页表在主存中的存放地址。
优化:将近期访问的页表项放入更高速的存储器,可加快地址变换的速度。
注意区别:块表中存储的是页表项的副本,cache中存储的是主存块的副本。
块表是一种“相联存储器”,可按照内容寻访。
虚拟存储器
访问位:实现页面替换算法。
外存块号:该页面在外存中的位置
段式虚拟存储器
按照功能模块拆分,每块的大小可能不一样。
如#0是自己的代码,#1是库函数代码,#2是变量
段页式虚拟存储器
把程序按逻辑分段,每段再划分成固定大小的页。
主存空间页划分为大小相同的页,程序对主存的调入,调出依旧以页为基本传送单位。
每个程序对应一个段表,每段对应一个页表。
虚拟地址 = 段号 + 段内地址 + 页内地址