• 计算机组成原理-华科版本


    序言

    此篇博客为阅读 谭志虎版计组 中记录的内容。主要为书本内容摘抄和注解。
    为方便自己日后再次阅读,梳理。

    Memory

    大容量 高速度 低成本

    分类

    存储介质

    磁存储器:利用磁化单元剩磁的不同磁化方向来存储数据0和1. 体积大,存取速度慢,单位容量成本最低。

    半导体存储器:双极型存储器,MOS存储器。静态MOS存储器(SRAM),动态MOS存储器(DRAM),体积小,速度快,单位容量成本高。

    光存储器:利用介质的光学特性读出数据。便于携带,成本低。

    存取方式

    随机存储器(RAM Random Access Memory):按照地址随机读写数据存储单元,且存取访问时间与存储单元的位置无关。半导体存储器。

    顺序存储器(SAM Sequential Access Memory): 存储单元中的内容只能按地址顺序访问,访问速度和存储单元的位置有关。磁带。

    直接存储器(DAM Direct Access Memory): 不必经过顺序搜索就能在存储器中直接存取信息的存储器。磁盘。

    信息可改写性

    既能读出又能写入:读写存储器。

    不允许被读出:只读存储器。ROM read only memory

    信息可保存性

    易失存储器:断电后,所保存的信息会丢失的存储器。

    非易失存储器:断电后,所保存的信息不丢失的存储器。

    功能和存取速度

    寄存器存储器:字长一般与机器字长相等,CPU内部,存放结果。

    高速缓冲存储器:cache,用静态RAM构成,用于缓冲CPU和慢速主存之间的性能差异。

    主存储器:MM(Main Memory)CPU能直接访问的存储器,存放指令和数据。主存并不是单一的内存,还包括BIOS.硬件端口。

    外存储器:计算机主机外的存储器。磁盘,磁带等。

    存储器技术指标

    存储容量

    存储器可以存储的二进制信息总量。

    1K * 4 : 1K个单元,长度为4位

    128B 表示 该芯片有128个单元

    存取速度

    存取时间:存储器的访问时间,启动一次存储器操作到该操作完成所经历的时间。

    存取周期:连续启动两次访问操作之间的最短时间间隔。

    存储器带宽:单位时间内存储器所能传输的信息量。

    主存中数据的存放

    存储字长和数据字长的概念

    存储字长:主存的一个存储单元所存储的二进制位数。

    数据字长:计算机一次能处理的二进制的位数。

    这两个不一定相等。字长为32位的计算机所采取的存储字长可以是16位,32位,64位。

    地址访问模式

    主存通常按照字节编址。主存可以按照字节访问,还可以按16位半字访问。

    主存地址可以分为:字节地址,半字地址,字地址。

    字节地址右移一位得到半字地址,右移两位得到字地址。

    ; 数据段寄存器DS为 0 
    mov ah, [8] ; 按字节寻址 ah = 0x12
    mov ax, [8] ; 按半字寻址 ax = 0x3412
    mov eax, [8] ; 按字寻址 eax = 0x78563412
    ; 8  9  a  b
    ; 12 34 56 78
    ; intel为小端 低字节放低位 高字节放高位 方便机器处理 : Intel x86, IA64 RISC-V
    ; 按照大端 低字节放高位 高字节放低位 符合人类思维 : PowerPC
    ; ARM, MIPS 同时支持小端 大端
    ; 上述如果按照大端进行访问得到的结果为
    ; ah = 0x12
    ; ax = 0x1234
    ; eax = 0x12345678
    

    数据对齐

    现代计算机主存按照字节编址,但是高级语言中不同数据类型的变量对应不同的字节长度。

    如果按照对应字节长度顺序地分配地址,不好访问数据。

    因为主存虽然按字节编址,但是存储字长是字节的整数倍,但是当一个多字节变量分布在不同字存储单元中时,比如double类型,8字节,如果是一个存储字长为4字节的机器,最优的放置方案是放置连续的字存储单元。但是如果按照字节去分配,它就有可能分散在3个字存储单元中。

    这样虽然会造成一定的空间浪费,但是可以有效提高存储速度。现代编译器除了会对数据变量进行边界对齐,还会对数据结构进行边界对齐。

    半导体存储器

    静态MOS存储单元

    存储单元是存储器中最小存储单元,作用是存储一位二进制信息。

    1.具有两种稳态

    2.两种稳态可以经过外部信号控制相互转换

    3.经控制后可以读出其中信息

    4.无外部原因,其中信息可以长期保存

    存储单元扩展

    采取二维的双译码结构,减少地址线条数。但是这样一次只能访问一位数据。

    为了访问多位,需要字长扩展。

    字长扩展

    字长扩展其实很简单,要一次访问多位数据,其实就是要同一个地址下能够取出多位数据。

    只需要把之前的多个一位合并,组成存储阵列即可。

    6位x向地址,6位y向地址,总共4片阵列,那么得到的就是2^6 * 2^6 * 4 = 4096*4位

    动态MOS存储器

    存储器以动态MOS存储元为基本单位组成的存储器称为动态MOS存储器。(DRAM)

    只读存储器

    信息只能读出,不能随意写入的存储器称为只读存储器。记为ROM。

    通过一定方式将信息写入之后,信息就固定在其中,且具有非易失性,即使电源断电,保存的信息也不会丢失。

    Mask ROM:掩膜式只读存储器,只能读出,不能修改,灵活性较差,信息固定不变,可靠性高。

    Programmable ROM:用户可写一次的ROM;

    EPROM Erasable Programmable ROM,可擦除可编程只读存储器。可多次写入的ROM。写入的信息可长期保存,当不需要这些信息或希望修改的时候,可以擦除后重新写入。

    主存的组织与CPU的连接

    存储器与CPU的连接

    单片存储器容量有限,要获得一个大容量的存储器,通常需要将多片存储器按照一定方式组织来实现并与CPU连接。

    需要注意以下几点:

    1.连接的地址线的数量与CPU要访问的主存容量有关。

    2.连接的数据线的数量与计算机字长有关。

    3.SRAM芯片的控制线包括片选信号和读写控制线。

    4.ROM芯片的控制线只有片选控制线。

    5.DRAM没有片选控制线,进行容量扩展时,可以利用~RAS和 ~CAS控制芯片的选择。

    存储器的扩展

    由于存储器芯片的容量及字长与目标存储器的容量及字长之间可能存在差异,应用存储芯片组织一定容量与字长的存储器时,可采用位扩展,字扩展,字位同时扩展的方式组织。

    位扩展即字长扩展。需要256K * 32 的存储器芯片,但是只有256k * 1 的存储器芯片,这个时候就需要位扩展。

    字扩展即容量扩展,需要 2M * 8 但是只有 256k * 8, 此时就需要利用一部分地址去组成 译码器。进而去选择确切的芯片。

    字位同时扩展即需要 2M * 8 ,但是只有 256k * 1 。要不先进行位扩展,再进行字扩展,要不反过来。

    Cache

    在主存和CPU中增加一个隐藏的小容量的快速的SRAM。

    将主存中经常访问或即将访问的数据的副本调度到小容量的SRAM中,使得大部分访问都可以在快速的SRAM中进行。(程序局部性原理)

    程序局部性原理:在一段时间内,整个程序的执行仅限于程序中的某一部分,而执行程序所需的指令和数据也仅局限于某个存储区域内。

    时间局部性原理:当程序访问某个存储位置时,该位置也可能在未来被多次访问。

    空间局部性原理:一旦程序访问了某个存储单元,其周围的存储单元也即将被访问。

    CPU不再直接访问主存,而是访问Cache。

    如果数据在Cache, 即为 Hit 命中。 命中时的数据访问时间称为命中范围时间tc。查找时间和cache访问时间。

    如果数据不在Cache中,即为Miss 数据缺失。此时需要将缺失数据从主存调入Cache。

    数据缺失时的访问时间称为缺失补偿(Miss Penalty)

    为了快速查找和比较,cache和主存都被分为多个固定大小的数据块。

    主存地址和cache地址可以分为块内地址和块内偏移地址(offset)

    读操作,命中cache即读入,缺失从mm中取出数据放入cache再读取。

    写操作,命中cache后,决定是写到cache中(写回),还是一直写到mm中(写穿)。写回速度快,但是会导致mm和cache数据不一致,cache中的数据称为脏数据。写穿数据一致,但是速度慢。

    缺失则从mm中取出数据再进行上述判断。

    cache实现的关键技术

    数据查找(Data Identification)如何快速判断数据是否在cache中

    地址映射(Address Mapping)主存中的数据块如何放到cache中

    替换策略(Placement Policy)cache满后如何处理,选择什么样的数据块进行操作

    写入策略(Write Policy)如何保证cache和memory数据的一致性

    相联存储器 Content Addressable Memory CAM

    按内容进行访问的存储器,用于存放查找表,其内部存储的基本数据单元是键值对(key, value)

    输入的不是地址,而是关键字key。输出该关键值对应的value。CAM用于cache的快速查找,用于在虚拟存储器中存放段表,页表和TLB表。

    地址映射 多做题 多理解

    全相联 Full Associative Mapping

    各主存块都可以映射到cache的任意数据块。

    将主存按照 每2^w个 分块,得到内存块b0,b1,b2…bn-1,bn,…,b2n-1,…,bmn-n,…,bmn-1

    那么整体地址就可以分为 s + w bits。2^s = mn

    主存地址-> 主存块地址(tag) 2^s + 块内偏移(offset) 2^w

    对于cache 除了要存储具体的信息外,还需要去存储标记信息。

    有效位+主存块地址+数据块副本。

    cache总共有n块。因此cache副本缓冲区的容量为 n * 2^w * 8 bits = n * 2^w bytes

    如果再算上标记位,cache实际容量为 n * (1 + s + 8 * 2^w) 位。

    这样的话,每次查询数据就需要去做n*(1+s)位比较,看看在cache中是否存在相关数据块,找到后输出,这个数据块中offset 后的 数据。

    特点:

    1.主存数据块可以映射到cache任何一行,cache利用率高

    2.只要cache中还有空行就不会引起冲突,因此cache冲突率低

    3.查找时需要并发比较查找表中所有项,每一个cache行对应一个比较电路,硬件成本比较高,只适合于小容量cache使用。

    4.cache满时载入新数据块需要利用替换算法进行替换,替换策略和算法较为复杂。

    直接相联 Direct Mapping 课后两题一定要做

    各主存块只能映射到cache中的固定块。

    cache 行号 i = 主存块号 j mod (cache 行数 n)

    主存地址-> 区地址 s-r + 行索引 r + 块内偏移 offset w 位

    2^r >= n

    也就是说cache 的每一行 必然是它区地址 中 2^r 块中 对应的那一行。 要再读取这行的具体数据,就再根据offset去读。

    因此,cache的实际容量为 n * (1 + (s-r) + 8 * 2^r )位。

    直接相联的替换算法较为简单,如果访问不命中则直接替换行索引译码器选中的行即可;所选中的行存在脏数据,需要将脏数据写入二级存储器保证数据一致。

    特点:

    1.主存数据块只能映射到cache中的特定行,cache利用率低,命中率低。

    2.index 相同的所有主存块映射到cache中的同一行,cache未满也可能发生数据冲突,cache的冲突率高。

    3.查找时只需根据index字段访问对应cache行的标记字段tag并进行比较,只需要一个比较器,硬件成本低,适合于大容量cache的使用。

    4.无须使用复杂的替换算法,直接替换冲突数据即可。

    组相联 Set Associative Mapping

    各主存块只能映射到cache固定组中的任意块。
    cache 被分为 n组,每组k行。

    先直接再全,而不是先全再直接的原因是 n一般比k大,如果采取先全再直接,那么全的比较电路 就是n个一块比较再 算上直接的一次。先直接再全,比较电路就是1+k。所以采取的是先直接再全。

    cache 组号 = 主存块号 mod (cache 组数)

    算出来组后,进行多路判别在哪里

    主存地址-> (s-d) + d + w = 标记tag + 组索引index + 块内偏移 offset

    cache 分为 n 个 组

    cache 块大小为 2^w 字节

    组数为 n = 2 ^ d

    主存容量 = 2^(s+w)字节

    cache容量= k*n (1+ s-d + 8 * 2^w)位

    替换算法

    1.先进先出算法

    按照数据块进入cache的先后顺序进行替换。需要去记录cache块进入的时间。系统开销小,但是没有考虑局部性,可能会把常常使用的数据给替换了,降低了cache的命中率。

    2.最不经常使用算法

    将访问次数最少的cache淘汰掉。需要去记录cache被使用的次数,硬件成本高。其并不能反映近期使用情况,比如之前有块常常被使用,但是已经很久没使用了,现在有前期不被使用,而后期被频繁使用,但是可能被淘汰。因而降低了cache的命中率。

    3.近期使用最少算法

    同样需要设置计数器。当某块命中后,将其计数器清0,其他行加1.需要替换时,比较各特定行的计数值,将计数值最大的换出。

    缺点在于实现快速比较多行计数器。当计数器较多时,比较器需要归并比较。但是如果是2路组相联的cache,情况将会简化。二选一并不需要计数器,利用二进制位即可标识。Pentium使用的即是这种算法。

    4.随机替换算法

    随机选择一行替换,硬件实现最简单。速度快。

    缺点是容易替换马上就要使用的数据,降低cache的命中率。

    但是随着cache容量的增加,负面影响会降低。

    在虚拟存储器TLB表中为了提高替换速度,采取了随机替换法。

    对于全,替换需要看所有,对于直接,不用管替换,对于组,只需要管对应行。

    写策略

    1.写回法 Write-Back WB

    使用写回法,每次修改内存数据,会写到cache中。

    cache再设置相关位,标识此行是否被改写过。此位被称为脏位(Dirty Bit),。

    当cache要被换出的时候,根据该位去判断是简单的丢弃,还是需要写入主存。

    2.写穿法 Write-Through WT

    每次写数据,都改写cache,并再改写主存。

    这种方式可以避免cache和主存之间数据不一致的问题。可是,这只能在单CPU中避免。

    对于多CPU,每个都有自己的cache,就算写穿了,也不能保证其他CPU中的cache的数据和主存数据保存同步。

    并且这种方式会降低cache的功效,本来可以直接写入的,现在还额外写了一个cache。

    cache应用

    分离cache,将指令和数据分开处理。并且还能利用指令和数据的不同局部性来优化性能。

    采用整体cache,实现和设计上简单,但是会出现执行存取数据时,指令预取会去从同一cache读指令的问题。

    多级cache

    将cache和处理器集成在一块芯片上->cache L1。

    减少了对片外总线的访问。

    在CPU和主存之间再设置了一个cache->cache L2。

    最新的cache都集成在了CPU内部。

    软件cache,只要存在性能,容量,价格差异,就可以利用cache技术优化存储系统的性能,使得存储系统在性能上接近于快速的一级存储器。

  • 相关阅读:
    深信服测开实习
    线性表的插入、删除和查询操作
    【linux】SourceForge 开源软件开发平台和仓库
    Git基础使用
    【 C++ 】vector的模拟实现
    【.NET CORE】yisha框架校验输入内容
    【Python刷题篇】——Python入门 010 内置函数(三)
    深度学习图像分类算法研究与实现 - 卷积神经网络图像分类 计算机竞赛
    Spring源码解析(十一):spring事务配置类源码
    ISP 处理流程
  • 原文地址:https://blog.csdn.net/SDDHDY/article/details/127039469