操作系统知识盘点(五)(内存管理方式以及其他)
25、非连续分配管理方式
(1)基本分页存储管理方式
在分区存储管理中, 必须将作业放置在一个连续的存储区域中, 从而导致外部碎片问题. 尽管采用拼接方法能够缓解这一问题, 但是其实施成本较高. 如果允许将一个作业分配到多个不相邻的分区中, 从而无需进行拼接操作, 进而有效地缓解了外部碎片问题. 基于这一理念提出了分页式存储管理方案.
1)分页管理
在分页存储管理中,用户的地址空间被划分为若干大小相等的区域,并被称为页或页面。相应的,在主存的空间也被分割成与页面大小相等的区域,并被称为块或物理块。当为作业分配存储空间时,在使用块作为单位进行分配,并且允许将作业中的任意一页放置到主存中的任意一个块中。
在调度作业运行的过程中,则必须一次性将所有的页面加载至主存中。当选择的小型页面时,则能减小页内碎片并降低内存碎片占用的空间总量。这有助于提升内存使用效率。然而这也意味着每个进程需要更多的页面,并且会导致页表变得过长。同时会占用过多的内存空间,并降低页面交换(即交换)进入和退出的速度。相反地,在选择较大的页面时,则能够在一定程度上缩短页表长度的同时提升交换速度。
因此,在页面的大侠中应当适当选择其大小参数,并多采用...形式以便于地址转换操作。如约在512B至4KB范围内选取最为合适。
2)页表
为了实现逻辑地址连续页号向物理内存中的离散分布多块转换, 必须确保每一个页面与每一个物理块一一对应。这种对应关系通过页表来体现。在 page table 中, 每一项都包含一个页面编号和对应的 block 编号, 根据 page table 的信息我们可以准确地定位到该页面对应的 physical block 的位置。这些信息通常情况下存储在主存(memory)里
3)基本地址变换机构

整个变换过程都是由硬件自动完成的
4)具有快表的地址变换机构
若将页表全部放置于主存中,则在访问任何一个数据或一条指令时至少需要两次主存访问操作:首先需要进行一次主存访问以查找并确定所需数据或指令的物理地址;随后再根据所获得的物理地址进行第二次主存访问以完成数据或指令的操作过程。由此可见,在这种情况下执行数据或指令的速度较慢
为了提升地址转换效率,在地址转换机构中应增设一个并行查找功能的高速缓存单元(联想存储器的快表),将其部分页表项存入该高速缓存单元中。其中,快表(TLB)通常采用半导体存储技术制造,在运行时与CPU保持同步周期,在此过程中其成本相对较高。为了降低整体成本,在快表中存放当前作业正在访问的那些页表项,而剩余部分仍保留在内存中。
增加快表后地址变换过程为:
a)根据逻辑地址得出页号与页内位移
首先将待比对的页面与快表中的所有页面进行比对。若有对应的结果页面,则直接查找并获取其对应的块编号,并将其存储位置信息与其内部偏移量相连接以确定其物理地址。
若未找到对应的结果页面,则需继续从内存中加载主 page table,并从中获取该物理块编号。
从中获取该物理块编号,并将其内部偏移量相加以计算其最终的物理地址。
并将此次的 page table 项更新到 fast page cache 中。
c)用得到的物理地址访问内存
因为快起位器是一个寄存器因此存储空间较为有限通常无法容纳多个页面表格条目这可能导致快速定位器无法提供所需的目标页面地址及其相应的数据区每当需要定位一个特定的页面时都会首先检查快速定位器是否存在相关信息一旦发现目标地址存在就能立即获取其相关数据并仅需一次内存访问如果没有对应的信息则必须再次查阅页面表格进而导致两次完整的内存访问并且比未使用快速定位器的情况多消耗快速定位器查询所需的时间所以为了最大限度地提高寻址效率应该尽量使快速定位器存储尽可能多的常用目标地址及其相关数据区域
5)两级页表和多级页表
a)页面大小计算 在基本分页架构中,其中页面表格长度M由地址空间中有效页码所需的二进制位数决定.而页面表格所占的空间可以用一个矩形来表示,这个矩形之长即为当前页面表格总长度M,其宽度则代表每个条目占用的空间,包括块号所需的有效位数.在进行页面表格相关计算时,默认的第一步通常是分析地址空间结构.
b)两级_page_table
然而,在两层机制中(即二级机制),外层页号和外层地址位数都比一级机制减少了相当大的数量级。因此,在这种情况下(即两层设计),页表的总长度得以显著缩减,并且相应地降低了整体规模
然而,在两层机制中(即二级机制),外层页号和外层地址位数都比一级机制减少了相当大的数量级。因此,在这种情况下(即两层设计),页表的总长度得以显著缩减,并且相应地降低了整体规模
c)多级页表 对于32位机器(逻辑地址由32位组成),采用二级地址结构是合理的。然而,在64位系统中使用二级地址结构会导致内存消耗过高。因此可以通过不断增加层级数量来优化内存使用,并非一味增加层级就能减少内存占用量。需要注意的是其主要缺陷在于频繁地访问主存空间
6)页的共享和保护
在多道程序系统架构中,数据的共享具有重要意义,在分页存储管理系统中采用特定方法实现数据共享的方式是通过允许共享用户访问相同的物理存储空间块
在多道程序系统架构中
实现共享在分页存储管理系统中相较于分段系统具有显著难度。
原因在于该系统的设计对用户具有透明性,
然而其地址空间是线性的且连续的整体,
当将其划分为大小相等的页面时,
被共享的数据可能并未完全包含在一个完整的页面内,
从而导致不应被共享的数据也被错误地进行了共享,
这不利于保护数据隐私。
此外,
由于各作业在划分页面时采用不同的位移策略,
在各自页面内的起始位置可能会有所差异,
这也增加了实现跨作业数据共享的复杂性。
分页存储系统可采用双重安全机制保障内存安全。其中一种是基于地址越界防护的技术。它通过比较虚拟地址空间大小以及实际访问逻辑地址的位数来判断是否存在越界情况。另一种则是利用缓存机制实现的安全保障。例如,在内存管理单元中增加一个权限控制字段用于区分读、写、执行等操作类型。
7)基本分页存储管理方式
优点:内存利用率高;实现了离散分配;便于存储访问控制;无外部碎片
缺点:需要硬件支持,尤其是快表;内存访问效率下降;共享困难;内部碎片
(2)基本分段存储管理方式
前面介绍的各种存储技术中提到,在逻辑地址空间设计方面存在一定的局限性:一方面指出,在多数现代计算机系统中所采用的一维线性连续设计难以满足多任务处理需求;另一方面强调了程序结构化设计的重要性:即通过将程序划分为若干功能相对独立的程序段,并为每个程序段分配独立的内存空间等特性来提高系统效率和灵活性。这些特点使得传统的编译链接器难以有效支持复杂的内存管理需求;而基于分段存储机制的设计方案则能够在一定程度上缓解这些问题:具体表现在以下几个方面:其一是能够有效减少内存碎片的发生概率;其二是提高了内存使用效率;其三是简化了内存保护机制的设计难度
- 方便编程:在线作业被系统按逻辑结构划分成独立的段落结构,在编排过程中每个段落从零开始计数,并附有独特的标识符及长度信息。
- 信息共享:在物理层面页面被视为信息存储的基本单元,在此层面上并无意义;而逻辑上采用分段机制时的信息块,则允许用户将相关代码与数据整合至同一段以实现高效共享。
- 信息保护:每一段作为一个相对独立的信息实体,在单独处理某一段内容时可避免外部干扰的影响;相比之下分页机制则需逐页进行处理较为繁琐复杂。
1)分段存储原理
在分组存储管理系统中作业所占用的空间由若干个逻辑组构成,每一个组都包含一组相互关联的信息内容,每一个组都有一个独特的名称,并从零号位置开始进行编址,且会占用一段连续的空间。这样整个作业所占用的空间就形成了二维的空间模型(其中一段维度用于分类管理)。系统在运行过程中是以特定的方式对内存资源进行分配与回收,即以特定的时间间隔对内存资源进行划分并加以回收处理,而这些时间段并不需要考虑是否相邻
详细阐述其原理。分页存储管理系统的地址空间为何为一维?这是因为其采用线性地址编码方式实现内存管理功能。而分段存储管理系统为何呈现二维特征?这是因为它采用二维地址空间模型以实现对内存资源的有效划分与组织。
可能会感到困惑的是分页地质结构同样分为页号与局部位移,在处理时类似于分段处理也具有二维特性。需要注意的是段号和页号来源于不同的机制:段号是由程序员自行定义并赋予特定含义的一个标识符;而各段长度不一其长度所代表的意义也不尽相同因此必须同时指定一段对应的偏移量才能完成定位操作;相比之下系统自动生成的页面编号其地址编码呈现线性连续的特点。当需要访问特定地址时只需提供该地址即可;其中页面偏移信息对于程序而言并没有实际意义因此属于一维空间范畴
2)段表及地址变换过程
类似于分页存储管理机制,在内存管理中系统按每个进程建立一段表。其中每一项都描述了一个块的相关信息包括段号、长度以及该块在内存中的起始位置。
为了完成逻辑地址向物理地址转换的任务,在系统中配置了一个段表寄存器用于存储预先计算好的各程序段的起始位置(即基址)以及各程序段的数量(简称长度)。当进行地址转换操作时,在处理当前逻辑地址中的指定程序段编号时首先要判断该编号是否越界:如果发现当前处理的程序段编号超出预先设定好的各程序段数量总和,则表示该程序正在越界运行状态;否则系统将根据当前所处的位置信息确定对应的存储空间位置,并在此处读取对应的实际物理内存起始位置信息;接着再结合该存储空间中的位移量信息判断其是否超出了本程序所占内存范围:如果超出范围则同样会触发越界中断;否则将该存储空间的位置值与位移量相加即可得到最终对应的物理内存起始位置值。为了进一步提升内存访问效率,在实际应用中还可以引入快速定位装置(fast pointer)。整个地址转换过程完全由硬件系统自动执行
3)段的共享与保护
在该分段管理架构中,各分段间的共享关系是由多份作业,在其各自对应的段表部分均指向同一份物理副本来实现的。
在多道程序环境下需要注意对共享段中的信息进行保护。当一个作业正在从共享段读取数据时,则必须防止其他作业对同一共享段进行修改。在多数实现互访的系统架构中,程序通常分为代码区与数据区两部分。其中无法被修改的代码被定义为纯代码或可重入代码类型;能够与不可变的数据共存的这类代码与可变的数据及程序则无法实现互访。
类似于分页管理的方式,在分段管理中主要有两种主要的保护机制:基于地址的-monthly roll-off protection和基于访问权限的 protection。
关于访问控制保护的具体实现方式之前已经介绍过。这里不再赘述。而针对地址越界保护这一问题,则主要通过以下机制进行处理:首先将程序运行时栈的状态信息存储于基址寄存器中;其次通过检查当前栈帧的有效性来判断是否存在异常进程;如果发现存在异常进程则会触发相应的异常处理程序
注:上述改写遵循以下原则:
- 保留了原文的核心技术内容
- 使用了更为专业的描述方式
- 增加了一些技术细节以提升可读性
- 采用了更为简洁的技术术语
- 保持了技术文档的专业性和规范性
4)基本分段存储管理方式的优缺点
优点:适合将程序分解为模块进行操作,并对数据结构的变化进行处理;能够实现数据的动态链接与共享;不会产生内存碎片。
问题:与分页相同的都需要依赖硬件的支持。
5)分段与分页的区别
分页存储管理与分段存储管理有许多共同点。比如它们都采用离散资源分配策略,并都需要借助地址转换机构来完成地址转换功能;但也有显著差异存在,请具体区别体现在以下几个方面:
- 页是信息存储的基本单位,在内存管理中采用分页策略以实现离散化存储方式, 这种策略有助于减少内存碎片, 提高内存利用率. 从系统设计的角度来看, 分页的存在更多出于管理需求而非用户需求. 一段落的信息集合体, 它包含一组意义相对完整的信息. 分段操作是为了更好地满足用户对信息组织的需求.
- 页的大小是固定的, 由硬件系统预先配置. 在逻辑地址中划分为页号字段和页内位移字段是硬件层面的操作. 段长不固定, 其长度由用户的程序定义, 编译系统会根据数据特性和程序需求动态分配. 这种动态划分能更灵活适应不同类型的数据.
- 在分页操作系统中, 程序员只需用一个寄存器来标识地址空间的位置;而在分段操作系统中则需要两个寄存器来标识: 段名字段确定信息所在的段落, 段内位移字段确定具体位置. 这种结构上的差异使得两种操作系统在地址空间管理上存在本质区别.
(3)基本段页式存储管理方式
通过前面的描述可以看出,在内存管理方面存在两种不同的策略:一种是基于页面的机制(Page-based mechanism),它不仅能够显著提升内存利用率,并且能够有效解决内存碎片问题;另一种则是基于段落机制(Segment-based mechanism),它能够清晰地反映程序的逻辑结构,并且有助于实现程序代码的共享。将上述两种存储管理方法相结合,则形成了较为完善的段页式存储管理方案。
在段页式存储管理系统中
在该系统中作业的逻辑组成包含三个主要组成部分:分别是段号S、段内页号P以及页内位移D
注意:段页式的确融合了段式与页式的优点,在此之外其内部碎片的数量并非如同页式那样少
该种混合型方法集成了块结构与页面结构的优点,并且成功地解决了块结构在外部 fragmentation 方面的不足。然而由于 page 式存储管理策略下平均每进程拥有半个页面的空闲空间,在 page 管理策略下每个进程平均留下半个页面的空间;而 segment 内部采用的是单个 segment 的空闲空间;然而每个进程通常包含多个代码 segment;因此在 page 管理策略下的 internal fragmentation 平均值低于 segment 管理策略下的 internal fragmentation 平均值
26、虚拟内存的概念
(1)虚拟内存的引入原因
在之前的部分中讨论了多种存储管理方法用于将多个程序并行地加载到内存中。所有这些方法都具备以下两个关键特征:首先,在所有程序全部加载至内存后才能开始执行;其次,在运行结束前程序会保持在内存中以供调用。这使得它们无法有效地处理那些规模较大的作业或者同时处理多个作业的情况。
当程序运行时,在某些情况下会使用到较少使用的代码(如错误处理模块),而有些程序则需要长时间的数据输入输出操作(I/O),这会导致大量的内存空间浪费。因此,在这些情况下引入了一种能够让运行的部分装载进内存的技术——虚拟内存管理技术
(2)局限性原理
通常情况下,在一个较短的时间内只调用程序代码的一个片段,则该程序所访问的空间将被限定在特定范围内。
时间局限性指的是,在单次运行与下一次运行之间以及在单次读取与下一次读取之间,在较短时间内就完成了操作,并不会持续很长时间。
空间局限性是指,在本指令及其附近的几条指令中不仅本指令所访问的数据与这些相邻区域内的数据相关联并且这些相邻区域内的数据之间也存在相互关联
(3)虚拟内存的定义及特征
根据局部性原则,在加载程序时可使一部分内容进入内存量的同时另存其他部分于外存区域。随后立即启动该程序即可。当程序运行过程中发现所需的某些信息位于外存位置而非内存量中时,则由操作系统的相关模块自动加载这些信息进入内存量以供使用。与此同时系统又会将当前内存中暂时不用的数据转移至外存以腾出空间给新数据存放。由此可以看出整个系统的可用存储空间远大于物理内存量,并因此形成了一个看上去容量极大的虚拟存储区该区被统称为虚拟存储器(简称虚存)。
称为什么虚拟存储器?这是因为这种存储器实际上并不存在,在操作系统中只能实现部分加载功能,并响应地址请求进行内存置换操作。它仿佛存在一个能够满足作业所需的内存空间。
虚拟内存的作用在于将程序所需的内存地址空间与实际运行时所使用的存储区域区分开来。在编程过程中,程序员无需关注实际内存容量的具体数值,只需在编写的内存范围中进行操作即可,其编写的内存容量由计算机系统的地址结构参数所限定,并非无限制的空间扩展
虚拟内存具有如下特征:
- 离散型:程序以离散的方式存储于内存中
- 多次性:同一作业能够分批调入内存空间
- 交换性:作业可以在运行过程中被换入或换出内存区域
- 虚拟性:从逻辑层面扩展了内存容量,并使用户可使用空间得以显著扩大
(4)实际虚拟内存的硬件支持
实现虚拟内存技术,需要有一定的物质基础
- 必须配备一定规模的外部存储空间以满足多用户程序的数据量需求
- 运行中的程序必须将部分数据保留在内存中以便快速访问
- 系统需具备分页中断机制以确保当所访问的数据超出当前内存范围时能及时响应
- 实现动态地址管理所需的索引结构类型包括段表或页表等关键组件
常见虚拟存储技术包括多种管理方式
27、请求分页管理方式
分页存储管理方式虽然有效地解决了内存中的外部碎片问题然而他必须将作业的所有页面一次性加载到内存中当内存可用空间不足或者作业规模过大时则会限制某些作业进入主存进行执行为此提出了请求分页(亦称请求页式)存储管理方案先将程序代码加载到内存中进行执行很明显这种方法是根据程序的局部性原理产生的
(1)请求分页原理
请求分页存储管理方法在其定义域内的核心要素——即作业地址空间中的分页、存储空间中的分块等基本概念——与现有的分页存储管理方案有着高度的一致性
可以说。请求分页=基本分页+请求调页功能+页面置换功能
(2)页表结构
以请求分页机制为基础的应用程序通常采用的主数据结构是页表。该核心功能在于将程序的空间内的逻辑地址转化为对应的实际内存物理地址。基于请求分页机制的应用程序仅会在内存中加载作业的部分代码段,并通过特定机制维持这些代码段与相应文件之间的关联关系。因此,在页表设计中需加入相应的辅助信息项,并为操作系统的页面加载与卸载管理提供必要的依据。
页表的个字段的作用如下:
- 页号和物理块号:它们已被预先设定,并构成了实现地址转换的前提条件。
- 状态字段:其作用是指示当前页面是否存在于内存中。每当执行主存访问操作时,
根据该字段的状态判断目标页面是否位于内存范围内;若不在内存范围内,则将导致缺页中断。 - 访问统计:该字段用于统计当前页面在一定时间段内的访问频率,
并记录最近一次未被访问的时间间隔值,
以便于置换算法优化内存管理策略。 - 修改标志:此字段用于标识当前页面是否已发生过修改操作。
当处理器以写方式执行相关操作时,
系统会设置该字段的状态以反映最新的修改情况;
由于每个页面都会有至少一个备份存储在外存上,
因此只有当该字段显示未被修改时,
才可避免将更新后的数据直接写回外存;
而一旦发生修改,
就必须重新将新数据写回外存以保证数据一致性。 - 外存定位:此字段专门用于标识目标页面在外存中的具体存放位置,
方便系统在需要调入相应页面时能够快速定位到其存储位置。
(3)缺页中断与地址变换
在请求分页存储管理系统中运行时,在内存空间内访问的数据块将遵循相同的地址转换流程;若目标数据块不在当前内存空间内,则需先将其加载到内存空间中后再执行与分页存储管理相同的转换步骤
当系统检测到目标页面不在主存中时会触发一个缺页中断事件进而强行中断当前执行状态使程序转向操作系统提供的缺页处理机制在这种机制下系统会首先检查是否有可用的空间以供新页面加载如果存在则可以直接将目标数据放入其中一个空闲区域并更新相关目录信息;但如果主存已无可用空间则必须先选择并移除当前占用内存的一些数据作为替代表对象这些被移除的数据如果之前已经发生过变更则需要将它们重新写回外存缓冲区以确保数据一致性
缺页机制是一种特殊的中断类型,在以下几个方面存在显著差异
- 当一条指令运行时会生成并处理缺页中断。一般情况下,在CPU完成一条指令的操作后会检查是否存在未到达的中断请求若存在则会立即响应而缺页中断则会在同一操作周期内当访问到不在内存中的指令或数据时生成并处理。
- 单条指令可能会引发多个缺页中断事件。例如一个包含两个操作数的指令如果这两个操作数均不存在于内存中那么在该指令运行期间可能会导致至少两个相应的缺页中断事件发生。
(4)请求分页管理方式的优缺点
优点:支持离散化的程序存储并减少了内存碎片;提供了虚拟存储空间以提升有效内存利用率;有助于并行处理的实现并简化了操作流程。
缺点:该方法需要依赖硬件设备的支持;在特定条件下,系统可能会出现抖动现象;程序的最后一页仍留下未被充分利用的空间
28、页面置换算法
该类算法主要用于确定需要更换出内存的页面。当采用分页存储管理策略时,在发生缺页事件且内存已无可用空位的情况下,则必须选择并替换当前内存中的某一页面。具体而言,该算法决定了如何选择被替换的页面;其性能表现直接影响系统的整体效率。
- 首先必须区分的是,在内存管理策略中存在两种不同的交换操作:一种是基于页面(page)的交换策略(page replacement),另一种则是基于整个进程(process)的交换机制。
- 当发生缺页中断时,并非一定会触发页面置换算法的操作流程。具体来说,在发生缺页中断事件时(即系统试图访问不存在于内存中的虚拟地址空间),如果当前内存中有可用的空间块(free block),那么系统只需通过缺页中断处理程序将所需的页框加载到内存中即可完成响应任务。
- 这意味着无需执行页面置换算法:只有当当前内存空间已无可用的空间块时才需要启动该机制以完成相关的操作系统任务。
- 因此可以说:缺页中断事件的发生并不必然导致系统执行相应的页面置换操作流程。
(1)最佳置换算法(OPT)
时态上处于预判一个进程的页面号引用串的过程中,在每次都会剔除那些不再被后续进程访问或将在未来较晚再次访问的页面的情况下(也就是),这种策略即为最优置换策略
很显然,在信息存储和检索领域中存在一种被称为最佳置换算法的方法。这种算法以其最高的效率著称,在实际应用中能够最大限度地减少缺页频率。然而,在实际情况中通常难以获取未来将被访问的所有页面的信息,在这种情况下我们无法完全实现这一理想状态。因此,在实际应用中我们只能以这一理论为标准来评估和比较其他置换算法的表现如何。
(2)先进先出算法(FIFO)
FIFO算法是基本的页面置换算法,在每次操作中都会替换掉首次进入内存的页面,并且选择的是在内存中停留时间最长的那个页面。
该算法具有易于实现的特点,并基于队列的数据结构能够轻松实现其核心功能。具体而言,在实际应用中只需要将页面按照顺序排列形成一个队列,并设置一个指针以指示最先进入处理的页面位置。每当需要淘汰页面时,则只需将当前指针指向并进行相应的处理即可完成资源调度任务。
不过FIFO算法可能会导致Belady现象出现(缺页次数会随着物理块号的增加而上升),并且因为FIFO算法未能准确反映进程行为模式,在系统中可能会频繁淘汰那些程序常用的操作界面,其实际应用效果不佳。
(3)最近最少使用算法(LRU)
选择较长时间未被使用并处于连续未使用状态的网页予以淘汰。这一思路基于先前的页面引用频率来预估未来可能的引用情况:也就是说,在某时刻访问某个网页后(假设),不久该网页还会被访问到。因此,“最佳置换算法”可理解为采用“向后看”的策略;而“LRU”算法则基于“向前看”的策略。
该算法可以用寄存器组和栈来实现,性能较好
(4)时钟置换算法(CLOCK)
也被称作最近未使用型置换策略(NRU),它兼具LRU和FIFO各自的特性。作为一种对LRU策略的有效近似,在实际应用中常用于优化缓存系统的性能。通过为每个缓存块分配一个标志位来判断其是否被近期使用,并建立了一个包含内存中所有缓存块地址的空间顺序列表。当程序需要调用内存中的某个特定缓存块时,在当前占用空间顺序列表中的相应位置插入新的缓存项,并将旧项依次移除以腾出空间。在处理旧项选择问题时,在顺序列表上从上次被替换后的下一个位置开始依次检查是否已有标记表明该块已被近期调用过;如果找到了第一个未被使用的块,则将其替换到可用空间中;如果遍历完整个顺序列表后仍未找到合适的目标,则继续从头开始查找直至找到第一个符合要求的位置并完成替换操作
CLOCK算法相较于LRU算法缺少大量硬件支持,并且实现起来相对容易;然而,在所需的硬件需求方面,它超过了FIFO算法。
29、工作集与页面分配策略
(1)工作集理论
为了应对抖动现象这一问题,在系统设计中提出了工作集的概念。工作集的设计建立在局部性原则的基础之上。如果能够预测程序在未来一段时间内所需的页面信息,并提前将这些页面加载到内存中,则这将显著降低缺页率,并减少页面置换次数以进一步提升CPU利用率。
包括最近n次内存访问的所有页面的一组别。其中数字n被定义为参数(work-set window),即为该工作的规模。通常会包含在该工作中。当某个页面不再被调用时,则该页面会被移除。当进程尝试访问未包含在其内的某个界面时,则会导致发生一次缺页中断。系统将对该事件做出响应,并更新当前的工作集结构以及在此处加载该特定的数据段
该系统的工作与模型的核心原理在于操作系统持续监控各个进程的工作集规模。主要关注各个工作集的规模,并通过空闲物理块重新调度一个进程至内存中以提升多线程能力。当工作集总规模超过可用物理块总数时,则操作系统会选择将内存中的某个进程换至磁盘从而有效降低内存中的进程数量并避免抖动现象的发生。
正确的选择工作集窗口大小(即为进程分配的页面数量),这将对存储器的有效利用率和系统吞吐率产生显著的影响。一方面而言,在窗口设置得较大时(即为进程分配较多页面),虽然能有效减少缺页中断的发生概率(即不容易发生缺页中断),但这会导致存储资源无法得到充分利用(即浪费存储空间)。另一方面而言,在窗口设置较小的情况下(即为进程分配较少页面),虽然减少了内存访问中断次数(即减少内存频繁访问的问题),但这反而会增加内存访问中断次数(即导致更多内存访问中断事件发生),从而降低系统的吞吐能力(即处理数据的速度)。因此,在实际应用中需要根据具体需求合理配置工作集窗口大小(即为进程分配合适的页面数量)。
(2)页面分配策略
在基于请求分页存储管理系统的环境中(strategies),我们可以将其划分为固定分配与可变分配两种主要策略(strategies)。当执行页面置换操作时(operations),同样可采取全局置换与局部置换两种不同的方法(methods)。通过结合这些策略(strategies),我们能够获得以下较为合理的三种组合方式($combinationsofstrategiesaremoresuitableinthiscontext))。值得注意的是(),由于固定分配全局置换成一种不合理的配置模式(),因此该种组合方式并不存在
固定分配局部置换: 将每个进程指定一定数量的物理区块,并保证这一数量在运行过程中始终保持不变。这种策略使得各进程中彼此之间不会竞争同一片物理区域。然而,在这种机制下可能会出现两种极端情况:某些进程中因拥有较少的物理区块而导致频繁发生缺页中断现象;另外一些进程中因被赋予过多的物理区块而导致内存资源被不必要的占用。因此,在采用固定分区策略时通常需要借助特定算法来合理配置各进程中应获得的具体分区数量
可变分配全局置换: 操作系统对可用空间进行管理,在内存不足时会动态维护一个空闲物理块集合。每当进程发生缺页需求时会从该集合中取出一块可用空间进行分配给该进程使用;当系统已无可用的空闲物理块时,则可能需要从任何一个进程中暂时断开其当前页面以供其他过程使用
可变分配局部置换: 在为每个进程预先分配一定数量物理存储体后每当发生缺少页面请求且内存已无空闲存储体可用时仅将该进程中断至自身特定的一个页面然而在某一进程中若频繁出现缺少页面请求则操作系统会为其追加额外的物理空间直至其缺少页面的比例降至理想水平之后则会适当减少相应进程中被分配的空间数量该策略不仅能够显著提升系统的内存使用效率还能有效降低各进程中出现的页面缺失频率
(3)页面调入策略
采用请求式加载策略:一个页面仅当其被访问或引用时才会被加载至内存中;否则将保留在外部存储设备中。这种加载机制会导致在进程初始阶段频繁触发缺页中断现象;这是因为此时内存尚未装载该进程的相关页面信息而引发的问题。尽管这一策略具有实现相对简单的优点;但其缺点在于会导致较多的缺页中断事件发生;造成较大的时间开销并容易引起抖动现象的发生
预调页策略: 即指将那些预计将在不久后会被频繁访问并因此而被使用起来的页面同时加载到内存中。虽然这些页面尚未被使用过,则当程序开始运行时若程序员能够识别出哪些页面应优先加载并将其整合在一起,则通过预载页策略就能使这些页面一次性加载进内存中从而节省大量时间资源这种基于局部性原理的操作通常会在程序进入初始阶段时应用
(4)从何调入页面
请将外存划分为两个区域:一个是存储文件的文件区(FFS),另一个是用于存储交换界面的对换区(TTS)。一般而言,在分配资源时会采用不同的策略:对换区通过连续分配来管理数据块(DB),而文件则采用离散分配的方式(DAS)。因此,在I/O操作效率方面存在显著差异。每当遇到一个缺页请求时,请确定该缺页应被加载至内存中以满足请求的需求。具体来说可以分为以下三种情况:1)当目标进程能够直接访问该内存块时;2)当目标进程无法直接访问该内存块但其运行时间可接受延迟时;3)当前处理的具体场景属于哪一种类型?
系统拥有足够的对换区空间: 确保能够充分地将所需界面页面加载到内存中。这时所有所需界面页面都可以直接从对换区加载,并通过内存中的缓存机制快速呈现给用户以提高调页速度。为此,在启动该进程中,必须将与该进程相关的所有文件从文件区复制到内存中的缓存区域.
该系统因缺乏足够的交换区空间而出现资源分配问题:在移除这些界面之后
即那些不会被再次改动或升级
UNIX方式: 因为与进程相关的所有文件都被安置在了存储区域中。所有未曾运行过的页面都需要从存储区域加载。曾经被启动却又被换出到回收站的页面位于回收站中,在下一次需要加载时,请确保它们已经被重新引入内存空间。而 UNIX 系统允许共享同一页面,在这种情况下,则无需再次从回收站加载该页内容
30、抖动现象与缺页率
(1)Belady异常
当物理块数目增长时,在FIFO置换策略下可能导致缺页频率上升的现象被称为Belady反常现象。以引用序列1-5为例,在内存容量为3的情况下会出现9次页面缺失事件;然而当内存容量扩大至4时,则会遇到10次页面缺失事件。这种随着分配得到的物理块数的增加缺页率反而增加的现象即被称为Belady反常现象
产生Belady异常的原因在于FIFO算法所具有的置换特性与进程对主存访问动态特性存在冲突性; 即被置换页面对应的进程将无法进行访问操作; 由此可知,FIFO策略可能导致发生Belady现象; 相反地,在LRU以及最佳替换策略下,绝不会出现此类问题; 值得注意的是,基于堆栈类算法设计出的页面替换策略同样无法实现这一目标
(2)抖动现象
若选择的页面置换算法不够合适,则可能导致出现一种特定情况:即被及时淘汰但随后又被频繁访问并很快又被调入内存的情况经过多次这样的循环操作之后会导致系统将大量时间消耗在页面切换的操作上从而使得系统几乎没有进行有效的处理工作这种情况通常被称为抖动(也称颠簸)
抖动产生的主要原因在于请求分页系统中的每个进程受限于内存分配策略只能获取到其所需全部内存空间的比例
(3)缺页率
假设某个作业包含n页,在其运行期间系统会为此作业预留m个页面空间,并规定m不超过n。当该作业再次运行时,在其总运行时间内它总共访问了A个页面(亦即引用串的长度为A)。其中那些尚未在内存中的页面需要被调入的数量是F,则缺页率被定义为f=F/A;而命中率则计算为1减去f。
缺页率作为页面置换算法的关键评价标准而存在。通常情况下,缺页率会受到所采用的置换算法、分配给系统的页面数量以及单个页面的大小等多种因素的影响
请求分页管理系统的缺页率对系统运行至关重要。当缺 pages 率过高时,必然导致读取页面的时间明显延长,并会显著影响进程执行速度。因此如何有效降低 miss 率则显得尤为重要。
31、请求分段
此类分段存储管理系统与分页存储管理系统相仿,在提供服务的同时为用户提供了一个远超主存可用空间的虚拟存储器空间。此外,在当前计算机体系结构中所允许的最大地址范围内定义了虚拟存储器的实际容量范围。
在基于分段存储管理系统的请求处理流程中,在作业启动前需确保系统能够加载当前所需的若干连续可执行代码段至内存区域以便执行相应的操作。一旦进入运行状态后若待访问的代码块尚未加载至内存中系统会自动识别并调入所需代码块至内存区域与此同时为了保证程序正常运转当程序执行到某特定函数时发现所需的代码块已不在内存区域则会触发置换操作将暂时不再被使用的代码块移动至磁盘外部以释放内部存储空间为此必须对原有区间的地址表进行扩展以支持新增的空间分配如图所示
在执行地址变换操作时所需的关键信息包括段号、段长以及内存起始地址。这些关键参数的功能与一般的请求分页存储管理机制一致。具体而言,在以下两种情况下分别实施不同的处理逻辑:若待处理的段已经存在于内存中,则直接按照常规的地址转换流程执行操作;而对于那些尚未进入内存的情况,则必须首先将相关数据加载至内存环境中之后才能完成相应的地址转换操作。
当所访问的程序模块所需的代码段无法加载到内存中时(即发生缺页),会导致系统立即生成一个缺页中断事件(页 fault)。随后的操作系统会首先尝试在内存中找到足以容纳这段代码的一份连续的空间区域(segment)。如果内存中没有这样的可用空间,则系统将执行如下操作:首先汇总当前所有未使用的内存空间总量;接着判断这些未使用的空间是否能够满足当前代码块的需求;如果剩余空间不足,则考虑将多个小片空闲区域进行合并以获得更大的可用空间;如果仍然无法满足需求,则可能会释放一些现有的空闲区域,并将它们与现有的可用空间合并以形成更大的可用区间;最后再从这些合并后的可用区间中选择合适的部分来装载所需的代码块
32、内存管理方式之间的对比与联系
在内存管理方式中,离散分配管理方式比连续分配管理方式重要得多:

