存储系统的组成
RAM
基本结构
译码器驱动电路
- 译码器:将地址总线的地址码转换成与之对应的译码输出线上的有效电平。
- 驱动器:提供驱动电流驱动相应的读写电路。
I/O和读写电路
完成被选中储存单元中各位的读出和吸入操作。
- 读入放大器
- 写入放大器
- 读写控制电路
读写控制线
控制器传递控制信号到主储存器。
ROM
储存单元
- 位(记忆单元):二进制数基本单位,储存器储存信息的最小单位。
- 储存字:作为一个整体被存入或取出的二进制数。
- 储存单元:储存储存字的空间,是CPU可以操作的最小储存单位。
- 储存地址:储存单元的编号。
编址
x86架构使用小端方案。在不同方案的计算机上传输数据以及进行底层编程时,需要注意编址方案。
- 大端方案:字地址等于最高有效位字节地址
- 小端方案:字地址等于最低有效位字节地址
数据在主存中的存放
目前大部分储存器采用字节编址,而储存字长一般为8个字节,也就是说一个储存字内含八个内存地址,一个储存周期最多读写64位数据。
- 紧缩存放:存储一个数据可能要花费两个储存周期(如第一排后面的绿块就跨越了两个储存字)。
- 储存字字边界存放
- 整数边界存放
$0_2$的含义:2的整倍数
$00_2$的含义:4的整倍数
在C语言中,可以通过#prama pack(...)
改变对齐方式。
储存器的主要技术指标
储存容量的表示:以字节编址的一般以字节数来表示,以字长编址的一般以字长数*字长来表示。
半导体RAM和ROM
RAM芯片分析
RAM芯片
主要的外引脚:
- 地址线:$A_i$,单向输入。
DRAM中将地址线等分为相同两部分,先后从相同引脚送入,$\overline{RAS}$(行地址选通信号)和$\overline{CAS}$(列)。DRAM增加一条地址线即增加两位地址,四倍容量。 - 数据线:$D_i$,可输入可输出。
- 片选线:$\overline{CE}$或$\overline{CS}$。
属于控制线,决定芯片是否被选中。DRAM中,可以被$\overline{RAS}$和$\overline{CAS}$代替 - 读写控制线:$\overline{WE}$(1为读允许,0为写允许)或$\overline{OE}$(读允许)/$\overline{WE}$(写允许)。
属于控制线,控制进行读操作还是写操作。 - $V_{CC}$
- $GND$
地址译码方式
单译码
又称字选法,对应字结构的储存器。
容量为M个字,每个字为b位的储存器,排列成$M\times b$的矩阵,每行对应一个字。K位地址线经过地址译码器后,产生$2^k$条字线(因为K位地址线有K个二进制位,可以表示$2^k$个地址),一条字选线选中一个字。片选线控制读写控制电路,读写控制电路可以选中字的某一位。
存在的问题是外围电路太多,且字数大大超过位数时,物理结构会变成纵向很长而横向很窄的不合理结构。
双译码
又称重合法,可以对应位结构,还可以对应字段结构。将$K$位地址线分为接近相等的两段,分别用于水平和垂直方向的地址译码。
位结构
每次选中一个记忆单元,可以在$Z$方向堆叠芯片,实现记忆单元的扩充(从一位扩展到多位)。
字段结构
- 一条行选择线管控s个b位长的字。
- 一条列选择线一次性选择b位数据。
- K位地址线:$K_x=\log_2M/s,K_y=\log_2s$
怎么算出来的?
我们一共有$M$个字,行选择线需要$M/s$根,而传输二进制地址码的$K_x$位地址线一共可以表示$2^{K_x}$个地址,即$2^{K_x}=M/s$,即$K_x=\log_2M/s$。$K_y$同理。
该图中,6位行地址线可以对应64个行,一条行选择线同时管控16个4位长的字;4位列地址线可以对应16个列,每条列选择线同时选中4位数据。
典型的RAM芯片记忆单元总数开方后仍是常数。
双译码方式减少了选择线数目和驱动器数目,储存容量越大,其效果越明显。
主存的主要技术指标
储存容量
存取速度
- 存取时间Ta:启动储存器到完成操作
- 存取周期Tm:两次连续访问存储器操作之间所需的最小时间间隔。
- 贮存带宽Bm:每秒从主存进出信息的最大数量。位/秒。
可靠性
功耗
性价比
Cache
地址映像
全相联映像
主存中任意一个块均可映像装入到Cache中任何一个块的位置上。如上图,主存块号会被变换为cache块号。
- 变换速度慢,成本高,实现困难
- 灵活、冲突概率最低、空间利用率最高
直接映像
主存中的一个块只能唯一对应cache中的一个位置。如上图,主存地址被分为区号和块号,变换时区号直接被切掉(取模)。
$K=I\mod 2^c$
- 不够灵活,冲突概率最高,空间利用率最低
- 成本低,容易实现,地址变换快
组相联映像
将Cache分成大小相同的组,主存中的某一块可以装入对应的某个组内任意一个块内,即组间直接映像,组内全连接映像。注意,当下工业上采用的直接映像是顺序的。
Cache地址由组号、块号、块内地址组成;主存地址由区号、块号、块内地址组成。主存地址的块号位数等于Cache地址的组号位数,因为组间采取直接映像,即$J(Cache块号)=I(主存块号)\mod Q(Cache组数)$,这样能把主存地址均匀分配到Cache的组中。
替换算法
- 随机算法
- FIFO先进先出:易实现、开销小,但可能会替换掉一些经常使用的程序块(如循环程序)
- LRU近期最少使用:最好、最复杂
替换策略
- 写直达法:写操作必须同时写入Cache和主存。
- 写回法:用标记位标注Cache中的内容是否发生改变,在某个块即将被替换时,检查标志位,如果发现被修改过,则将其写回主存再替换它。
速度快但是因为没有随时同步数据,可能出错(为啥会出错??)
虚拟储存器
和cache很像。
页式
虚地址:虚页号+页内地址
红框处完成一次拼接。
然后将获取到的实页号拼接到业内地址上,就获得了实际地址。