注意:
- 主存-辅存:解决主存容量不够的问题。
- cache-主存:解决主存与CPU速度不匹配的问题。
- cache和主存都可以直接与CPU交换数据,而辅存必须先加载到主存后才能被CPU访问。
- cache-主存是由硬件自动完成,所以其数据交换对任何程序员都是透明的。
主存-辅存是由硬件+操作系统完成,所以其数据交换并不是对任何程序员都透明。
* 按存储介质分类
1. 半导体存储器(主存、cache)
2. 磁表面存储器(磁盘、磁带)
3. 光存储器(光盘)
* 按存取方式分
1. 按地址寻址
1. 随机存储器(RAM): 读取任何一个存储单元所花时间相同,与存储单元所在物理位置无关。比如,内存
1. 动态随机存储器(DRAM):用做主存
2. 静态随机存储器(SRAM):用做Cache
* DRAM和SRAM的具体信息在下面会介绍
* 特别的,ROM也能随机存储
2. 顺序存储器(SAM): 读取一个存储单元所需时间取决于其物理位置。比如,磁带
3. 直接存储器(DAM):既有随机存储,又有顺序存储的特性。先直接选取信息所在区,然后顺序存取。比如,磁盘。
2. 按地址或者内容寻址
1. 相联存储器:可以按照内容检索到存储位置进行读写,比如,快表
* 按信息的可更改性分
1. 只读存储器(ROM): 只能读,不能写。比如BIOS就存放在ROM中
2. 读写存储器:即可读,又可写。
* 按信息的可保存性分
1. 断电后
1. 易失性存储器:信息丢失。
2. 非易失性存储器:信息不丢失。
2. 读取信息后
1. 原存储信息被破坏,需要重写。比如DRAM芯片
2. 原存储信息不被破坏,比如SRAM芯片、磁盘、光盘
* 性能指标
1. 存储容量
2. 每位价格:注意是每bit
3. 存储速度 = 存储字长/存储周期
注意:
- 这3个指标相互制约,目标是高容量、低价格、高速度
- 存取时间不等于存取周期,前者小于后者。
存取时间:从存储器读出或者写入一次信息所需要的平均时间。
存取周期:连续两次访问存储器之间所必须的最短时间间隔。- DRAM需要进行“刷新"操作,所以其恢复时间会比较长。
- 恢复时间内CPU不可以对该存储体进行访问【如果有多个存储器】,但是能对其他存储器进行访问。
DRAM半导体常用来做主存。主存中的存储元是半导体元件,即给高电压时器件是通的,给低电压时,器件是阻塞的。
而存储元由MOS管 和 电容
两个元器件组成,其实现读写的原理如下:
存储器的内部电路如下:
对存储矩阵进行优化,使用行列地址,加快数据的访问(行列地址都是原来的一半):
注意:DRAM会使用行列地址复用技术,所以DRAM的地址线是以前地址线的一半,即
n/2
。SRAM还是n
条地址线。如果采用了地址复用技术,则会增加行通线和列通线(片选线用行通线代替)。【做题时,默认DRAM使用地址复用,而SRAM没有,这是很多考生忽略的地方】
注意:
- 一般容易出芯片有多少个引脚的题目。即
地址线数 + 数据线数 + 1根片选 + 读写线数
, 一般读写控制线题目会说是1根还是2根。- 译码驱动电路是用来将信号放大的,防止信号衰落。
现代计算机按字节编址,但是通常都支持按字、半字、按字节寻址,但是最终都会转为按字节编址。如果一台计算机的存储字长为32位,则一个字 = 32bit
, 半字 = 16bit
。则访问字转为字节时,是对应二进制数左移2位(32bit/8=2^2, 是2次方所以左移两位)
;同理半字转为字节是左移1位。下面是该例子的示意图:
DRAM
指动态随机存储器,使用栅极电容
存储信息。
SRAM
指静态随机存储器,使用双稳态触发器
存储信息。
两者的区别是存储元不一样。
上面我们介绍了DRAM的组成,接下来,我们对比着介绍一下SRAM
的组成:
注意:
- 破坏性读出:由于DRAM使用的是电容,读取信息后,电容中的电荷被释放了,如果是1会变成0,会造成破坏;而双稳态触发器不会。
- 读取后需要重写:由于DRAM是破坏性读出,所以为保证不被破坏需要重写。
- 运行速度:由于DRAM读后需要重写,比SRAM多一步操作,所以更慢。
- 集成度:DRAM比较慢,需要集成。
- 发热量:SRAM有六个触发器,所以功耗大。
- 存储成本:SRAM更快,所以更贵。
- 刷新:DRAM是电容,电荷会慢慢消失,所以需要刷新,保持电容电荷。而其刷新分为三种:
1. 分散刷新
2. 集中刷新
3. 异步刷新
* 注意:刷新是由存储器独立完成的,并不需要CPU控制。- 送行列地址:由于DRAM会使用地址复用的技术,地址线引脚数目减半,所以会先传行地址,再传列地址,需要两次。
注意:DRAM的地址引脚数目会减半,在做引脚体数目的题时特别注意。
注意:
- 分散刷新,机器的存取周期中的存取时间用来读写,恢复时间用来刷新,因此不存在死时间。
- 集中刷新和异步刷新都存在死时间,异步刷新缩短了死时间。
- 在工作中DRAM的内容会产生变化。错误,可以通过刷新机制解决。
注意:
- 可能你会疑惑,
ROM
是只读存储器,为什么EPROM
、Flas Memory
、SSD
还可以写?传统的ROM
确实是只读,但是由于历史的发展,使得很多为归类为ROM
的芯片也能写。- 闪存的写比读慢,因为它需要先擦除数据。
- EPROM虽然可以读写数据,但是改写较为繁琐,写入时间很长,且速度慢,所以不能作为随机存储器。
我们知道,电脑在断点后主存和cache的数据都会丢失,那么开机时,加载操作系统的指令从哪里来?
电脑主板上有一个叫做BIOS
的ROM
芯片,专门用来做这个事情的。
虽然,BIOS
和主存的DRAM
在主板的不同位置,但是我们认为在逻辑上主存 = DRAM + ROM
,且两者统一编址。在做题时特别注意。
现在计算机中,MDR和MAR通常放在CPU中,做题时放在主存和CPU都可以算对。
如果数据总线的位数大于单块存储芯片的位数【注意是位数】,则需要进行位扩展,从而充分利用总线位数,提高系统效率。
位扩展的核心:多块存储芯片共享地址、片选信号和读写信号。
线选法的字扩展核心:芯片共享地址信息和读写信息,芯片的CS分别由CPU的一位地址位控制。
缺点:CPU连接芯片的CS的地址线不能同时为0或者1。
线选法的字扩展核心:芯片共享地址信息和读写信息,CPU用多位地址线经过一个译码器与芯片的CS相连。
优点:解决了线选法的缺点
同时出现位不足,和地址过多的现象,所以同时采用位扩展和字扩展,即字位扩展:
双端口RAM和多模块存储器就是来解决以上两个问题的。
双通道RAM是指同一个存储器有左右两个独立编址,分别具有两组相互独立的地址线、数据线和读写控制线,允许两个独立的控制器同时异步的访问存储单元。
高位交叉编址,相对于只是对存储体进行了扩容,而低位交叉编址在扩容的同时也提高了速度,理想为T/r
倍。
高位m体交叉编址和低位m体交叉编址都是每次读取m个模块,时间上并行。
单体多字存储体使得一次能读取m个字【若存储体为m】,速度的提示和低位交叉编址的多体并行存储体差不多,都是T/r
。
但是,单体多字存储体不够灵活,比如上图,访问这四个连续的字,CPU需要读取两次,而低位交叉比较灵活,可以克服这个缺点。
我们知道CPU
工作的速度原高于其访问主存的速度,这就拉低了CPU
的工作效率,所以我们在CPU
与主存间设置一个更加高速的cache
,即cache-主存
结构,用来解决CPU
与主存速度不匹配的问题, 即加速CPU对主存的访存操作。
cache
由SRAM(静态随机存储器)
组成,容量和体积都比主存小,所以现在计算机中,cache
通常放在CPU
内部。
基于程序局部性原理,可以把CPU
目前访问的地址“周围”的部分数据【即主存块】复制一份到cache
中。
那么上述的周围具体如何定义?
通常会将cache
和主存以同样大小进行分块,比如1KB
为一块, 那么cache和主存之间以块为单位交换数据,一旦主存中的某个信息被CPU
之间访问,则立即将该信息所在块复制一份到cache中。
注意:通常主存的“块”又叫“页/页面/页框”,cache的块又叫“行”
如果主存中某块被复制到cache
的块中,那么CPU
访问cache
时,如何知道cache
的哪个快对应着主存的哪个块?
这就需要我们在将主存块复制到cache
时,要标记主存块的信息,即标记位。然后再用1位
来表示有效位,如下图所示:
具体标记位的位数与cache与主存的映射方式有关,后面会介绍。
注意:cache的平均访问时间有两种公式,注意看清题目给的是同时还是非同时。
cache与主存以块为单位进行数据交换,那么主存的块映射到cache的哪一个块?也就是CPU要进行访存操作时,如果知道Cache中是否有相应的信息?主要有以下三种方式:
cache块号 = 主存块号 % cache块总数
组号 = 主存块号 % 分组数
。注意:全相联映射中,cache的标记信息为对应主存块号。
CPU
访问想访问主存信息时:
CPU
会遍历所有cache
块的标记位,看是否有相应的主存块号cache
命中。优点:cache空间利用充分,命中率高
缺点:查找标记最慢。
注意:当cache的块数为2^n时,可以优化cache的标记位数。
CPU
访问想访问主存信息时(拿上图举例):
cache
块。cache
标记匹配且有效位=1,则cache
命中。优点:查找标记快
缺点:cache空间利用率低,命中率低
注意:和直接映射类似,当cache的组数为2^n时,也可以优化cache的标记位数。
CPU
访问想访问主存信息时(拿上图举例):
cache
组。组内某个标记匹配且有效位=1,则
cache`命中。组相联映射是全相联映射与直接映射的结合,所以其综合效果最好。
Cache
很小,主存很大。如果Cache
满了怎么办?这就需要相应的块被替换,具体有RAND
、FIFO
、LRU
、LFU
。
注意:由于直接映射的位置是固定的,所以直接映射不需要考虑替换算法,只有全相联映射和组相联映射才考虑替换算法【在cache块满的情况下才考虑】。
注意:
- 以上都可能发生抖动现象:频繁的换入换出现象。
- 只有
LRU
用到了程序的局部性原理,其他的都没有,所以其效果最好。- 若Cache块的总数为2^n,则
LRU
的计算器的位数 = n
CPU修改了cache中数据副本,如何确保主存中数据母本的一致性?这就需要用到写策略:写命中与写不命中。
写命中指:CPU对某个地址要进行写,且该地址的数据已经被复制到cache中。
写回法:当CPU对cache写命中时,只修改cache的内容,而不修改内存的内容,只有当此块被换出的时候才写回主存。
优点:减少了CPU访问主存的次数
缺点:存在数据不一致的问题
特别需要注意的是cache还需要增加一个标记位,即脏位,为1表示要写回。
全写法:当CPU对cache写命中时,将数据同时写入cache和主存,通常使用写缓冲。
缺点:增加了CPU访问主存的次数
优点:能保证数据的一致性
如果使用写缓冲,则CPU是将数据直接写入cache和写缓冲区,在CPU做其他事情的时候,由一个专门的电路将写缓冲中的数据写入到主存中。
使用写缓冲有一个缺点,就是在CPU频繁写的时候,回使得写缓冲饱和,使得CPU阻塞,不得不停下手中的事情,来立即写回数据。
写命中指:CPU对某个地址要进行写,而该地址的数据没有被复制到cache中。
当CPU对Cache写不命中时只写入主存,把主存中的块调入Cache,在Cache中修改。通常搭配写回法使用。
当CPU对Cache写不命中时只写入主存,不将主存中的数据调入Cache。通常搭配全写法使用。
注意:非写分配法,只有“读”未命中才调入Cache
页式存储:一个进程在逻辑上被分为若干个大小相等的“页面”,“页面”大小与主存块的大小相同。每个页面可以离散的放入不同的主存块中。
我们编写的程序通过翻译程序生成的一系列指令,其中指令的地址码使用的是逻辑地址。【因为每次将程序加载到主存的位置是不一样的,我们不可能提前预知进程被放在哪里,所以只能是逻辑地址】
这就导致CPU执行的机器指令中的地址码使用的是逻辑地址
,因此需要通过页表
将逻辑地址转为物理地址。【页表里面记录了每个逻辑页面放在哪个主存块中】
注意:
- 逻辑地址(虚地址):指程序员视角看到的地址。
- 物理地址(实地址):实际在主存中的位置。
如果我们想加快地址转换的速度,该怎么做?结合CPU利用Cache加快访问主存速度,不难想到,如果我们可以弄一个访问速度更快的快表
,在进行地址转换时,先到快表中查相应的主存块号,如果有则直接地址转换;如果没有,则到页表里面去查,然后将相应的信息复制一份到快表中。
注意:访问快表比慢表(即页表)更快的原因:
- 快表是放在一个SRAM存储器中
- 快表是一种“相联寄存器”,可以按内容寻址,所以像这种根据内容逻辑号查找对应的主存号会更快。
主存和辅存一起构成虚拟存储器,虚拟存储器拥有主存的速度和辅存的容量。
页式虚拟存储器:我们可以把程序拆分成一个个与主存块大小相同的页面,然后以页为单位,将部分页面先调入主存。
虚拟地址 = 页号 +页内地址
页式虚拟存储器:按照功能模块将程序分成多个段,然后以段为单位,将部分段先调入主存。
虚拟地址 = 段号 + 段内地址
段页式虚拟存储器:按照功能模块将程序分成多个段,再将段分成一个个与主存块大小相等的页面,然后以页为单位,将部分页面先调入主存。
虚拟地址 = 段号 + 段内页号 + 页内地址