第三章内存管理
一、内存管理的概念
1.操作系统内存管理
- ①负责内存空间的分配和回收
- ②负责提供某种技术从逻辑上对内存空间进行扩充(实现虚拟性)
- ③负责程序的逻辑地址到物理地址的转换(这个过程称为地址重定位)
- ④提供内存保护功能,保证各进程在各自存储空间内运行,互不干扰。
2.地址重定位的三种装入方式
①绝对装入:编译时产生绝对地址,单道程序阶段此时还未有操作系统。
②可重定位装入:装入时将逻辑地址转换为物理地址,用于早期的多道批处理操作系统。
③动态运行时装入:运行时将逻辑地址转换为物理地址,用于现代操作系统。
3.内存保护
-
在计算机内存中,操作系统占了一部分内存,每个进程各占了部分内存,进程不可随意更改操作系统的数据也**不可访问其他进程的存储空间。**所以需要有内存保护机制。
-
内存保护两种方法:
方法一:CPU设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令访问某个地址时,CPU检查是否越界。
方法二:采用重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)进行越界检查。重定位寄存器存放进程起始地址,界地址寄存器存放进程最大逻辑地址。
二、内存空间的扩充
2.1覆盖技术
-
为了解决程序大小超过物理内存总和,引入了覆盖技术。
-
覆盖技术:将程序分为多段(多个模块),常用段常驻内存,不常用的段在需要时调入内存。
-
固定区:需要常驻的内存段放在“固定区”中,调入后就不再调出直到运行结束。
-
覆盖区:需要用到时调入内存,用不到时调出内存。
-
覆盖技术对用户不透明,增加了用户编程负担。
2.2交换技术(对换技术)
-
内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存。进程在内存与磁盘之间动态调度。
-
中级调度(内存调度)就是决定将哪个处于挂起状态的进程重新调入内存。
-
具有对换功能的操作系统中,通常把磁盘空间分为文件区和对换区两个部分:
文件区:主要存放文件,追求存储空间利用率,因此对文件区空间的管理采用离散分配方式。
对换区:空间占磁盘空间小部分,被换出进程数据就存放在对换区。且对换速度直接影响系统整体速度,对换区追求换入换出速度,采用连续分配方式。
综上,对换区的I/O速度比文件区更快。
-
交换通常在许多进程运行且内存吃紧时进行,系统负荷降低就暂停。
例如,在发现许多进程运行时经常发生缺页,说明内存紧张,此时可以换出一些进程。如果缺页率明显下降,则暂停换出。
-
可优先换出阻塞进程;可换出优先级低的进程。
三、内存空间分配—连续分配
- 连续分配:指用户进程分配必须是一个连续的内存空间。
- 连续分配管理方式:单一连续分配、固定分区分配、动态分区分配。
3.1单一连续分配
-
单一连续分配:内存被分为系统区和用户区。内存中只能有一道用户程序,用户程序独占整个用户区。
系统区用于存放操作系统相关数据,通常位于内存低地址部分;
用户区用于存放用户进程相关数据。
-
优点:实现简单;无需外部碎片;可以采用覆盖技术扩充内存;不一定需要内存保护。
-
缺点:只能用于单用户、单任务的操作系统中;有内部碎片;存储器利用率极低。
注:内部碎片指分配给某进程内存区域没用上的部分。
3.2固定分区分配
-
固定分区分配:为了能够在内存中装入多道程序,且这些程序之间不会相互干扰。将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业。
-
固定分区分配分为:
①分区大小相等:缺乏灵活性,适用于用一台计算机控制多个相同对象的场合。
②分区大小不等:增加灵活性,可以满足不同大小的进程需求。
-
操作系统建立一个数据结构——分区说明表,用来实现各个分区的分配和回收。
每个表项用来对应一个分区,通常按照大小排列,每个表项包括对应分区的大小、起始地址、状态(是否已分配)。
当某个用户程序需要装入内存中,由操作系统内核程序根据用户大小检索该表,找到一个能满足程序的分区分配给程序,然后修改状态为已分配。
-
优点:实现简单;无外部碎片。
-
缺点:当用户程序太大,所有分区都不能满足需求时,需要采用覆盖技术来解决问题,降低了性能;产生内部碎片,内存利用率低。
3.3动态分区分配
-
动态分区分配:又称可变分区分配。这种分配方式不会预先划分内存分区,在进程装入内存时根据进程大小动态建立分区。
-
记录内存使用情况的两种常用的数据结构:
①空闲分区表:每一个空闲分区对应一个表项,表项包含分区号、分区大小、分区起始地址等信息。
②空闲分区链: 每个分区的起始部分和末位部分分别设置前向指针和后向指针。起始部分还可记录分区大小等信息。
-
把一个新作业装入内存时,需按照一定的动态分区分配算法,从空闲分区表中选出一个分区分配给改作业。
-
动态分区分配没有内部碎片,但是有外部碎片。
内部碎片:分配给某个进程的内存区域中,有些部分没用上。
外部碎片:内存中某些空闲分区由于大小难以利用。
【分配】假设采用空闲分区表,内存中有三块空闲分区,现有一个进程(4MB)要存入内存。
①若进程按照某个动态分区算法,要放入第一块空闲分区。由于第一块空闲分区比进程大,则只需要修改分区表中大小和起始地址信息。
②若进程按照某个动态分区算法,要放入第三块空闲分区,由于第三块空闲分区刚好用完,则只需删除分区表中分区。
【回收】假设采用空闲分区表,内存中要回收一块进程空间。
①假设回收后有一个相邻的空闲分区。
则合并到相邻的空闲分区中。例如回收进程4
②假设回收区的前、后各有一个相邻的空闲分区
将一整块空间进行合并。例如回收进程4
③假设回收区前后都没有空闲区
需要增加一个空闲分区表项,例如回收进程2
注:各表项的顺序不一定按照地址递增序列排列,具体的排列方式需要一句动态分区分配算法来确定。
3.4动态分区分配算法
- 动态分区分配算法:在动态分区分配方式中,当很多空闲分区都能满足需求时,按照一定规则进行分配。
- 动态分区分配算法有:首次适应算法、最佳适应算法、最坏适应算法、邻近适应算法
1.首次适应算法
算法思想:每次从最低地址开始查找,找到第一个大小能满足大小的空闲分区。
实现:空闲分区按照地址递增的次序排列。每次分配内存时从头查找。
2.最佳适应算法
算法思想:为了保证“大进程“到来能有连续的大片空间,尽可能更多留下大片空闲区,即优先使用更小的空闲区。
实现:空闲分区按容量递增次序链接,每次分配内存时从头找到大小能满足要求的第一个空闲分区。
缺点:每次都选最小的分区进行分配,会留下越来越多很小的内存块。这种方法会产生很多的外部碎片。
3.最坏适应算法(最大适应算法)
算法思想:优先使用最大的空闲区。
实现:空闲分区按容量递减次序链接。每次分配内存时从头查找。
4.邻近适应算法
算法思想:每次查找从上次查找结束的位置开始检索,依次减少查找开销。空闲分区排序按照最佳适应算法。
实现:空闲分区按容量递增次序链接,每次分配内存从上次查找结束的位置开始查找空闲分区。
四、内存空间分配—非连续分配
4.1基本分页存储管理
1.分页存储:
将内存空间分为大小相等的分区,每个分区就是一个“页框”,(按照不同教材的叫法:页框=页帧=内存卡=物理块=物理页面),每个页框有一个编号,称为“页框号”(按照不同教材的叫法:页框号=页帧号=内存块号=物理块号=物理页号),页帧号从0开始。
进程的逻辑地址也分为与页框大小相等的部分,每个部分称为一个“页”或"页面"。每个页面有一个编号称为“页号”,页号也是从0开始。
注:这里需要区分,页框是指内存里边,页面(页)是指进程里边。
-
操作系统以页框为单位为各个进程分配内存空间,进程的一个页面分别放入一个页框中。即进程的页面与内存的页框有一一对应关系。
-
为了能知道进程的每个页面在内存中存放位置,操作系统为每个进程建立一张页表。 页表通常存放在PCB(进程控制块)中。
- 分页主要目的是为了实现离散分配,提高内存利用率。对用户不可见的。
2.页表:
①每个进程对应一个页表
②进程的每个页面对应一个页表项
③每个页表项由”页号“和”块号“组成,分别记录页面和实际存放在内存的页框号的映射关系。
【例】假设某物理内存大小为4GB,页面大小为4KB,则每个页表项至少应为多少字节?
内存块大小
=
页面大小
=
4
K
B
=
2
12
B
4
G
B
内存会被分为
2
32
÷
2
12
=
2
20
个内存块
则内存块号范围为
0
到
2
20
−
1
则内存块号至少需要
20
b
i
t
来表示。
所以至少要用
3
个字节
(
24
b
i
t
)
来表示块号,也就是每个页表项需要
3
B
。
内存块大小=页面大小=4KB=2^{12}B \\4GB内存会被分为 2^{32}÷2^{12}=2^{20}个内存块 \\则内存块号范围为 0到2^{20}-1 \\则内存块号至少需要20bit来表示。 \\所以至少要用3个字节(24bit)来表示块号,也就是每个页表项需要3B。
内存块大小=页面大小=4KB=212B4GB内存会被分为232÷212=220个内存块则内存块号范围为0到220−1则内存块号至少需要20bit来表示。所以至少要用3个字节(24bit)来表示块号,也就是每个页表项需要3B。
页表项是连续存放的,因此页号可以隐含,不占用存储空间。
3.逻辑地址结构
如果有
k
位表示“页面偏移量”,则说明该系统中一个页面大小事
2
k
个内存单元。
如果有
m
位表示
"
页号
"
,则说明该系统中,一个进程最多有
2
m
个页面。
给出一串逻辑地址,页号
=
逻辑地址
÷
页面长度
(
取整数
)
;页内便宜量
=
逻辑地址
%
页面长度
(
取余数
)
。
如果有k位表示“页面偏移量”,则说明该系统中一个页面大小事2^k个内存单元。 \\如果有m位表示"页号",则说明该系统中,一个进程最多有2^m个页面。 \\给出一串逻辑地址,页号=逻辑地址÷页面长度(取整数);页内便宜量=逻辑地址\%页面长度(取余数)。
如果有k位表示“页面偏移量”,则说明该系统中一个页面大小事2k个内存单元。如果有m位表示"页号",则说明该系统中,一个进程最多有2m个页面。给出一串逻辑地址,页号=逻辑地址÷页面长度(取整数);页内便宜量=逻辑地址%页面长度(取余数)。
4.基本地址变换机构
- 基本地址变换机构借助进程的页表将逻辑地址转换为物理地址。
- 通常在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M。
- 程序未执行时,页表的起始地址和页表长度放在进程控制块中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。
- 页表长度:表示一共有多少个页面。
- 页表项:每个页表项长度相同的,页号是隐含的。
【逻辑地址变换为物理地址】
①根据逻辑地址会得到页号、页内偏移量
②将页号在页表查询前,会经过一个判断页号是否超出页表长度的部件。如果超过页表长度(超过和等于都会),则产生越界中断。
③页号未超出部件,根据页表寄存器中的页表起始地址,查询页表确定页面存放的内存块号。
④内存块号和页内偏移量组成物理地址,根据地址进行访存操作。
所以,CPU在进行地址变换时,需要进行两次访存操作:①查页表。②访问目标内存单元。
【例】若页面大小L为1K字节,页号2对应的内存块号b=8,将逻辑地址A=2500转换为物理地址E。
- 等价描述:某系统按照字节寻址,逻辑地址结构中,页内偏移量占10位。页号2对应内存块号b=8,将逻辑地址A=2500转换为物理地址E。
页面大小为 1 K 字节 ( 按照字节寻址,页内偏移量占 10 位 ) ,即页面大小 1024 B 页号 = 2500 / 1024 = 2 ( 计算机中取整数部分 ) 页内偏移量 = 2500 % 1024 = 452 根据题目条件可知,页号 2 没有越界,其存放的内存块号 b = 8 。 则物理地址 E = 8 ∗ 1024 + 452 = 8644 页面大小为1K字节(按照字节寻址,页内偏移量占10位),即页面大小1024B \\页号=2500/1024 = 2(计算机中取整数部分) \\页内偏移量=2500\%1024=452 \\根据题目条件可知,页号2没有越界,其存放的内存块号b=8。 \\则物理地址E=8*1024 + 452 = 8644 页面大小为1K字节(按照字节寻址,页内偏移量占10位),即页面大小1024B页号=2500/1024=2(计算机中取整数部分)页内偏移量=2500%1024=452根据题目条件可知,页号2没有越界,其存放的内存块号b=8。则物理地址E=8∗1024+452=8644
- 综上所述:在分页存储管理中,只要给出逻辑地址,系统就可自动算出页号、页内偏移量。所以页式管理中地址是一维的。
- 理论上,页表长度为3B即可表示内存块号的范围,但是为了方便页表查询往往会使页面恰好可以装得下整个页表项让页表项占更多字节。
4.2具有快表的地址变换机构
- 快表:又称联想寄存器(TLB),是一种访问速度比内存块很多的高速缓存(TLB不是内存),用来存放最近访问的页表项的副本,可以加速地址变换速度。因此内存中页表也成为慢表。
【拥有快表逻辑地址变换为物理地址】
①根据逻辑地址会得到页号、页内偏移量
②将页号在页表查询前,会经过一个判断页号是否超出页表长度的部件。如果超过页表长度(超过和等于都会),则产生越界中断。
③页号未超出部件,根据页表寄存器中的页表起始地址,查询“快表”,快表若命中则直接组成物理地址。
④若快表未命中,则查询内存中的页表。并且最近使用过的页表项会放入快表当中。
注:快表中存放的是页表的一部分副本,由于快表造价高,所以快表一般容量较小。
- 所以:快表命中时,访问某个逻辑地址仅需要一次访存即可。
快表未命中时,访问某个逻辑地址需要两次访存。
4.3两级页表
- 二级页表:当页表很大时,需要占用很多连续页框,可以将页表分页并进行离散存储,再建立一张页表记录页表各个部分存放目录,称为“项目录表”。
【例】32位逻辑地址空间,页表项大小为4B,页面大小为4KB,则页内地址占12位。
- 若采用单级页表结构的逻辑地址结构:
由此可得页表项有1048575个(20^20)。
- 采用二级列表,将原来的页表项每1024另成一个页表分散存储到内存当中,建立一个“页目录表”。
若采用二级页表结构逻辑地址结构:
由此可得页目录表共有1024项,每个二级页表(页表索引)有1024项。
【二级页表逻辑地址变换为物理地址】
例:根据上图,将逻辑地址(0000000000,0000000001,111111111111),逻辑地址是以原码表示,转为物理地址(用十进制表示)
【注意细节】
1.若采用多级页表机制,各级页表大小不能超过一个页面。
例:某系统按字节编址,采用40位逻辑地址,页面大小为4KB,页表项为4B,假设采用纯页式存储,需要采用几级页表,页内偏移量几位。
解:页面大小为
4
K
B
=
2
12
B
,按照字节编址则页内偏移量位数为
12
位
页号
=
40
−
12
=
28
位。
页面大小
4
K
B
,页表项为
4
B
。则每个页面可存放
4
K
B
/
4
B
=
2
10
个页表项
因此各级页表最多包含
2
10
个页表项,需要
10
位二进制,因此每级页表最多为
10
位
总共
28
位页号至少要分三级。
解:页面大小为4KB=2^{12}B,按照字节编址则页内偏移量位数为12位 \\页号=40-12=28位。 \\页面大小4KB,页表项为4B。则每个页面可存放4KB/4B=2^{10}个页表项 \\因此各级页表最多包含2^{10}个页表项,需要10位二进制,因此每级页表最多为10位 \\总共28位页号至少要分三级。
解:页面大小为4KB=212B,按照字节编址则页内偏移量位数为12位页号=40−12=28位。页面大小4KB,页表项为4B。则每个页面可存放4KB/4B=210个页表项因此各级页表最多包含210个页表项,需要10位二进制,因此每级页表最多为10位总共28位页号至少要分三级。
2.假设没有快表机构,两级页表访存次数分析:
①第一次:访问内存中页目录表
②第二次:访问内存中二级页表
③第三次:访问目标内存单元
4.4基本分段存储管理方式
1.分段
- 分段:进程的地址空间按照自身逻辑关系划分为若干个段,每个段都有一个段名,每段从0开始编址。
- 内存分配:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。
- 例如进程A分为MAIN、X、D三个段,分别存在内存当中。
-
由于时按逻辑功能模块划分,用户编程更方便,程序可读性更高。
-
分段系统逻辑地址结构按照段号(段名)和段内地址(段内偏移量)所组成。
段号的位数决定了每个进程可以分为几段,段内地址位数决定了每个段最大长度。
例:段号占16位,则每个进程最多有216=64K个段。段内地址占16位,因此每个段最大长度216=64KB。
2.段表
- 程序分为多个段,各段离散地装入内存。为了保证程序能正常运行,需要为每个进程建立一张段映射表用来找到各逻辑段位置。这个表称为“段表“。
- 每个段对应一个段表项,段表项记录了在内存中起始位置(称”基址“)和段长度。
- 各个段表项长度是相同的。
【分段管理地址转换过程】
-
分段管理和分页管理最大的区别,分页每个页面长度是相同的,分段每个段长是不同的。
-
分段主要目的是为了更好的满足用户需求。对用户可见的。
-
分段更容易实现信息的共享和保护。
-
分段管理同时也需要两次访存。
4.5段页式管理方式
1.分页分段优缺点
2.段页式管理(分段+分页)
- 将进程按逻辑分块,在将各段分页。再将内存空间分为大小相同的内存块。
- 例如每个页面4KB。
-
段页式系统逻辑地址:由段号、页号、页内地址组成。
-
段号位数决定了每个进程最多可以分几段
页号位数决定了每个段最大有多少页
页内偏移量决定了页面大小、内存块大小
【例】段号占16位,该进程最多可以分2^16=64K个段
页号占4位,每个段最多2^4=16页
页内偏移量占12位,因此每个页面大小为2^12=4096=4KB
- 每个段对应一个段表项,段表项由段号、页表长度、页表存放块号组成。
- 每个页表存放块号指向内存页表,每个页面对应一个页表项,页表项由页号、页面存放内存块号组成。
【段页式管理地址转换过程】
五、内存空间扩充—虚拟内存
-
传统的存储管理,如连续分配和非连续分配。作业必须一次性全部装入内存后才能开始运行,会导致问题:
①作业很大时,不能全部装入内存,导致大作业无法运行。
②当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降。
③一旦作业装入内存,就会一直驻留在内存中,直到作业运行结束。事实上,一个时间段内只需要访问作业一小部分数据即可正常运行。
-
局部性原理:
①时间局部性:如果执行了程序中某条指令,那么不久后这条指令很有可能再次执行;某个数据被访问过,不久后该数据可能再被访问。
②空间局部性:一旦程序访问了某个存储单元,在不久后其附近的存储单元也有可能被访问。
5.1虚拟内存
- 基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存。就可以让程序开始执行。
- 在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
- 若内存空间不够,由操作系统负责将内存暂时用不到的信息换出外存。
- 综上所述:在操作系统管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存。
- 操作系统虚拟性:实际物理内存大小没有变,只是逻辑上进行了扩充。
1.主要特征
- 多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
- 对换性:在作业运行时,无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。
- 虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量远大于实际容量。
2.实现虚拟内存
- 虚拟内存技术,允许一个作业多次调入内存。因此需要建立在离散分配的内存管理方式基础上。
5.2请求分页管理方式
-
请求分页存储管理与基本分页存储管理主要区别:
请求分页存储管理在基本分页存储管理上,
操作系统还要提供请求调页功能,将缺失的页面从外存调入内存。
还需要提供页面置换功能,将暂时用不到的页面换出外存。
1.请求页表
-
对于请求分页管理方式,请求页表项除了需要记录内存块号,还需要记录:
①状态位:标记是否已调入内存
②访问字段:记录最近被访问几次,提供给置换算法选择换出的依据。
③修改位:页面调入内存后是否被修改
④外存地址:页面在外存存放的位置。
2.缺页中断机构
-
为了实现请求调页功能,系统需要引入缺页中断机构。缺页中断与当前执行指令有关,属于内中断。
-
在请求分页系统中,当访问页面不在内存时,产生一个缺页中断。由操作系统的缺页中断处理程序处理中断。
-
此时缺页的进程阻塞,放入阻塞队列。调页完成后再将其唤醒,放回就绪队列。
-
缺页中断处理程序:
如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应页表项。
如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面近期被修改过需要将其写回外存。
3.地址变换过程
-
请求分页管理方式相对于基本分页管理新增步骤:
①请求调页:查到页表项时进行判断
②页面置换:需要调入页面,但没有空闲块时进行
③新增表项:需要修改请求页表中新增的表项
5.3页面置换算法
- 页面的换入换出需要磁盘I/O,有较大开销。因此好的页面算法应该追求更少的缺页率。
1.最佳置换算法
- 最佳置换算法:每次选择淘汰的页面将是以后永不使用,或者最长时间内不再被访问的页面,以保证最低缺页率。
- 整个过程缺页中断发生了9次,页面置换发生了6次。
- 注:缺页时,未必发生页面置换。还有空闲内存块时,不用进行页面置换。
- 实际上,操作系统无法提前预判页面访问序列。因此最佳置换算法是无法实现的。
2.先进先出算法
- 先进先出置换算法:每次选择淘汰的页面是最早进入内存的页面
- 实现方法:把调入内存的页面根据调入的先后顺序排列成一个队列,需要换出页面时选择队头页面。
- 只有先进先出算法才会产生Belady异常。算法实现简单,但是算法性能差。
3.最近最久未使用置换算法(LRU)
-
最近最久未使用置换算法(LRU):每次淘汰的页面是最近最久未使用的页面。
-
实现方法:用访问记录该页面自上次被访问以来所经历的时间t,当需要淘汰一个页面时,选择t值最大。、
- 在人工查看时:需要淘汰页面时,往前扫描找到最后一个页号就是要淘汰的页面。
- 该算法实现需要专门的硬件支持,性能好,但实现困难,开销大。
4.时钟置换算法(NRU)
-
时钟置换算法(NRU):是一种性能和开销较均衡的算法,又称CLOCK算法或者最近未用算法。
-
简单的实现方法:将内存中的页面通过链接指针链接成一个循环队列
且为每个页面设置一个访问位,1表示最近访问过,0表示最近没被访问过。
当需要淘汰时,需要检查页的访问位,0则换出,1则置为0,暂不换出。
若第一轮扫描都是1,则将这些页面访问位置0后,在进行第二轮扫描。
【例】假设系统为某进程分配了5个内存块,并考虑到有以下页面号引用串:1,3,4,2,5,6,3,4,7
①1,3,4,2,5会链接成一个循环队列
②分配6时,每个访问位都为1,经过第一轮扫描后所有访问位都置0。
第二轮扫描时,6号页会替换1号页,扫描指针指向下一页
③访问3号、4号时,访问位都置1。
④访问7时,需要依次扫描,若为1,置0指向下一个位置,找到第一个访问位为0替换
5.改进型的时钟置换算法
- 简单的时钟算法仅考虑到了一个页面是否被访问过。如果淘汰的页面没有被修改过就不需要执行I/O操作写回外存。只有被淘汰的页面被修改过才需要写回外存。
- 所以在简单的时钟置换算法其他条件相同时,应优先淘汰没有修改过的页面,避免I/O操作。
- 增加修改位:0为未修改过,1为修改过。
5.4页面分配策略
-
驻留集:指请求分页存储管理中给进程分配的物理块的集合。若采用了虚拟存储技术,驻留集大小一般小于进程总大小。
-
若驻留集太小,导致缺页频繁,系统要花大量时间来处理缺页,实际用于进程推进的时间很少。
-
若驻留集太大,导致多道程序并发度下降,资源利用率低。
-
根据分配情况,驻留集分配分为:
①固定分配:操作系统为每个进程分配一个固定数目的物理块,在进程运行期间驻留集大小不再改变。
②可变分配:先为每个进程分配一定数目的物理块,在进程运行期间根据情况适当增加或减少。
-
根据置换范围,驻留集的置换分为:
①局部置换:发生缺页时只能选进程自己的物理块进行置换。
②全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存再分配给缺页进程。
注:全局置换意味着一个进程拥有的物理块会改变,因此不可能是固定分配。
-
将分配和置换策略结合得到:
①固定分配局部置换:系统为每个进程分配一定数量的物理块,在整个运行期间都不改变。若进程在运行中发生缺页,则只能从该进程在内存中的页面中选择一页进行换出。
缺点:很难开始就确定应该为每个进程分配多少个物理块。
②可变分配局部置换:刚开始为每个进程分配一定数量物理块,操作系统保持一个空闲物理块队列。若进程发生缺页,从空闲物理块中取出一块分配给该进程,若没有空闲物理块,则选择一个未锁定页面换出外存,将该物理块分配给该进程。
缺点:对于进程发生缺页时,将获得新的物理块。若空闲物理块用完,系统选中进程的物理块会减少,缺页率会增加。
③可变分配全局置换:刚开始为每个进程分配一定数量物理块。当某个进程发生缺页时,只允许该进程自己物理块中进行置换。如果进程频繁缺页,系统会为其增加物理块,若进程缺页率低,系统会为其减少物理块,以保证缺页率到达适合程度。
注:可变分配局部置换:只要缺页就分配新物理块
可变分配全局置换:根据发生缺页频率来变动物理块。
-
何时调入页面:
预调页策略:一般用于进程运行前
请求调页策略:进程运行时,发现缺页在调页
-
抖动(颠簸):刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存。主要原因是内存块不够。
-
工作集:在某段时间间隔里,进程实际访问页面的集合。
5.5内存映射文件
-
内存映射文件:方便程序员访问文件数据,方便多个进程共享同一个文件。
-
方便程序员访问文件数据:磁盘的数据是离散存储的,将需要用到的进程复本存入进程的虚拟地址空间中,即可顺序访问。
页进行换出**。缺点:很难开始就确定应该为每个进程分配多少个物理块。
②可变分配局部置换:刚开始为每个进程分配一定数量物理块,操作系统保持一个空闲物理块队列。若进程发生缺页,从空闲物理块中取出一块分配给该进程,若没有空闲物理块,则选择一个未锁定页面换出外存,将该物理块分配给该进程。
缺点:对于进程发生缺页时,将获得新的物理块。若空闲物理块用完,系统选中进程的物理块会减少,缺页率会增加。
③可变分配全局置换:刚开始为每个进程分配一定数量物理块。当某个进程发生缺页时,只允许该进程自己物理块中进行置换。如果进程频繁缺页,系统会为其增加物理块,若进程缺页率低,系统会为其减少物理块,以保证缺页率到达适合程度。
注:可变分配局部置换:只要缺页就分配新物理块
可变分配全局置换:根据发生缺页频率来变动物理块。
-
何时调入页面:
预调页策略:一般用于进程运行前
请求调页策略:进程运行时,发现缺页在调页
-
抖动(颠簸):刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存。主要原因是内存块不够。
-
工作集:在某段时间间隔里,进程实际访问页面的集合。
5.5内存映射文件
-
内存映射文件:方便程序员访问文件数据,方便多个进程共享同一个文件。
-
方便程序员访问文件数据:磁盘的数据是离散存储的,将需要用到的进程复本存入进程的虚拟地址空间中,即可顺序访问。
-
方便多个进程共享同一个文件:多个进程可以映射同一个文件,实现共享。
参考书籍:计算机操作系统(第四版)——汤小丹;王道操作系统复习指导
参考视频:王道计算机考研操作系统