术语
- 记忆单元(存储基元/存储元/位元)(Cell):具有两种稳态的能够表示二进制数码0和1的物理器件
- 存储单元/编址单位(Addressing Unit):具有相同地址的位构成一个存储单元,也称为一个编址单位
- 存储体/存储矩阵/存储阵列(Bank):所有存储单元构成一个存储阵列
- 编址方式(Addressing Mode):ISA决定的,有字节编址、按字编址
- 存储器地址寄存器(Memory Address Register – MAR):用于存放主存单元地址的寄存器
- 存储器数据寄存器(Memory Data Register – MDR):用于存放主存单元中的数据的寄存器
存储器分类
- 按照工作性质/存取方式分类:
- 随机存取存储器(Random Access Memory – RAM):每个单元读写时间一样,且与各单元所在位置无关。如内存
- 是因为RAM是对地址译码的,不同地址的译码时间相同、选中单元的时间相同、读出来的时间相同
- 但由于现在的DRAM芯片都采用行缓冲row buffer,所以如果要读写的数据在row buffer里面,时间就会更快。所以这里每个单元读写时间一样指的是不考虑row buffer的情况下
- 顺序存取存储器(Sequential Access Memory – SAM):数据按顺序从存储载体的始端读出或写入,因而存取时间的长短与信息所在位置有关,如磁带
- 直接存取存储器(Direct Access Memory – DAM):直接定位到读写数据块,在读写数据块时按顺序进行。如磁盘通过移动磁头来定位数据
- 相联存储器(Associate Memory – AM, Content Addressed Memory – CAM):前三种都要根据给定的地址信息去读写数据,而相联存储器是根据内容去读写数据的,即,按内容检索到存储位置进行读写。如快表
- 随机存取存储器(Random Access Memory – RAM):每个单元读写时间一样,且与各单元所在位置无关。如内存
- 按存储介质分类:
- 半导体存储器:双极型、静态MOS型、动态MOS型
- 磁表面存储器:磁盘(Disk)、磁带(Tape)
- 光存储器:CD、CD-ROM、DVD
- 按信息的可更改性分类
- 读写存储器(Read/Write Memory):可读可写
- 只读存储器(Read Only Memory):只能读不能写
- 按断电后信息的可保存性分类
- 非易失(不挥发)性存储器(Nonvolatile Memory):信息可一直保留,不需电源维持。如ROM、磁表面存储器、光存储器(这种都是卸下来装到口袋里,不加电信息也不会丢)
- 易失(挥发)性存储器(Volatile Memory):电源关闭时信息自动丢失。如RAM、Cache等(目前的内存就是易失性)
- 按功能/容量/速度/所在位置分类
- 寄存器(Register)
- 封装在CPU内,用于存放当前正在执行的指令和使用的数据
- 用触发器实现,速度快、容量小(几~几十个)
- 高速缓存(Cache)
- 位于CPU内部或附近(早期在附近,现在已经在CPU里面了),用来存放当前要执行的局部程序段和数据
- 用SRAM实现,速度可与CPU匹配,容量小(几MB)
- 内存储器MM(Main Memory)
- 位于CPU之外,用来存放已被启动的程序及所用的数据
- 用DRAM实现,速度较快、容量较大(几GB)
- 外存储器AM(Auxiliary Storage)
- 位于主机之外,用来存放咱不运行的程序、数据或存档文件
- 用磁表面或光存储器实现,容量大、速度慢
- 寄存器(Register)
主存
- 主存的基本结构:
如下图,8个cell(记忆单元)构成一个存储单元(一个存储单元中的8个cell都是同一个地址),若干存储单元构成一个存储阵列(bank);
下图中数据线64位、一个存储单元有8位,则是8个地址同时读(且只能是0~7同时读、8~15同时读,不可能是1~8同时读);
控制线这边的读信号送过来,就会控制某些单元把数据一起读到数据线上,写信号送过来,就会到数据线上取数据过来写到某些单元中;
地址译码器连着的是“字线”,每次选中一个存储单元。n位地址线对应的最大存储单元个数是 2 n 2^n 2n
- 主存的性能指标
- 按字节连续编址,每个存储单元为1个字节(8个二进制位)
- 存储容量:所包含的存储单元的总数(单位:MB/GB)
- 存取时间
T
A
T_A
TA(access time):CPU把地址、命令送出去,存储器就会根据地址和命令进行读或写。
- 读取时间:存储器从指定单元把数据读出来送到数据总线,然后数据总线送到MDR。读取时间就是从CPU送地址命令开始,直到存储器将数据送到数据总线的时间
- 写入时间:CPU把数据、地址、写命令送出去,存储器根据这些来将数据写入单元的时间
- 存储周期
T
M
C
T_{MC}
TMC(memory cycle time):连续两次访问存储器所需的最小时间间隔,它等于存取时间+下一次存取开始前所要求的附加时间(后者即“预充电”)。即
T
M
C
>
T
A
T_{MC}>T_A
TMC>TA
- 因为存储器由于读出放大器、驱动电路等都有一段稳定恢复时间,所以读出后不能立即进行下一次访问
- 时间、存储容量(或带宽)的单位
- 内存储器的分类及应用:
内存由半导体存储器芯片组成,芯片有多种类型:
- SRAM使用6个晶体管构成一个cell,其数据保存在一对正负反馈门电路中,只需供电,数据就一直保持。不是破坏性读出,也无需重写,即无需刷新
- DRAM电路元件少、功耗小、集成度高,用于构建主存储器。缺点是:速度慢、是破坏性读出(需读后再生)、需定时刷新(0就放电、1就充电,因为即使不读也会慢慢漏电)
- 刷新:DRAM的一个重要特点是,数据以电荷的形式保存在电容中,电容的放电使得电荷通常只能维持几十个毫秒左右,相当于1M个时钟周期左右,因此要定期进行刷新(读出后重新写回),按行进行(内存条中所有芯片中的同一行一起进行),刷新操作所需时间通常只占1%~2%左右
- 半导体RAM的组织
记忆单元(cell)-> 存储器芯片(chip)-> 内存条(存储器模块)- 记忆单元cell的组织:每个cell都会被一条字线+一条位线所指定(SRAM是两根位线指定一个cell)
- 把若干cell串起来:
- 字片式:SRAM、ROM
- 位片式:DRAM
这里的“行”只是二维排列中的行,并不是什么专门术语
如下图是典型的16M位DRAM( 4 M × 4 = 2 11 × 2 11 × 4 4M\times 4=2^{11}\times 2^{11}\times 4 4M×4=211×211×4):
- 地址线:11根线分时复用,由RAS和CAS提供控制时序。如下图是芯片的样子,芯片上有很多引脚,A开头的引脚称为地址引脚,专门把地址通过这些引脚传到芯片里。这里4MB的存储阵列只需要A0~A10这11个地址引脚即可
- 需要4个位平面:对相同行、列交叉点的4位一起读/写。如上图的D1、D2、D3、D4是具有相同的地址的,即4位一编址
- 各片同时按“行”刷新:所以上面的例子中,一共要刷新2048次。第一行刷新完成后,隔一段时间刷新第二行。所以图中行译码器左边有一个多路选择器,选择有二:如果是刷新的话就把刷新计数器里的值(11位)作为行地址选中一行进行刷新;如果是读写的话就把行地址缓冲器里的值(11位)拿过来作为读写的行地址
- 每出现新一代DRAM芯片,容量至少提高到4倍:每出现新一代DRAM芯片,则至少要增加一根地址线,所以行地址和列地址各增加一位,导致行数和列数各增加一倍。因而容量至少提高到4倍
- 地址线:11根线分时复用,由RAS和CAS提供控制时序。如下图是芯片的样子,芯片上有很多引脚,A开头的引脚称为地址引脚,专门把地址通过这些引脚传到芯片里。这里4MB的存储阵列只需要A0~A10这11个地址引脚即可
- 字片式:SRAM、ROM
- 记忆单元cell的组织:每个cell都会被一条字线+一条位线所指定(SRAM是两根位线指定一个cell)
- 内存条的组织
如下图是一个128bit宽度的memory bus,插槽上插了一个内存条,该内存条上有16个芯片。每个芯片是512行*512列(地址引脚9个即可),每个芯片有8个位平面( 512 × 512 × 8 = 256 K × 8 = 2 M b 512\times 512\times 8=256K\times 8=2Mb 512×512×8=256K×8=2Mb),这8个位平面的同一行列交叉点上的位一起读出来,即一个芯片一次读8位出来。所以这16个芯片同时可以读出 16 × 8 = 128 16\times 8=128 16×8=128位。当CPU访问一块连续区域(即行地址相同)时,可直接从行缓冲读取,它用SRAM实现,速度极快
上图是SPARCstation的组织。现在我们主流用的PC机上的memory bus(的数据线)是64bit宽度,即每次读64位(在存控里的数据宽度是64位)。
假设下面是一个128MB的内存条,该内存条里有8个芯片(每个芯片是 128 8 = 16 M B \frac{128}{8}=16MB 8128=16MB),一个芯片有8个位平面,即一个芯片是 2 12 × 2 12 × 8 2^{12}\times 2^{12}\times 8 212×212×8。小粉方块表示某一行某一列的交叉点(包含8个位平面)
CPU送给存控的32位地址,存控要将其中的27位(128MB,交叉编址时:最高12位是行地址,中间12位是列地址,后面的3位是指定8个芯片中的哪个芯片)送到内存条里,每个芯片的高24位地址都是一样的,只有低3位不同,是用来选片的。
片内的地址不连续(交叉编址),可以保证所有的芯片同时读出
这里地址虽然是27位,但是低三位的片选位没有用,这是因为我们到内存去取数据的时候取的是一个block,而一个block的大小远远大于64位(是64位的倍数),所以这64位总是同时读写的。
这里的行缓冲是连续的,一个行缓冲里共有 8 × 4096 = 32768 8\times 4096=32768 8×4096=32768字节
- 内存条与CPU的连接
如下图是三通道的,即三个内存条通过三个不同的存储器总线,同时传输 3 × 64 b = 192 b 3\times 64b=192b 3×64b=192b。
因为我们现在在CPU和主存之间的数据搬家,是按block搬的,所以这种架构非常有用
上图中的内存条的插槽长下面这个样子:插的时候要将同色的三个内存插槽插上内存条,系统就会自动识别进入三通道模式
存控给出的地址包括:Channel(如三通道中的通道号)、Rank(SIMM就是一面共一个rank,DIMM就是两面共两个rank)、Bank(就是一个DRAM芯片:行 × \times ×列 × \times ×位平面)、Row、Column
过程梳理如下图所示:CPU会送地址、数据、控制信号给存控(Memory Controller),存控会把地址分解成通道号、rank号、行地址、列地址、bank号。下图的芯片是4行$\times$4列,因此该芯片的地址引脚是2根。Row buffer里是4列(一行)。下图是一个芯片读取第二行第一列的数据的过程,每个芯片都是这样,那么8个芯片就会同时读取64位数据:
芯片规格
- 行=列是最好的:最少的地址引脚
- 不能相等时,行数要少于列数(扁平型):这样可以减少刷新次数