目录
前言
正文
1.进程运行的基本原理
(1)存储器的多层结构
(2)进程运行的基本原理
程序的链接
程序的装入
两个细节
内存扩充
2.内存管理方式
1.连续分配管理方式
(1)单一连续分配
(2)固定分区分配
(3)动态分区分配
数据结构
空闲分区表
空闲分区链:
分配算法
基于顺序搜索的动态分区分配算法
基于索引搜索的动态分区分配算法
内存回收
连续分配方式存在的问题
2.非连续分配管理方式
(1)基本分页储存管理方式
基本概念:
地址结构:
页表
1.基本的地址变换机构:
2.具有快表的地址变换机构:
两级页表(同理多级页表)
反置页表
(2)基本分段存储管理方式
引入目的:
分段的基本原理
段表
分页和分段的主要区别
优缺点对比:
信息共享
(3)段页式分区管理方式
3. 虚拟内存管理
局部性原理
虚拟内存的特征
虚拟内存的实现
请求分页管理方式
缺页中断机构
页面置换
抖动与工作集
抖动
工作集
抖动的预防方法:
请求分段管理方式
请求分段中的硬件支持
分段的共享
分段的保护
内存管理是计算机系统中对内存资源进行分配、跟踪和释放的过程。操作系统和应用程序需要对内存进行有效管理,以确保程序能够顺利运行,避免资源竞争、内存泄漏或性能下降等问题。
寄存器:这是最快但容量最小的存储级别,通常嵌入在CPU内部,用来存储即将被CPU处理的指令或数据。
高速缓存(Cache):存放于CPU内部或近一点的区域,分为一级、二级、三级高速缓存(L1,L2,L3)。它存储了最常用的指令和数据,以便快速访问。
主存储器(主存):又称内存或RAM,其速度比高速缓存慢,但容量更大。当程序运行时,其指令和数据通常存储在主存中。
硬盘缓存:硬盘上的部分区域被用作缓存,通常用于存储最近从磁盘上读取或写入的数据,以便将来更快地访问这些数据。
固定磁盘:也叫硬盘,比RAM更慢,但存储容量更大,且能在电源关闭时仍保持数据。
可移动存储介质:如光盘、闪存设备(如USB闪存驱动器)等,通常用于数据的便携式存储,将数据从一个系统传输到另一个系统。
高速缓存主要是解决寄存器和主存储器之间访问速度的矛盾,硬盘缓存解决主存和固定磁盘之间访问速度的矛盾。CPU只能读取主存和CPU寄存器的数据,辅存要调入主存才可以被读取。
用户程序 -> 进程
编译(Compile):编译是将高级程序语言(如C、C++等)源代码翻译为低级的机器代码(二进制文件)的过程。编译器将源代码进行词法分析、语法分析、语义分析,并生成目标代码。目标代码是与特定平台和处理器指令集相关的中间代码。
链接(Link):链接是将编译后的目标代码文件与其他目标代码文件和库文件合并的过程。在链接过程中,链接器将各个目标代码文件中的符号(如函数和变量)进行解析,解决外部引用关系,生成最终的可执行文件。链接的一部分是符号解析和重定位,确保每个符号都能正确地解析并与正确的地址关联。
装入(Load):装入是将可执行文件加载到内存中并开始执行的过程。在装入过程中,操作系统将可执行文件的内容加载到合适的内存地址,并为程序分配必要的资源。加载完成后,CPU开始执行程序的机器指令,程序开始在计算机上运行。
静态链接
在程序运行前,将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开。
对相对地址进行修改;变换外部调用符号。
装入时动态链接
在装入内存时,采用边装入边链接的链接方式便于修改和更新。
便于实现对目标模块的共享。
运行时动态链接
将某些目标模块的链接推迟到执行时才执行。即在执行过程中,若发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将它装入内存,并把它链接到调用者模块上。
加快装入过程,节省大量的内存空间。
绝对装入方式
编译时产生的地址使用绝对地址
程序或数据被修改时,需要重新编译程序
可重定位装入方式
编译后的目标模块使用相对地址
在装入时,完成重定位(静态重定位)
需硬件支持
动态运行时装入方式
逻辑地址转换为物理地址的过程称为重定位,也称为地址变换
编译后的目标模块使用相对地址
在运行时,完成重定位(动态重定位 )
逻辑地址与物理地址
物理地址 (绝对地址)
物理内存的地址,内存以字节为单位编址。
物理地址空间:所有物理地址的集合。
逻辑地址(虚拟地址、相对地址)
由CPU产生的地址,即程序编译后使用的相对于0字节的地址。
逻辑地址空间:由程序所生成的所有逻辑地址的集合。
内存保护
内存保护的目的
- 保护OS不被用户访问
- 保护用户进程不会相互影响
内存保护的实现:硬件
- 基地址寄存器:保存最小的合法物理内存地址(基地址)。
- 界限寄存器:保存合法的地址范围大小(界限地址)。
内存空间保护的实现
- 判断“基地址s物理地址< (基地址+界限地址)”是否成立 。
内存扩充的原因
在多道程序环境下:
一方面,在内存中的某些进呈由于某事件尚未发生而被阻塞运行,但它却占用了大量的内存空间,甚至有时可能出现在内存中所有进程都被阻塞况;而迫使CPU停止下来等待的情况,
在外存上等待,因无内存而不能进入内存另一方面,却又有着许多作运行的情况。
浪费资源,降低系统吞吐量。
内存扩充的两种方式
1.对换(Swapping)
把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需的程序或数据,调入内存。
对换是提高内存利用率的有效措施,广泛应用于OS中。
2.覆盖(Overlaying)
覆盖是一种较为古老的内存管理方式,主要用于内存空间有限的环境。在覆盖技术中,程序被分割为一些互斥的覆盖区。这些覆盖区可能都需要内存来运行,但是不会同时运行。因此,他们可以同时占用同一块内存区域,根据程序的需要,当前运行的覆盖区将占据内存,之前的覆盖区将被移出。被覆盖的代码或数据会被后来调入内存的代码数据所覆盖。常见的就是分支语句下照成的情况。
为一个用户程序分配一个连续的内存空间。
内存
系统区:供OS使用、低址部分。
用户区: 供用户使用。
分配方式
单道程序环境下,仅装有一道用户程序,即整个内存的用户空间由该程序独占。
- 内存分配管理十分简单,内存利用率低。
- 用于单用户、单任务OS
- CP/M、MS-DOS、RT11
未采取存储器保护措施
>节省硬件 >方案可行
总结
优点:
实现简单;无外部碎片;不一定需要内存保护
缺点:
只能用于单用户、单任务OS;有内部碎片;存储器利用率低;
最早的、也是最简单的一种可运行多道程序的存储管理方式
可以预先把可分配的主存储器空间分不割成若干个连续区域,称为一个个分区。每个分区的大小可以相同也可以不同。但分区大小固定不变,每个分区装一个且只能装一个作业。
内存分配:如果有一个空闲区则分配给进程 。
划分分区时:
分区大小一样:缺乏灵活性,程序太小:浪费内存,程序太大:装不下。
分区大小不等:多个小分区,适量中分区,少量大分区。
有些场合适用,如利用-台计算机同时控制多个相同对象 。
总结:
优点:实现简单;无外部碎片;
缺点:1.较大用户程序时,需要采用覆盖技术,降低了性能;2.会产生内部碎片,利用率低
又称为可变分区分配,根据进程的实际需要,动态地为之分配内存空间。
记录内存的使用情况
一个空闲分区占一个表目分区序号、分区始址、分区大小、状态等。
为了实现对空闲分区的分配和链接在每个分区的起始部分,设置一些用于控制分区分配的信息,以及用于链接各分区所用的前向指针;在分区的尾部设置后向指针,通过前后向指针,可将所有的空闲分区链接成一个双向链 。
依次搜索空闲分区链上的空闲分区寻找一个其大小能够满足要求的分区。
首次适应算法
空闲分区链以地址递增的次序链接。
从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止,从低地址查找合适空间。
缺点:低址部分留下许多小碎片。
循环首次适应算法(临近适应算法)
从上次找到的空闲分区的下一个空闲分区开始查找直到找到一个能满足要求的空闲分区。
空闲分区分布更均匀,减少了查找的开销。
缺乏大的空闲分区 。
最佳适应算法
搜索整个序列,找到适合条件的最小的分区进行分配。
空闲分区按其容量从小到大的顺序链接用最小空间满足要求;但留下许多难以利用的小碎片。
最坏适配算法
搜索整个序列,寻找最大的分区进行分配
空闲分区按其容量从大到小的顺序链接
分割后空闲块仍为较大空块;缺乏大的空闲分区。
算法 |
算法思想 |
分区排序 |
优缺点 |
首次适应 |
从低地址查找合适空间 |
地址递增排列 |
综合性能最好,开销小; 不需要(对空闲分区)重排序; |
最佳适应 |
优先使用最小空闲空间 |
容量递增排列 |
更容易满足大进程需求; 小碎片多,开销大,需要重排序; |
最坏适应 |
优先使用最大连续空间 |
容量递减排列 |
小碎片少; 不利于大进程,开销大; |
临近适应 |
从上次查找处向后查找 |
地址递增排列 (循环链表) |
不用每次从链表头查找,开销小; 会使高地址大分区被用完; |
提高搜索空闲分区的速度,在大、中型系统中采用
快速适应算法、伙伴系统和哈希算法
(1)快速适应算法
将空闲分区按其容量大小进行分类,具有相同容量的所有空闲分区设有一个空闲分区链表。
系统设有一张管理索引表,每一项对应一个空闲分区类型。
分配时,根据进程长度,从索引表中寻找到能容纳它的最小空闲分区链表,从链表中取下第一块进行分配。
特点:
>优点: 不分割分区长度,不产生碎片,查找效率高
>缺点:分区归还主存时算法复杂,系统开销较大,存在浪费
(2)伙伴系统
分区大小均为2的k次幂。
内存按2的幂的大小来分配,即4KB、8KB等。
- 满足要求是以2的幂为单位的
- 如果请求不为2的幂,则需要调整到下一个更大的2的幂:先计算一个i值,使2i-1
- 当分配需求小于现在可用内存时,当前段就分为两个更小的2的幂段
继续上述操作直到合适的段大小。
主要用于多处理机系统中(Linux早期版本) 。
(3)哈希算法
建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项对应于一个空闲分区链表的头指针。
进行分配时,根据空闲区大小,通过计算哈希函数,得到在哈希表中的位置,找到对应的空闲分区链表。
优点:查找快速。
回收后相邻空间要合并;
如:第一种情况,F1和回收区合并,并更新F1尾部。
更新空闲分区表和/或空闲分区链记录;
四种情况:
碎片:不能被利用的小分区
解决方案:紧凑,要求代码和数据可以在内存中移动紧凑:通过移动内存中的作业位置,以把原来多个分散的小分区拼接成一个大分区的方法,也叫“拼接
动态重定位:在指令运行时,实现地址转换(相对地址转换为绝对地址)
分配算法:类似于动态分区分配算法,增加了紧凑的功能
进程的逻辑地址空间可能是不连续的,如果有可用的物理内存,它将分给进程。
把物理内存分成大小固定的块,称为物理块(frame)(大小为2的幂,通常为1KB~8KB)。
把逻辑内存也分成固定大小的块,称为页(page)。
保留所有空闲块的记录
运行一个有N页大小的程序,需要找到N个空的页框来装入程序。存在页内碎片:进程最后一页经常装不满,而形成不可利用的碎片。
分页地址中的结构 (32位)
- 页号P
- 12-31位:20位地址空间最多允许有1M (2^20)页
位移量w (页内地址)
- 争0-11:12位
- 每页大小为4KB(212)
对某特定机器,地址结构是一定的。
若给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d可按下式求得物理地址 = (页号->块号 ) + 偏移量
P = INT[A/L]
d= [A] MOD L
其中,INT:整除函数,MOD: 取余函数
例如:系统页面大小为1KB,设A=5168B,则P=5,d=48 。
系统为每个进程建立了一张页表。
逻辑地址空间内的所有页,依次在页表中有一表项,记录相应页在内存中对应的物理块号。
页表的作用:实现从页号到块号的地址映射。
页号不一定是真正存在的,有可能只是作为索引,真正的表是这个蓝色部分。
页表的实现:
页表被保存在主存中
页表寄存器(PTR)指向页表的起始地址和长度
在这个机制中,每一次的数据/指令存取需要两次内存访问,一次是访问页表,一次是访问数
据指令
解决两次访问的问题,是采用小但专用且快速的硬件缓冲,这种缓冲称为转换表缓冲器(TLB)或联想寄存器。
- 页式管理中地址空间是一维的
- 每次访存都需要地址转换,必须足够快
- 页表不能太大,会降低内存利用率
- 直接将页号与快表页号比较
- 匹配成功,取块号+偏移量形成地址
- 匹配失败,访问主存页表,并同步到快表(局部性原理 )
快表 :
- 快表是非常快的,可以并行访问。
- 如果命中走快表,否则按没有块表走页表。
- 由于造价昂贵所以不会拿它直接存数据。
- 引入快表后解决两次内存访问。
引入快表后的有效查找时间 (EAT)
- 查找快表需要的有效的时间为 λ。
- 假设访问一次内存需要的时间为t ,EAT=t+t= 2t(基本分页存储系统中)。
- 命中率-----在联想寄存器中找到页号的百分比,比率与联想寄存器的大小有关,假设为a。 引入快表有效访问时间(EAT) EAT= λ*a+(t + λ )(1- a) + t
快表大小: 16-512个页表项,局部性: 90% 。
问题:
现代的大多数计算机系统都支持非常大的逻辑地址空间。在这样的环境下,页表就变得非常大,要占用相当大的内存空间。
解决办法
对页表所需要的内存空间,采用离散分配方式部分页表调入内存
页表结构
两级页表 多级页表 反置页表
页表连续存放,占用大量连续空间
一段时间内只需要访问部分特定页面
页表项分组/分页离散存储
建页目录表管理离散页表
实现:
将逻辑地址拆分成三部分。
从PCB中读取页目录表始址。
根据一级页号查出二级页表位置。
根据二级页号查内存块号,加偏移量计算物理地址。
为减少页表占用的内存空间,引入反置页表,一个系统一张页表对每个内存物理块设置一个条目每个条目保存在真正内存位置的页的虚拟地址,以及包括拥有这个页的进程的信息。
减少了需要储存每个页表的内存,但是当访问一个页时,增加了寻找表需要的时间。
可使用哈希表来将查找限制在一个或少数几个页表条目AS/400、IBM RISC System 和IBM RT采用。
反置页表的地址转化机制:
为了满足用户(程序员) 在编程和使用上多方面的要求,如:
方便编程
- 用户将自己的作业按照逻辑关系划分为若干个段,每个段都是从0开始编址并有自己的名字和长度。因此,希望访问的逻辑地址是由段名 (段号)和段内偏移量(段内地址)决定的
信息共享
- 在实现对程序和数据的共享时,是以信息的逻辑单位为基础的。分页系统中的“页”只是存放信息的物理单位,并无完整的意义,不便于实现共享;然而段却是信息的逻辑单位。
信息保护
- 信息保护同样是对信息的逻辑单位进行保护
动态链接
动态增长
- 在实际应用中,往往有些段(特别是数据段),在使用过程中会不断地增长。
一个程序是一些段的集合,一个段是一个逻辑单位,如:
- main program,procedure,function,
- local variables,global variables.common block,
- stack,
- symbol table, arrays
每个段定在分段存储管理方式中,作业的地址空间被划分为若干个段,定义了一组逻辑信息。
每个段都有自己的名字,通常用一个段号来代替段名,每个段都从0开始编址,并存储在一段连续的地址空间内
段的长度由相应的逻辑信息组的长度决定,因此各段长度不等。
在分段式存储管理系统中,为每个分段分配一个连续的分区。进程中的各个段可以离散地装入内存中不同的分区中。
类似于分页系统,在系统中为每个进程建立一张段映射表(段表),用于实现从逻辑段到物理内存区的映射。
每个段在表中占有一个表项记录了该段在内存中的起始地址 (基址)和段的长度。
段表保存在内存中由控制寄存器保存其地址。
分段系统的地址变换过程
分页 | 分段 | |
信息单位 | 页 | 段(逻辑上有意义) |
信息完整性 | 离散分配方式 | 意义相对完整 |
页/段的大小 | 固定,由系统决定 | 不固定,由程序员决定 |
地址空间 | 一维(页号->特定地址) | 二维(段号+段内地址) |
优点 |
缺点 |
|
分页管理 |
内存利用率高,不会产生外部碎片,少量内部碎片 |
不好按照逻辑模块实现信息共享和保护 |
分段管理 |
容易按逻辑模块实现信息共享和保护 |
段长较大时,不便分配空间;会产生外部碎片 |
在计算机系统中,"段"(Segment)和"页"(Page)是内存管理的两个基本概念,用于组织和管理程序的内存空间。
1.段(Segment):
2.定义: 段是内存中一块连续的地址空间,用于存储特定类型的数据或执行特定任务的代码。通常,程序被划分为多个段,如代码段、数据段、堆段和栈段等。
3.特点: 段的大小不一定相同,可以根据需要进行动态调整。每个段有自己的基地址和限制,限制了该段可以访问的地址范围。
4.页(Page):
5.定义: 页是内存中的固定大小的块,通常是4KB或8KB。物理内存和虚拟内存都被划分为页的大小,以简化内存管理和提高数据局部性。
6.特点: 虚拟内存中的地址空间被划分为页面,而物理内存也被划分为相同大小的物理页面。操作系统使用页表来映射虚拟页和物理页的关系,实现虚拟内存的管理和地址转换。
关系:
7.段和页都是为了更有效地管理内存而引入的概念,但它们解决的问题略有不同。
8.段主要关注程序的不同部分,如代码、数据、堆、栈等,以提供更灵活的内存组织结构。
9.页主要用于虚拟内存系统,将虚拟地址空间和物理地址空间划分为固定大小的块,以简化内存管理和提高内存使用效率。
在一些系统中,段和页的概念可能结合使用,形成段页式内存管理系统,以兼顾段的灵活性和页的简便性。这种系统中,程序的地址空间被划分为多个段,而每个段又被划分为多个页。这样,既能够提供灵活的内存管理,又能够充分利用页的优势。
分段的一个突出优点是易于实现段的共享即允许若千个进程共享一个或多个分段,且对段的保护也十分简单易
在分页系统中,虽然也能实现程序和数据的共享,但远不如分段系统来得方便
可重入代码(纯代码)一种允许多个进程同时访问的代码。
基本原理
分段和分页原理的结合,即先将用户程序分成若干段,再把每个段分成若千个页,并为每个段赋予一个段名。
段页式管理方式
- 段表始址+段号找到段表项
- 根据页表长度检查页号越界情况
- 页表地址+页号找到页表项
- 内存块号+页内地址得到物理地址
优点:
既有分段系统的便于实现、可共享易于保护、可动态链接又能像分页系统,很好地解决内存的外部碎片问题
段页式存储管理方式的地址变换过程:
概念: 具有请求调入和置换功能,从逻辑上对内存容量加以扩充的一种存储器系统。
内存加外存之和为虚拟内存。
时间局部性,空间局部性。
时间局部性(Temporal Locality):如果一个地址被访问,那么在近期内它很可能会被再次访问。比如在循环或递归中,同一代码块的多次操作就表现出时间局部性。
空间局部性(Spatial Locality):如果一个地址被访问,那么邻近的地址在未来也很可能被访问。例如,在编程中连续的数组元素或者顺序执行的指令就展示出空间局部性。
多次性,对换性,虚拟性。
多次性:这个原则主要说明在程序的执行过程中有可能需要反复地加载和卸载。比方说,在一个大型的程序中,可能不是所有的数据和代码都需要同时加载到内存中,部分数据和代码在需要的时候被载入,不需要的时候被卸载。这就是多次性的表现。
对换性:这是一种系统把一部分内存中的内容(称为页或块)暂时保存到硬盘等存储设备上,以便释放内存供其他用途使用,待需要时再从硬盘中读取回内存的过程,被称为“对换”(Swapping)。对换操作的基本单位可以是进程,也可以是更小的页或者段。
- 虚拟性:虚拟性是指在一个使用虚拟内存的系统中,每个进程都拥有一定范围的逻辑地址空间,这个地址空间能被操作系统映射到实际的物理内存中。虚拟性允许每个进程使用一套独立的逻辑地址,这些地址并不需要与实际的物理内存地址一一对应,而是通过一页或一个段的映射来实现。这种解耦使得程序员可以编写更大、更复杂的程序,而不用担心物理内存限制,同时操作系统也能更高效地管理和分配物理内存。虚拟性提供了一种逻辑上的连续地址空间,简化了代码编写和内存管理。
- 请求分页存储管理
- 请求分段存储管理
- 请求段页式存储管理
请求页表机制
状态位P:指示该页是否在内存访问。
字段A:记录该页在一段时间内被访问的次数。
修改位M:也称脏位,标志该页是否被修改过。
外存地址:指示该页在外存中的地址(物理块号 )
基本分页
基本分页存储管理页表:
页号 | 块号 |
0 | a |
1 | b |
请求分页存储管理页表:
页号 |
内存块号 |
状态位 |
访问字段 |
修改位 |
外存地址 |
0 |
无 |
0 |
0 |
0 |
x |
1 |
b |
1 |
13 |
1 |
y |
2 |
c |
1 |
8 |
1 |
z |
请求分页中的内存分配:
1.最小物理块数的确定
- 保证进程正常运行所需的最小物理块数
2.物理块的分配策略
- 固定分配 局部置换
- 可变分配 全局置换
- 可变分配 局部置换
3.物理块分配算法
- 平均分配算法
- 按比例分配算法;(计算各进程页面总和S
S=S1+....Sn
计算每个进程所能分到的物理块数b b=(Si/S)*m(当前系统中能够分配的物理块的总和)。- 考虑优先权的分配算法
页面调入策略:
何时调入页面
- 预调页策略:预先调入一些页面到内存。
- 请求调页策略:发现需要访问的页面不在内存时,调入内存。
从何处调入页面
- 如系统拥有足够的对换区空间,全部从对换区调入所需页面。
- 如系统缺少足够的对换区空间,凡是不会被修改的文件,都直接从文件区调入;当换出这些页面时,由于未被修改而不必再将它们重写磁盘,以后再调入时,仍从文件区直接调入
- UNIX方式:未运行过的页面,从文件区调入;曾经运行过但又被换出的页面,从对换区调入。
如何调入页面(页面调入方法):
1.查找所需页在磁盘上的位置
2.查找一内存空闲块
- 如果有空闲块,就直接使用它。
- 如果没有空闲块,使用页面置换算法选择一个“牺牲”内存块。
- 将“牺牲”块的内容写到磁盘上,更新页表和物理块表。
3.将所需页读入(新)空闲块,更新页表
4.重启用户进程
缺页率:
- 访问页面成功(在内存)的次数为:S
- 访问页面失败(不在内存)的次数为F总访问次数为:A=S+F
- 缺页率为: f=F/A
- 影响因素:页面大小、分配内存块的数目、页面置换算法、程序固有属性
- 缺页中断处理的时间:t=β x t(a) + (1-β) x t(b)。β为缺页率,t(a)为缺页处理时间,t(b)不缺页。
在指令执行期间产生和处理中断信号。
一条指令在执行期间,可能产生多次缺页中断 。
分类:
内中断(CPU内部)
- 陷入、故障、终止
外中断(CPU外部)
- I/O中断请求
- 人工干预
地址变换机构:
与分页内存管理类似。
- 请求调页,判断是否在内存
- 可能需要页面置换
- 新增/修改页表项
- 热点表项同步到快表
页面置换:找到内存中没有使用的一些页,换出(牺牲者)。
- 算法:替换策略。
- 性能:找出一个导致最小缺页数的算法。
同一个页可能会被装入内存多次。
在一个较小的物理页面置换完善了逻辑内存和物理内存的划分内存基础之上可以提供一个大的虚拟内存 。
页面置换算法:
常见置换算法:
最佳置换算法 (OPT) 最少使用算法 (LFU) 先进先出置换算法 (FIFO) Clock置换算法 最近最久未使用置换算法 (LRU) 页面缓冲算法
- 需要一个最小的缺页率
- 通过运行一个内存访问的特殊序列(访问序列),计算这个序列的缺页次数
最佳置换算法 (OPT):
- 保障最低缺页率
- 每次选择淘汰最不可能再次被使用(之后最长时间不再被使用)的页面
- 无法实现
先进先出置换算法 (FIFO):
- 保障顺序上的公平
- 每次选择淘汰最早进入内存的页面,总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
- Belady异常,性能差
最近最久未使用置换算法 (LRU):
- 保障时间和距离上的公平
- 每次选择淘汰最久最近未使用的页面淘汰
- 需要硬件支持,开销大
硬件支持
寄存器:为内存中的每个页面设置一个移位寄存器。
- 被访问的页面对应寄存器的Rn-1位置为1,定时右移。
- 具有最小数值的寄存器所对应的页面为淘汰页。
栈:保存当前使用的各个页面的页面号
- 被访问的页,移到栈顶。
- 栈底是最近最久未使用页面的页面号。
最少使用算法 (LFU):
- 保障时间和距离上的公平
- 为内存中的每个页面设置一个移位寄存器,用来记录该页面的被访问频率
- LFU 选择在最近时期使用最少的页面作为淘汰页
Clock置换算法:
LRU的近似算法,又称最近未用(NRU)或二次机会页面置换算法
- 保障性能和开销均衡
- 为页面设置访问位(0/1),并链接成循环队列,进程访问页面后置为1。淘汰时为1置为0并跳过,为0时淘汰。
- 最多需要两轮扫描
简单的Clock算法:
- 每个页都与一个访问位相关联,初始值位0
- 当页被访问时置访问位为1
- 置换时选择访问位为0的页;若为1,重新置为0(给其一次机会)。淘汰为0的页。
改进Clock置换算法:
- 额外考虑是否修改,保障最少I/O操作:
- 增加修改位(0/1),第一轮找(0,0),第二轮找(0,1)并修改访问位为0,第三轮找(0,0),第四轮找(0,1)
使用方式:
1.除须考虑页面的使用情况外,还须增加置换代价
2.淘汰时,同时检查访问位A与修改位M。
- 第1类(A=0,M=0):表示该页最近既未被访问、又未被修改,是最佳淘汰页
- 第2类(A=0,M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页。
- 第3类 (A=1,M=0):表示该页最近已被访问,但未被修改,该页有可能再被访问。
- 第4类 (A=1,M=1):表示该页最近已被访问且被修改,该页有可能再被访问
置换时,循环依次查找第1类、第2类页面,找到为止3.置换时,循环依次查找第1类、第2类页面,找到为止
页面缓冲算法(PBA):
影响效率的因素:
- 页面置换算法、写回磁盘的频率、读入内存的频率
目的:
- 显著降低页面换进、换出的频率,减少了开销可采用较简单的置换策略,如不需要硬件支持
具体做法:
设置两个链表:
- 1.空闲页面链表:保存空闲物理块。
- 2修改页面链表:保存已修改且需要被换出的页面等被换出的页面数目达到一定值时,再一起换出外存。
访问内存的有效时间(EAT):
访问页在内存,且其对应页表项在快表中
- EAT = λ + t (λ表示在快表的时间,t表示在内存的时间)
访问页在内存,且其对应页表项不在快表中(含更新快表的时间)
- EAT=λ + t + λ + t = 2 ( λ + t )
访问页不在内存中
1.需进行缺页中断处理,有效时间可分为查找快表的时间、查找页表的时间处理缺页的时间、更新快表的时间和访问实际物理地址的时间。
2.假设缺页中断处理时间为ε
- EAT=λ+t+E+λ+t=E+2(λ+t)。
3.f为缺页率,φ为缺页中断处理时间
- EAT=t+f x(φ +t) + (1- f) x t 。
如果一个进程没有足够的页,那么缺页率将很高,这将导致:
- CPU利用率低下
- 操作系统认为需要增加多道程序设计的道数
- 系统中将加入一个新的进程
抖动(Thrashing): 一个进程的页面经常换入换出 。
根本原因
- 同时在系统中运行的进程太多
- 因此分配给每一个进程的物理块太少,不能满足进程运行的基本要求,致使进程在运行时,频繁缺页,必须请求系统将所缺页面调入内存。
抖动的发生与系统为进程分配物理块的多少有关
- 进程发生缺页的时间间隔与所获得的物理块数有关
- 根据程序运行的局部性原理,如果能够预知某段时间内程序要访问的页面,并将它们预先调入内存,将会大大降低缺页率
缺页率和物理块数地关系 :
处理机的利用率:
工作集的定义:
所谓工作集,指在某段时间间隔A里进程实际要访问页面的集合把某进程在时间t的工作集记为w(t,△)其中的变量A称为工作集的“窗口尺寸”
工作集w(t,△)是二元函数,即在不同时间的工作集大小不同,所含的页面数也不同;工作集与窗口尺寸A有关,是A的非降函数,即:
w(t,△) ⊆ w(t, △+1)
举例:
1.采取局部置换策略:只能在分配给自己的内存空间内进行置换;
2.把工作集算法融入到处理机调度中;
3.利用“L=S”准则调节缺页率:
- L是缺页之间的平均时间
- S是平均缺页服务时间,即用于置换一个页面的时间
- L
- 磁盘和处理机都可达到
- L=S,最大利用率
- L>S,说明很少发生缺页
4.选择暂停进程 。
请求段表机制:
存取方式:表示段存取属性为只执行、只读或允许读/写。
访问字段A:记录该段在一段时间内被访问的次数。
修改位M: 标志该段调入内存后是否被修改过。
存在位P:指示该段是否在内存。
增补位:表示该段在运行过程中是否做过动态增长。
外存始址:指示该段在外存中的起始地址(盘块号)。
缺页中断机构
在指令执行期间产生和处理中断信。
一条指令在执行期间,可能产生多次缺段中断。由于段不是定长的,对缺段中断的处理要比对缺页中断的处理复杂。
地址变换机构
若段不在内存中,则必须先将所缺的段调入内存,并修改段表,然后利用段表进行地址变换。
共享段表:保存所有的共享段
- 共享进程计数count
- 存取控制字段
- 段号
共享段的分配
- 对首次请求使用共享段的用户,分配内存,调入共享段,修改该进程段表相应项,再为共享段表增加一项,count-1
- 对其他使用共享段的用户,修改该进程段表相应项,再为共享段表增加一项count-count+1。
共享段的回收
- 撤销在该进程段表中共享段所对应的表项,并执行count-count-1操作。
- 若为0,回收该共享段的内存,并取消共享段表中对应的表项。
- 若不为0,只取消调用者进程在共享段表中的有关记录 。
越界检查
- 由地址变换机构来完成
- 比较段号与段表长度,段内地址与段表长度。
存取控制检查: 以段为基本单位进行
- 通过“存取控制”字段决定段的访问方式
- 基于硬件实现。
环保护机构:
- 低编号的环具有高优先权
- 一个程序可以访问驻留在相同环或较低特权环(外环)中的数据
- 一个程序可以调用驻留在相同环或较高特权环(内环)中的服务