考纲
- 内存管理的需求:重定位、内存保护、内存共享
- 程序的装入和链接:静态装入和可重定位装入、静态链接、动态链接、运行时动态链接。
- 分区存储管理:分区方式(单一连续分区、固定分区、可变式分区)、分区分配算法(首次适应算法、循环首次适应算法、最佳适应法、最坏适应法等)
- 段式管理与页式管理:段、页、碎片等基本概念、段式管理与页式管理机制
- 虚拟内存:局部性原理、虚拟内存概念、请求分段与请求分页、段页式管理、段页式地址结构与地址转换、页面置换算法(OPT、先进先出、LRU、Clock、改进型 Clock 置换)、抖动
计算考选填的可能性大,简答考到一个小问的可能性大。对比第四章外存看(组织方式、调度方式)
一、内存管理概念
1、内存管理基本原理和要求
- 内存管理:操作系统对内存的划分和动态分配。
- 基本原理:若不加控制和安排的将所有用户进程和系统所需的全部程序和数据放入主存,那么主存的容量需要几乎和辅存那么大,这是不现实的。因此操作系统必须对内存空间进行合理的划分和有效的动态分配。
- 内存管理的功能/种类:内存空间的分配与回收、地址转换、内存空间的扩充、存储保护。
(1)程序装入和链接
步骤+动态/静态优劣
- 创建进程步骤:编译(源代码→目标模块)、链接(目标模块+库函数→装入模块)、装入(装入模块→内存)
- 链接方式
- 静态链接:运行前先链接,之后不再拆开。对相对地址进行修改、变换外部调用符号。
- 装入时动态链接:边装入边链接。便于修改和更新、实现对目标模块的共享。
- 运行时动态链接:执行需要该目标模块时链接。加快程序的装入过程、节省大量内存空间。
- 装入方式
- 绝对装入:将目标模块装入内存中事先指定的位置,逻辑地址和实际内存地址相同,只适用于单道程序环境。
- 可重定位装入/静态重定位:根据内存的具体情况将装入模块装入到内存的适当位置,装入模块中的逻辑地址和实际装入后的物理地址不同,地址变换在装入时一次完成。
特点:①作业装入内存时,分配要求的全部内存空间;②装入后不能移动/申请。
重定位:装入时对目标程序中指令和数据的修改过程。 - 动态运行时装入/动态重定位:装入内存后,把地址转换推迟到要执行前进行,装入后内存后仍为相对地址。需要重定位寄存器。
特点:①将程序分配到不连续的存储区中;②运行时动态申请分配内存;③根据需要动态申请分配内存;④提供比存储空间大的地址空间,便于程序段共享。
(2)逻辑地址空间与物理地址空间
- 逻辑地址空间:链接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间。
- 物理地址空间:内存中物理单元的集合。
- 地址重定位:通过地址转换将逻辑地址转换为物理地址。
(3)内存保护
- 内存保护:内存分配前,保护操作不受用户进程的影响、保护用户进程不受其他用户进程的影响。
- 方法:
- CPU中设置一对上、下限寄存器,CPU访问时对比判断是否越界。
- 用重定位寄存器(或基址寄存器)和界地址寄存器/限长寄存器(选填常考)。重定位含最小的物理地址值,界地址max。界地址比较是否越界,重定位相加映射成物理地址。
2、覆盖与交换
了解
- 覆盖和交换:多道程序环境下用来扩充内存的两种方法。交换在不同进程/作业中进行,覆盖在同一个程序或进程。
- 覆盖:
- 思想:固定区1+覆盖区n。活跃放入固定区,即将访问的在覆盖区,其他的在外存,需要时调入。
- 特点:①打破了必须将一个进程的全部信息装入主存后才能运行的限制,但同时运行程序的代码量大于主存时仍不能运行。②内存中能更新的地方只有覆盖区的段,不在覆盖区的段会常驻内存。
- 交换/对换
- 思想:①换出:把处于等待状态的程序从内存移到辅存,把内存空间腾出来;②换入:把准备好竞争CPU运行的程序从辅存移到内存。
- 问题:①需要备份存储(快速磁盘)。②执行时间>交换时间,转移时间影响交换时间,与所交换的内存空间成正比。③换出进程,必须保证该进程空闲。④交换空间通常为磁盘的一整块,且独立文件系统,使用起来很快。⑤在许多进程运行且内存空间吃紧时启动,在系统负荷降低暂停。⑥交换策略的某些变体仍在unix等中有使用。
3、连续分配管理方式
计算→选填
- 连续分配方式:为一个用户程序分配一个连续的内存空间。
- 分类:单一连续分配、固定分区分配、动态分区分配。
- 共同特点:用户进程/作业在主存中都是连续存放。
- 比较:
(1)单一连续分配
- 内存分为系统区和用户区。无需内存保护:只有一道程序,不会因越界干扰其他程序。
- 优点:简单、无外部碎片,可以采用覆盖技术。
- 缺点:只用于单用户、单任务的OS,有内部碎片,存储器的利用率极低。
(2)固定分区分配
- 每个分区只装入一道作业,有空闲分区则从外存的后备作业队列中选择适当大小的作业装入。
- 划分分区方法:分区方法相等、分区大小不等。
- 内存分配:建立分区说明表(始址、大小、状态),无合适分区则拒绝分配。
- 缺点:①程序太大放不进任意分区,需要覆盖技术;②主存利用率低,产生内部碎片。
内部碎片:程序小于固定分区大小,也占用一个完整的内存分区空间。 - 优点:可用于多道程序设计的最简单的存储分配,无外部碎片。
(3)动态分区分配
- 动态分区分配/可变分区分配:动态划分内存,分区大小和数目可变。
- 外部碎片:所有分区外的存储空间会变成越来越多的碎片。
- 紧凑:OS不时地对进程进行移动和整理,拼接成大分区,需要动态重定位寄存器支持。能克服外部碎片。
- 基于顺序搜索的动态分区分配策略:
- 首次适应算法FF:要求空闲分区以地址递增的次序链接。从链首开始查找空闲分区,否则失败。特点:简单、最好、最快。缺点:低地址出现小空闲分区,增加查找开销。
- 最佳适应算法BF:要求按容量递增形成空闲分区链。特点:产生最多外部碎片。
- 最坏适应算法/最大适应算法WF:按容量递减。特点:导致没有可用大内存块。
- 邻近适应算法/循环首次适应算法NF:分配内存时从上次查找结束的位置开始继续查找。特点:使内存末尾分配空间分裂成小碎片。
4、非连续分配管理方式
重要,三种方式(段、页、段页)各自的组织方式,内存空间到地理空间的地址变换。
- 非连续分配:允许一个程序分散地装入不相邻的内存分区。存储密度低于连续存储方式。
- 分类:分页存储管理方式(基本分页存储管理方式、基本分页存储管理方式)、分段存储管理方式。
(1)基本分页存储管理方式
- 分页:把主存空间划分为大小相等且固定的块,作为主存的基本单位。进程在执行时,以块为单位逐个申请主存中的块空间。
- 分页管理不会产生外部碎片。进程为最后一个不完整的块申请主存空间时产生内部碎片。每个进程平均只产生半个块大小的内部碎片/页内碎片。
[1] 分页存储基本概念
- 页:进程中的块。页框/页帧:内存中的块。块:外存以同样的单位进行划分。页面大小:2的整数幂。
- 地址结构:决定了虚拟内存的寻址空间大小。
- 页表/页面镜像表:记录页面在内存中对应的物理块号,页表一般存放在内存中,由页表项组成,页表项=页号+物理内存中的块号。作用:实现从页号到物理块号的地址映射。
[2] 基本地址变换机构
- 地址变换机构:将逻辑地址转换为内存中的物理地址。
- 页表寄存器PTR:存放页表在内存的起始地址F和页表长度M。进程执行时将页表始址和长度存入PTR。
- 页表长度:一共有多少页。页表项长度:页地址占多大的存储空间。
- 页面大小为L,逻辑地址A到物理地址E的变换过程如下:(十进制)
①页号P ( P = A / L ) (P=A/L) (P=A/L),页内偏移量W ( W = A % L ) (W=A\%L) (W=A%L)。
②若 P ≥ M P≥M P≥M,则产生越界中断,否则继续执行。
③P对应的 页 表 项 地 址 = 页 表 始 址 F + P ∗ 页 表 项 长 度 页表项地址=页表始址F+P*页表项长度 页表项地址=页表始址F+P∗页表项长度,取出该页表项内容b,即为物理块号。
④计算 E = b ∗ L + W E=b*L+W E=b∗L+W。 - 页表项:找到该页在内存中的位置。
- 分页管理方式问题
①地址转换过程必须足够快,否则访存速度会降低。
②页表不能太大,否则内存利用率会降低。 - 页表全部放在内存中,存取需要访问两次内存(访问页表+读取数据/指令)
[3] 具有快表的地址变换机构
- 快表/相联存储器TLB/联想寄存器:具有并行查找能力的高速缓冲存储器。
- 慢表:主存中的页表
- 具有快表的地址变换机构:
- 地址变换:(计算)
①逻辑地址地址转换,将页号送入cache,和快表中的页号比较。
②找到则取出该页对应的页框号,与页内偏移量拼接形成物理地址。
③没找到则访问慢表,读出页表项同时存入快表,满则替换。
④慢表、快表可同时查找,在快表中查找成功则终止慢表查找。 - 快表的有效性基于局部性原理
- 内存的有效访问时间EAT:从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据,所需花费的总时间。设t为访问一次内存所需要的时间。
- 基本分页存储管理中(查页表项+拼接物理地址): E A T = t + t EAT=t+t EAT=t+t
- 引入快表中(命中率a,查找快表所需要的时间λ): E A T = a ∗ λ + ( t + λ ) ( 1 − a ) + t = 2 t + λ − t x a EAT=a*λ+(t+λ)(1-a)+t=2t+λ-txa EAT=a∗λ+(t+λ)(1−a)+t=2t+λ−txa
[4] 两级页表
理解如何组织,与多级目录思想类似
- 二级页表:页表的页表,层次结构的页表。
- 顶级页表最多只能有1个页面。
- 建立多级页表目的在于建立索引,以便不用浪费主存空间去存储无用的页表项。
- 逻辑地址空间的格式/组织方式:
- 二级页表结构
(2)基本分段存储管理方式
- 分段。段式管理方式按照用户进程中的自然段划分逻辑空间。段间连续,段内不要求,地址空间是二维的。逻辑地址结构:
- 段表。实现逻辑空间与内存空间映射。通过查找段表找到对应的内存区。
- 分段存储管理方式的引入:方便编程、信息共享、信息保护、动态增长、动态链接。
- 地址变换机构。段表寄存器中存放段表始址F和段表长度M。A→E的地址变换如下:(多为二进制)
①从A中取出段号S、段内偏移量W。
②若 S ≥ M S≥M S≥M,则越界中断,否则继续执行。
③S对应的 段 表 项 地 址 = 段 始 址 F + S ∗ 段 表 项 长 度 段表项地址=段始址F+S*段表项长度 段表项地址=段始址F+S∗段表项长度,取出前几位得到段长C。若 W ≥ C W≥C W≥C,越界中断。
④取出始址b,计算 E = b + W E=b+W E=b+W。 - 段的共享与保护。共享通过两个作业的段表中相应表项指向被共享的段的同一个物理副本实现。纯代码和不能修改的数据可以共享。
纯代码/可重入代码:不能修改的代码,不属于临界资源。 - 保护方法:存取控制保护、地址越界保护(段号越界+段内偏移越界)。
分页管理中页内偏移不会越界。 - 分页和分段的主要区别:
①页是信息的物理单位。段是信息的逻辑单位。
②页的大小固定且由系统决定。段长不固定。
③分页的用户程序地址空间是一维的。分段二维。
(3)段页式管理方式
- 页式有效提高内存利用率,段式反应程序逻辑结构并有利于段的共享。
- 段页式:先分为逻辑段,段再分为大小固定页,内存空间分为页大小的存储块。
- 逻辑地址结构:
- 地址空间二维,每个进程一张段表,每个分段一张页表,系统中还有段表寄存器。
- 地址变换:段表→页表始址→页表→页帧号→物理地址。实际访问三次主存。如建立快表,关键字由段号、页号组成,值是页帧号和保护码。
二、虚拟内存管理
1、虚拟内存的基本概念
虚拟内存与传统存储的优缺点
- 传统存储管理方式的特征/缺点
- 一次性:可能导致①作业很大无法装入、②少数作业先运行,多道程序度下降。
- 驻留性:装入后一直驻留内存,运行中的进程可能因等待IO阻塞。
- 问题引入:
- 局部性原理:(考多次简答,分类、含义、实例)
- 时间局部性:程序中的某条指令一旦执行,不久后该指令可能再次执行;某数据被访问过,不久后该数据可能再次被访问。实例:程序中存在大量的循环操作。
- 空间局部性:一旦程序访问了某个存储单元,不久后其附近的存储单元也将被访问。程序在一段时间内所访问的地址可能集中在一定范围之内。实例:指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。
- 时间局部性通过将近来使用的指令和数据保存到cache中,并使用高速缓存的层次机构实现。空间局部性使用较大的高速缓存,将预取机制集成到高速缓存控制逻辑中实现。
- 虚拟存储器:由于系统提供了部分装入、请求调入、置换功能后,好像为用户提供一个比实际内存大得多的存储器。
- 虚拟存储器的特征:多次性、对换性、虚拟性。
- 虚拟内存技术的实现(+“请求”):请求分页存储管理、请求分段存储管理、请求段页式存储管理。
- 虚拟内存硬件支持:一定容量的内存和外存、页表/段表作为主要的数据结构、中断机构(未调入内存时)、地址变换机构。
2、请求分页管理方式
组织方式、缺页及解决方式
- 请求分页系统:一部分页面装入,执行时再调入需要访问页面,暂时不用的页面置换到外存。
- 页表机制/组织方式:
- 缺页中断机构:访问的页面不在内存中时产生缺页中断,缺页的进程阻塞,调页唤醒。
- 解决流程:①若内存中有空闲块,则分配并装入,修改相应页表项。②无空闲块则淘汰某页,若淘汰页修改过则写回外存。
- 缺页中断步骤:保护CPU环境、分析原因、转入处理程序、恢复CPU环境等。(参考地址变换过程中的流程)
- 区别:①在指令执行期间发生,属于内部中断。②一条指令执行期间可发生多次缺页中断。
- 地址变换,先检索快表:(熟悉流程图)
- 若找到则修改访问位(w重置修改位),得到E。
- 未找到则到内存中查找,对比P看是否已调入内存,未调入则产生缺页中断从外存调入内存。
3、页面置换算法
主要靠LRU和时钟
(1)最佳OPT置换算法
- 选择淘汰最长时间内不再访问的页面。无法实现,有较低的缺页率。
- 置换图:
缺页中断9次,页面置换6次。
(2)先进先出FIFO页面置换算法
- 优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面。与进程实际运行时的规律不适应。基于队列实现。
- 置换图:
页面置换12次。 - Belady异常:FIFO算法产生所分配的物理块数增大而页故障数不增反减的现象。
(3)最近未使用LRU置换算法
LRU和CLOCK重要。画置换图,求缺页次数。
- 淘汰最近最长时间未访问过的页面。设置访问字段,淘汰最大的。基于堆栈实现。
- 置换图:
(4)时钟CLOCK置换算法
- 循环扫描缓冲区。
- 简单的CLOCK算法/最近未用NRU算法:候选帧集合为循环缓冲区,给每帧关联一个使用位,访问/装入置1,扫描1置0。循环找第一个使用位为0的帧中的页,替换后指向下一帧。
- 改进型CLOCK算法:使用位+修改位。有四种情况,eg.最近被访问,也被修改(u=1,m=1)。
- 改进型CLOCK步骤:
①扫描帧缓冲区,对使用位不做修改,选择u=0,m=0的帧替换。
②若①失败,重新扫描,选择u=0,m=1的帧替换,对每个跳过的帧使用位置0。
③若②失败,指针回到初始位置,所有使用位=0,重复①、②找到替换帧。 - 改进型替换时首选没变化的页,节省修改页在替换前写回的时间。
- 原先占有的是x号物理块/页框,则换入内存后也在x号。
4、页面分配策略
概念、了解
- 驻留集:给一个进程分配的物理页框的集合。
- 考虑因素:①分配给一个进程的存储量越小,驻留的进程数就越多,从而提高时间利用效率。②若在主存中页数过少,页错误率仍会较高。③若页数过多,因局部性原理,分配更多主存空间对该进程的错误率无明显影响。
- 最小物理块数:能保证进程正常运行所需的最小物理块数。
- 页面分配策略:①固定分配局部置换、②可变分配全局置换、③可变分配局部置换。
- 物理块分配算法:①平均分配算法、②按比例分配算法、③考虑优先权的分配算法。
- 调入页面的时机
- 预调页策略:运行前的调入,主要用于进程的首次调入。
- 请求调页策略:运行期间调入需要访问的、不在内存的页面。
- 外存:文件区(离散分配方式)、对换区(连续分配方式)。
- 从何处调入页面
- 系统拥有足够的对换区空间:运行前从文件区复制到对换区,全部从对换区调入所需页面。
- 系统缺少足够的对换区空间:不会修改文件从文件区调入,可能修改部分从对换区调入。
- UNIX方式:未运行从文件区调入,运行过从对换区调入。
- 页面调入过程:未在内存时发出缺页中断,若内存已满置换,若修改过则写回磁盘,所缺页调入内存并修改表项、写入快表、形成物理地址。
- 缺页率:逻辑空间n页、分配物理块数m(m≤n),访问成功次数S,失败F,则总访问次数A=S+F,缺页率
f
=
F
/
A
f=F/A
f=F/A 。
影响因素:①页面大小、②进程所分配物理块数目、③页面置换算法、④程序固有特性。 - 缺页中断处理时间:被置换的页面被修改概率β,其缺页中断处理时间 t a t_a ta,被置换页面没有被修改的缺页中断时间 t b t_b tb,计算公式 t = β ∗ t a + ( 1 − β ) ∗ t b t=β*t_a+(1-β)*t_b t=β∗ta+(1−β)∗tb
5、抖动
重点,是什么、解决方式
- 抖动/颠簸:频繁的页面调度行为,在换页上用的时间多于执行时间。
- 主要原因:某个进程频繁访问的页面数目高于可用的物理页帧数目。
- 虚拟内存技术可在内存中保留更多的进程以提高系统效率。
- 抖动的预防方式:①采用局部置换策略、②把工作集算法融入到处理机调度中、③利用“L=S”准则调节缺页率(缺页之间的平均时间=平均缺页服务时间)、④选择暂停的进程。
6、工作集
是什么,工作原理
- 工作集:在某段时间间隔内,进程要访问的页面集合。
- 为了防止抖动,分配给进程的物理块数(即驻留集大小)要大于工作集大小。
- 工作原理:让操作系统跟踪每个进程的工作集,并为进程分配大于其工作集的物理块。工作集内的页面调入驻留集,外则可换出。若有空闲物理块则可调一个进程到内存以增加多道程序数。若工作集之和超过了可用物理块总数,则OS会暂停一个进程,将其页面调出并分配,防止抖动。