存储器

存储器的类型有哪些?

  • 随机存储器(random access memory,RAM):RAM是易失性存储器
    • 静态随机存储器(SRAM)。静态RAM只要电源供电不断就可以维持所需要的数据。
    • 动态随机存储器(DRAM)。动态RAM由一个小电容构成,因为电容会泄露电荷,因此每隔几毫秒就需要为DRAM充电,
    • SRAM速度更快,价格更高。DRAM的存储密度更高(单块芯片存储更多的位数),消耗功耗更低,产生的热量小得多。通常将两种技术组合,DRAM用作主存储器(primary memory可读写存储器)。SRAM用作高速缓存存储器
  • 只读存储器(read-only memory,ROM):ROM为非易失性存储器,采用硬连线,可长久保持所存放的数据,也可应用于嵌入式系统、计算机外围设备等,基本的ROM可分五种不同类型:ROM、PROM、EPROM、EEPROM和闪存。计算机里面有小rom用于存放启动计算机所必须的程序
    • PROM:可编程只读存储器,内部有熔断丝,通过烧断熔断丝对芯片编程,一旦编程完成所有数据和指令都不能更改。
    • EPROM:可擦除PROM,用发射紫外线的特殊工具将原有芯片内容擦除再重新编程。
    • EEPROM:电可擦出PROM,芯片上的信息擦除只要施加一个电场,无需特殊工具,并且可以只擦除部分信息(一次擦除一个字节)。
    • 闪存本质为EEPROM,但可按块擦写数据,速度比EEPROM快。

存储器层次结构Hierarchy是什么?

存储器分层结构系统基本类型包括:寄存器、高速缓存、主存储器、辅助存储器(硬盘:磁盘或者固态硬盘,也就是基于闪存的硬盘存储器、可移动存储介质等)离线大容量存储器(第三级存储器:光盘磁带;和离线存储器:软盘闪存外置硬盘)。按存储器离开处理器的距离对存储器分类,距离按照访问存储器所需要的机器周期数目测量。

1576582587086-dc8cb004-576c-459e-a532-c417618ab366.png

寄存器、一级缓存、二级缓存、主存、固态硬盘、固定硬盘、光盘、磁带、USB闪存、可移动磁盘

命中缺失名词什么意思?

  • 命中(hit):CPU请求的数据驻留在要访问的存储器层中
  • 缺失(miss):CPU请求的数据不在要访问的存储器层。
  • 命中率hit rate):CPU找到所需数据的百分比。
  • 缺失率miss rate):1 - 命中率。
  • 命中时间hit time):在某个特定的存储器层,CPU取得所请求信息所需要的时间。
  • 缺失惩罚miss penalty):处理一次缺失时间所需要的时间,包括利用新数据块取代上层某个数据块所需要的时间、所需数据传递给处理器需要的附加时间。

什么是访问局部性locality?

  • 时间局部性(Temporal locality):最近访问过的内容在不久的将来可能再次被访问。
  • 空间局部性(Spatial locality):对存储器地址空间的访问形成团簇的集中倾向(如数组或循环操作)。
  • 顺序局部性(Sequential locality):访问存储器的指令倾向于按顺序执行。

总结:局部性原理使系统在任意给定时刻只需要访问整个存储空间中非常小的部分,存储在该位置的数值会被重复读取。将大量信息存储在巨大的低成本的存储器中,再将部分数据复制到容量小、速度快的高层存储器中,就可以获得与高层存储器几乎相同的访问速度。

高速缓存

集成在CPU中,分数据缓存指令缓存。高速缓存存储器不通过地址访问,而是按照内容进行存取,因此又称按内容寻址的存储器(content addressable memory,CAM),

新块存放在缓存里面的位置决定于:缓存映射策略缓存大小

缓存映射策略

  • 主存储器块需要竞争才能获取高速缓存中的对应位置。
  • CPU访问的时候会首先生成一个主存里面的地址,如果对应的数据已经存在缓存里面那么在缓存里面的地址和CPU给的地址不一样,需要转换为在缓存里面的地址,转换的策略就是下面说的三种:直接映射、全关联、组关联
  • 主存储器地址的各个位划分为不同的组,每一个组叫做一个字段,映射方案通常****将地址的二进制位分为不同的组(2~3个地址域),如何使用这些字段取决于不同的映射方案,****规定特殊意义来实现地址转换
  • 数据访问流程:
    • 当生成一个存储器地址时,CPU首先搜索高速缓存存储器判断需求的数据块是否存在,找不到则将主存储器中该字所在的整个块装入高速缓存。
    • CPU使用主存储器地址的其中一个地址域,直接给出已驻留在高速缓存的请求数据的位置,称为高速缓存命中(Cache hit);
    • CPU对没有驻留在高速缓存的数据,会指示出数据将要存放在高速缓存中的位置,称为高速缓存缺失(Cache miss)。
    • 不同的字段不同作用,有一个字段:当已经拷贝到缓存里面时候指的是数据存储在缓存里面的位置,没有放到缓存里面指的是存储在内存里面的位置。每一个块配备一个有效位来实现。CPU将检查高速缓存块的一个有效位,验证所引用的高速缓存块的合法性,若有效位合法,表示引用数据块正确,可能产生高速缓存命中,否则CPU访问主存储器。之后,CPU还会将属于高速缓存块的标记和主存储器的标记域(主存储器地址中划分的一组二进制位,标记与对应数据块一起存放到高速缓存中)比对,匹配则产生高速缓存命中。

直接映射高速缓存

直接映射通过模计算实现映射

为了实现直接映射,二进制主存地址划分为多个字段,偏移字段识别块内字/字节地址,块中的字节数或者字数决定 了偏移字段的位数,缓存总块数决定块字段的位数,标记字段就是剩下的位数,三块的位数之和等于主存地址位数

1576587237377-fe367860-33d3-424c-a5de-371c9dc2def9.png

举例:存储器由2^14个字节组成(说明地址是14位),高速缓存有16个存储空间块(说明块域有4位),每个块包含8个字节(说明偏移域有3位),因此存储器共被分为2^11个块(14-3),每个存储器地址为14位二进制数。14位地址中,最右边三位为字域,中间4位指定高速缓存数据块(2^4=16),高7位为标记域。

标记(7位) 块(4位) 字(偏移量),3位
  • 每个块的标记都和该块一起存放在高速缓存中
  • 映射时主存地址的块域决定高速缓存的位置,对比内存地址的标记域和缓存里面的标记可以区分高速缓存的第0块是主存储器中的哪一块。整个过程无需搜索,成本低于其它种类高速缓存。偏移指的是确定块之后块内偏移几个字节
  • 缺陷:假设主存储器中的0块和16块循环调用,则每次都会产生高速缓存缺失。
  • 主存和缓存的块大小是一致的

全关联映射

允许主存储器的数据块存放到高速缓存的任意位置。要找到某个数据块必须搜索全部高速缓存,需要把请求的标记与所有存放在高速缓存中的标记比对,其实现需要特殊硬件,成本较高。

因此整个高速缓存需要按照关联存储器(associative memory)模式构建,以便CPU可以执行平行搜索,关联映射需要把主存储器的地址划分为标记域和字域两部分,

对于全关联映射,如果高速缓存已满,需要一种置换算法决定从高速缓存中丢弃哪个数据块。被丢弃的块称为牺牲块。最简单的置换方法是先进先出,但现在已经较少使用。

组关联映射

直接映射和全关联组合成N路组关联映射(N-way set associative Cache mapping),映射方法类似直接映射,区别在于不是将数据块映射到高速缓存中的某一个空间块,而是映射到由几个高速缓存块组成的某个块组中。同一个高速缓存的所有组的大小必须相同。

N路就代表有N组

在组关联高速缓存中,主存储器地址分为标记域、组域和偏移域,作用类似。

一个N路组关联高速缓存,每组包含N个高速缓存块。在每组内使用关联映射方式,搜索组内全部数据,与标记域比对。

缓存替换策略

最近最少被使用(LRU):考虑时间局部性,可以跟踪每个高速缓存块上次访问的时间,选择最近最少被使用的高速缓存块作为牺牲块,这种算法称为LRU(least recently used)算法,LRU需要系统保留每个高速缓存块的历史访问记录,因此需要较大存储空间,拖慢速度。

先进先出(FIFO):选取存放在高速缓存中时间最长的块作为牺牲块。

随机选择:可能将即将需要的数据丢弃,降低平均性能,并且很难有真正意义的随机置换。

有效访问时间和命中率

分层存储器性能 采用有效存取时间(EAT)或每次访问的平均时间量度。

EAT = 命中率与相连存储器层次的相对访问时间产生的加权平均

例如假设缓存访问时间为10ns,主存储器为200ns,缓存的命中率为99%,则:

  • 重叠(并行)访问:EAT = 10×99% + 200 × 1% = 9.9ns + 2ns = 11.9ns。
  • 非重叠(顺序)访问:EAT = 10×99% + (200+10) × 1% = 9.9ns + 2ns = 11.9ns。

由此可见,虽然存储器大部分采用200ns的慢速技术,但整体类似一个高效的大存储器。

缓存失效时间:

如果程序的局部性不好,高速缓存会失效,并导致存储器的层次结构性能很差,尤其是面向对象编程可能导致程序的局部性不是最佳

缓存写策略:

对高速缓存脏块的处理方案,脏块指高速缓存中已被修改过的数据块。两种基本的些策略:

  • 写直通策略:在每次对高速缓存的写操作时,处理器同步更新主存储器中对应的数据块,可以保证高速缓存与主存储器的数据始终一致。实际应用中,因为大多数存储器访问都是读操作,因此可以忽略写通策略对主存储器的写操作带来的系统速度减慢。
  • 回写策略:指只有某个高速缓存块被选择为牺牲块而必须从高速缓存移出时,处理器才更新主存储器中对应的数据块。回写速度比写直通快,缺点在于数值的不同步,如果某个进程在回写主存储器之前发生中断(或崩溃),则高速缓存中数据可能丢失。

提高高速缓存命中率可以使用更好的映射算法、更好的写操作技巧、更好的置换算法和更好的程序编码方案。例如访问二维数组,按行访问的编码方案要比按列访问的编码方案增加30%命中率。简单增加高速缓存容量大小可以增加1~4%命中率,但无法保证始终如此。

哈佛缓存

数据和指令分开存放

  • 数据缓存:数组比链表有更好的局部性,编程会影响数据缓存的命中率
  • 指令缓存:数据缓存命中率高的时候指令缓存命中率才会对提高性能有影响,因为指令一般顺序执行,没有可提升空间

虚拟存储器

虚拟存储器使用硬盘作为RAM的扩充,增加了进程可以使用的有效地址空间。通过在硬盘开设一个区域(页文件),保持主存储器的信息块。最常用实现方法是分页机制,将主存储器和程序都划分为相同大小的块,将程序块根据需要存放到存储器块中(程序各个块可以无序存储,并且主存储器只需要存在特定片段就可以运行程序,暂时不用的程序部分存储在硬盘页文件中

因此程序的虚拟地址一旦由CPU生成,就需要转换成主存储器的物理地址。

  • 名词解释
    • 虚拟地址(virtual address):进程使用的逻辑地址或程序地址。CPU生成的地址即对应虚拟地址空间。
    • 物理地址(physical address):物理存储器的实际地址。
    • 映射(mapping):将虚拟地址转换为物理地址,类似高速缓存映射。
    • 页帧(page frame):由主存储器分成的相等大小的信息块或数据块。
    • 页(pages):由虚拟存储器(逻辑地址空间)划分成的信息块或数据块,每页大小与一个页帧相同。在硬盘上存储虚拟页,供进程使用。
    • 分页(paging):将一个虚拟页从硬盘复制到主存储器的某个页帧。
    • 存储碎片(fragmentation):变得不能使用的存储器单元。
    • 缺页(page fault):当一个请求页在主存储器中没有找到时发生的事件。

分页实现虚拟存储

  • 概念:按照固定大小的页帧为各个进程分配物理存储空间,用页表跟踪每个虚拟页的物理位置,每个进程都有自己的页表,页表驻留在主存储器中页表有N行,N为该进程的虚拟页的页码数。若当前进程的某些页不在主存储器中,页表会将该页的有效位置零。通常页表还会附加一些内容,如修正位指示页中内容是否发生了改变,提高CPU进行返回页内容到硬盘的操作效率;使用位指示页的使用情况,如果处理器访问过某一页则置1,一定时间后会置零,若长时间保持0,则将该页从主存储器移出。如果程序进程并不正好占用几个页,或进程本身全部内容小于一个页的大小,则分页后会产生潜在的内部碎片,进程占用的最后一个页帧的剩余空间将被浪费。

  • 工作原理:进程生成一个虚拟地址时,操作系统必须动态将虚拟地址转换成数据实际驻留的存储器物理地址。为简化问题,假设不存在高速缓存,从程序角度看,一个10字节程序的最后一个字节会存放在地址9,而实际可能驻留在物理存储器的1239位置(程序从1230位置开始装入)。将虚拟地址分为页域偏移量,偏移量表示数据在页内位置。
    流程如下:1.从虚拟地址提取页码,2.从虚拟地址提取偏移量,3.访问页表将页码转换为对应的物理页帧数,首先在页表中查找页码,之后检查该页的有效位:若有效位为0,说明产生了缺页事件,操作系统介入,在磁盘上查找到对应的页,在主存储器寻找到一个空帧(如果主存储器满,则使用置换算法移除一个牺牲页,并将牺牲页复制到硬盘),将要使用的页复制到空页帧内,并更新页表(牺牲页置零,移入页置一);若有效位为1,则查找的页已在主存储器中,使用实际物理页帧数代替虚拟页码,加上偏移量产生物理地址。

  • 举例:以一个真实的小系统为例,不涉及高速缓存。假设长度为15字节的程序需要访问一个按字节编址的8字节存储器,每一页的长度是两个字。程序执行时,按照以下地址引用:0,1,2,3,6,7,14。假设另一个进程正在占用主存储器的第0帧和第1帧,当请求地址0时,产生缺页事件,因此第0页中的地址0和地址1都被复制到主存储器的第2帧。请求地址1时,页1已经存在于主存储器中,因此产生一次命中。假设此时占用主存储器前两帧的进程已经结束,接着引用地址2,产生缺页事件,地址2和3所在的页1会被复制到存储器的第0帧。继续进行到访问14之前,此时主存储器已满,页表情况如图所示。最后访问地址14将产生某个牺牲页,将牺牲页替换后,主存储器中即产生了内部碎片,该页帧的第二个字节并没有被使用1571878801150-ed8bc205-763c-4caa-8d46-c266399969c9.png

  • 假设一个更大规模的存储器系统,不考虑高速缓存。虚拟地址空间长度位为8KB字,物理存储器大小4KB字,按字节寻址,物理存储器页的大小为1KB字。虚拟存储器大小为8KB=213,因此虚拟地址13位,其中3位地址用作页域,共8页,每页有210个偏移量,对应每页有210个字节。物理存储器大小4KB,12位地址,2位地址作为地址域,有22=4个页帧。地址转换即将虚拟存储器的3位页域转换成物理存储器的2位页帧域。

  • 分页有效存取时间:处理器每次对虚拟存储器的访问都必须至少执行两次对物理存储器的访问操作,一次引用页表,一次访问要请求的实际数据。假设访问一次主存储器时间200ns,产生的缺页率为1%,处理缺页的时间为10ms,包括将缺页转移到存储器,更新页表以及引用数据所需要的总时间。该存储器的EAT = 0.99 ×(200ns+200ns)+ 0.01 ×(10ms + 200ns)= 100398ns。即使缺页率为0,有效存取时间仍为400ns,是存储器访问时间的两倍,原因在于页表存储在主存储器中。

  • 快表--转换旁视缓冲器(translation look-aside buffer,TLB):存放最近的页查询数据值,可以加速页表查询时间。每个TLB入口目录由一个虚拟页页码和对应的物理页帧帧数组成,使用关联高速缓存实现TLB。使用TLB的一个查询过程为:1.从虚拟地址提取页码和偏移量,2.在TLB中搜索虚拟页码,3.如TLB中找到虚拟页码和物理帧数对,则将偏移量加上物理帧数产生实际物理地址,直接访问该存储单元,4.如发生TLB缺失,则处理器重复分页存储器的流程,并更新TLB。

  • 分页虚拟存储的优缺点:查找页表实现地址转换需要较大开销,需要额外空间存储页表,需要专门的硬件和操作系统支持。优点在于可以允许系统运行虚拟地址空间比实际物理存储器空间大的多得程序,允许进程和进程自身分享物理存储器,使用固定大小的页帧简化存储器空间的分配和地址安排问题。

分段实现虚拟存储

  • 分段机制不把虚拟地址空间和物理地址空间划分为相等的固定大小的页和页帧,而是将虚拟地址空间划分为多个可变长度的逻辑单元,称为段。物理存储器不再进行实际的空间分割。当需要将某个段复制到物理存储器时,操作系统查找足够大的自由存储空间存储整个段。每个段都有一个表示该段在存储器中位置的基地址和一个指示段的大小的界限。每个程序由若干个段组成,每个程序也有一个相应的段表,段表包含每个段的基地址和界限对的集合,只要提供段的基地址和段内偏移量即可转换存储器访问。使用分段更容易实现存储空间的保护和共享:例如一个程序的虚拟地址空间可以分为代码段、数据段、堆栈段和符号表段,每个段大小长度各不相同,用户可以很方便的选择数据段共享出去。
  • 外部碎片:分段机制不存在内部碎片问题,但在分段配置和解除分段时,存储器中的自由空间块会变的残缺不完整,最后存储器会留下许多长度较小的自由空间块,不足以存放一个整程序段。但对于外部碎片,存储器上总的空间足够分配给一个程序进程使用,但这个存储空间是不连续的,因此可以通过碎片收集,对存储空间上已经占用的信息块进行重新调整。而对于内部碎片,无法使用多余的空间。

分段和分页组合

使用分页更容易管理,不存在外部碎片问题,但需要更多系统开销;使用分段可以避免内部碎片问题,支持段的共享和保护。在组合方式中,虚拟地址空间被分割为长度可变的段,段内分为固定大小的页面,主存储器的物理空间对等的划分为相等大小的帧。每个段都有一个页表,每个程序有多个页表,系统的物理地址划分为三个域,段域指示系统对应段表,页域用作进入页表的偏移量,第三个域为页内偏移量。

奔腾处理器的存储器管理

奔腾为32位虚拟地址和32位物理地址,分页大小为4KB或4MB,采用分页和分段管理机制的不同组合:包括没有分段和分页的存储器,只有分页的存储器,只有分段的存储器以及二者兼有的存储器。其采用两级高速缓存:L1和L2,都使用一个32位大小的存储区块。L1靠近处理器,L2位于处理器和存储器之间。L1被分割为保存指令的高速缓存(I-Cache)和保存数据的高速缓存(D-Cache)。两个L1 Cache都使用一个LRU位处理置换操作。每个L1有一个TLB,D-Cache的TLB有64个入口目录,I-Cache只有32个入口目录。两个TLB都采用4路的组关联映射方式。L2的规模从512KB(早期)增加到1MB(后期型号)。L2 Cache和两个L1 Cache都采用2路组关联映射方式,都采用MESI高速缓存的一致性协议,每一路高速缓存线都使用2位二进制数存储下列MESI状态中的一种:1)M:高速缓存中数据被修改,与主存储器中不同,2)E:独占的,高速缓存数据没有被修改过,与主存储器相同,3)S:共享的,高速缓存的线/块可以呵其他高速缓存的线/块共享,4)I:无效的,所请求的线/块不在高速缓存

posted on 2025-10-12 19:21  chuchengzhi  阅读(129)  评论(0)    收藏  举报

导航

杭州技术博主,专注分享云计算领域实战经验、技术教程与行业洞察, 打造聚焦云计算技术的垂直博客,助力开发者快速掌握云服务核心能力。

褚成志 云计算 技术博客