存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。
CPU寄存器、高速缓存存储器、主存储器、磁盘。
信息通过引脚流入流出芯片,每个引脚携带一个1位的信号。
这个电路可以一次传入或传出w位。
【具体过程范例】
目的:读取(i, j)处的内容
步骤:
1.存储控制器发送行地址i
2.DRAM响应,将行i的整个内容拷贝到一个内部行缓冲区
3.存储控制器发送列地址j
4.DRAM响应,从行缓存区中拷贝出超单元(i, j)中的内容,并把它们发送到存储控制器。
DRAM芯片包装在存储器模块中,是插在主板的扩展槽上的。
读一个存储器模块的内容:
通过将多个存储器模块连接到存储控制器,能够聚合主存,当控制器收到一个地址A时,控制器选择包含A的模块k,将A转换为它的(i, j)的模式,并将(i, j)发送到模块k。
习题6.1总结:就是使布局最大可能接近正方形。注意组织形式为dxw,并且有关系rc=d。
视频-VRAM:用在图形系统的帧缓存区中,思想类似FPM DRAM,区别:
1.VRAM的输出是通过依次对内部缓冲区的整个内容进行移位得到的
2.VRAM允许对存储器并行的读和写。
RAM断电丢失数据,是易失的;
ROM是非易失的,统称为只读存储器
EEPROM,电子可擦除PROM,能够被编程的次数的数量级在10的五次方。
基于EEPROM,为大量的电子设备提供快速而持久的非易失性存储。
存在于:数码相机、手机、音乐播放器、PDA、笔记本、台式机、服务器计算机系统
存储在ROM设备中的程序通常被称为固件,当一个计算机系统通电以后,他会运行存储在ROM中的固件。
总线是一组并行的导线,能携带地址、数据和控制信号。
总线分类:
I/O桥将系统总线的电子信号翻译成存储器总线的电子信号,也将系统总线和存储器总线连接到I/O总线。
提高面密度即可提高容量。
将柱面的集合分割成不相交的子集合(记录区),每个区包含一组连续的柱面;
一个区中的每个柱面的每条磁道都有相同数量的扇区,这个扇区的数量由该区中最里面的磁道所能包含的扇区数确定
注意:软盘仍是老式方法,每条磁道的扇区数是常数
磁盘以扇区大小的块来读写数据。
访问时间的分类:
——移动传动臂所用的时间。
依赖于读/写头以前的位置和传动臂在盘面上移动的速度。
通常为3-9ms,最大可达20ms。
——驱动器等待目标扇区的第一个位旋转到读/写头下
依赖于盘面位置和旋转速度。
最大旋转延迟=1/RPM X 60secs/1min (s)
平均旋转时间是最大值的一半。
依赖于旋转速度和每条磁道的扇区数目
平均传送时间= 1/RPM x 1/(平均扇区数/磁道) x 60s/1min
根据课本393页的示例可以得出结论:
1.主要时间是寻道时间和旋转延迟。
2.将寻道时间x2是估计磁盘访问时间的简单而合理的方法。
盘面,磁道,扇区,这个三元组唯一的标识了对应的物理扇区。
类比:内存可以看成字节数组、磁盘可以看成块数组。
I/O总线连接了CPU,主存和I/O设备。
主机总线适配器
DMA:直接存储器访问
——设备可以自己执行读或者写总线事务,而不需要CPU干涉的过程。
具体过程见课本395页图。
固态硬盘是一种基于闪存的存储技术【区别于旋转磁盘:固态磁盘没有移动的部分。
一个SSD包由一个或多个闪存芯片和闪存翻译层组成:
闪存芯片——对应旋转磁盘中机械驱动器
闪存翻译层(硬件/固件设备)——对应磁盘控制器
速度相当,顺序读比顺序写稍微快一点
写比读慢一个数量级
原因:底层闪存基本属性决定。
一个闪存由B个块的序列组成,每个块由P页组成。通常页的大小是512~4kb,块是由32~128页组成的,块的大小为16kb~512kb。
数据是以页为单位读写的。
局部性原理:
一个编写良好的计算机程序,常常倾向于引用临近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。
分类:
应用:
1.硬件层:
通过引入高速缓存存储器来保存最近被引用的指令和数据项,从而提高对主存的访问速度。
2.操作系统级:
系统使用主存作为虚拟地址空间最近被引用块的高速缓存,用主存来缓存磁盘文件系统中最近被使用的磁盘块
3.应用程序中:
Web浏览器将最近被引用的文档放在本地磁盘上。
定义:一个连续变量中,每隔k个元素进行访问,就被称为步长为k的引用模式。
步长为1的引用模式:就是顺序访问一个向量的每个元素,有时也被称为顺序引用模式,它是程序中 空间局部性常见和重要的来源。
一般来说,随着步长增加,空间局部性下降。
int sumarraycols(int a[M][N])
{
int i,j,sum = 0;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
sum += a[i][j];
return sum;
}
和
int sumarraycols(int a[M][N])
{
int i,j,sum = 0;
for(j=0;j<M;j++)
for(i=0;i<N;i++)
sum += a[i][j];
return sum;
}
上面的代码是按照行优先顺序执行的,下面的代码是按照列优先顺序执行的,而c数组在存储器中是按照行顺序存放的,所以第一个空间局部性良好,第二个空间局部性很差。
因为循环体会被执行多次,所以它也有很好的时间局部性。
程序指令是存放在存储器中的,CPU必须取出(读出)这些指令。
但是代码区别于程序数据的一个重要属性是:在运行时它是不能被修改的。
量化评价一个程序中局部性的简单原则:
即:每层存储设备都是下一层的“缓存”
高速缓存:是一个小而快速的存储设备,它作为存储在更大、更慢的设备中的数据对象的缓冲区域。
缓存:使用高速缓存的过程称为缓存。
数据总是以块大小为传送单元在第k层与第k+1层之间来回拷贝。任一对相邻的层次之间块大小是固定的,但是其他的层次对之间可以有不同的块大小。
一般来说:层越低,块越大。
当程序需要第k+1层的某个数据对象d时,首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中,就称为缓存命中。
该程序直接从第k层读取d,比从第k+1层中读取d更快。
即第k层中没有缓存数据对象d。
这时第k层缓存会从第k+1层缓存中取出包含d的那个块。如果第k层缓存已满,就可能会覆盖现存的一个块
覆盖——替换/驱逐
替换策略:
即第k层的缓存是空的(称为冷缓存),对任何数据对象的访问都不会命中。
通常是短暂事件,不会在反复访问存储器使得缓存暖身(理解为反复访问存储器,使得存储器不为空?)之后的稳定状态中出现。
由于一个放置策略:将第k+1层的某个块限制放置在第k层块的一个小的子集中,这就会导致缓存没有满,但是那个对应的块满了,就会不命中。
当工作集的大小超过缓存的大小时,缓存会经历容量不命中,就是说缓存太小了,不能处理这个工作集。
某种形式的逻辑必须管理缓存,而管理缓存的逻辑可以是硬件、软件,或者两者的集合。
位于CPU寄存器文件和主存之间,访问速度2-4个时钟周期
位于L1高速缓存和主存之间,访问速度10个时钟周期
位于L2高速缓存和主存之间,访问速度30或40个时钟周期
高速缓存是一个高速缓存组的数组,它的结构可以用元组(S,E,B,m)来描述:
S:这个数组中有S=2^s个高速缓存组
E:每个组包含E个高速缓存行
B:每个行是由一个B=2^b字节的数据块组成的
m:每个存储器地址有m位,形成M=2^m个不同的地址
除此之外还有标记位和有效位:
有效位:每个行有一个有效位,指明这个行是否包含有意义的信息
标记位:t=m-(b+s)个,唯一的标识存储在这个高速缓存行中的块
组索引位:s
块偏移���:b
高速缓存的结构将m个地址划分成了t个标记位,s个组索引位和b个块偏移位。
指所有块的大小的和,不包括标记位和有效位,所以:
C=S*E*B
S,B将m个地址位分为了三个字段,见上图,然后:
习题6.10:只需记住几个参数之间的数量关系即可
根据E(每个组的高速缓存行数)划分高速缓存为不同的类,E=1的称为直接映射高速缓存,以此为例:
高速缓存确定一个请求是否命中,然后取出被请求的字的过程,分为三步:
1.组选择
2.行匹配
3.字抽取
高速缓存从w的地址中间抽取出s个组索引位
组索引位:一个对应于一个组号的无符号整数。
类比:高速缓存-关于组的一位数组,组索引位就是到这个数组的索引。
注意,判断缓存命中有两个充分必要条件:
同样的一个类比:块-关于字节的数组,字节偏移是到这个数组的一个索引。
我的理解,还能类比为数组的下标,和有效地址的偏移量,等等。
——用新取出的行替换当前的行。。
※注意课本第413-414页的CPU执行读的一系列动作
1.先利用索引位,确定是针对哪个组
2.然后看对应的组是否有效:
(1)如果无效则缓存不命中,高速缓存从存储器或低一层中取出要找的块,存储在对应的组中,再把有效位置1,返回需要的值
(2)如果有效,再根据标记找是否有匹配的标记:
-如果有,则缓存命中,返回需要的值
-如果没有,则替换行,然后返回。
——高速缓存反复的加载和驱逐相同的高速缓存块的组
这些块被映射到了同一个高速缓存组。
在每个数组的结尾放B字节的填充(B字节是一个块的长度,一行是一个块,相当于分开了行)从而使得他们映射到不同的组。
为什么用中间位做索引?参看415页习题6.12和416页旁注。高位的话,任何时刻高速缓存都只保存着一个块大小的数组内容。
E路组相联高速缓存:1<E<C/B
和直接的一样。
形式是(key, value),用key作为标记和有效位去匹配,匹配上了之后返回value。
重要思想:组中的任意一行都可以包含任何映射到这个组的存储器块,所以告诉缓存必须搜索组中的每一行。
判断匹配的标准依旧是两个充分必要条件:
1.有效
2.标记匹配
有空行替换空行,没有空行,应用替换策略:
只有一个组,默认组0,没有索引位,地址只被划分成了一个标记和一个块偏移。
同组相联。
只适合做小的高速缓存。
缺点:每次写都会引起总线流量。
加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块。
避开高速缓存,直接把这个字写在低一层中。
高速缓存既保存数据,也保存指令。
在这一节中好几个概念很容易混淆,在做题时就会产生错误。区分如下:
每台计算机都有表明他存储器系统的能力特色的唯一的存储器山。
——就是把存储器系统的性能用关于时间和空间局部性的山表示。
想要达成的目的:使得程序运行在山峰而不是低谷
目标:利用时间局部性,使得频繁使用的字从L1中取出;利用空间局部性,使得尽可能多的字从一个L1高速缓存行中访问到。
通过这一章的学习我对存储器的模式有了更深入的了解,但是最后存储器山的部分还是有些模糊,地形图似的那张图看不太懂,大概是地理的知识全忘了,对山峰山脊山谷山坡没法直观的感受,但是压成二维的柱形图后就好理解了一点,但也仅仅针对结论而不是过程,做习题的过程中发现还不够熟练,对知识的掌握不牢靠需要反复回去翻书,只能说过了一遍知识点还没能完全消化。