计算机组成---存储系统

写在前面:本篇文章内容来自作者原创,以及 任国林·《计算机组成原理》第2版,华清远见科技有限公司教材《ARM嵌入式》,华清远见科技有限公司《嵌入式操作系统》以及一些计算机作品参考文献,以及部分网络内容(截图),若有侵权,请联系作者删除。

目录

存储系统概述:

存储系统的工作过程

一、存储系统

1.1 基本概念

1.存储器的层次结构

2.存储器的分类

3.存储器的性能指标

1.2主存储器

1.2.1主存储器的基本组成

1.2.2 随机存取存储器RAM

1.存储元件不同导致的特性差异

2.DRAM的刷新

3.DRAM的地址线复用技术

1.2.3 只读存储器ROM

1.2.4 主存储器和CPU的连接

1.单块存储芯片与CPU的连接

2.多块存储芯片与CPU的连接

1.2.5 双端口RAM和多模块存储器

1.双端口RAM

2.多模块存储器

3.应用

1.3 Cache

1.3.1 Cache的基本概念和原理

1.3.2 Cache和主存的映射方式

(1)全相联映射

(2)直接映射

(3)组相联映射

1.3.3 Cache替换算法

1.随机算法(RAND)

2.先进先出算法(FIFO)

3.近期最少使用(LRU)

4.最近不经常使用(LFU)

1.3.4 Cache写策略

1.写命中

2.写不命中

3.多级Cache

1.4 虚拟存储系统

1.4.1 页式存储

1.4.2 虚拟存储器

1.页式虚拟存储器

2.段式虚拟存储器

3.段页式虚拟存储器


存储系统概述:

        存储器的功能是存放指令和数据,存储器使计算机具有了记忆能力,进而具备自动进行操作的能力,因此,存储器在计算机中的地位很重要。存储器设计中,采用什么存储介质、怎样控制操作过程是一个基本问题;怎样进行结构组织,使存取速度较快、总成本较小是另一个重要问题。
本章主要讨论主存储器、高速缓冲存储器的基本组成与工作原理,以及虚拟存储器的基本原理及实现技术。

存储系统的工作过程

        根据存储程序工作方式的要求,程序被调入主存后方可执行,程序执行时,CPU是按主存地址访问存储系统的。
        CPU按主存地址访问Cache时,Cache-主存层次的辅助硬件控制整个访问过程,若访问信息在Cache中,Cache立即完成访问;否则,从主存中调入访问信息后,再继续未完成的访问。由于存在程序访问的局部性,信息在Cache中找到的概率很高,平均访问速度接近于Cache速度。相关技术将在1.3节高速缓冲存储器中介绍。
程序总是存放在辅存中的,主存怎么分配给程序使用,目前由操作系统及相关硬件共同完成。程序执行时,不需要全部装入主存,有需要时自动在主存-辅存之间交换信息,并能够自动将程序地址转换成主存地址。这样,CPU就可以按程序地址访问存储器,这个存储器的空间不再受主存容量限制了,其访问速度接近于主存速度。相关技术将在1.4节虚拟存储器中介绍。
        
可见,Cache-主存-辅存三级存储系统,可以达到容量为辅存容量、速度接近于Cache速度、价格略超过辅存价格的目标。

一、存储系统

1.1 基本概念

知识总览:

image-20210623232321106

1.存储器的层次结构

image-20210623232503861

主存——辅存:解决了主存容量不够的问题。

Cache——主存:解决了主存与CPU之间速度不匹配的问题。

image-20210623232825208

2.存储器的分类

存储器有很多属性,从不同的角度可以有不同的分类方法。例如,按电源掉电后信息的可保存性来分类,按存储器有易失性,非易失性分类,按功能和访问方式分类等。

(1)按层次进行分类

image-20210623233313249

(2)按传输介质进行分类

        存储介质指可用两个稳定的物态来表示二进制0和1的物质或元器件。目前主流的存储介质有半导体器件、磁性材料和光介质材料3种。
        半导体存储器利用电平高低表示信息,有TTL型、MOS型两种类型,后者被广泛使用。磁性材料存储器利用剩磁状态表示信息,有磁芯、磁表面两种类型,磁芯存储器已被淘汰,磁表面存储器又可分为磁盘、磁带两种。

        光介质存储器利用不同物态的反光性表示信息,常见的是光盘。除半导体存储器为易失性存储器外,其余两类都是非易失性存储器。

(3)按存取方式进行分类

         存取方式指存储器中信息的定位方法及操作方式。按照存取方式,存储器可分为随机存取、顺序存取、直接存取和只读4种类型。

  • 随机存取存储器(Random Access Memory,RAM)

        这类存储器的访问时间固定,通过译码器定位信息存放位置。由于访问时间与访问地址值无关,为了提高存储空间的利用率,RAM的编址单位可以很小,如存储字长通常是1B。半导体存储器就是一种RAM.

  • 顺序存取存储器(Sequential Access Memory,SAM))

        这类存储器的信息总是按顺序读出和存储,访问时间完全取决于信息存放位置与当前位置的距离。为了提高存取效率,每次访问的数据量都很大。磁带就是一种SAM,它的特点是存储容量大、存取速度慢,常用作海量数据的脱机备份存储器。

  • 直接存取存储器(Direct Access Memory,DAM)

        这类存储器的存取方式和存取性能都介于SAM和RAM之间。访问时,先用RAM方式进行信息所在区域的寻址,再用SAM方式进行信息的存取。为了提高存取效率及存储空间利用率,DAM的编址单位通常是大小固定的记录块。磁盘是一种典型的DAM,记录块称为扇区,扇区大小通常为512B,单个盘片的磁盘地址由磁道号及扇区号两级地址组成。

  • 只读存储器(Read Only Memory,ROM)

        这类存储器的存取方式是只读不写,信息寻址方法取决于内部结构是RAM还是DAM,而RAM、SAM、DAM属于读写存储器(RWM)。随着用户需求的变化,目前ROM也允许修改信息,只是ROM具有非易失性,这是ROM和RWM的最大区别。

(4)按应用功能分类

        按照存储器在计算机中的应用功能,存储器可分为主存储器、辅助存储器、高速缓冲存储器和控制存储器4种类型。

  1. 1)主存储器(Main Memory)

        主存用来存放程序运行时的代码和数据,是CPU唯一按地址访问的存储器。因而,主存具有较快的存取速度,通常由MOS型半导体动态RAM构成。由于半导体存储器的价格较高,因此,主存的容量不会很大。

  1. 2)辅助存储器(Secondary Memory)

        辅存指计算机运行期间与主存直接交换信息的存储器,是主存的后援存储器,存放主存暂时不用的程序和数据。与主存相比,辅存的容量更大,速度不要求很快,通常由磁性材料或光介质的DAM构成。后备存储器主要用于脱机时存放信息,由于容量巨大,通常称为海量存储器。

  1. 3)高速缓冲存储器(Cache)

        高速缓冲存储器位于CPU与主存之间,速度比主存更快,存放主存中最近使用的信息,是主存的快速缓冲器。Cache通常由MOS型半导体静态RAM构成。

  1. 4)控制存储器(Control Storage)

        控制存储器用来存放解释机器语言指令的微程序,位于CPU内部。由于其信息不需要修改,通常由MOS型半导体ROM构成。

(5)按信息的可更改性进行分类

  • 读写存储器:可读可写(如内存,硬盘等)
  • 只读存储器:只能读,不能写(如电影使用的光碟)

(6)按信息的可保存性进行分类

  • 易失性存储器:断电后数据消失(主存,Cache)
  • 非易失性存储器:断电依然保存(磁盘、光盘)
  • 破坏性读出:读出数据后要进行重写(如DRAM芯片)
  • 非破坏性读出:读出数据后原数据没被破坏(如SRAM芯片、磁盘、光盘)
3.存储器的性能指标
  • 存储容量:存储字数 x 存储字长(如 1M x 8位 )。

        MAR反映存储字数,MDR反映了存储字长。(BIT ,BYTE, KB, MB, GB, TB)

  • 单位成本:每位价格 = 总成本/总容量(某条内存条价格为259,容量为8GB,则单位成本 = 259 / (8*8) )。

  • 存储速度:数据传输率 = 数据的宽度/存储周期

    image-20210624000827602
  • 存取时间:存取时间 + 恢复时间 = 存取周期,计算机进行一次读写操作后需要一段恢复时间才能进行下一次的读写操作。

  • 主存带宽:就是上面的数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒,字节/秒,位/秒。

1.2主存储器

1.2.1主存储器的基本组成

知识总览:

image-20210624001528956

(1)存储体

存储体由多个存储单元构成,每个存储单元由多个存储元构成。

存储元:能够存储一位比特。

image-20210624002517073

电容:存储电荷,有电压差表示比特1,无电压差表示比特0。

MOS管:一个电控开关,当输入电压到达某个阀值时,MOS管就可以接通,电容中的电荷就可以跑出来。(相当于一个电路的开关)

将多个存储元组合起来就构成了存储单元,同个存储单元的存储元共用一根MOS管。

将多个存储单元组合起来就构成了存储体。

image-20210624002838559

(2)地址寄存器和数据寄存器

通过译码器来选择哪一个存储单元进行读写。

并通过数据总线传送数据。

image-20210624003758264

(3)控制电路:

控制电路控制着 MAR,译码器和MDR的数据处理。

MDR定义:
    全称 memory data register,主存数据寄存器,MDR用来保存要被写入地址单元或者从地址单元读入的数据。

MAR定义:
    全称memory address register,主存地址寄存器,MAR用来保存数据被传输到的位置的地址或者数据来源位置的地址

同时存储芯片还需要对外提供 片选线,读选择线,写选择线。

片选线:芯片的总开关,低电平有效时表示选择了这块芯片进行工作了。

读选择线,写选择线:分别用来控制是读还是写。有时候会将这两根线合为一条,用低电平表示写,用高电平表示读。

image-20210624004351010

(4)从总体上来看:

image-20210624004544524 image-20210624004842531

这里也表明了片选线的作用,上述的内存条是由多个存储芯片构成,假设每个存储芯片为1GB,则这条内存条条就为8GB,在进行读写数据时,需要通过片选线来选取不同的存储芯片进行存储。

寻址:

image-20210624010422947

假设该存储体中的存储字长为4B,总容量为1KB,则存储单元为256个。

寻址方式可分为四种:

  • 按字节寻址:则有1K个地址,需要10根地址线
  • 按字寻址:则有256个地址,字节地址等于字地址乘于字长。
  • 按半字寻址
  • 按双字寻址
1.2.2 随机存取存储器RAM

知识总览:

image-20210624194927812

RAM主要分为两种:

SRAM:静态RAM,用于Cache

DRAM:动态RAM,用于主存

1.存储元件不同导致的特性差异

DRAM芯片:使用栅极电容来存储信息

SRAM芯片:使用双稳态触发器来存储信息

(1)栅极电容:

image-20210624201446831

1:电容内存储了电荷

0:电容内未存储电荷

破坏性读出:电容放电后相当于电荷跑了出来,导致信息破坏,所以读出后需要有重写操作,也称为再生。这也是DRAM读写速度比SRAM慢的原因。

电容内的电荷只能维持2ms,即便不断电,2ms后信息也会消失。所以在2ms之内必须刷新一次,给电容充电。

每个存储元制造成本更低,集成度高,功耗低。

(2)双稳态触发器:

image-20210624201746636

1:A处为高电平并且B处为低电平

0:A处为低电平并且B处为高电平

非破坏性读出:读出数据后,触发器状态保持稳定,无需重写。读写速度更快。

只要不断电,触发器的状态就不会改变。

每个存储元制造成本更高,集成度低,功耗高。

2.DRAM的刷新

(1)多久刷新一次:一般为2ms

(2)每次刷新多少个存储单元:以行为单位,每次刷新一行存储单元。

存储器中存储单元的排列是由 行地址译码器 和 列地址译码器 共同选择。

image-20210624204328703

如果只使用一个译码器来进行地址选择的话,那么8位地址需要使用 28=256 条选通线,而使用行地址译码器和列地址译码器共同工作的话,只需要 24+24=32 条选通线,也就是行译码器16条选通线,列译码器16条选通线。

(3)如何刷新:有硬件支持,读出一行的信息后重新写入,占1个读/写周期

(4)什么时候进行刷新?

假设DRAM内部结构排列成 128x128 的形式,读/写周期为 0.5us ,则 2ms 内共有 2ms/0.5us=4000个 读/写周期。

于是刷新的时间选择可以有以下三种思路:

image-20210624210823530

3.DRAM的地址线复用技术

由于DRAM存储容量较大,存储单元数目多,所需地址线也就比较多,为了简化硬件,采用地址线复用技术,行地址和列地址分成两次进行传送到译码器中。

image-20210624211522648

总结:

image-20210624203336734

1.2.3 只读存储器ROM

image-20210624211903579

image-20210624212903415

  • ROM芯片虽然叫做“Read Only”,但是很多ROM也可以写。
  • 闪存的写速度一般比读速度慢,因为写入之前需要先擦除。
  • 事实上很多ROM也是具有随机存取的特性的。
1.2.4 主存储器和CPU的连接

image-20210624214039285

1.单块存储芯片与CPU的连接

image-20210624222948187

假设有一块 8Kx1位 的存储芯片,说明此芯片需要 13根地址线,CPU有8个数据线和16根地址线,从上面可以看出,CPU每次只能传送1位数据到该芯片中,这会导致CPU的数据线没有得到充分利用,并且会有需要扩展主存容量的情况。

于是,就需要通过多个存储芯片的合理连接来扩展主存容量。

可以有两种方式:

  • 位扩展:扩展存储单元的字长
  • 字扩展:扩展存储单元的个数
2.多块存储芯片与CPU的连接

(1)位扩展:

image-20210624224156942

如上图,将两片存储芯片进行连接,CPU地址总线A0~A12会一起发送给这两块芯片,而第二块芯片的数据线D0会和CPU的数据线D1进行相连。这样就扩展成了8Kx2位的存储器了。

同样,CPU中一共有D0~D7个数据线,因此可以总共连接8个图中所示的存储芯片,扩展成 8Kx8位的 存储器。

image-20210624224658638

(2)字扩展:

字扩展可分为两种:

  • 线选法
  • 片选法

image-20210624230816431

如图中是一块 8Kx8位 的存储芯片,由于该芯片的存储单元字长等于CPU的数据总线数,因此不需要进行位扩展。而地址线并没有被完全利用到,因此可以考虑进行字扩展。

  1. 线选法:

image-20210624230829234

用专门的地址线作为片选线,进行选择某一块存储芯片。

如图中:A13为第一块存储芯片的片选线,A14为第二块存储芯片的片选线,当A13 A14分别为01或10时,代表选中了第一块存储芯片或第二块存储芯片,这样就能扩展存储单元的个数。

此时第一块存储芯片的最低地址为:01 0000 0000 0000,最高地址为 01 1111 1111 1111

第二块存储芯片的最低地址为:100 0000 0000 0000,最高地址为 101 1111 1111 1111

但是线选法有一个缺陷:A13和A14不能取00或者11,因为取00时会导致两快存储芯片都没有被选中,11会导致两块存储芯片都被选中。并且需要n个片选信号。

可以进行优化:

image-20210624232229945

只通过A13和一个非门来进行选择。

此时第一块芯片的最低地址为10 0000 0000 0000,最高地址为11 1111 1111 1111

第二块芯片的最低地址为00 0000 0000 0000,最高地址为01 1111 1111 1111

  1. 片选法:

image-20210624232525034

总结:

image-20210624233026242

(3)位扩展和字扩展 同时扩展

image-20210624233501408

1.2.5 双端口RAM和多模块存储器

知识总览:

image-20210625105502047

  • 存取周期 = 存取时间 + 恢复时间

image-20210625105008208

前面讲到,DRAM由于电容的特性,每次进行读操作后需要进行重写,也就是需要一定的恢复时间,导致DRAM的存取周期比较长,并且这个恢复时间往往还比存取时间长。

这样会引出以下两种问题:

  1. 对于现如今的计算机,很多都是具有多核CPU,那么不同的CPU访问主存时,后续的CPU是否需要等待这么长的恢复时间呢?

  2. CPU的读写速度比主存快很多,主存恢复时间太长怎么办?

这两个问题分别对应接下来的内容:双端口RAM 和 多模块存储器。

1.双端口RAM

image-20210625105611426

**需要两组完全独立的数据线,地址线, 控制线。**CPU和RAM中也要有更复杂的控制电路。

两个端口对同一主存操作有以下4种情况:

image-20210625105701118

当发生冲突时,会发出忙信号,有判断逻辑决定暂时关闭一个端口(即被延时),未被关闭的端口正常访问,被关闭的端口延长一个很短的时间断后再访问。

2.多模块存储器

(1)多体并行存储器:

image-20210625111608775

图中每个方格表示一个存储单元。

高位交叉编址:每个存储体遍历完了之后再遍历下一个存储体。仅仅相当于扩容。

低位交叉编址:以横向方式遍历存储体,也就是每次都是遍历不同存储体的不同存储单元。这样,在读取其他存储体的存储单元时,之前读取过的存储单元可以利用这段时间进行恢复,达到一种并行的效果。

在模块数的选取上需要保证模块数 m >= T/r,这样才能保证存储体有足够的时间进行恢复。

image-20210625112917668

(2)单体多字存储器:

image-20210625113409932

和多体并行存储器相反,单体多字存储器将多个存储体进行了合并,每次只能同时取m个字,不能单独取其中某个字,当某次读写的数据在不同行时,需要读入多余的信息。

3.应用

双通道内存:

原理:低位交叉编址的多体并行存储器。

image-20210625115529730

1.3 Cache

1.3.1 Cache的基本概念和原理

知识总览:

image-20210625145053543

虽然 双端口RAM和多模块存储器已经提高了存储器的工作速度,但是和CPU的差距依然很大,于是就产生了缓存Cache,其价格更高,容量更低。

(1)工作原理:

image-20210625144858180

**空间局部性:**在最近的未来要用到的信息,很有可能与闲杂i正在使用的信息在存储空间上是临近的。(信息的存储一般都是顺序的)

**时间局部性:**在最近的未来要用到的信息,很可能是现在正在使用的信息。(程序中很可能存在大量的循环结构,需要重复访问)

故Cache能够工作的理论依据:从上面两个局部性可以分析到,我们可以把CPU目前访问的地址周围的部分数据放到Cache中。

(2)性能分析:

image-20210625145403479

设 **tc**为访问一次Cache所需时间,**tm**为访问一次主存所需时间。

CPU能够直接在Cache中找到所需信息,称为命中。

**命中率 H:**CPU欲访问的信息已在Cache中的比率。

**缺失率(未命中率)M:**M = 1 - H

**CPU平均访问时间 t 为:**t = H tc + ( 1-H ) ( tc+tm )

例题:

image-20210625211029379

(3)如何界定“周围”:

image-20210625145835025

  • 将主存的存储空间进行分块,主存与Cache之间以块为单位进行数据交换。

  • 这样主存地址就可分为两部分:块号 和 块内地址。

  • 在操作系统中,通常将主存中的 “一个块” 也称为 “一个页/页面/页框” 。

  • Cache中的 “块” 也称为 “行” 。

Cache和主存之间仍然存在一些问题:

  • 如何区分Cache和主存之间的数据块对应关系? ——Cache和主存的映射方式
  • Cache很小,主存很大。如果Cache满了怎么办? ——替换算法
  • CPU修改了Cache中的数据副本,如何确保主存中数据母本的一致性? ——Cache写策略

以上问题请继续看下面内容。

总结:

image-20210625213605526

1.3.2 Cache和主存的映射方式
(1)全相联映射

任何一个主存块可以放在Cache的任意位置。

给每一个Cache块增加一个标记位,记录对应的主存块号。

还需要一个有效位,有效位为1时表示标记位有效,有效位为0时表示标记位无效。

image-20210625215055304

以上图为例,主存中任意一块数据都可以存放在Cache任意一块中,只要标记好和主存数据的对应就行。例如主存中第9号块数据可以存放在Cache中0号到1号任意一个位置。

优点:Cache存储空间利用充分,命中率高。

缺点:查找速度较慢。

故CPU访问主存数据的流程如下:

image-20210625230112686

(2)直接映射

每个主存块只能放到特定的一个位置:Cache块号 = 主存块号 % Cache总块数。

image-20210625215318058

以上图为例,8块为一个循环。主存中0号和8号块数据可以存放在Cache第0号块中,主存中1号和9号块数据可以存放在Cache第1号块中,以此类推。

**若Cache总块数 = 2n,则主存块号末尾 n 位直接反映它在Cache中的位置。**这是因为Cache块号 = 主存块号 % Cache总块数 = 主存块号末尾 n 位。

于是对于Cache所保存的标记号可以不用保存主存中对应的整个地址,可以只保留主存块号m前面(m-n)个二进制数。

image-20210625230843362

故CPU访问主存数据流程如下:

image-20210625225440110

优点:只需要对比一个标记,速度最快。

缺点:Cache存储空间不充分,命中率低。

(3)组相联映射

将Cache块分为若干组,每个主存块可放到特定分组中的任意一个位置。

每个主存块对应的组号 = 主存块号 % 分组数

image-20210625215617471

以上图为例,8块为一个循环组。0号和8号同属于第0组,0号和8号数据可以存放在第0组的任意一个位置,只要做好标记就行。

和直接映射一样,若Cache总分组数 = 2n,则主存块号末尾 n 位直接反映它在Cache中是第几组。

image-20210625230936046

故CPU访问主存数据流程如下:

假设以下采用2路组相联映射,也就是 2块为一组,分四组。

image-20210625231648988

优点:上面两种方法的折中,综合效果较好。

总结:

image-20210625232220926

1.3.3 Cache替换算法

知识总览:

image-20210625232724991

直接映射方式 由于主存数据块对应的Cache块是固定的,所以没得选择,不需要使用替换算法。

而全相联映射和组相联映射方式 由于可以选择不同位置进行替换,所以需要用到替换算法进行替换。

下面例子以全相联映射方式进行举例。

1.随机算法(RAND)
  • 若Cache已满,则随机选择一块替换。

    举例:

    图中红色表示该位置被重新替换成新的块。

    图中绿色表示命中该缓存块。

image-20210625233144880

  • 随即算法实现简单,但完全没考虑局部性原理(时间局部性),命中率低,实际效果很不稳定。
2.先进先出算法(FIFO)
  • 若Cache已满,则替换最先被调入Cache的块。

举例:

image-20210625233517197

从上图可以看到,红色出现很多次,这表明缓存块被频繁地替换,刚被替换的块很快又被重新调入,这称为抖动现象。

  • 先进先出算法实现简单,但是依然没考虑局部性原理(时间局部性),因为最先被调入Cache的块也可能是被频繁访问的。
3.近期最少使用(LRU)
  • 为每一个Cache块设置一个”计数器“,用于记录每个Cache块已经多久没被访问过了。当Cache满了之后替换”计数器“最大的。
  • 计数规则:
    • 命中时,所命中的行的计数器清零,比其低的计时器加1,其余不变(加一没有意义)。
    • 未命中且还有空闲行时,新装入的行的计数器置0,其余非空闲行全加1。
    • 未命中且没有空闲行时,计数值最大的行的信息块被淘汰,新装行的块的计数器置0,其余全加1。

举例:

一开始,缓存块中并没有存储数据,计数器均为0。

image-20210625234519059

访问主存块1

image-20210625234542103

访问主存块2

image-20210625234624359

访问主存块3

image-20210625234657672

访问主存块4

image-20210625234726007

访问主存块1,命中缓存,Cache0计数器重新清零

image-20210625234816616

访问主存块2,命中,Cache1计数器重新清零

image-20210625234946039

访问主存块5,此时未命中,将会采取下先进先出算法,替换计数值最大的块,图中替换Cache2

image-20210625235057355

接下来的流程和上面类似,只需要根据计数规则自行模拟即可,这里不再赘述。

  • 近期最少使用算法 基于 局部性原理,近期被访问过的主存块,在接下来的时间内很可能还会被访问,因此淘汰最久没被访问过的块是合理的,该算法实际运行效果优秀,Cache命中率很高。
  • 若被频繁访问的主存块的数量 > Cache行的数量,则还是有可能发生抖动。
4.最近不经常使用(LFU)
  • 为每一个Cache块设置一个”计数器“,用于记录每个Cache块被访问过几次。当Cache满后替换“计数值”最小的。

  • 新调入的块计数器=0,之后每被访问过一次计数器+1。

举例:

访问了主存块1号,2号,3号,4号后,Cache的状态:

image-20210626000456276

访问主存块1号和2号时均命中,Cache0和Cache1计数器加一。当访问主存块5号时,未命中,于是会替换计数值最小的Cache2(这里Cache2和Cache3均为0,会按行号递增或者FIFO策略来进行选择哪一个被替换)

image-20210626000613697

接下来的流程和上面类似,根据 最不经常使用算法 自行模拟即可,这里不再赘述。

  • 评价:曾经被经常访问的内存块在未来并不一定仍然被访问,并没有很好地遵循局部性原理(时间局部性原理),因此实际效果并不如 近期最少使用算法 LRU。

总结:

image-20210626001330145

1.3.4 Cache写策略

知识总览:

image-20210626001754786

为何不讨论读命中,读不命中的情况?

因为读不会导致主存和Cache的数据不一致。

1.写命中

(1)写回法:

  • 当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此Cache块被替换时才写回主存。

  • 需要增加一位脏位,用于标记该Cache块是否被修改了。

  • 减少了访存的次数,但存在数据不一致的隐患。

image-20210626112650962

(2)全写法:

  • 当CPU对Cache块写命中时,必须把数据同时写入Cache和主存中,一般使用写缓冲(write buffer)。
  • 访存次数增加,速度变慢,但能保证数据的一致性。

image-20210626113320921

  • 使用写缓冲,CPU写的速度很快,若写操作不频繁,则效果很好,若写操作很频繁,可能会因为写缓冲饱和而发生阻塞。

image-20210626114022787

2.写不命中

(1)写分配法:

  • 当CPU对Cache写不命中时,把主存中的块调入Cache中,在Cache中修改,通常搭配写回法使用。也就是发生替换时才写回主存。

image-20210626120511351

(2)非写分配法:

  • 当CPU对Cache写不命中时,只写入主存,不调入Cache中。搭配全写法使用。

image-20210626120557077

3.多级Cache

image-20210626120804700

现代计算机常采用多级Cache:

  • 离CPU越近的速度越快,容量越小

  • 离CPU越远的速度越慢,容量越大。

各级Cache之间常采用 全写法 + 非写分配法。

Cache 和 主存 之间常采用 写回法 + 写分配法。

总结:

image-20210626120939453

1.4 虚拟存储系统

1.4.1 页式存储

有时候一个程序比较大,无法将它顺序地存放在主存中的各个块中,因此操作系统会将它分成若干个页面,页面的大小和块的大小相同,每个页面可以离散地放入不同的主存块中。

image-20210626151413849

逻辑地址(虚地址):程序员看到的地址。

物理地址(实地址):实际在主存中的地址。

对于一条机器指令:000001 001000000011(操作码+地址码),其地址码所使用的就是 逻辑地址。

页表:记录了每个逻辑页面存放在哪个主存块中,页表的数据放在主存中。

image-20210626152212018

地址变换过程:举例

假设此时执行一条取指令操作,该指令为 000001 001000000011,所以要取的数据的逻辑地址为 001000000011

  1. 首先将逻辑地址拆分成 逻辑页号 和 页内地址
  2. 在主存中找到 页表,然后通过 逻辑页号 进行查表,查出对应的 主存块号
  3. 将 主存块号 拼接 页内地址 得到最终的 物理地址
  4. 到Cache中查找该物理地址,找不到的话再到主存找。

image-20210626153032319

但是由于页表是存放在主存中的,而根据时间局部性原理,刚使用的数据很可能在接下来还会使用,这样在下一次使用该数据时又得访问一次主存进行查表,为了更快地查表,会将近期访问的页表项放入更高速的存储器中,称为 快表。

**快表:**快表是一种相联存储器,可以按照内容进行寻访,并且其采用的是SRAM,访问速度更快。

image-20210626153509902

快表 和 Cache 的区别:

  • 快表 存储的是 页表项的副本
  • cache 存储的是 主存块的副本

总结:

image-20210626154413090

1.4.2 虚拟存储器

**虚拟存储系统:**辅存中的数据并不是一次性全部加载到主存中的,而是和 Cache——主存 类似,根据局部性原理加载一部分数据到主存中。

举例:打游戏时的“Loading”界面背后可能就是在 将游戏地图相关数据调入内存中。

1.页式虚拟存储器

和Cache、主存类似,辅存中数据也被分为一个一个的块。

image-20210626163252564

为了实现只加载一部分数据到主存中,需要对页表补充一些信息。

image-20210626163036547

  • 逻辑页号:逻辑地址中的页号

  • 主存块号:物理地址中的主存块号

  • 外存块号:辅存中对应的块号

  • 有效位:这个页面是否被调入主存中

  • 访问位:用于页面替换算法,主存也有用完的时候,需要进行替换,例如可以使用最不经常使用算法,统计访问次数。

  • 脏位:这个页面是否被修改过,修改主存后会导致主存和辅存之间数据不一致。

由于主存和辅存之间的数据调入是由操作系统来调控的,因此具体细节请看操作系统相关内容,以上仅做粗略介绍。

image-20210626163933234

  • **主存——辅存:**实现虚拟存储系统,解决了主存容量不足的问题。
  • **Cache——主存:**解决了主存和CPU之间速度不匹配的问题。
2.段式虚拟存储器

按照功能模块进行拆分。

例如:#0段是自己的代码,#1段是库函数的代码,#2段是变量。

image-20210626164416891

和页式存储类似,操作系统以段为单位来决定哪一些段应该被调入内存中。

image-20210626164555468

3.段页式虚拟存储器

把程序先按功能模块分段,每段再划分为固定大小的页,主存空间也划分为大小相等的页。

程序对主存的调入,调出仍然以页为基本传送单位,每个程序对应一个段表,每段对应一个页表。

虚拟地址:段号 + 段内页号 + 页内地址。

具体详情请看操作系统内容。

猜你喜欢

转载自blog.csdn.net/m0_69914734/article/details/141821990