1. 随机访问存储器(RAM)
1. 静态RAM(SRAM)
常用来做cache。
SRAM存储器单元只要有电,就会永远保持它的值。
2. 动态RAM(DRAM)
常用来做内存。
DRAM每个位存储为电容充电。因为有很多原因会导致漏电,所以内存系统必须周期性地通过读出数据,重写来刷新内存的每一位。
3. 传统DRAM
下图是一个16*8的DRAM芯片。
16是超单元的个数,8表示每个超单元可以存储8bit的数据
整个DRAM芯片通过内存引脚和数据引脚与内存控制器相连
当我们需要从DRAM芯片中读出图中所示的超单元(2,1)
-
首先内存控制器发送行地址2到DRAM芯片,DRAM所作出的响应是将整个第二行的内容全部复制到内部的行缓冲区中。
-
然后内存控制器发送列地址1到DRAM芯片,DRAM从这个行缓冲区中复制出对应的数据位,并发送到内存控制器。
-
为什么分两次发送:
DRAM是一个二维的阵列,而不是一个线性数组。
若是一个0-15的数组,那么需要四个地址引脚。但用4*4的阵列分两次发送就只需要两个地址引脚
4. 内存模块
下图是一个用DRAM芯片封装成的内存模块,一共有8个DRAM芯片
每个芯片的大小为8M*8,也就是8MB
因此整个模块的大小为64
每个超单元存储8bit的数据,对于8字节的数据需要8个超单元来存储。
这8个超单元分布在八个芯片上,具有相同的i,j(行、列地址)
DRAM0存储最低8位,DRAM7存储最高八位
5. 访问主存
数据流通过总线在处理器和DRAM主存之间来来回回。
cpu和主存之间的数据传送称为总线事务。
- 读事务:从主存传送数据到cpu
- 写事务:从cpu传送数据到主存
当cpu执行一个如下操作
movq A , %rax //地址A的内容加载到寄存器rax中
- cpu将地址A放到系统总线上,I/O桥将系统总线的电子信号翻译成内存总线的电子信号
- 主存感觉到内存总线上的地址信号,从内存总线读地址,从DRAM取出数据,并将数据写到内存总线上
- I/O桥将内存总线上的电子信号转化为系统总线。cpu感觉到系统总线上的信号,从总线上读数据,并将数据复制到寄存器
2. 磁盘存储
无论是SRAM还是DRAM,都需要有电的情况下才能保存数据。
磁盘是在断电下也能保存数据的存储介质
目前市面上主流的磁盘有两类:机械磁盘和固态硬盘
1. 磁盘构造
盘片表面有磁性的记录材料,主轴带动盘片高速旋转。如图有三个盘片,一共六个表面可以存储数据。
盘片的表面被划分成一圈圈磁道(左图),像同心圆一样。
每个磁道被划分成多个扇区(右图)。扇区之间有一些间隙,是用来存放扇区标识信息,不能用来存储数据
磁盘通过读写头来读写存在盘片表面的数据。
盘片每个表面都对应着一个独立的读写头,所有的读写头连接在一个传送臂上,通过传送臂的移动读取数据。这种机械运动是寻道
2. 磁盘操作
磁盘以扇区大小的块来读写数据。对扇区的访问时间有三个主要部分
-
寻道时间
当目标扇区所处的磁道与读写头当前所处的磁道不同时,传动臂需要将读写头移动到目标扇区所处的磁道。传送臂移动的时间就是寻道时间 -
旋转时间
当读写头位于目标扇区所在的磁道,驱动器等待目标扇区的第一个位旋转到读写头下。主要取决于读写头到达目标扇区时的位置和磁盘的旋转速度
-
传送时间
当目标扇区的第一个位位于读写头下,驱动器就可以开始读或者写该扇区的内容。假如每条磁道的平均扇区有400个,转一圈需要8ms,所以转过一个扇区需要0.02ms,传送时间为0.02ms
3. 逻辑磁盘块
从操作系统角度看,每个磁盘抽象成一个个逻辑块序列,每个逻辑块和一个扇区的容量一致,都是512个字节。
磁盘内部有一个硬件/固件设备:磁盘控制器。维护逻辑块号与实际磁盘扇区的映射关系
当操作系统执行读一个磁盘扇区数据到主存。
- 操作系统发送一条命令到磁盘控制器,让它读某个逻辑块号
- 控制器上的固件执行一个快速表查找,将一个逻辑块号翻译成一个(盘面,磁道,扇区)三元组
- 控制器上的硬件解释这个三元组,并将读到的数据写入控制器上的缓冲区中,然后复制到主存。
3. 固态硬盘
闪存翻译层扮演着和磁盘控制块相同的角色,将对逻辑块的请求翻译成对底层物理设备的访问
4. 局部性
-
有良好的时间局部性的程序中
被引用过一次的内存位置很可能在不远的将来再次被多次引用 -
有良好的空间局部性的程序中
如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置
在下面这个程序中
sum在每次循环迭代中都被引用一次,具有良好的时间局部性
数组是行优先存储的,先循环行再循环列有良好的空间局部性
int sum = 0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
sum+=a[i][j]
}
5. 存储器层次结构
存储器层次结构示意图:
存储器层次结构的中心思想是:
对于每个k,位于k层的更快更小的存储设备作为位于k+1层的更大更慢的存储设备的缓存。
第k层的缓存包含第k+1层块的一个子集的副本。
数据总是以块大小为传送单元在第k层和第k+1层来回复制的
缓存命中
当程序需要第k+1层的某个数据对象d时,它首先在第k层找d。
如果d刚好在第k层,就是缓存命中
缓存不命中
当第k层中没有缓存数据对象d,也就是缓存不命中
当缓存不命中,第k层的缓存从第k+1层缓存中取出包含d的那个块。如果第k层缓存已满,可能会覆盖现存的一个块
标签:缓存,读写,存储器,扇区,DRAM,层次结构,内存,第六章,磁盘 From: https://www.cnblogs.com/algoshimo/p/18015300