一 存储器概述
1 分类
按作用分:主存储器(内存);辅助存储器(外存);高速缓冲存储器(cache)
按介质分:磁表面存储器(磁盘,磁带);磁芯存储器;半导体存储器(MOS型;双极型);光存储器(光盘)
按存取方式分:随机存储器(RAM),只读存储器(ROM)都是随机存取;串行访问存储器(顺序存取——磁带;直接存取——磁盘,光盘)
按信息的可保存性分:断电后信息消失——易失性存储器(RAM);断电后信息仍保持——非易失性存储器(ROM,磁表面,光存储器);破坏性读出——再生操作(导致恢复时间),非破坏性读出
2 存储器的性能指标
存储容量:存储字数*字长
存储速度:数据传输率/存取周期
存取时间(Ta):读出时间和写入时间,启动一次存储器操作到完成该操作所经历的时间
存取周期(Tm):一次完整的读写操作所需的时间
主存带宽(Bm):数据传输率,每秒从主存进出信息的最大数量,单位为字/秒,字节/秒,位/秒
3 多级层次的存储系统
产生原因:价格成本,各级之间速度不匹配,容量大小
主存与cache之间的数据调动由硬件完成,完全透明;主存与外存的数据调动由硬件和操作系统完成,对应用程序员透明
随着发展产生了虚拟存储系统,编程时可用地址远大于主存空间;上级的内容是下级的副本
二 主存储器
1 SRAM芯片和DRAM芯片
主存储器——DRAM;cache——SRAM
一个二进制位的物理器件——存储元
地址码相同的多个存储元——存储单元
若干个存储单元的集合——存储体
1.1 SRAM的原理
静态随机存储器SRAM,存储元用双稳态触发器(六晶体管MOS),非破坏性读出,价格贵
1.2 DRAM的原理
动态随机存储器DRAM用存储元电路中的栅极电容的电荷存储信息,一个存储元一个晶体管
为避免电容电荷的消失,需要刷新,一般刷新周期是2ms
(1)集中刷新
一个周期内一个固定时间(死时间),读写不受刷新影响,但会停止访问存储器
(2)分散刷新
把刷新分散到各个工作周期,没有死区,但会加长存取周期,降低速度
(3)异步刷新
两种方式的结合,将刷新周期除以行数,得到两次刷新操作之间的时间间隔t,每隔t产生一次刷新请求,没有死时间,又提高了效率
DRAM的刷新对CPU透明,刷新单位是行,刷新操作类似读,所有芯片同时被刷新
1.3 DRAM芯片的读写周期
C A S ‾ \overline{CAS} CAS 列选通信号
R A S ‾ \overline{RAS} RAS 行选通信号
W E ‾ \overline{WE} WE 读写控制信号
DRAM的地址复用技术,行地址和列地址用过相同的引脚先后两次输入,地址引脚数可减少一半,现在SDRAM更常用
1.4 存储器芯片的内部结构
(1)存储体(存储矩阵)
由行选择线X和列选择线Y来选择访问单元,相同行,列上的位同时被读写
(2)地址译码器
将地址转换成高电平,驱动相应的读写电路
(3)I/O控制电路
控制被选中的单元的读写
(4)片选控制信号
多个芯片,选中访问字所在的芯片
(5)读写控制信号
根据CPU给出的命令,控制被选中单元读或写
2 只读存储器ROM
2.1 ROM的特点
结构简单,位密度比可读写存储器高;非易失性,可靠性高
2.2 ROM的类型
(1)掩模式只读存储器(MROM)
厂家生产时直接写入内容,无法更改
(2)一次可编程(PROM)
允许用户写入一次,无法更改
(3)可擦除可编程(EPROM)
编程次数有限,写入时间长,不能取代RAM
(4)Flash存储器
长期保存信息,在线进行快速重写
(5)固态硬盘(SSD)
闪存芯片,快速擦除重写,读写速度快,低功耗,价格高
3 多模块存储器
是一种空间并行技术,提高存储器的吞吐率
3.1 单体多字存储器
只有一个存储体,每个存储单元m个字,总线宽度m个字,一次并行读出m个字,地址顺序排列并处于同一存储单元
指令和数据连续存放,遇到转移指令或操作数不能连续存放,效率提升不明显
3.2 多体并行存储器
多体模块组成,每个模块容量相同,有独立的读写电路,MAR和数据寄存器,既能并行又能交叉工作
(1)高位交叉编址(顺序方式)
高位表示体号,低位表示体内地址
逻辑上还是顺序访问,各个模块不能并行访问,不能提高吞吐率
(2)低位交叉编址(交叉方式)
低位为体号,高位为体内地址
在不改变存取周期的前提下,采用流水线的方式并行存取,提高了存储器的带宽
设模块字长等于数据总线宽度,存取一个字的周期为T,总线传送周期为r,流水线存取,交叉存取度m=T/r
模块数大于等于m
r时间后启动下一模块,大于等于m确保模块经过m*r时间后存取操作已经完成,连续存取m个字的所需时间为
t1=T+(m-1)r
顺序存取m个字的时间为t2=mT,带宽大大提升
三 主存储器与CPU的连接
1 连接原理
数据总线的位数与工作频率的乘积正比于数据传输率
地址总线的位数决定可寻址的最大内存空间
控制总线(读\写)
2 主存容量的扩展
片选线 C S ‾ \overline{CS} CS, C E ‾ \overline{CE} CE表示低电平有效,CS或CE表示高电平有效
W E ‾ \overline{WE} WE或 W R ‾ \overline{WR} WR低电平表示写,高电平表示读,也可以分开为 W E ‾ \overline{WE} WE和 O E ‾ \overline{OE} OE两根读写线
2.1 位扩展法
CPU的数据线数和存储芯片的数据位数不一定相等,为充分利用数据线数,对存储芯片扩位
仅采用位扩展时各个芯片的连接地址线的方式相同,连接的CPU数据线不同,某一时刻选中所有芯片,片选信号 C S ‾ \overline{CS} CS要连接所有芯片
2.2 字扩展法
增加存储器中字的数量,位数不变;将芯片的地址线,数据线,读写控制线相应并联,片选信号来区分各个芯片的地址范围
仅采用字扩展,数据线地址线的连接方式相同,但某一时刻只需要选中部分芯片,通过片选信号 C S ‾ \overline{CS} CS或者译码器设计连接
两个芯片地址分别是01xxxxx 10xxxxx;这是线选法,顾名思义,通过不同的线路的电平来判断选择哪个芯片,但是n个芯片就需要n个线路,电路简单,地址空间不连续,且不能充分利用存储器空间,造成地址资源的浪费
优化后:
通过译码器可以减少线路来表示更多的芯片,如图,如果电平是1,则选择第一块芯片,是0则选择第二块
三个地址线路就可以表示8块芯片,电路复杂,地址空间可连续
CPU可使用译码器的使能端控制片选信号的生效时间;地址信号稳定后发出存储器请求信号
2.3 字位同时扩展法
即同时使用以上两种方法,字位同时扩展,地址线连接方式相同,数据线连接不同,且通过片选信号或者译码器来选择不同组的芯片。
四 外部存储器
1 磁盘存储器
容量大价格低,重复使用,长期保存,非破坏性读出;存取速度慢,结构复杂,环境要求高
1.1 组成
磁盘驱动器:磁头组件和盘片组件
磁盘控制器:与主机的接口,标准有IDE,SCSI等
磁头数(盘面数);柱面数(不同面相同位置磁道构成的圆柱面);扇区数(每条磁道上有多少个扇区)
1.2 原理
磁头和磁性记录介质相对运动,电磁转换完成读写操作
1.3 指标
记录密度:单位面积上记录的二进制信息量,道密度(磁道),位密度(二进制位数),面密度(二者的乘积)
容量
平均存取时间=寻到时间+延迟时间(转半圈)+传输时间
数据传输率,磁盘转数r转/秒,每条磁道N字节,数据传输率=rN
磁盘的主要操作是寻址,读盘,写盘;读写是串行的,不能同时进行
1.4 磁盘阵列
多个磁盘组成一个独立的逻辑盘,数据交叉存储,并行访问
RAID0:无冗余和无校验的磁盘阵列
RAID1:镜像磁盘阵列
RAID2:采采用纠错的海明码的磁盘阵列
RAID3:位交叉奇偶检验的磁盘阵列
RAID4:块交叉奇偶检验的磁盘阵列
RAID5:无独立检验的奇偶检验磁盘阵列
2 固态硬盘SSD
2.1 原理
基于闪存技术,falsh memory,即EEPROM
以页为读写单位,相当于磁盘的扇区;以块为单位擦除,每页可以写一次,读无限次,但是每一块的擦除次数有限,擦除次数过多会坏掉(这个块);可以随机访问
另外如果写入的页有数据,则需要复制其他页到另一个块,是否意味着两次擦除,答案是不一定
为了解决一直选择一个块擦除导致这个块的快速损坏问题,采用磨损均衡技术,将擦除的次数平均到每一块
动态磨损均衡:写入时优先选被擦除次数少的块
静态磨损均衡:SSD检测并自动进行数据的分配迁移,让老的块承担主要以读的数据(如电影),新的块承担更多写的数据
五 高速缓冲寄存器(cache)
1 程序访问的局部性原理
时间局部性:现在用到的数据未来也可能用到,不断循环
空间局部性:未来要用的数据可能和现在用的数据是邻近的(指令是顺序存放或者数据以向量,数组存放)
高速缓冲技术就是利用局部性把部分数据放到cache中,让CPU和cache更快的访问,提高执行速度
int sum1(int a[M][N])
{
int i ,j,sum=0;
for(i= 0;i<M;i++)
{
for(j=0;j<N;j++)
{
sum +=a[i][j];
}
}
return sum;
}
int sum2(int a[M][N])
{
int i ,j,sum=0;
for(i= 0;i<M;i++)
{
for(j=0;j<N;j++)
{
sum +=a[j][i];
}
}
return sum;
}
通过以上代码就可以看出一个简单的改动就能使访问的时间增加,数组a顺序存放,那么sum2每访问一个a就要跳过N个数据,空间局部性差
2 cache的原理
由SRAM组成,和主存一样划分相同的块,但容量比主存小的多
cache按照某种策略装入未来CPU可能访问的数据
cache满时按照某种替换算法,替换某个块,由硬件实现
CPU——cache以字为单位,cache——主存以块为单位
cache命中还会有与主存中内容不一致的问题,因为CPU写入cache,而主存的没有更改,所有会有写入策略
CPU要访问的信息命中cache,成为cache 的命中率H;cache的总命中次数Nc,访问主存总次数Nm
命中率H=Nc/(Nc+Nm)
tc为命中cache的访问时间,tm是未命中的访问时间,则cache——主存系统的平均访问时间Ta
Ta=Htc+(1-H)tm(同时找)
Ta=Htc+(1-H)(tm+tc)(先cache再主存)
实现cache还需解决以下关键问题:
(1)数据查找;如何快速判断数据在cache中
(2)[地址映射](3 cache和主存的映射方式);主存块怎么存放在cache中,怎么把主存地址转换成cache地址
(3)[替换策略](4 cache中主存块的替换算法);cache满怎么替换
(4)写入策略;保持cache的内容和主存一致且提升效率
3 cache和主存的映射方式
把主存地址空间映射到cache地址空间;cache的每一个块都有一个标记,指明它是哪一块的副本,同时有一个有效位判断是否有效
3.1 直接映射
直接无条件被替换出去,没有替换算法,实现简单不灵活,块冲突概率高,空间利用率低
cache行号= 主存块号 mod cache总行数
假设cache4块(编号0-4),主存16块(编号0-15),那么主存编号0,4,8,12都对应cache0号,以此类推
给cache行设置一个长为t的标记
直接映射的地址结构为
(1)先根据c找到cache行
(2)再根据t标记和cache的对比,相同且有效位为1,则命中,再根据块内地址找到cache中的内容;
若不命中,CPU从主存中找到块信息送到cache(一次访存),有效位置1,标记置为地址中的高t位,再将内容送到CPU
3.2 全相联映射
主存的块装入任意位置,标记指出来自内存的哪一块,CPU访存时需要与所有cache行标记对比
灵活,块冲突概率低,命中率高;标记比较慢,实现成本高(需要按内容寻址的相联存储器)
3.3 组相联映射
把cache分为Q个组,组间采用直接映射,组内采用全相联映射
Q=1就是全相联映射,Q=cache行数就是直接映射
cache组号 = 主存块号 mod cache组数(Q)
每组行数量越大,块冲突概率越大,但是电路也复杂,成本高
(1)根据组号找到cache组
(2)组中的行对比标记
(3)相等且有效位为1,命中,再根据块内地址找到cache中的数据;
若未命中,CPU从主存中读出并送到cache对应组的空白行中,有效位置1,设置标记,再将内容送到CPU
每个标记项有两位替换控制位
总线带宽=总线宽度x频率
4 cache中主存块的替换算法
cache满时从主存替换cache行
4.1 随机算法(RAND)
随机替换,没有依据局部性,命中率低
4.2 先进先出算法(FIFO)
选择最早进入的替换,没有依据局部性,因为先进入可能反复使用
4.3 近期最少使用算法(LRU)
根据局部性原理,选择近期内长久没有访问过的cache行作为替换,平均命中率比FIFO高,是堆栈类算法
特点:(1)每个行设置一个计数器,位数与cache组大小相关,两路就是一位LRU,4路就是2位
(2)命中时,命中行清零,比它低的加一,其他不变
(3)未命中且还有空闲行,装入并计0,其他行加一
(4)未命中且满了,替换计数值最高的,新装入计0,其他加一
会有抖动现象:集中访问的存储区域超过cache组的大小,命中率变得很低
4.4 最不经常使用算法(LFU)
替换一段时间内访问次数最少的行
也有一个计数器,访问一次加一,新行从0开始,替换计数值最小的行
5 cache写策略
cache中的内容被改变时,主存中的内容需要与cache一致
cache写命中时
(1)全写法(写直通法,write through)
CPU同时写入cache和主存
实现简单正确率高
但增加访存次数降低效率,为此引入写缓冲
写缓冲:减少写入主存的时间损耗,在cache和主存间加入一个写缓冲(FIFO队列),解决速度不匹配问题,但是频繁写写缓冲可能会饱和
(2)回写法
先写入cache,换出时再写入主存
减少了写入次数,但有不一致的问题
减少开销,cache行设置修改位(脏位),为1表示修改才写会主存,否则不用写回主存
cache写未命中时
(1)写分配法(常配合回写法)
先把主存的块调入cache,再更新
每次未命中都要调入
(2)非写分配法(常配合全写法)
只写入主存,不进行掉块
现代计算机将指令cache和数据cache分开,减少冲突,优化性能
同时采取多级cache,离CPU越远的cache访问速度越慢,容量越大
指令cache和数据cache的分离在L1cache,此时为写分配法和回写法合用
L1——L2全写法,L2——主存回写法;并且L2速度快,避免了写缓冲的饱和
六 虚拟存储器
虚拟存储器=主存+辅存;由硬件和操作系统实现,对应用程序员透明
1 基本概念
将主存或辅存的地址空间统一编址,形成一个庞大的地址空间,用户可以自由编程,不用在意主存容量和程序在主存中实际的位置
用户编程——虚地址(逻辑地址),对应空间是虚拟空间,虚地址 = 虚存页号+页内字地址
主存单元地址——实地址(物理地址),对应主存地址空间,实地址= 主存页号+页内字地址
使用虚地址,由硬件找到虚实地址的对应,并判断是否装入主存
若已经在主存,通过地址变化,CPU直接访问;若不在,把页面调入主存CPU再访问,主存满就需要替换
缺页的访问辅存代价大,必须提高命中率,因此采用全相联映射
写操作不能同时写回磁盘,因此采用回写法
2 页式虚拟存储器
以页为基本单位
主存的页——实页,页框;虚存的页——虚页
虚拟地址:虚页号 + 页内地址 虚拟地址——物理地址(页表实现)
页表:虚页号和实页号的对照表,记录虚页调入主存的位置,保存在主存中
2.1 页表
有效位:1,已经装入主存;0,没有调入主存
脏位(修改位):配合回写策略判断是否修改需要写回
引用位(使用位):配合替换策略
执行情况:
(1)虚拟地址——>物理地址
(2)页表基址寄存器存放进程的页表首地址,然后根据虚拟地址高位部分的虚拟页号找到对应的页表项
(3)有效位为1,取出物理页号,物理页号+虚拟地址低位的页内地址=实际物理地址
有效位为0,缺页,操作系统进行缺页处理
页式虚拟存储会有内部碎片;处理保护和共享数据不方便
2.2 快表(TLB)
根据局部性原理,把经常访问的页存入TLB(高速缓冲器组成),能提高效率
地址转换,先找快表
采用全相联或组相联
TLB项 = 页表项内容 + TLB标记字段
全相联——TLB标记就是页表项对应的虚页号
组相联——TLB标记就是虚页号的高位
详见操作系统
2.3 具有TLB和cache的多级存储系统
查找时,快表和慢表可以同步进行
CPU的一次访存操作可能涉及TLB,页表,cache,主存和磁盘的访问
cache缺失——硬件完成
缺页处理——操作系统完成
TLB缺失——硬件/操作系统完成
3 段式虚拟存储器
按程序的逻辑划分,长度因程序而异
虚拟地址 = 段号 + 段内地址
虚实地址的转换——段表
段表:段号 + 装入位 + 段起点(各段起始地址) + 段长等信息
具有逻辑独立性,易于管理保护和共享,但会造成外部碎片
4 段页式虚拟存储器
把程序按逻辑分段,每段再按页划分;调入调出仍以页为单位
一个程序一个段表,每段一个页表
虚地址 = 段号 + 段内页号 + 页内地址
段号——>段表地址——>页表起始地址+段内页号=页表地址——>实页号+页内地址——>物理地址
两次访存,开销较大
5 虚拟存储器与cache 的比较
相同:(1)提高系统性能
(2)把数据划分
(3)地址映射,替换算法,更新策略
(4)局部性原理应用(快速缓存思想)
不同:
cache | 虚拟存储器 | |
---|---|---|
主攻 | 系统速度 | 主存容量 |
实现 | 硬件(透明) | 硬件+os(对应用程序员透明) |
未命中性能影响 | 较小 | 较大(访问辅存) |
连接 | 与CPU直连 | 辅存不能和CPU通信 |