半导体存储器
基本结构
- 存储矩阵:大量的存储单元排列而成
- 译码器:将来自地址总线的地址信号翻译为对应的选通信号
- 读写电路:包含放大器和写入电路,与译码器配合完成对于选中单元的读写操作
- 片选线:确定存储芯片
- 地址线:单向输入,位数与每个存储芯片中的存储字个数相关
- 数据线:双向传输数据,位数与读入与写出的数据位数相关
静态随机存储器(SRAM)
信息读出后其保持原态不需要再生(非破坏性读出)。但是电源切断后保存的信息会丢失,属于易失性存储器
特点
- 存取速度快
- 集成度低
- 功耗大
- 一般用于高速缓冲存储器
动态随机存储器(DRAM)
DRAM通过存储元电路中的电容来存储信息。DRAM上的电荷一般只能维持1-2ms,即使不断电,信息也会自动丢失。因此需要每隔一定时间刷新(一般取2ms),成为刷新周期
DRAM采用地址复用技术地址线为原来的1/2,地址信号分为行列两次传送
特点
- 存取速度比SRAM慢
- 容易集成
- 功耗低
- 容量大
刷新方式
- 集中刷新:每一个刷新周期内,利用一段固定时间依次对存储器内所有行进行逐行再生。此期间停止对存储器的读写操作,称为“死时间”,又称访存“死区”
- 分散刷新:每行的刷新分散到各个工作周期中。这样一个存储器的系统工作周期分为2部分,一部分负责正常读取操作,后半部分用于某一行的刷新。这种方式增加了系统的存储周期降低了整机的速度,但优点是没有死区。
- 异步刷新:集中刷新和分散刷新的结合。既缩短了“死时间”又能充分利用最大刷新间隔。通过 最大刷新周期/行数=t 每隔时间t进行一次刷新请求。既避免了cpu连续等待时间过长,而且减少了刷新次数
- 透明刷新:将刷新安排在不需要访存的译码阶段,既不会增加存取周期也不会产生“死时间”。这是分散刷新新方式的发展
只读存储器(ROM)
ROM与RAM都支持随机存取。RAM为易失性存储器,ROM中一旦有了信息,就不能轻易改变,即使断电也不会丢失。
特点
- 结构简单,所以位密度比可读写存储器高
- 具有非易失性,可靠性高
ROM类型
- 掩模式只读存储器
- 一次性可编程只读存储器
- 可擦除可编程只读存储器
- 闪存
- 固态硬盘
主存储器与CPU
主存容量扩展
- 位扩展:扩展每个字的位数,字的数量不变。
- 字扩展:扩展存储器中字的数量,每个字的位数不变
- 字位同时扩展:同时扩展字的位数与字的数量。
- 字的位数改变,连接数据总线的方式改变。通过片选信号或者采用译码器设计连接相应芯片。
存储芯片的地址分配与片选
线选法
将信号的高位地址线连接到各个芯片的片选端,当某地址线信息位0时(低电平有效),选中与之想对应的存储芯片。例如高位信号 1011 芯片2有效,不允许多位同时有效例如1001.
- 优点:不需要译码器,线路简单。
- 缺点:地址空间不连续选片的地址必须分时为低电平否则不能工作。地址资源浪费。
译码片选法
将除片内选址的高位地址线通过地址译码器芯片产生片选信号。n位能产生2^n个片选信号。例如高位片选信息 101 则选择第5片存储芯片。
CPU访存速度提升
- 双端口存储器,属于空间并行
- 多模块存储器,属于时间并行
双端口RAM
同一个存储器有左右两个独立的端口,分别具有独立的地址线、数据线和读写控制线,允许两个独立的控制器同时异步的访问存储单元。
两个单元同时对存储器的同一地址进行存取时,会因数据冲突造成存储或者读取错误。
- 两个端口不同时对同一地址单元存取数据 不会出现错误
- 两个端口同时对同一地址单元读出数据 不会出现错
- 两个端口同时对同一地址单元写入数据 写入错误
- 两个端口同时对易地址单元一个写入一个读出 读出错误
解决方法 设置忙信号
多模块存储器
CPU的速度比存储器快,若同时从存储器中取出n条指令,就可以充分利用CPU资源,提高运行速度。
单体多字存储器
存储器中只有一个存储体,每个单元存储m个字,每次读出m个字。增加了存储器的带宽,提高了单体存储器的工作速度。但是指令和数据在主存必须是连续存放的,一旦遇到转移指令,或者操作数不能连续存放,效果就不明显。
多体并行存储器
多体并行存储器由多体模块组成。每个模块有相同的容量和存取速度,各模块有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,也能交叉工作。
高位交叉编址
高位表示体号,低位表示体内地址。高位交叉编址的存储器仍然是顺序存储器。
低位交叉编址
低位表示体号,高位为体内地址。程序连续存储在相邻体中,因此采用此编址方式的存储器为交叉存储器。
多模块结构的存储器采用低位交叉编址后,可以在不改变存取周期的情况下,采用流水线的方式并行存取,提高存储器带宽。
低位交叉存储模块数应大于等于 m = 模块字的存取(T)/总线的传送周期(r)
其中m称为交叉存取度。
连续存取m个字所需时间为 t = T + (m - 1) * r
高速缓冲存储器
Cache和主存的映射方式
直接映射
主存数据块只能装入Cache中的唯一位置。若这个位置已有内容,则产生块冲突,原来的块直接换出(无需使用替换算法)。这种方法空间利用率低,块的冲突概率最高。
直接映射地址结构: 主存字块标记 | Cache字块地址 | 字块内地址
全相联映射
可以将主存字块放入Cache中的任意位置。全相联的优势是比较灵活,Cache块的冲突率比较低,空间利用率高。缺点是地址变换速度变慢,实现成本高,通常需要采用昂贵的按内容寻址的相关联存储器进行地址映射。
全相联地址结构:主存字块标记 | 字块内地址
组相联映射
将Cache分为大小相同的组,主存的一个数据块可以放入一个组的任意一个位置。
组相联映射地址结构:主存字块标记 | 组地址 | 字块内地址
- 直接映射可以看作组数为n的组相联。
- 全相联映射可看作是组数为1的组相连。
- 组相联映射可以看作组间采用直接映射,组内采用全相联映射。
Cache替换算法
这里与操作系统类似
- 随机算法:随机选择
- 先进先出(FIFO):类似队列,最早调入的换出
- 近期最少使用算法(LRU):通过计数器,Cache每命中一次,命中行计数器清零,其他的加1,选择值最大的换出。
- 最不经常使用算法(LFU):通过计数器,每命中一次,命中的行加1,其他的不变,选择值最小的换出。
Cache写策略
Cache中的内容是主存中的副本,当Cache中的内容改变后,需要选择写策略使Cache和主存中的内容保持一致。
当Cache写命中时(修改的单元在Cache中有备份)有两种处理方法:
- 全写法: CPU命中Cache时,把数据同时写入主存和Cache。这样当新的块调入时,不需要将块写回主存,直接覆盖就行。这种方法实现简单,能随时保持主存的正确性。但是增加了访存次数,影响了Cache的效率。在此基础上加入写缓冲。CPU写数据时同时写到Cache和写缓冲队列中,写缓冲再将内容写入主存。写缓冲可以解决速度不匹配问题,但是如出现频繁写时,会使写缓冲饱和溢出。
- 写回法: 当CPU命中Cache时,只修改Cache中的内容,不立即写入主存,只有当块被换出时才写回主存。这种方法减少了访存次数,但存在不一致的隐患。采用写回法时,每个Cache需要设置一个标志位(脏位),表示此块是否被修改过。
- 写分配法: 加载此块到Cache中,然后更新Cache块,他试图利用程序的空间局部性,但是每次不命中都需要从主存中调入一块。此方法通常与写回法搭配使用。
- 非写分配法: 只写入主存,不进行调块。此方法通常与全写法搭配使用。
多级Cache
按照离CPU的距离可命名为L1Cache、L2Cache。离CPU越远,访问速度越慢,容量越大。
如下图是一个两级Cache的系统,L1Cache对L2Cache使用全写法,L2Cache对主存使用写回法,由于L2Cache访问速度大于主存,避免了因为频繁写入时造成的写缓冲饱和溢出
虚拟存储器
此部分内容与操作系统中的虚拟内存管理可以相结合。
程序运行时只将当前运行所需要的部分调入主存,供CPU使用,其余部分留在磁盘当中。
基本概念
- 逻辑地址:也叫虚拟地址。通常由用户给出,对应虚拟存储空间。
- 物理地址:也叫实地址,对应主存地址空间。
虚拟地址到物理地址的转换与主存块映射到Cache类似,只是单位不同。
页式虚拟存储器
页式虚拟存储器以页为单位。主存的页称为实页,虚存的页称为虚页。将虚拟地址分为两段:虚页号和页内地址(有时候也叫页内偏移量)。虚地址到实地址大转换是通过页表来进行的。页表是一张存放着虚页号与实页号的对照表,记录着虚页调入主存时安排在主存中的位置。页表一般长久的保存在内存中。
虚拟地址到物理地址的映射主要是虚页号到物理页号的转换,业内地址并不改变。虚页号到实页号的转变需要通过页表基址寄存器(每个进程一个)。页表页表基址寄存器中存放的是页表的起始地址,与虚拟页号相加后得到一个页表地址,根据这个页表地址去页表中取出实页号,然后实页号与页内地址相加得到物理地址。具体的变换过程在操作系统中总结。
页式虚拟存储器的优点是,页面的长度固定,页表简单,调入方便。缺点是,犹豫程序几乎不可能是页面的整数倍,最后一页会有内部碎片,而且页并不是逻辑上独立的实体,所以处理保护和共享都不如段式虚拟存储器方便。
段式虚拟存储器
段式虚拟存储器中的段是按照逻辑划分的,每个段的长度不一定相同。虚拟地址分为段号和段内地址。虚拟地址到物理地址的转换通过段表实现。段表的每行记录与段对应的段号、装入位、段起点和段长等信息。
段式存储地址变换需要通过段表寄存器,首先将段号与寄存器中段表长度进行比较判断是否越界。若未越界再与寄存器中保存的段表始址相加得到段表项地址,取出该段表项中的段首址,拼接段内偏移量得到物理地址。
段式存储的优点是,段的分界与逻辑的分界相对应,因此具有逻辑独立性,使得他易于编译、管理、修改和保护,也便于多道程序共享。缺点是段长度可变,分配空间不便,容易在段间留下外部碎片。
段页式虚拟存储器
结合了段式存储与页式存储。把程序首先按逻辑分为若干段,然后在段中进行分页。主存空间也划分为若干页,程序的调入调出也以页为基本传送单位。在段页式存储器中,每个程序对应一个段表,每段对应一个页表,段的长度必须是页的整数倍,段的起点必须是某一页的起点。
虚地址分为: 段号 | 页号 | 页内地址 。 CPU访存时,首先根据段号得到段表地址,然后从段表中取出该段的页表起始地址,与虚地址中的页号合成,得到页表地址,最后从页表中取得实页号,与虚地址中的页内地址拼接成物理地址。
段页式存储的优点是,兼具段式和页式的优点,可以按段实现共享和保护。缺点是在地址变换的过程中需要两次查表,系统开销大。
快表(TLB)
在虚拟存储器中,需要先访问一次主存查页表得到页地址,然后再访问主存才能拿到数据,访问效率低,而在段页式中需要查段表和页表两次表。
根据程序的局部性原理,在一段时间总是访问到某些页时,将这些页放在由高速缓冲器组成的快表(TLB)中,可以明显提高效率。相应的将存放在主存中的表称为慢表(PAGE)。快表是慢表的副本,并且只存放了很少的一部分。
虚拟存储器与Cache异同
相同之处
- 都是为了提高系统性能,都有容量、速度、价格的梯度
- 把数据划分为了更小的块,作为基本传输单位,虚拟存储系统的单位更大
- 都有地址映射、替换算法、更新等策略
- 根据局部性原理应用快速缓存的思想,将相对活跃的数据放在相对高速的部件中
不同之处
- Cache解决CPU与主存速度不匹配问题;虚拟存储器是为了解决主存容量
- Cache全由硬件实现,是硬件存储器,对多有程序员透明;虚拟存储器是OS和硬件共同实现,是逻辑上从存储器,对系统程序员不透明但是对应用程序员透明。
- 对于不命中的影响:CPU的速度约为主存的10倍,主存的速度为硬盘的100倍以上,因此虚拟存储器不命中对系统的影响更大。
- CPU与Cache和主存都建立了直接通路,而辅存与CPU没有直接通路。因此当Cache不命中时可以直接与主存通信,同时数据调入Cache中;而虚拟存储器系统不命中时,只能先由硬盘调入主存,不能与CPU直接通信。