随机访问存储器 Random-Access Memory,RAM
-
静态RAM(SRAM)
速度比动态的RAM要快,但是也贵得多,通常作为高速缓存存储器。
电路类似于下面的图,只有两个状态是稳定的,其他状态都是不稳定的,从不稳定状态开始,电路会迅速地转移到两个稳定状态的其中一个。每位用六晶体管来实现。
SRAM只要有电,就会永远保持它的值,有干扰的电压也不会改变值,干扰消除时,电路就会恢复稳定。
动态RAM(DRAM)
DRAM将每个位存储为对一个电容的充电,这个电容非常小,对干扰非常敏感,当电容的电压被扰乱之后,它就无法恢复了。
很多原因会导致漏电,所以内存系统必须周期性地通过读出,然后重写刷新内存每一位。
每位一个晶体管。-
传统DRAM
为了方便寻址,将DRAM芯片中的单元(位)划分为d个超单元,每个超单元都由w个DRAM单元组成。超单元被组织成一个r行c列的长方形阵列,rc = 。每个单元有形如(i,j)的二维地址。
取值的时候先传送i,再传送j,再通过(i,j)取值。这样可以减少引脚的数量,但是需要加倍的传送时间。
内部有一个行缓冲区,比如读取(2,1)的时候,会先将2读入内部行缓冲区,再将列1读出发给内存控制器。
-
内存模块
将多个DRAM组合成一个内存模块,例如将8个8Mx8的DRAM组成64M的内存模块,8个芯片编号0-7,每个超单元存储主存的一个字节,一个地址(i,j)表示的是64位。内部将64位组合成8字节返回给内存控制器。
非易失性存储器
断电后仍然可以保存数据的存储器。
ROM中有的类型既可以读,也可以写,但是被统称为只读存储器(Read-Only Memory)。
- PROM(Programmable ROM)只能被编程一次。
- 可擦写可编程ROM(Erasable Programmable ROM,EPROM)可以写入与擦除次数达1000次。
- 电子可擦除PROM(Electrically Erasable PROM,EEPROM),可以达10^5次编程次数。
- 闪存(flash memory)是基于EEPROM的存储器
存储在ROM中的程序称为固件(firmware),当计算机系统通电后机会运行存储器在ROM中的固件。
-
访问主存
数据流通过称为总线(bus)的电路在CPU和DRAM主存之间来来回回。每次传送数据的一系列步骤称为总线事务(bus transaction)。读事务从主存传送数据到CPU。写事务从CPU传送数据到主存。
I/O桥包括内存控制器。
movq A,%rax的具体过程:
-
旋转磁盘
每个盘片有两面,有磁性记录材料。每个同心圆都是一个磁道(track),每个磁道被划分为一组扇区(sector)。多个半径相等的磁道被称为一个柱面(cylinder)。
磁盘为了对操作系统隐藏复杂性,将磁盘构造呈现为一个简单的视图,一个B个扇区大小的逻辑块的序列,序号为0,1,...,B-1。磁盘中有一个固件设备,称为磁盘控制器,扶着维护逻辑块号与实际磁盘扇区之间的映射关系,会将逻辑块号翻译成一个(盘面,磁道,扇区)三元组。
局部性(locality)
时间局部性(temporal locality):被引用过一次的内存位置很可能在不远的将来再被多次引用。
空间局部性(spatial locality):如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附件的一个内存位置。
此种程序具有较好的局部性:sum具有时间局部性,a数组具有空间局部性。但是如果将a[i][j]变为 a[j][i]那么空间局部性很可能会降低。
存储器层次结构
- 缓存
高速缓存(cache)是一个小而快速的存储设备,它作为存储在更大、也更慢的设备中的数据对象的缓冲区域。使用高速缓存的过程称为缓存(caching)。
- 缓存命中:在第k层的某些块中找到了要访问的第k+1层的数据对象d,就是缓存命中。
- 缓存不命中:如果第k层中没有数据对象d,就是缓存不命中。此时要从k+1层中取出包含d的那个块,放到第k层中缓存起来,如果缓存已满,则需要一定的替换策略(replacement policy)进行覆盖,例如LRU,最近最少被使用。
- 缓存不命中的种类
冲突不命中:一定的放置策略导致无法命中。
容量不命中:缓存太小。
-
高速缓存存储器
有关写的问题
当更新了缓存的字w,如何写回低一层的副本中呢?直写(write-through),立即将w的高速缓存块写回到第一层中。
写回(write-back),当替换算法要替换这个更新过的块时,才写到第一层中。必须维护一个额外的修改位(dirty bit),表明是否被修改过。
-
真实高速缓存层次结构
真实的高速缓存可以分为i-cache(只保存指令),d-cache(只保存数据),统一高速缓存(都可以保存)