Cache存储器和虚拟存储器

概述

Cache引入原因:
通过双端口RAM、多模块存储器提高存储器的工作速度后,主存速度与CPU差距依然很大;
同时采用更高速的存储单元设计,代表着存储器价格上升,容量下降,又不能一味的增加存储容量。
然后在编程中发现了局部性原理,因此应用到主机,便诞生了Cache-主存层次

(1)CPU和主存速度存在差异
(2)CPU和I/O争抢访存
一旦主存与I/O交换信息,主存可以将CPU需要的信息提前送至缓存, CPU可直接从缓存中读取所需信息,不必空等影响效率。

cache是介于CPU和主存之间的小容量存储器,但存取速度比主存快。主存容量配置几百MB的情况下,cache的典型值是几百KB。

功能:
解决CPU和主存之间的速度不匹配问题

实现方案:
image

  • 全由硬件调度,对用户透明(程序员无法调用)
    为追求高速,包括管理在内的全部功能由硬件实现,因而对程序员是透明的。

  • 一般采用高速的SRAM构成。

  • CPU和主存之间的速度差别很大,采用两级或多级Cache系统
    早期的一级Cache在CPU内,二级在主板上
    现在的CPU内带L1 Cahe和L2 Cahe

作用:

  1. cache能高速地向CPU提供指令和数据,从而加快了程序的执行速度。
  2. 从功能上看,它是主存的缓冲存储器。

Cache的设计依据:

  1. 局部性原理
    CPU这次访问过的数据和指令,下次有很大的可能也是要访问的数据和指令(时间局部性);
    CPU这次访问过的数据和指令,下次有很大的可能也是附近的数据和指令(空间局部性)。

  2. CPU与Cache之间的数据传送是以字为单位
    主存与Cache之间的数据传送是以块为单位

一块由多个字构成

局部性原理及性能分析

局部性原理

程序的局部性原理:在某一段时间内频繁访问某一局部的存储器地址空间,而对此范围之外的地址空间很少访问的现象。
分类

  • 时间局部性:最近被访问的信息很可能还要被访问。
  • 空间局部性:最近被访问的信息临近地址的信息也可能被访问

比如说:对于将数组的每个元素加一这个操作,显然访问了a[1],就要访问a[2](空间局部性);然后还要将加后数据放回原来的位置(空间局部性)。

需要注意一件事情:CPU和存储器交流的最小单位是 机器字长(因为CPU内部寄存器容量太小)
Cache与主存的交流最小单位是: 块。(两者都是存储器,容量较大)

根据局部性原理,引入Cache后对速度提升是明显的,比如:
没有引入Cache:
image
仅考虑a[i] = a[i] + 2。
取出a[i]耗时1000ns,加法运算5ns,存回a[i]耗时1000ns,
故每个a[i]耗时2005ns,1000个a[i]共耗时 2005ns × 1000 = 2005us
引入Cache:
image
取出a[0] ~ a[9]花费 1000ns+(5+5+5)ns×10=1150ns
因此取出a[0] ~ a[999] ,花费1150ns×100=115us

引入Cache后工作过程:
CPU读主存时,便把地址同时送给Cache和主存,
Cache控制逻辑依据地址判断此字是否在Cache中

  • 若在Cache中(命中)此字立即由Cache传送给CPU
  • 否则(未命中),则用主存读周期把此字从主存读出送到CPU
    与此同时,把含有这个字的整个数据块从主存读出送到Cache中。

因此可以看到命中概率越高整个系统运行效率越高。这里定义几个概念:

引入Cache后,系统性能分析

命中率 \(h\): CPU欲访问的信息已在Cache中的比率
在一个程序执行期间,设\(N_c\)表示Cache完成存取的总次数,\(N_m\)表示主存完成存取的总次数,则有

\[命中率:h=\frac{N_c}{N_c+N_m} \]

从CPU角度来看,
增加Cache的目的: 就是在性能上使主存的平均读出时间尽可能的接近Cache的读出时间。
因此: 为了达到这个目的,在所有的存储器访问中由Cache满足CPU需要的部分应占很高的比例,即Cache的命中率应接近于1
由于程序访问的局部性,实现这个目标是可能的。

Cache/主存系统的平均访问时间 \(t_a\)
\(t_c\)表示命中时的访问时间( Cache访问时间),\(t_m\)表示未命中时的访问时间,\(1-h\)表示未命中率,则有:

\[平均访问时间:t_a=h*t_c+(1-h)t_m \]

注意: 由于未命中后的策略不同,未命中时的访问时间\(t_m\) 有两种情况:

  1. 如果未命中,则主存像Cache传送数据,再有Cache传入CPU;此时访问时间是 \(主存访问时间+Cache访问时间\)
  2. 如果未命中,则主存直接向CPU传入数据;此时访问时间就是 \(主存访问时间\)

实现目标:以较小的硬件代价使 \(ta\) 接近 \(t_c\)

例: 假设Cache的速度是主存的5倍,且Cache的命中率为95%,则采用Cache后,存储器性能提高多少(设Cache和主存同时被访问,若Cache命中则中断访问主存)?
设Cache的存取周期为t,则主存的存取周期为5t。由于Cache和主存同时访问,不命中时访问时间为5t
故系统的平均访问时间为Ta=0.95×t + 0.05×5t = 1.2t
设每个周期可存取的数据量为S,则存储系统带宽为S /1.2t ,不采用Cache时带宽为S /5t ;
故性能为原来的\(\frac{S/1.2t}{S/5t} = \frac{5t}{1.2t}≈4.17倍\),即提高了3.17倍。

若采用先访问Cache再访问主存的方式
不命中时,访问Cache耗时为t ,发现不命中后再访问主存耗时为5t ,总耗时为6t
故系统的平均访问时间为Ta=0.95×t + 0.05×6t = 1.25t
故性能为原来的 \(\frac{5t}{1.25t} =4倍\),即提高了3倍。

访问效率 \(e\)
\(r=\frac{t_m}{t_c}\)表示主存慢于Cache的倍率
则有

\[访问效率=\frac {\text{Cache}访问时间}{系统平均访问时间}: \]

\[e=\frac {t_c}{t_a}=\frac{t_c}{h*t_c+(1-h)*t_m} \]

\[=\frac{1}{h+(1-h)*r} \]

\[=\frac{1}{r+(1-r)*h} \]

由表达式看出,为提高访问效率

  • 命中率h越接近1越好
  • r值以5—10为宜,不宜太大。

因此:命中率h与程序的行为、Cache的容量、组织方式、块的大小有关。

、CPU执行一段程序时,Cache完成存取的次数为1900次,主存完成存取的次数为100次,已知Cache存取周期为50ns,主存存取周期为250ns,求Cache/主存系统的效率和平均访问时间。

解:
命中率:h=Nc/(Nc+Nm)=1900/(1900+100)=95%
主存慢于Cache的速率:r=tm/tc=250ns/50ns=5
访问效率:e=1/(r+(1-r)h)=1/(5+(1-5)×0.95=83.3%
平均访问时间:ta=tc/e=50ns/0.833=60ns

Cache工作原理

分析之前规定几个基础概念

  • Cache与主存的交流最小单位是:
  • cache 的数据块大小称为
  • 主存 的数据块大小称为
  • 行与块是等长的,每个块(行)由连续的字组成。
点击查看 相联存储器 CAM

实现主存-Cache 地址映射需要标记位,CAM就是用来实现标记位的硬件。

存放在相联存储器的项中的项可以看成具有下列格式:

\[key,data \]

其中键KEY是地址,而数据DATA是读写信息。

由此可知,相联存储器的基本原理是:
把存储单元所存内容的某一部分作为检索项(即关键字项),去检索该存储器,并将存储器中与该检索项符合的存储单元内容进行读出或写入。

应用:
需要快速查找时:

  1. 在计算机系统中,相联存储器主要用于虚拟存储器中存放分段表、页表和快表;
  2. 在高速缓冲存储器中,相联存储器作为存放cache的行地址之用。

设计原则:

  • 命中率尽量高,接近1
  • 希望cache对CPU而言是透明的。

cache 原理图:
假设存储系统是模块化的,主存中每个模块和cache 相联系(多模块交叉存储器)。cache 分为 x 行,每行 y 个字(W)。
image
cache 的地址存放在一个相联存储器 CAM 中( CAM是按内容寻址的存储器。输入关键字(地址)项后,会将存储器中与该检索项符合的存储单元内容进行读出或写入 )。

当 CPU 执行访存指令时,就把所要访问的字的地址送到 CAM;
如果W 在cache中,直接读取。
如果 W 不在 cache 中:(其中一种策略)

  • 则将 W 从主存传送到 CPU。
  • 与此同时,把包含 W 的由前后相继的 4 个字所组成的一行数据送入 cache,替换原来 cache 中的一行数据。

注意:
由始终管理 cache 使用情况的硬件逻辑电路来实现替换算法。

扩展:实际过程:
CPU读主存时,便把地址同时送给Cache和主存,
Cache控制逻辑依据地址判断此字是否在Cache中

  • 若命中,此字立即由Cache传送给CPU
  • 若未命中,则用主存读周期把此字从主存读出送到CPU
    与此同时,把含有这个字的整个数据块从主存读出送到Cache中。

结构设计需解决的问题

两种不同速度、不同容量、不同价格的存储器组织在一起,需要解决有关的三个问题:

  1. 信息放置问题:主存中的块放到Cache中哪个位置?
    (1)空位随意放:全相联映射
    (2)对号入座:直接映射
    (3)按号分组,组内随意放:组相联映射

  2. 替换问题:对于(1),Cache满了如何处理?对于(2)(3),对应位置被占用如何处理?
    随机(RAND)算法、先进先出(FIFO)算法、
    近期最少使用(LRU)算法、
    最不经常使用(LFU)算法

  3. 改写问题:修改Cache中的内容后,如何保持主存中相应内容的一致性?
    命中:全写法(write-through),写回法(write-back)
    不命中:写分配法(write-allocate),非写分配法(not-write-allocate)

主存-Cache 地址映射

回忆以下几个基础概念
Cache与主存的交流最小单位是: ,每个块(行)由连续的字组成。
cache 的数据块大小称为;主存 的数据块大小称为块/字块;行与块是等长的。

首先解决问题1:信息放置问题,也就是 主存中的块放到Cache中哪个位置?
有三种映射方法:(1)空位随意放:全相联映射。(2)对号入座:直接映射 (3)按号分组,组内随意放:组相联映射
其映射示意图如下:
image
由于主存和Cache的基本传输单位是行(块),因此需要对Cache行和主存块进行重新标号:

  • 主存块地址/CPU访主存地址: \(M_{主存块号}+W_{块内字号 / 字地址}\)
  • Cache行地址: \(C_{Cache块号}+W_{字地址/块内地址 }\)

因为CPU访问Cache的本质是访问主存,也就是说 CPU的访问存储器的地址是 \(主存的地址\);所以 除了给Cache行编号外,还需要存放有效位 和标记位,其作用如下:

  • 有效位:判断Cache该行是否被使用
  • 标记位:判断Cache该行存放主存中哪里的数据(映射策略不同,标记位不同)。

再明确几个小概念:

  • Cache行 即Cache块,是Cache与主存之间传送数据的基本单位。
  • 主存如果按字编址,块内字号=字地址。

假设某个计算机的主存地址空间大小为256MB,按字节编址,其数据Cache有8个Cache行,行长为64B。
其每行的地址范围如下:
image

全相联映射

全相联映射是指主存中任一块都可以映射到Cache中任一块的方式。
映射示意图
image

存储信息

  • 因为是随意映射,因此标记位S必须存放 主存的块号。

  • CPU的访主存地址: \(M_{主存块号}+W_{块内字号 / 字地址}\)

  • Cache行地址: \(C_{Cache块号}+W_{字地址/块内地址 }\)

检索过程
CPU给出访问地址后
将地址分为两部分(块号和字 即块内地址),比较电路中的块号与Cache表中的标记进行比较

  • 相同表示命中,用 字地址(块内地址) 访问Cache相应单元;

  • 如果没有命中CPU 直接用内存地址访问内存,
    并将被访问内存的相对应内存块写入Cache,同时设置CAM的标记位。

注意:

  1. 全部标记用一个相联存储器来实现
  2. 指令中的块号与 cache 中所有行的标记同时在比较器中进行比较

优点:冲突概率小,Cache的利用率高。
可以放入cache的任意一块

缺点:高速比较器难实现,需要一个访问速度很快代价高的相联存储器。
如果块多,实现cam快速访问比较难,电路复杂。

应用场合: 适用于小容量的Cache

有一个处理器,主存容量1MB,字长1B,块大小16B,cache容量64KB,若采用全相联映射,对内存地址(B0010)16给出相应的标记和字号。
解:
\(块大小=行大小=2^w个字节=16=2^4\),字地址\(w=4\)
\(主存寻址单元数=2^{s+w}=1M=2^{20}\)
\(主存的块数=\frac{1M}{16B}=2^S=2^{16}\),标记\(s=16\)
全相联方式的内存地址格式如下
image
\((B0010)_{16}=(1011 0000 0000 0001 0000)_2\)
因此:
\(标记s=(1011 0000 0000 0001)_2\)
\(字地址w=(0000)_2\)

直接映射方式

直接相联映射方式是指主存的某块j只能映射到特定的块。
具体来说就是:
主存的某块j只能映射到满足如下特定关系的Cache块i中: \(i=j \mod Cache块数\)
简单来说就是:余数相同的块都映射到同一个cache块

注意:

  1. 主存容量应是Cache容量的整数倍。
  2. 主存与Cache分成相同大小的数据块。

映射示意图
image

为了理解方便,可以把主存首先分区,每个区的块数与cache的行数m相等。
image
所有区的第 0 块在调入 cache 时只能映射到 cache 的第 0 行,
所有区的第 1 块在调入cache 时只能映射到 cache 的第 1 行……
所有区的第 m–1 块在调入 cache 时只能映射到 cache的第 m–1 行。

存储信息

  • 因为若\(Cache总块数=2^n\),则主存块号末尾n位,直接反映它在Cache中的位置,不需要再存储;因此对于某行Cache只需要知道其余的前几位(即:区号)即可找到对应的主存位置。
    因此标记位T\(=主存区号\) 即可。

  • 由于标记位的改变,原本的主存块号M实际上被分成了两个字段:主存区号+Cache块号(T和C),其中T用作标志位,C用于指出主存的块可以映射的Cache的块。
    CPU的访主存地址: \(\\{T_{区号/主存字块标记}+C_{Cache块号}\\}+W_{块内字号 / 字地址}\)

  • Cache行不变。\(Cache行=C_{Cache块号}+W_{字地址/块内地址 }\)

注意

  • 一般来讲,主存的块数是Cache的块数的整数倍,也就是说主存的块数\(2^M\)和Cache的块数\(2^C\)满足关系式:\(2^M=n·2^C\)

    image

检索过程:

当CPU送来一个访存地址时,
首先根据该主存地址的C字段找到Cache的相应块。
然后该块 标志字段中存放的标志与主存地址的T标志进行比较。

  • 相符,说明主存的块目前已调入该Cache块中,则命中,于是使用主存地址的W字段访问该Cache块的相应字单元;

  • 若不相符,则未命中,于是使用主存地址T 直接访主存。
    然后将该块调入 Cache,同时将主存地址的T标志存入Cache块的标志字段中。

优点:硬件简单,成本低,地址变换速度快
(比较电路少m倍线路,所以硬件实现简单)

缺点:冲突概率高
(访问块号相距m整数倍的两个块,因两块映射同一行,需要置换。降低cache效率)

应用场合
适合大容量Cache(更多行数减少冲突机会)

:cache有16块,主存有512块,求直接映像。

主存块号                 映射关系       cache 块号
    0               0÷16=0…….0             0
    1               1÷16=0…….1             1
     …                    ………              …
    15             15÷16=0…….15            15
    16             16÷16=1…….              0
    17             17÷16=1…….1             1
     …                    ………..            …
    511           511÷16=31…….15           15

补例1:主存容量为64KB, cache 容量为2KB,若按128B分块,直接相联映射方式,主存地址应该如何分配?
:由题意,

  • 地址总线的位数为16位(主存64KB)
  • cache块数: 2KB÷128B=16(块),4位地址线C=4
  • 块内128B需要7位地址线,W=7
  • ∴ 标志位=16-7-4=5
    image

补例2: 假设主存容量为512KB,cache容量为4KB,每个字块为64B,则
①cache地址有多少位?可容纳多少块?
②主存地址有多少位?可容纳多少块?
③直接映射方式下,主存的第几块映射到cache的第5块(设起始字块为第1块)④画出直接映射方式下主存地址字段中各段的位数。

① 4KB=212 B,cache地址为12位。cache中有4KB/64B=64块。
② 512KB=219 B ,主存地址为19位。主存中共512KB/64B=8192块
=213。
③ 8192/64=128组。主存的第5块,64+5,264+5 ,……12764+5(\(2^{13}-64+5\))能映射到cache的第5块。
image

例3.5 直接映射方式的内存地址格式如下所示:
image
若主存地址用十六进制表示为BBBBBB,请用十六进制格式表示直接映射方法cache的标记、行、字地址。
:(BBBBBB)16=(1011 1011 1011 1011 1011 1011)2
标记=(1011 1011) 2 = BBH
Cache块=(1011 1011 1011 10) 2 = 2EEEH
字地址=(11) 2 = 3H

组相联映射方式

全相联映射和直接映射两种方式的优缺点正好相反。

  • 从存放位置的灵活性和命中率来看,前者为优
  • 从比较器电路简单及硬件投资来说,后者为佳

而组相联映射方式是前两种 方式的折中方案,它适度地兼顾了二者的优点又尽量避免二者的缺点,因此被普遍采用

映射方式: 将Cache分组,组间采用直接映射方式,组内采用全相联的映射方式。也就说:分组后,主存块放到哪一组是固定的,但是存到该组哪一行是灵活的。
具体来说就是:将M行Cache 分V组,每组K行(块),则主存第j块内容拷贝到Cache的q(q= j mod v)组中的某行(块)

分析:

  • 行数k=1,则为直接相联映射方式
  • 组数v=1,则为全相联映射方式

注意: 行数k的取值一般比较小, 一般是2的幂,称之为k路组相联cache

组相联映射示意图
image

存储信息

  • 和直接映射类似,原本的主存块号M实际上被分成了两个字段:\(标记位T+组号d\),其中组号d用于指出主存的块可以映射的Cache的组。
    CPU的访主存地址: \(\\{T_{主存字块标记}+D_{组号}\\}+W_{块内字号 / 字地址}\)

  • Cache行不变。\(Cache行=C_{Cache块号}+W_{字地址/块内地址 }\)

检索过程:
当CPU送来一个访存地址时,
首先根据该主存地址的D字段找到Cache的相应
然后将s-d位(标志位)与该组V行中的标记同时进行比较。

  • 哪个行的标记跟与之相符,哪行即命中。此后再根据内存地址的W位检索到此行具体的字,完成具体的存取操作。
  • 如果没有一行的标记与之相符,则cache未命中,此时需按内存地址访问主存。

优点: 比全相联容易实现,冲突低;相比直接映射冲突概率小。
应用场合 最普遍。

例:主存64KB, cache2KB,按128B分块,再将cache按2块分组,求组相联映像。(2路组相联)
解:64KB÷128B=512(块)
2KB÷128B=16(块) 16÷2=8 (组)
q= j mod v
主存0-7块映射到cache 0-7组

主存块号                 映射关系       cache 组         cache块
    8                8÷8=1…….0                 0             0、1

    9                9÷8=1…….1                 1             2、3
…                   ……                             …               …
    15             15÷8=1  …….7                 7           14、15
     …                    ……..                          …               …
   511           511÷8=63…….7                7            14、15

补例:主存64KB,cache 2KB,按128B分块,再将cache按2块分组,组相联映像地址应该如何分配?

  • 主存64KB:16位
  • cache 组数:2KB÷128B÷2=8组 3位
  • 块内地址128B : 7位
  • 标记=16-3-7=6
    image

例3.6 一个组相联cache,由64个行组成,每组4行,主存储器包含4K个块,每块128字,请表示内存地址的格式。
块大小=行大小=128=27 =2W个字
组数64/4=16=24=2d
主存的块数=4K=212
标记大小(s-d)位=12-4=8
主存地址长度(s+w)位=12+7=19
主存寻址单元数=219
组相联的内存地址格式如右图
image

替换策略

现在解决问题2:替换问题:Cache满了如何处理?对于全相联映射,Cache满了如何处理?对于直接映射和组相联映射,对应位置被占用如何处理?

Cache的工作原理要求它尽量保存最新数据。因此不能随便选取,就诞生了替换策略,又称替换算法,常见有以下几个方法:

  • 随机(RAND)算法、先进先出(FIFO)算法、
  • 近期最少使用(LRU)算法、
  • 最不经常使用(LFU)算法

RAND(随机替换)

从特定的行位置中随机地选取一行换出即可。
优点:在硬件上容易实现,且单次替换速度快。
缺点:没有依据局部性原理,命中率低,实际cache工作效率低。

LFU(最不经常使用)

LFU(least frequently used):将一段时间内被访问次数最少的那行数据换出。
具体做法: 每行设置一个计数器,被访问的行计数器增加1,换值小的行。

缺点:不能反映近期cache的访问情况。

LRU(近期最少使用)

LRU(Least Recently Used):将近期内长久未被访问的行换出。
具体做法:被访问的行计数器置0,其他的计数器增加1,换值大的行。符合cache的工作原理。也是最常用的一种方法。

例题

设cache有1、2、3、4共4个块,a、b、c、d等为主存中的块,访问顺序一次如下:a、b、c、d、b、b、c、c、d、d、a ,下次若要再访问e块。

LFU
image

LRU
image

写操作策略(自学)

最后解决问题3 改写问题:修改Cache中的内容后,如何保持主存中相应内容的一致性?

由于cache的内容只是主存部分内容的拷贝,它应当与主存内容保持一致。而CPU对cache的写入更改了cache的内容。如何与主存内容保持一致,可选用如下三种写操作策略:

  1. 写回法:新增行的修改位。换出时,对行的修改位进行判断,决定是写回还是舍掉
  2. 全写法:新增硬件。写命中时,Cache与内存一起写
  3. 写一次法:与写回法一致,但是第一次Cache命中时采用全写法。

命中:全写法(write-through),写回法(write-back)
不命中:写分配法(write-allocate),非写分配法(not-write-allocate)

虚拟存储器

虚地址空间: 也称虚拟存储空间或虚拟存储器空间,它是应用程序员用来编写程序的地址空间,这个地址空间非常大。对应于虚拟地址(虚地址)
主存储器的地址空间: 也称主存地址空间、主存物理空间或实存地址空间,对应于主存地址(物理地址、实地址)
辅存地址空间: 也就是磁盘存储器的地址空间,对应于辅存地址(磁盘存储器地址)

基本原理
虚拟存储系统是由主存储器、辅助存储器以及进行地址转换的软硬件构成。在虚拟存储系统中,把虚拟存储器、主存储器和辅助存储器都划分为相同大小的单位,主存中的内容是辅存中的内容的副本(逻辑上,程序是在虚存中,物理上,程序存储在辅存中)。用户只面对虚存编程。计算机得到虚地址后,那么将辅存的内容掉入主存,如果主存已满,那么将采纳合适的替换算法

虚拟存储技术

image
逻辑地址和物理地址的转换。

段式虚拟存储器

段:利用程序的模块化性质,按照程序的逻辑结 构分成的多个相对独立的部分。段可以被其他程 序段调用,形成大型程序。
程序段可以是主程序,也可以是各种子程序,还 可以是数据块、数组、表格、向量等。每个程序 段都从0地址开始,长度可长可短,甚至可以在 程序执行时动态地改变程序段的长度。虚拟存储 空间是由多个段构成。把主存也按段来进行分配。

段式虚拟存储器:
每一道程序(或一个用户、一个进程等)由一张段 表控制,每个程序段段表中占一行。段表的內容 主要包括段号、段长和起始地址等三个字段。如果 段号是连续的,则这一字段可以省掉,只要根据起 始地址和段长,就能够把该程序段唯一地映象到主 存储器的确定位置中。另外,根据需要还可以在段 表中增加其它信息,如指出该程序段的访问方式
(可读可写、只读、某些用户可写、只能执行等)、 是否已经装入主存的标志、是否被修改过的标志等。

注意:

  1. 段长不固定
  2. 段间有碎片
  3. 通过逻辑地址找段号,然后找物理地址

image

image
段式存储:按用户作业中的自然段来划分逻辑空间,然后调入内存,段的长度可 以不一样。

  • 优点:多道程序共享内存,各段程序修改互不影响
  • 缺点:内存利用率低,内存碎片浪费大

例题

image

C

image
B

image

image

页式虚拟存储器

image
注意:

  1. 段的长度相同

地址映象:
image
注意: 因为页长固定,因此不用存储页长

image
页式存储:
将程序与内存均划分为同样大小的块,以页为单位将程序调入内存。

高级程序语言使用逻辑地址; |运行状态,内存中使用物理地址

逻辑地址=页号+页内地址
物理地址=页帧号+页内地址

  • 优点:利用率高,碎片小,分配及管理简单
  • 缺点:增加了系统开销;可能产生抖动现象

地址变换
image

页表机制
image
image

缺页中断机构

每当所要访问的页面不在内存时,便产生缺页中断,请求系统将所缺之页调入内存。
缺页中断的特点:

  1. 在指令执行期间产生和处理中断信号,而非通常的在指令执行完之后检 测处理中断。
  2. 一条指令在执行期间,可能产生多次缺页中断。

页面置换算法

  1. 最佳(Optimal)置换算法
    选择换出的页面,将是以后永不使用的或在最长(未来)时间内不再被访问的页面。因无法预 知哪个页面永远不再使用或者最长时间不再被访问,所以这是一种理想算法。

  2. 先进先出(FIFO)置换算法
    总是将最先进入内存的页面换出,或者说选择在内存中驻留时间最久的页面换出

  3. 最近最久未使用(LRU)置换算法
    选择最近最久未使用的页面换出,是一种用“最近的过去”作为“最近的将来”的估计的方法。
    具体方法:用访问字段来记录一个页面自上次被访问以来所经历的时间t, 时,当要换出页面时,选择现有页面中其t值最大的,即最近最久未使用的页面换出。
    LRU是堆栈类的算法。

  4. Clock置换算法
    访问页面时,在页表项中记录下访问情况;缺页时,从上次查找结束的位置顺序查找未被访问的页面换出。

习题

image
D B

posted @ 2022-10-06 11:46  kingwzun  阅读(1247)  评论(0编辑  收藏  举报