20135316王剑桥 linux第六周课实验笔记

6、存储器层次结构

6.1存储技术

1、如果你的程序需要的数据是存储在CPU寄存器中的,那么在执行期间,在零个周期内就能访问到它们。如果存储在高速缓冲中,需要1~10个周期。如果存储在主存中,需要50~100个周期。如果存储在磁盘上,需要约20000000个周期。

2、随机访问存储器(RAM,Random-access memory)分为两类-静态和动态的。静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵很多。SRAM用来作为高速缓存存储器,即可以在CPU芯片上,也可以不在CPU芯片上。DRAM用来作为主存以及图形系统的帧缓冲区。

3、静态RAM

SRAM将每个位存储在一个双稳态(bistable)存储器单元(cell)中。每个单元是用一个六晶体管电路来实现的。这个电路的一个属性是:它可以无限制地保持在两个不同的电压配置(configuration)或状态(state)之一。其他任何状态都是不稳定的。

由于SRAM的双稳态特性,只要有电,它就会永远地保持它的值,即使有干扰,如电子噪音,当干扰消除,电路也能恢复到稳定值。

4、动态RAM

DRAM将每个位存储为对电容的充电。电容约为30×10-15F。

泄露电流的各种因素会导致DRAM单元在10~100毫秒内失去电荷。计算机运行的时钟周期是以纳秒来衡量的。

 

 

    计算机界,倾向于把DRAM的阵列单元称为单元(cell),电路设计者倾向于称之为字(word)。这里称为supercell。

 

从图中可以看出,二维阵列组织的缺点就是必须分两步发送地址,这增加了访问时间。

5、168个管脚的双列直插存储器模块(Dual Inline Memory Module,DIMM),它以64位为块传送数据到存储控制器和从存储控制器传出数据;72个管脚的单列直插存储器模块(Single Inline Memory Module,SIMM),它以32位为块传送数据。

6、SDRAM(synchronous DARM,同步DRAM),SDRAM用与驱动存储器相同的外部时钟信号的上升沿来代替许多这样的控制信号。

DDR SDRAM(double data-rate synchronous DRAM,双倍数据数率同步DRAM)。DDR SDARM是对SDRAM的一种增加,它通过使用时钟的两个边沿作为控制信号,从而使DRAM的速度翻倍。

7、EEPROM(electrically erasable programmable ROM,电子可擦除PROM),类似于DPROM,但是它不需要一个物理上独立的编程设备,因此可以直接在印制电路卡上编程。EEPROM能够编程的次数量级可达10e5次。闪存(flash memory)是一个类小的非易失性存储器,基于EEPROM,支持插拨。

8、存储在ROM设备中的程序通常称为固件(firmware)。

9、访问主存

读事务(read transaction)从主存传送数据到CPU;写事务(write transcation)从CPU传送数据到主存。

总线是一组并行的导线,能携带地址,数据,的控制信号。

 

1)读事务语句

movl A,%eax;

CPU将地址A放到存储器总线->主存从总线读出A,接收字x,然后将x放到总线上->CPU从总线读出字x,并将它copy到寄存器eax中。

2)写事务语句

movl %eax,A

CPU将地址A放到存储器总线,主存读出这个地址,等待接收数据字->CPU将数据字y放到总路上->主存从总线读数据字y,并将它存储在地址A。

10、磁盘构造

每个表面是由一组称为磁道(track)的同心圆组成;每个磁道被划分成一组扇区(sector);每个扇区包含相等数量的数据位(通常是512字节);这些数据编码在扇区上的磁性材料中。扇区之间由一些间隙(gap)分隔开,这些间隙中不存在数据位。间隙存储用来标识扇区的格式化位。

 

注:spindle(主轴),platter(盘片),cylinder(柱面)

11、磁盘容量

 

(扇区大小×每条磁道平均扇区数×每个面磁道的磁道数×每个盘片的面数×每个磁盘的盘数)

12、对于与DRAM和SRAM容量相关的单位,通常K = 210,M = 220,G = 230,对于磁盘和网络这样的I/O设备容量相关的单位,通常K = 103,M = 106,G = 109。

13、任何时刻,所有的读写头都位于同一柱面上。

 

注:spin(旋转),cushion(垫子),radially(放射状的,在半径方向上)

在传动臂末端的读/写头在磁盘表面高度约0.1微米处一层薄薄的气垫上飞翔,速度大约为80km/h。磁盘以扇区大小的块来读写数据。

14、对扇区的访问时间有三个主要部分组成:寻道时间(seek time),旋转时间(rotational latency)和传送时间(transfer time)。

1)寻道时间(seek time):为了读取某个目标扇区的内容,传动臂把读/写头首先定位到包含目标扇区的磁道上。所需时间即为寻道时间,约等于最大旋转时间。

2)旋转时间:定位到期望的磁道后,驱动器等待目标扇区的第一个位旋转到读/写头下。

Tmax rotation = 1/最大旋转数率

Tavg rotation = (1/2) × Tmax rotation。

3)传送时间

Tavg transfer = (1/最大旋转数率) × (1/每磁道的平均扇区数)。

15、现代磁盘构造复杂,有多个盘面,这些盘面上有不同的记录区。为了对操作系统隐藏这样的复杂性,现代磁盘将它们的构造简化为一个b个扇区大小的逻辑块的序列,编号为0,1,2,...b-1。磁盘中有一个小的硬件/固件设备,称为磁盘控制器,维护着逻辑块号的和实际(物理)磁盘扇区之间的映射关系。

16、局部性有两种形式:时间局部性(temporal locality)和空间局部性(spatial locality)。在一个具有良好时间局部性的程序中,被引用过一次的存储器位置很可能在不远的将来再被多次引用;在一个具有良好空间局部性的程序中,如果一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。

17、重复引用同一个变量的程序有良好的时间局部性。对于具有步长为k的引用模式的程序,步长越小,空间局部性越好;在存储器中以大步长跳来跳去的程序空间局部性会很差。

18、存储器存储结构

 

 

L0                                 寄存器

L1                          芯片里L1高速缓存

L2                          芯片外L2高速缓存

L3                                 主存

L4                             本地磁盘

L5                           远程二级存储

k层是第k+1层的缓存,因为第k层的存储速度更块,当然空间也更小。     这样便有一个统一的缓存模型。

k+1层的存储器分成不同的块,每个块有唯一的地址,通常块的大小固定(也可以变化)

k层的存储里缓存着k+1层里的部分块,在kk+1之间传输数据时,都是以块为大小来传输。

i)缓存命中

若需要访问k+1层里的数据块d,如果d已经缓存在第k层,则称缓存命中。这样从第k层取块d要比k+1层更块。

ii)缓存不命中

d不在第k层,则是缓存不命中,此时将k+1层存储中取出块d,放入k层。可能需要替换掉k层中已有的块。替换策略是:随机,最近最少使用等。

刚开始k层中没有缓存k+1中的数据,这时称为强制性不命中。

由于k层大小较小,因此k+1层中可能多个块会需要放入k层中相同位置,此时为冲突不命中,因为k层中可能还有多的空间没用。

若循环访问一个数组,当数组大小大于k层的大小时,就会发生容量不命中,即是因k层容量太小导致的。

需要有个东西对缓存进行管理,比如怎么进行块的划分,各层次间怎么传送块,判断是否命中,不命中该如何处理,写回数据的时候该如何处理。

都是需要考虑的问题,可用硬件管理如cache,也可用软件管理如虚拟内存。

高速缓存存储器

L1高速缓存:

位于CPU寄存器文件和主存之间,访问速度2-4个时钟周期

L2高速缓存:

位于L1高速缓存和主存之间,访问速度10个时钟周期

L3高速缓存:

位于L2高速缓存和主存之间,访问速度3040个时钟周期

i)相关假定

假定存储器的地址有m位,便有M=2的m次方 不同地址。

一个缓存被分成S=2的s次方个的高速缓存组(cache set),

每个组包含 个高速缓存行。

每个缓存行由一个B=2的b次方字节的数据块,一个有效位,t=m-(b+s)个标记位组成。

一个高速缓冲区的大小C = S * E * B

 

工作过程

S,Bm个地址位分为了三个字段,见上图,然后:

先通过s个组索引位找到这个字必须存储在哪个组中

然后t个标记位告诉我们这个组中的哪一行包含这个字(当且仅当设置了有效位并且该行的标记位与地址中的标记位相匹配时)

b个块偏移位给出来在B个字节的数据块中的字偏移

ii)如何访问缓存

当要访问存储器中的一个字节时,给出的访问地址的m位中,前t位表示标记位,中间s位为组索引,最后b位为块偏移。

因此对这个访问地址,首先利用中间的s位组索引找到相应的组,

对组中的每一个缓存行,将缓存行的t位标记与访问地址中的前t位进行比较,若相等,则找到字节所在的块。若没找到,缓存不命中。

如果有效位为1,则利用b位块偏移,在缓存行中取出要访问的字节。

若有效位为0,则缓存不命中。

iii)缓存不命中时

当缓存不命中时,则若需要将存储器中的块放入缓存对应的组中。

若组中的行都有数据,则需要进行替换,替换策略是:LFU或这LRU(不想细说了)

iv)三种缓存方式的划分

分为直接映射高速缓存,组相联高速缓存,全相联高速缓存

若指定了SEB的值,则缓存的划分方式就已经确定了。

缓存块与存储块之间也就建立了一种映射关系。

E = 1时, 一个组中只有一个行,明显这个时候不需要使用替换策略,比较简单。查找块也很块,但容易发生冲突不命中。    直接映射高速缓存

E < C/B时,一个组中有多个行,这时需要考虑使用什么替换策略了。而且在查找块时,需要将地址中的标记与组中全部缓存行的标记进行比较。      组相联高速缓存

E=C/B时,仅有一个组,这时不会出现冲突不命中的情况,但容易发生容量不命中。而且查找块时,需要比较全部缓存行中的标记。      全相联高速缓存

原文地址:https://www.cnblogs.com/20135316wjq/p/4912712.html