• 20145229 《信息安全系统设计基础》第7周学习总结


    20145229 《信息安全系统设计基础》第7周学习总结

    教材学习内容总结

    存储器层次结构

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

    6.1.1 随机访问存储器

    • 随机访问存储器:静态(SRAM)和动态(DRAM)
    • SRAM为高速缓存存储器,可以在 cpu 上和片下,且比DRAM更快,更贵,不会超过几兆字节
    • DRAM为主存以及图形系统的帧缓存区,占几百或几千兆字节

    1.静态RAM

    • SRAM将每个位存储在一个双稳态的存储器单元里。单元由一个六晶体管电路实现,电路可以无限期的保持在两个不同的稳定状态。
    • 这个存储器单元类似一个钟摆,钟摆摆到最左边和最右边的时候最稳定,其他时候就不稳定。而垂直的亚稳态会在细微的扰动下失去平衡
    • SRAM由于单位的双稳态特性,只要有电就会保持不受干扰,就算有干扰,在干扰消除时又会稳定下来

    2.动态RAM

    • DRAM将每个位存储为对一个电容的充电,电容非常微小,但存储器制造得非常密集,每个单元由一个电容和一个访问晶体管组成
    • DRAM对干扰非常敏感,只要电容的电压被扰乱后,它将永远不会恢复,受到阳光照射也会导致电容电压变化,就和相机和摄影机一样,不能暴晒,因为它的传感器本质就是DRAM
    • 由于部分原因使DRAM容易漏电,所以存储器系统必须周期性的通过读写来刷新查看是否有错。有的系统也通过纠错码来防止错误。

    3.传统的DRAM

    • 每个DRAM芯片被连接到称为存储控制器的电路,电路每次在芯片中传送w位
    • 超单元(i,j)将行地址RSA和列地址CSA分别进行发送,但是它们共享同样的DRAM地址引脚
    • 我觉得整个传送过程非常简单,首先确定超单元的行地址和列地址,确定行i的内容复制到缓冲区,然后把列j的内容复制到列缓冲区,最后一起复制出来然后发送到存储控制器。书上的图例帮助理解得更清楚。
    • DRAM组织成二维阵列的原因是为了降低地址引脚的数量

    4.存储器模块

    • DRAM芯片包装在存储器模块。包装包括168个引脚的双列直插存储器模块(以64位为块传输)和72个引脚的单列直插存储器(以32为块传输)
    • 若要取出地址A的一个64位双字,首先将A转换为超单位地址(i,j),然后发送到存储器模块,再广播至每一个DRAM,再由DRAM输出(i,j)的8位内容,后由电路收集合并城位双字。

    5.增强的DRAM

    • 快页模式DRAM(FPM DRAM) :FPM DRAM 允许对同一行连续访问可以直接从缓冲区内得到服务,之前的DRAM需要发送4次
    • 扩展数据输出DRAM( EDO DRAM ):FPM DRAM的增强形式,它允许单独的CAS信号在时间上更紧密
    • 同步DRAM(SDRAM):SDRAM能够比异步的存储器更快的输出超单元的内容
    • 双倍数据速率同步DRAM(DDR DRAM ): 通过使用两个时钟沿作为控制信号,使DRAM的速度翻倍。不同类型由欲取缓冲区大小决定:DDR(2位),DDR2(4位)和DDR3(8位)
    • 视频RAM(VRAM): 它用在图形系统的桢缓冲区,VRAM的输出通过对内部缓冲区的整个内容进行移位,且VRAM允许对存储器并行的读和写。所以系统可以在下一次更新写的时候,用缓冲区中的像素刷屏幕

    6.非易失性存储器

    • 在断点情况下会丢失信息的存储器称为非易失性存储器,如DRAM和SRAM
    • RAM有的类型可以读也可以写,区分它们的标准是能够被重编程的次数以及重编程所用的机制
    • PROM只能被编程一次。可擦写可编程ROM(EPROM)通过石英窗口可被擦除和重编程的次数可达1000次。电子可擦除PROM(EEPROM)不需要物理设备,可被重编程达到(10)5
    • 闪存是一种非易失性存储器存储器,为电子设备提供快速而持久的存储
    • 存储在ROM中的程序称为固件,通电后提供基本的输入和输出函数。例如图形卡和磁盘驱动器也依赖固件翻译来自CPU的输出输入请求

    7.访问主存

    • CPU与主存之间的数据传送称为总线事务。读事物由主存传送到CPU,写事务由CPU传送到主存。
    • 总线是一组并行的导线,可以携带地址、数据和控制信号。总线的设计可以决定数据和地址信号是否共享一组导线。而且两个以上的设备也可以共享一根总线。控制线携带的信号会同步事务,并标识出正在被执行的事务的类型
    • 存储器总线——连接I/O桥和主存
    • I/O总线:I/O桥将系统总线的电子信号翻译成存储器总线的电子信号,也将系统总线和存储器总线连接到I/O总线。

    6.1.2 磁盘存储

    1.磁盘构造

    • 磁盘是保存数据的存储设备,基于RAM的存储器容量小于一般存储器,但是速度较快,DRAM快10万倍,SRAM快100万倍。
    • 磁盘由盘片构成,每个盘片有盘面,盘面覆盖着磁性记录材料
    • 磁盘是由一个或多个叠放在一起的盘片组成,它们被封装在一个密封包装里,整个装置称为磁盘驱动器。
    • 磁盘驱动器也称旋转磁盘,它与固态磁盘的区别在于固态磁盘(SSD)没有旋转部分

    2.磁盘容量

    • 一个磁盘上可以记录的最大位数称为最大容量,简称为容量。
    • 容量的决定因素:记录密度、磁道密度、面密度
    • 现在大容量磁盘使用多区记录的技术,一个区每个柱面的每个磁道都有数量相同的扇区,扇区的数量由最里面磁道能包含的扇区数决定
    • 软盘依然使用老技术,每个磁道的扇区数是常数。
    • 磁盘容量 = 字节数/扇区 X 平均磁盘数/磁道 X 磁道数/表面 X 表面数/盘片 X 盘片数/磁盘

    3.磁盘操作

    • 磁盘用读/写头来读写存储在磁性表面的位,读/写头连接在传动臂一端
    • 通过移动传动臂将读/写头定位于磁道上称为寻道。
    • 由于盘面的任何微小尘粒都会阻挠读/写头,所以磁盘总是密封包装的
    • 磁盘以扇区大小的块读写数据,对扇区的访问时间分为:寻道时间、旋转时间、传送时间
    • 寻道时间取决于读/写头以前的位置以及转动臂在盘面移动的速度。平均寻道时间通常为3~9ms,最大时间可达20ms
    • 旋转时间取决于读/写头到达目标磁道时盘面的位置和磁盘的旋转速度。最大旋转延迟=1/RPM X 60secs/1min (s),平均旋转时间是最大旋转时间的一半
    • 传送时间取决于旋转速度和每条磁道的扇区数目,平均传送时间= 1/RPM x 1/(平均扇区数/磁道) x 60s/1min,一个磁盘扇区内容的平均时间为平均寻道时间、平均旋转延迟和平均传送时间之和。
    • 访问一个磁盘扇区中用的时间主要是寻道时间和旋转延迟

    3.逻辑磁盘块

    • 磁盘中有个小的硬件/固体设备,称为磁盘控制器,维护着逻辑块号和实际磁盘扇区之间的映射关系
    • 操作步骤即为操作系统想执行I/O操作的时候,读一个磁盘扇区的数据到主存,操作系统发送命令到磁盘控制器,让其读某个逻辑块号。控制器上的固件则负责执行一个快速表查找,将逻辑号翻译为一个三元组,三元组则对应物理扇区。再由读写头感知后拷贝到主存中

    4.链接到I/O设备

    • 图形卡、监视器、鼠标、键盘和磁盘输入输出都是用的I/O总线
    • 外围设备互联(PCI):总线链接到CPU和主存的
    • 通用串行总线(USB):一个连接到USB总线的设备的中转机构,连接各种外围I/O设备
    • 图形卡:硬件和软件逻辑,它们负责代表CPU在显示器上画像素
    • 主机总线适配器:SCSI可以支持多个磁盘驱动器,更快,更贵;SATA只支持一个驱动器,更便宜,更慢

    5.访问磁盘

    • CPU使用存储器映射I/O的技术向I/O设备发出命令,当一个设备连接到总线时,它与一个或者多个端口连接
    • 比如,当发起磁盘读的时候:(1)发送指令告诉磁盘发起一个读和其他参数 (2)指令指明应该读的逻辑块号 (3)指明应该存储磁盘扇区内容的主存地址
    • 当磁盘控制器收到读的指令,将逻辑块号翻译为一个扇区地址,读取后直接传送到主存,不受CPU干涉的过程称为直接存储器访问,这种数据传送称为DMA传送

    6.1.3 固态磁盘

    • 固态硬盘(SSD)是一种基于闪存的存储数据,SSD包插到I/O总线上标准硬盘插槽,处理来自CPU的都写逻辑磁盘块的请求
    • SSD由一个或多个闪存芯片和闪存翻译层组成
    • SSD随机读和写性能差不多,随机读和写的性能差别由底层基本属性决定的
    • 随机写很慢的原因:(1)擦除块需要相对较长的时间 (2)修改一个已经有数据的页,就必须将这个页的内容拷贝到新块
    • SSD的优点:它由半导体存储器构成,随机访问的时间比旋转磁盘更快,能耗更低,更结实
    • SSD的缺点:由于反复写,SSD容易磨损,且SSD每个字节比旋转磁盘贵大约100倍
    • 音乐设备中,SSD已经完全取代旋转磁盘

    6.1.4 存储技术趋势

    • 不同的存储技术有不同的价格和性能折中
    • 不同的存储技术的价格和性能属性以截然不同的速率变化着
    • DRAM和磁盘的性能滞后于CPU的性能

    6.2 局部性

    • 一个计算机程序倾向于引用邻近于其他最近引用过的数据项的数据项,或者数据项本身,被称为局部性原理
    • 局部性:时间局部性和空间局部性
    • 良好局部性的程序比局部性差的程序运行得更快

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

    这一小节的内容主要是通过C语言实例来向我们解释空间局部性,按顺序访问每个元素的函数,具有步长为1的引用模式,每隔K个元素进行访问即为步长为k的引用模式,但是步长为1肯定是局部性最好,步长越长,局部性越差。在按顺序读行或者列的函数,行的函数的局部性也更好

    6.2.2 取指令的局部性

    • 循环中指令是按照连续的存储器顺序执行,所以空间局部性良好
    • 代码与程序数据的区别是在运行的时候,CPU只从存储器中读取指令,绝对不会重写或者修改指令

    6.3 存储器层次结构

    • 存储技术:不同的存储技术的访问时间差别很大,快的成本高,容量小。CPU和主存之间的速度差距在增大
    • 计算机软件:一个编写良好的程序倾向于展现出良好的局部性
    • 存储器层次结构;从高层到底层,越来越慢,越来越便宜,越来越大

    6.3.1 存储器层次结构的缓存

    • 高速缓存是作为在一个更大更慢设备中的一个缓冲区域,使用高速缓存的过程称为缓存
    • 缓存就是层次结构中的每一层都缓冲来自较低区域的数据,以此类推直至最小的缓存-CPU寄存器集合
    • 数据总是以块作为传送单位在第K层和第K-1层来回拷贝的
    • 当需要K+1层的某个对象d时,可以在第K层找到即称为缓存命中,若找不到即称为缓存不命中
    • 当缓存不命中的时候需要替换的块称为牺牲块
    • 强制性不命中/冷不命中:即第k层的缓存是空的(称为冷缓存),对任何数据对象的访问都不会命中。通常是短暂事件,不会在反复访问存储器使得缓存暖身之后的稳定状态中出现
    • 冲突不命中:由于一个放置策略:将第k+1层的某个块限制放置在第k层块的一个小的子集中,这就会导致缓存没有满,但是那个对应的块满了,就会不命中
    • 容量不命中:当工作集的大小超过缓存的大小时,缓存会经历容量不命中,就是说缓存太小了,不能处理这个工作集
    • 缓存管理:某种形式的逻辑必须管理缓存,而管理缓存的逻辑可以是硬件、软件,或者两者的集合

    6.4 高速缓存寄存器

    • 早期存储器层次结构只有三层:CPU寄存器、DRAM主存储器和磁盘存储,后加入L1,L2,L3高速缓存

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

    • 每个存储器地址有m位,形成M=2^m个不同的地址。
    • 高速缓存组:S = 2^m个高速缓存组的数组
    • 高速缓存行:B = 2^m字节的数据块组成
    • 有效位:指明这个行是否包含有意义的信息
    • 标记位:唯一地标识存储在这个高速缓存行中的块,t = m -(b+s)
    • 高速缓存的结构用元组(S,E,B,M)描述,C指所有块大小的和,不包括标记位和有效位,C=S X E X B
    • 当一条加载指令指示CPU读字时,将A的地址发给高速缓存,高速缓存发给CPU

    6.4.2 直接映射高速缓存

    • 每个组只有一行的高速缓存被称为直接映射高速缓存,当发起一个读指令,分为3步:(1)组选择 (2)行匹配 (3)字抽取
    • 当发起读指令,根据字的地址找出对应的组
    • 在已经选择一个组的情况下确定哪一行,由于有效位可以直接找那一行的缓存,若已存储至那一行,则缓存命中,反之缓存不命中
    • 在找到哪一行的情况下通过块偏移位找到字的位置
    • 若发生缓存不命中,则需要行替换,替换掉一个块,将下一行的块拷贝到该缓存后找到该字

    6.4.3 组相联高速缓存

    • 组选择:与直接映射高速缓存中的组选择一样,组索引位标识组。
    • 行匹配和字选择:
      把每个组看做一个小的相关联存储器,是一个(key,value)对的数组,以key为输入,返回对应数组中的value值。高速缓存必须搜索组中的每一行,寻找有效的行其标记与地址中的相匹配。
    • 形式是(key, value),用key作为标记和有效位去匹配,匹配上了之后返回value。
    • 组中的任意一行都可以包含任何映射到这个组的存储器块,所以告诉缓存必须搜索组中的每一行。
    • 组相连高速缓存中不命中时的行替换:
    • 最不常使用策略LFU:替换在过去某个时间窗口内引用次数最少的那一行。
    • 最近最少使用策略LRU:替换最后一次访问时间最久远的那一行。
    • 全组相连高速缓存:
    • 组选择:只有一个组,没有组索引位。
    • 行匹配和字选择:与组相连高速缓存是一样的,但规模大很多,因此只适合做小的高速缓存,例如虚拟存储系统中的翻译备用缓冲器。
    • 写命中时,更新低一层中的拷贝的方法
      直写:立即将w的高速缓存块协会到紧接着的低一层中;缺点:每次写都会引起总线流量。
      写回:只有当替换算法要驱逐更新过的块时,才写到紧接着的低一层中。优点:符合局部性原理,显著的减少总线流量;缺点:增加了复杂性,必须为每个高速缓存行维护一个额外的修改位
      -写不命中的处理方法:
      写分配(对应写回):加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块。
      非写分配(对应直写):避开高速缓存,直接把这个字写在低一层中。

    练习题

    6.2
    计算这样一个磁盘的容量。它有2个盘片,10 000个柱面,每条磁道平均有400个扇区,每个扇区平均有512个字节 磁盘容量 = 512字节/扇区400扇区/磁道10 000磁道/表面2表面/盘片2盘片/磁盘 = 8192000000字节 = 8.192GB

    6.3
    估计访问下面的一个磁盘上的一个扇区需要的时间(以ms为单位)。旋转速率:15000RPM;Taveseek = 8ms;每条磁道的平均扇区数:500
    访问时间 = Taveseek+Taverotation+Tavetransfer = 8ms+0.51/15000RPM60secs.min1000ms/s+1/15000RPM1/50060secs/min1000ms/s=8ms+2ms+0.008ms=10.008ms

    6.4
    假设1MB的文件由512字节的逻辑块组成,存储在有如下特性的磁盘驱动器上(旋转速率:10 000RPM,Taveseek=5ms,平均扇区/磁道 = 1000)。

    (1)最好的情况:给定逻辑块到磁盘扇区的最好的可能的映射(即,顺序的),估计读这个文件需要的最优时间

    (2)随机的情况:如果块是随机地映射到磁盘扇区的,估计读这个文件需要的时间

    1MB=2^20字节,即数据存储在2000个逻辑块中;Taverotation=0.51/10000RPM60secs/1min*1000ms/s=3ms

    (1)T=Taveseek+Taverotation+2Tmaxrotation=5ms+3ms+26ms=20ms

    (2)块被随机的映射到扇区上,读2000块的每一块都需要Taveseek+Tavgrotation=8ms。所以读这个文件的总时间为T = 8ms*2000=16000ms=16s

    6.11
    在前面dotprod的例子中,在我们对数组x做了填充之后,所有对x和y的引用的命中率是多少?

    对于x和y数组,只有在引用第0个和第4个元素的时候发生不命中。因而命中率为75%

    6.12
    一般而言,如果一个地址的高s位被用作组索引,那么存储块连续的片会映射到同一个高速缓存组。

    1.每个这样连续的数组有片多少个块?

    2.考虑下面的代码;它运行在一个高速缓存形式为(S,E,B,m)=(512,1,32,32)的系统上

    int array[4096]
    for(i=0;i<4096;i++)
    sum+=array[i];
    在任意时刻,存储在高速缓存中的数组块的最大数量是多少?

    1. 1.2^t个块
    2. 若地址的前s=9位做组索引,所以t=18位做标记位;高速缓存容量是512个32字节的块。数组需要(4096*4)/32=512个块;这些块会被映射到组0中(数组是连续存放的),所以,缓存中只能保存一个数组块(尽管它的容量可以存放数组)。这样降低了高速缓存利用率。

    家庭作业

    6.42中采用嵌套循环,将buffer中的所有数据清零
    pixel类型的结构体
    struct pixel{

    char r;
    char g;
    char b;
    char a;
    

    } ;

    二维数组buffer定义为pixel类型。首先cptr指向buffer[0][0].第一项,后面的buffer[0][0].g,buffer[0][0].b,buffer[0][0].a均未被读入,第一次未命中,因为一行四个字节,所以读入buffer[0][0].r时把后面三项也读入了,这样再访问buffer[0][0].g等三项时均命中。所以不命中率为25%

    6.43
    //sizeof(char)==1;

    char cptr = (char)buffer;

    for(;cptr<(((char)buffer)+640480*4);cptr++)

    *cptr=0;

    代码依旧是将数组清零,第一行把数组从pixel类型转为char类型,cptr首先指向buffer数组的起始位置,依次往后,初始为空,cptr指向buffer[0][0].r高速缓存不命中,然后高速缓存把4字节数据都调到自己的第一行,后三个就会命中,这样就同6.42中结果一样,不命中率为25%

    6.44
    //sizeof(int)==4;

    int cptr = (int)buffer;

    for(;cptr<(((int)buffer)+640480);cptr++)

    *cptr=0;

    因为int本身就是4字节的,而第一行将buffer从pixel型强制转换为int型,所以cptr每指向数组一次,就一次指向了原结构体中的四项。首次cptr指向buffer[0][0]高速缓存不命中,高速缓存把4字节的数据调入,第二次cptr指向buffer[0][1],高速缓存再次不命中,所以此时的高速缓存不命中率为100%。

    本周代码托管截图


    感想

    这周的学习和上周一样,从周三开始学习,这周的内容我觉得跟实践没啥关系,主要就是理论的体系,刚开始看到一大叠内容觉得很烦躁,可是当进入学习的时候发现知识都是融会贯通的,书上的内容是具体详细的,在你的总结下其实可以变成很精炼的知识,在发现这个规律之后我对学习更有信心了,不再害怕学这门课,说实话挺感谢老师的,如果不是老师一直严要求,可能我已经放弃了,在这里不是拍马屁的跟老师说一声谢谢,我会继续努力下去。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 200/200 1/2 20/20
    第二周 300/300 2/4 18/18
    第三周 450/450 3/7 22/22
    第四周 600/600 4/9 30/30
    第五周 750/750 5/5 42/42
    第六周 820/820 6/6 50/50
    第七周 886/886 7/7 58/58

    参考资料

    • [《深入理解计算机系统V2》学习指导]
    • ...
  • 相关阅读:
    fenby C语言 P32
    fenby C语言 P31 使用数组的指针
    fenby C语言 P30
    fenby C语言 P29
    fenby C语言 P28
    fenby C语言 P27使用指针
    fenby C语言 P25
    fenby C语言 P26
    fenby C语言P24
    Python学习之路:通过socket实现处理多个连接
  • 原文地址:https://www.cnblogs.com/20145229ss/p/6011533.html
Copyright © 2020-2023  润新知