作为开发者需要理解存储器层次结构,以及了解系统是如何将数据在存储器层次结构中移动,这样在编写程序时可以利用这些特性来提升性能。其中最主要的就是局部性原理,具有良好局部性的程序会更倾向于从较高层次访问数据,减少CPU访问时间。
- 将注意力集中在内循环上,大部分计算和内存访问都发生在这里;
- 通过按照数据对象存储在内存中的顺序,以步长为1的来读取数据,使得程序空间局部性最大;
- 一旦从存储器中读入了一个数据对象,就尽可能多地使用它,从而使得程序中的时间局部性最大;
这一章我是结合和CMU的课程视频来学习的,相比前几章来说,在看书之前已经了解了哪些重点概念需要关注,个人感觉效果还不错。
首先从基本的存储技术学习:
RAM 随机访问存储器:
- SRAM,静态随机访问存储器,常用来做高速缓存,可以在CPU芯片上也可以在片下。将每个位都存储在一个双稳态存储器单元里,每个单元由一个六晶体管电路实现。只要有电就会永远保持它的值,即使有干扰来扰乱电压,消除后也会立即恢复到稳定值。
- DRAM,动态随机访问存储器,常用来作为主存以及图形系统的帧缓冲。每个位存储为对一个电容的充电,对干扰非常敏感,当电容的电压被扰乱后就永远不会恢复了。
- 两者相比,只要供电SRAM就会保持不变,与DRAM不同,不需要刷新。SRAM的存取也比DRAM快得多,但是SRAM比DRAM单元使用更多的晶体管,因此密集度低,更贵且功耗更大。
传统DRAM,二维阵列,读取时先RAS(Row Access Strobe)请求再CAS(Column Access Strobe)请求。
- 两者相比,只要供电SRAM就会保持不变,与DRAM不同,不需要刷新。SRAM的存取也比DRAM快得多,但是SRAM比DRAM单元使用更多的晶体管,因此密集度低,更贵且功耗更大。
- 内存模块,DRAM芯片封装在内存模块中,插入主板的扩展槽,以64位为块传送数据到呢欧村控制器和从内存控制器传出数据。
- 增强的DRAM:
- 快页模式,允许对同一行连续地访问可以直接从行缓冲区得到服务。
- 扩展数据输出DRAM,允许各个CAS信号在时间上靠得更紧密一些。
- 同步DRAM,能够比一部的存储器更快输出单元内容。
- 双倍数据速率同步DRAM,常见的DDR2 DDR4 DDR8等
- 视频RAM,用在图形系统的帧缓冲区中。
- 1)VRAM输出是通过依次对内部缓冲区的整个内容移位得到;
- 2)VRAM允许对内存并行读写。
- 非易失性存储器, 断电后依然能保存数据。 ROM, PROM, EPROM,flash memory等
访问主存,通过总线的共享电子电路在处理器和DRAM主存之间传递数据。
磁盘存储器:从磁盘上读取数据时间为ms级,比DRAM慢10万倍,比SRAM慢100万倍。
磁盘的构造相关内容CMU的课程视频上讲解的比较清晰,所以看书时主要关注在于磁盘的访问。
CPU通过内存映射I/O技术来发送命令,磁盘接受到命令后,将逻辑块号翻译成扇区地址,读取该扇区内容。然后将内容直接传到主存,不需要CPU的干涉,即DMA传送。当传送完成后,磁盘控制器通过给CPU发送一个中断信号来通知。
SSD固态硬盘,由半导体存储器构成,没有移动的部件,因而随意访问时间比旋转磁盘快,能耗更低且结实。不过缺点是反复写后,闪存块会磨损,通过平均磨损逻辑来将擦除平均到所有块上来最大化每块的寿命。
然后是局部性原理:空间局部性和时间局部性。现代计算机系统各个层次都有利用到局部性原理,如高速缓存等(CPU芯片、操作系统、分布式文件系统和万维网中都使用了缓存)。
最后是高速缓存相关,其结构可以用四元组(S,E,B,m)来描述,容量大小C=SEB。其结构使得它能够通过简单地检查地址位,找到请求字(类似哈希表)。1)组选择;2)行匹配;3)字抽取。
按照类型可以分为直接映射高速缓存、组相联高速缓存、全相联高速缓存。
需要注意的是,即使程序具备良好的空间局部性,高速缓存中也有足够的空间存放块,但是还可能因为映射到相同组产生抖动现象,即高速缓存反复地加载和驱逐相同的高速缓存块的组。 此时可以通过数据填充将其映射到不同的组来消除抖动冲突不命中。
高速缓存写操作:
- 命中时,向更低一层写时分为两种:直写和写回。直写简单但是每次写都会引起总线流量;写回尽可能推迟更新,只有当替换算法驱逐该块时才写,由于局部性显著减少总线流量,但增加了复杂性。
- 不命中时,有写分配和非写分配两种。写分配需要加载相应第一层的块到高速缓存中,然后更新,试图利用局部性原理。非写分配避开高速缓存,直接把这个字写入到下一层。直写高速缓存通常是非写分配的,写回高速缓存是写分配的。
对开发者来说,在设计程序时可以心里默认采用使用写回合写分配的高速缓存模型,在高层次开发程序展示良好的空间和时间局部性。原因:
- 通常较长的传送时间,存储器层次结构中较低的缓存更可能使用写回;
- 逻辑电路密度提高,写回的高复杂性也越来越不成阻碍;
- 写回写分配试图利用局部性,和处理读的方式对称;