zoukankan      html  css  js  c++  java
  • 20135220谈愈敏--信息安全系统设计基础第六周学习总结

    第六章 存储器层次结构

    存储器系统 是一个具有不同容量、成本和访问时间的存储设备的层次结构。

    CPU寄存器:容量小,成本高,访问快
    高速缓存存储器:CPU和主存之间的缓存区域
    主存:磁盘上大容量,成本低,慢速
    

    局部性

    具有良好局部性的程序:

    倾向于一次又一次的访问相同的数据项集合
    倾向于访问邻近的数据项集合
    倾向于从存储器层次结构中较高层次处访问数据项
    

    6.1 存储技术

    6.1.1随机访问存储器 RAM

    静态的RAM:SRAM更快也更贵,用来作为高速缓存存储器,既可以在CPU芯片上,也可在片下。
    动态的RAM:DRAM,用来作为主存以及图形系统的帧缓冲区。容量更大。
    

    SRAM和DRAM存储器的特性:

    只要有供电,SRAM就会保持不变,与DRAM不同,它不需要刷新。SRAM的存取更快,抗干扰能力更强,代价是SRAM更贵,功耗更大。

    非易失性存储器ROM

    RAM在断电后会丢失信息,ROM即使断电也能保存着信息。ROM中有的类型既可以读又可以写,但整体上称为只读存储器。

    ROM是以它们能够被重编程的次数和进行重编程所用机制进行区分的:

    PROM:可编程ROM,只能被编程一次。
    EPROM:可擦写可编程ROM,能够被擦写和重编程的次数的数量级达到1000次。
    EEPROM:电子可擦除PROM,不需要物理上独立的编程设备,可直接在印刷电路卡上编程。数量级达到10^5。
    FLASH:闪存,基于EEPROM,为大量的电子设备提供快速而持久的非易失性存储
    

    存储在ROM设备中的程序通常称为 固件,一个计算机系统通电后,会运行固件,一些系统在固件中提供了少量基本的输入和输出函数,如PC和BIOS。复杂的设备也依赖固件翻译来自CPU的I/O输入输出请求。

    访问主存

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

    数据流通过总线在处理器和DRAM主存之间来回。
    控制线携带的信号会同步事务,并标识出当前正在被执行的事务的类型。
    

    CPU和主存之间的数据传送是通过一系列步骤来完成的,称为总线事务

    读事务:从主存传送数据到CPU
    写事务:从CPU传送数据到主存
    

    计算机系统的配置:

    CPU芯片
    I/O桥芯片组
    组成主存的DRAM存储器模块
    
    系统总线:连接CPU和I/O桥
    存储器总线:连接I/O桥和主存
    I/O桥将系统总线的电子信号翻译成存储器总线的电子信号
    

    例:

    movl A,%eax
    

    地址A的内容被加载到寄存器%eax中。CPU上称为总线接口的电路发起读事务

    1 CPU将地址A放到系统总线上,I/O桥将信号传递到存储器总线。
    2 主存感觉到地址信号,从存储器总线读地址,从DRAM取数据并写到存储器总线,I/O桥翻译成系统总线信号。
    3 CPU感觉到系统总线上的数据,读数据并拷贝到寄存器%eax。
    

    例:

    movl %eax,A
    

    寄存器%eax的内容被写到地址A,CPU发起写事务

    1 CPU将地址放到系统总线上。存储器从存储器总线读出地址并等待数据到达。
    2 CPU将%eax中的数据字拷贝到系统总线。
    3 主存从存储器总线读出数据字,并将这些位存储到DRAM中。
    

    6.1.2 磁盘存储

    1、磁盘构造

    磁盘有许多盘片构成,每个盘片有两个表面,表面上覆盖着磁性记录材料。盘片中央有一个可旋转的 主轴,盘片以固定旋转速率旋转。

    每个表面由一组称为磁道的同心圆组成。磁道被划分为一组扇区 ,每个扇区包含相等数量的数据位。扇区之间由间隙分隔开,间隙不存储数据。

    磁盘由多个叠放的盘片组成,被封装在一个密封的包装里,整个装置称为磁盘驱动器,即磁盘,也称 旋转磁盘,区别与基于闪存的固态磁盘SSD

    柱面:描述多个盘片驱动器的构造,指所有盘片表面上到主轴中心的距离想等的磁道的组合。

    2、磁盘容量

    一个磁盘上可以记录的最大位数称为最大容量,即容量。由以下技术因素决定:

    记录密度:磁道一英寸的段中可以放入的位数
    磁道密度:从盘片中心出发半径上一英寸的段内可以有的磁道数
    面密度:记录密度与磁道密度的乘积
    

    计算磁盘容量的公式:

    磁盘容量 = 字节数/扇区 X 平均磁盘数/磁道 X 磁道数/表面 X 表面数/盘片 X 盘片数/磁盘

    3、磁盘操作

    磁盘用读/写头来读写存储在磁性表面的位,读写头连接到传动臂,前后移动传动臂可以到达任何磁道,定位到了期望的道,磁道旋转每个位通过时就可读写该位。多个盘片针对每一个都有独立的读写头,且位于同一柱面上。

    对扇区的访问时间:

    寻道时间:定位到包含目标扇区的磁道上,移动传动臂所需时间。依赖于读写头以前的位置和传动臂移动速度。
    旋转时间:目标扇区的第一个位旋转到读写头下,时间依赖于读写头到目标磁道的位置和磁盘的旋转速度。
    传送时间:读写该扇区的内容,时间依赖于旋转速度和每条磁道的扇区数目(扇区大小)。
    

    书上有具体例题和公式。

    访问时间主要是寻道时间和旋转时间,将寻道时间乘以2可以估计访问时间。

    4、逻辑磁盘块

    现代磁盘将构造呈现为简单的视图,一个B个扇区大小的逻辑块的序列,编号为0,1,...,B-1。磁盘中有一个小的硬件/固件设备,称为磁盘控制器,维护这逻辑块号和实际物理磁盘扇区之间的映射关系。

    5、连接到I/O设备

    输入输出设备都是通过I/O总线连接到CPU和主存的。与系统总线和存储器总线不同,它可以设计成与CPU无关的。

    I/O总线较慢,但可以连接种类繁多的第三方I/O设备:

    通用串行总线(USB)控制器是一个连接到USB总线的设备的中转机构。
    
    图形卡(或适配器)包含硬件和软件逻辑,代表CPU在显示器上画像素。
    
    主机总线适配器将一个或多个磁盘连接到I/O总线,使用特别的主机总线接口定义的通信协议。
    两个常用的磁盘接口SCSI/SATA,SCSI更快更贵,可支持多个磁盘驱动器,SATA只能支持一个。
    
    其他设备,如网络适配器,插入到主板上空的扩展槽,从而连接到I/O总线。
    

    6、访问磁盘

    CPU从磁盘读数据,CPU使用存储器映射I/O的技术向I/O设备发出命令,过程中地址空间有一块是为与I/O设备通信保留的,称为I/O端口。当设备连接到总线时,它与一个或多个端口相关联。(映射)

    例:假设磁盘控制器被映射到端口0xa0

    1 CPU可能执行三个对地址0xa0的存储指令发起磁盘读:
    	发送命令字,告诉磁盘发起读,同时还有其他参数;
    	指明应该读的逻辑块号;
    	指明应该存储磁盘扇区内容的主存地址。
    
    2 磁盘控制器收到读命令后将逻辑块号翻译成扇区地址,读扇区内容,将这些内容直接传送到主存,不需要CPU干涉。
    这种过程称为直接存储器访问DMA,这种数据传送称为DMA传送。
    
    3 DMA传送完成,扇区内容被存储在主存中后,磁盘控制器给CPU发送一个中断信号来通知CPU。
    

    6.1.3 固态硬盘SSD

    固态硬盘是一种基于闪存的存储技术,一个SSD包由一个或多个闪存芯片和闪存翻译层组成,闪存芯片替代传统旋转磁盘中的机械驱动器,闪存翻译层是一个硬件/固件设备,与磁盘控制器相同,将对逻辑块的请求翻译成对底层物理设备的访问。

    SSD顺序读比顺序写稍微快一点,但随机写比读慢一个数量级。

    SSD优点:随机访问时间比旋转磁盘更快,能耗更低,更结实
    SSD缺点:容易磨损,较贵,容量通常只是旋转磁盘的1%
    

    6.1.4 存储技术趋势

    不同的存储技术有不同的价格和性能折中。
    
    不同存储技术的价格和性能属性以截然不同的速率变化着。
    

    6.2 局部性

    一个编写良好的计算机程序常常具有良好的局部性,它倾向于引用邻近于最近引用过的数据项的数据项,或者最近引用过的数据项本身,这种倾向性被称为局部性原理

    时间局部性:被引用过一次的存储器位置很可能在不远的将来再被多次引用。
    空间局部性:如果一个存储器位置被引用了一次,那么很可能在不远的将来引用附近的一个存储器位置。
    

    6.2.1 对程序数据引用的局部性

    例:一个向量的元素求和

    int sumvec(int v[N])
    {
    	int i,sum = 0;
    
    	for (i = 0;i < N; i++)
    		sum += v[i];
    	return sum;
    }
    

    对于变量v,是顺序读取的,有很好的空间局部性,但时间局部性很差,因为每个元素只被访问一次。

    连续向量中每隔k个元素进行访问称为步长为k的引用模式,步长为1的引用模式即顺序引用模式,空间局部性最好。

    例:二维数组的元素求和,双重嵌套循环按照行优先顺序

    int sumarrayrows(int a[M][N])
    {
    	int i,j,sum = 0;
    
    	for(i = 0; i < M; i++)
    		for(j = 0; j <N; j++)
    			sum += a[i][j];
    	return sum;
    }
    

    函数具有良好的空间局部性,按照数组被存储的顺序来访问。如果交换i和j的循环,空间局部性就会变得很差,结果得到步长为N的引用模式。

    6.2.2 取指令的局部性

    例如第一个程序中,for循环体里的指令是按照连续的存储器顺序执行的,因此循环有良好的空间局部性,因为循环会被执行多次,所以时间局部性也很好。

    代码区别于程序数据的是在运行时是不能被修改的。

    6.2.3 局部性小结

    量化评价一个程序中局部性的简单原则:

    重复引用同一个变量的程序有良好的时间局部性。
    对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。
    对于取指令来说,循环有很好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
    

    6.3 存储器层次结构

    用相互补充的性质想到的一种组织存储器系统的方法:存储器层次结构。一般而言,从高层往底层走,存储设备变得更慢、更便宜和更大。

    6.3.1 存储器层次结构中的缓存

    高速缓存是一个小而快速的存储设备,作为存储在更大、也更慢的设备中的数据对象的缓冲区域。使用高速缓存的过程称为缓存

    存储器层次结构的中心思想是:每一层都缓存来自较低一层的数据对象。

    第k+1层的存储器被划分为连续的数据对象片,称为。每个块都有唯一的地址和名字。类似第k层也被划分为较少的块的集合,块的大小与k+1层是一样的,第k层的缓存包含第k+1层块的一个子集的拷贝。

    数据总是以块为传送单元在两层之间来回拷贝。不同层次对之间可以有不同的块大小。

    1、缓存命中
    需要k+1层的数据对象d,在第k层的一个块中查找到d,可直接读取,更快。
    
    2、缓存不命中
    第k层没有缓存数据对象d,这时会从第k+1层取出包含d的块缓存到第k层。如果k层已满会覆盖现存的一个块。
    
    决定该替换哪个块又缓存的替换策略控制,如随机替换策略,最近最少被使用LRU替换策略。
    
    3、缓存不命中的种类
    强制性不命中/冷不命中:第k层的缓存为空(称为冷缓存),任何访问都会不命中。
    这种通常是短暂的事件。
    
    冲突不命中:放置策略为将第k+1层的块限制放置在第k层块的一个小的子集中。
    如:假设第k层有4个块,第k+1层的块i必须放置在第k层的块(i mod 4)中。
    这时会出现有些对象映射到同一个缓存块,缓存会一直不命中。
    
    容量不命中:每个阶段访问缓存块的某个相对稳定不变的集合,称为这个阶段的工作集。
    当工作集的大小超过缓存的大小,会经历容量不命中。就是缓存太小。
    
    4、缓存管理
    指某个东西要将缓存划分成块,在不同层之间传递块,判定是命中还是不命中,并处理他们。
    
    管理缓存的逻辑可以是硬件、软件或两者的结合。
    

    6.3.2 存储器层次结构概念小结

    基于缓存的存储器层次结构行之有效,因为较慢的存储设备更便宜。

    利用时间局部性
    利用空间局部性
    

    缓存无处不在:

    6.4 高速缓存存储器

    CPU和主存之间差距太大,插入一个SRAM高速缓存存储器

    L1高速缓存:2~4个时钟周期
    L2高速缓存:10个时钟周期
    L3高速缓存:30~40个时钟周期
    

    6.4.1 通用的高速缓存存储器结构

    S=2^s个高速缓存组
    每组E个高速缓存行
    每行B=2^b字节的数据块
    每行一个有效位
    每行 t=m-(b+s)个标记位
    
    高速缓存大小C=S*E*B,不包括标记位和有效位
    

    物理地址m被分为三个字段:

    t位标记
    s位组索引
    b位块偏移
    

    组索引找到组,标记位找到行,偏移位找到数据字。

    6.4.2 直接映射高速缓存

    每个组只有一行的高速缓存称为直接映射高速缓存。

    高速缓存确定一个请求是否命中,然后抽取出被请求的字

    1 组选择
    2 行匹配
    3 字抽取
    
    1、直接映射高速缓存中的组选择
    从地址中抽取s个组索引位,解释成一个对应于一个组号的无符号整数,选择相应组。
    
    2、直接映射高速缓存中的行匹配
    直接映射高速缓存每个组只有一行,当设置了有效位并且行中的标记与地址中的标记相匹配时,我们得到缓存命中。
    
    3、直接映射高速缓存中的字选择
    块偏移位b提供了所需要的字的第一个字节的偏移。
    
    4、直接映射高速缓存中不命中时的行替换
    缓存不命中时,需要从下一层取出被请求的块存储在组索引位指示的组中的高速缓存行中。
    若组中都是有效行时。需要替换,直接映射高速缓存每组只有一行,就可直接替换。
    
    5、综合:运行中的直接映射高速缓存

    书上举了一个详细的例子说明高速缓存的一系列执行情况。

    6、直接映射高速缓存中的冲突不命中

    当程序访问大小为2的幂的数组时,直接映射高速缓存中通常会发生冲突不命中。

    书上的示例中高速缓存反复地加载和驱逐相同的高速缓存块的组(抖动)。

    改进的办法很简单:在每个数组的结尾放B字节的填充,改变数组元素的组索引。

    6.4.3 组相联高速缓存

    每个组都保存有多于一个的高速缓存行。一个 1<E<C/B 的高速缓存通常称为E路组相联高速缓存。

    1、组相联高速缓存中的组选择
    组索引位标识组
    
    2、组相联高速缓存中的行匹配和字选择
    行匹配更复杂,必须检查多个行的标记位和有效位,字选择与前面一样。
    
    3、组相联高速缓存中不命中时的行替换
    缓存不命中时,高速缓存从存储器中取出包含这个字的块,替换行时,如果没有空行,按照替换策略替换。
    复杂的替换策略利用了局部性原理,以使在比较近的将来引用被替换的行的几率最小.
    例:最不常使用LFU策略,最近最少使用LRU策略。
    

    6.4.4 全相联高速缓存

    由一个包含所有高速缓存行的组组成的,即E=C/B。

    1、全相联高速缓存中的组选择
    因为只有一个组,地址中没有组索引位,地址只被划分成了一个标记和一个块偏移。
    
    2、全相联高速缓存中的行匹配和字选择
    与前面的一样,区别主要是规模大小的问题
    

    全相联高速缓存只适合做小的高速缓存,例如虚拟存储器系统中的翻译备用缓存器TLB。

    学习总结

    这章的内容相对比较简单,前面介绍了各种存储器各层次,局部性,主要理解语言,这些都比较好理解,而后面的高速缓存通用结构和执行情况搞懂后,特例的高速缓存都有很多相似之处,对比着来看就知道了,理解和记忆的也更深刻。

    参考资料

    课本,其中截图均来自《深入理解计算机系统》pdf版。

  • 相关阅读:
    云平台架构架构调整路线图
    python3生成测试数据,并写入ssdb
    关于因各种原因,造成LINUX主机不能通过域名访问自己的解决办法
    学习OpenResty编程
    在WINDOWS2008 Server 中创建NFS服务器,使用LINUX的MOUNT命令去加载网络盘
    云平台资源挂盘办法V1.2
    VMware安装Centos7超详细过程(图文)
    VMware配置网络的3种方式:NAT、Host-Only、Bridged
    vmware12安装centos7系统详解
    AMQP && MQTT comparision
  • 原文地址:https://www.cnblogs.com/tymjava/p/4908066.html
Copyright © 2011-2022 走看看