进程的描述和控制
并行:指两个或多个事件在**同一时刻**发生。
并发:指两个或多个事件在==同一时间间隔==发生,宏观上同时发生,微观上,实践交替运行。
进程:进程是进程实体的运行过程,是系统进行资源分配和调度的独立单位。
进程的特征
- 动态性:进程的实质是进程实体的运行过程,由创建产生,由调度执行,由撤销而消亡
- 并发性:多个进程实体同存于内存中,且能在一段时间内同时进行。
- 独立性:进程实体是一个独立能运行,独立获得资源,独立调度的基本单位。
- 异步性:进程按照异步的方式运行的,即能各自独立的,不可预知的速度向前推进。(不可再现性)
- 结构性:由代码+数据+PCB构成。
进程控制块PCB
PCB:进程实体的一部分,用于描述,控制和管理进程的一种数据结构,是进程存在的标志。
PCB作用:
- 作为独立运行基本单位的标志。
- 能实现间断性运行方式。
- 提供进程管理所需要的信息。
- 提供进程调度所需要的信息。
- 实现与其他进程的同步与通信。
PCB中的信息
- 进程标识符
- 外部标识符:方便用户(进程)对进程的访问。由创建者提供。通常由字母,数字组成。
- 内部标识符:方便系统对进程的使用,在OS中又为进程设置了内部标识符。
- 处理机的状态
- 通用寄存器:用户程序可以访问的,又称用户可视寄存器
- 指令计数器:存放了下一条指令要访问的地址
- 程序状态字PSW: 含有状态信息
- 用户栈指针:指每个用户进程都有一个或若干个与之相关的系统栈。用于存放过程和系统调用参数及调用地址
- 进程调度信息
- 进程状态
- 进程的优先级:优先级越高应优先获得处理机
- 进程调度所需要的其他信息
- 事件:指进程由执行状态转变为阻塞状态所等待发生的事件
- 进程控制信息
- 程序和数据的地址:进程实体中的程序和数据的内存或外存地址。
- 进程同步和通信机制:实现进程同步和进程通信时所需的机制。如消息队列或者信号量等。
- 资源清单:列出运行期间所需要的全部资源不包括CPU
PCB的组织方式
- 线性方式:简单,开销小,所有的PCB都在一张表中,每次查找都需要全表查询。
- 链接方式:把具有相同状态的PCB链接成一个队列。
- 索引方式:系统根据进程的状态不同,建立几张索引表。
进程的控制
引起进程创建的4类事件
- 用户登录
- 作业调度
- 提供服务
- 应用请求
进程创建的过程
- 申请空白PCB
- 为新创建的进程分配其运行所需的资源
- 初始化进程控制块
- 如果进程就绪队列能接纳新进程,就加入进程就绪队列。
进程终止的过程
引起进程终止的事件
- 正常结束:表示程序的任务已经完成
- 异常结束:越界错,保护错,非法指令,特权指令错,运行超时,等待超时,算术运算错。IO故障
- 外界干预:操作员或操作系统干预,父进程请求,父进程终止。
进程终止过程
- 根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,读取其状态
- 若被终止进程正处于执行状态,应立刻停止该进程的执行,并指调度标志为真。用于指示该进程被终止后应重新调度
- 若该进程还有子孙进程,还应将其所有的子孙进程也都予以禁止,以防他们成为不可控进程。
- 将被终止的进程拥有的全部资源归还给父进程或者系统
- 将被终止的进程从所在队列或链表中移除,等待其他进程来收集信息。
进程的阻塞和唤醒
引起进程阻塞和唤醒的事件
- 向系统请求共享资源失败,进入阻塞
- 等待某种操作完成,当某进程必须在某个操作完成后才能运行
- 新数据尚未到达,进程请求数据尚未到达进入阻塞
- 等待新任务的到达等
进程阻塞的过程
正在执行的进程,如果发生了上述某件事,进程便通过调用阻塞原语block将自己阻塞,阻塞时进程自身的一种主动行为。
进程唤醒过程
首先把被阻塞的进程从等待该事件的阻塞队列中移除,将其PCB中现行状态由阻塞改为就绪,然后将该PCB插入到就绪队列。
进程同步
资源共享关系(间接相互制约)
多个程序在并发执行时,由于共享系统资源,如CPU,IO设备等。致使在这些并发执行的程序之间形成相互制约的关系。
相互合作关系(直接相互制约)
为了完成某个任务而建立两个或多个进程。这些进程为完成同一项任务而相互合作。例如计算进程和打印进程共享一个缓冲区的情况。
同步机制原则
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待
进程通信(3)
-
共享存储器系统
- 基于共享数据结构的通信方式:要求某些进程公用某些资源,如生产者和消费者的游街缓冲区。(低级通信)。
- 基于共享存储区的通信方式(高级通信)
-
管道通信
所谓管道:用于连接一个读进程和写进程以实现他们之间的通信的一个共享文件。必须有一下三个协调能力
1)互斥:即当另一个进程对他进行读(写)操作时,另一个进程必须等待
2)同步:当写进程写入一定数量的数据后应进入睡眠状态,当读进程读取数据后将他唤醒,当读取为空时,应进入睡眠状态
3)确定对方是否存在
-
消息传递系统:进程不借助任何共享存储区或者数据结构。以格式化的消息为单位,将通信数据封装在消息中(高级通信)
- 直接通信方式:是指发送进程通过OS所提供的发送原语,直接发送给目标主机
- 间接通信方式:通过共享中间实体实现(邮箱)
进程同步的解决方法
信号量机制:
-
整型信号量
wait(s){ while(s<=0);//没有遵守让权等待 s--; } signal(s){ s++; }
-
记录型信号量
设置一个记录型信号量s 和一个List指针
P操作
s= s-1;
if(s<0);
block(s.l),
当信号量小于0时,就阻塞并加入到list中
v操作
s=s+1;
if(s<=0);
wakeup(s.l),
当信号量<=0,就表示该链表中还有阻塞资源,应当唤醒他。
例子:两个进程访问一个打印机 s=1
进程a:
P(a) s=s-1 =0; 0!<0,该线程运行
进程b:
P(b) s=s-1=0-1 = -1 <0 阻塞并加入到了指针中
当a运行完成后
V(a):s=s+ 1= -1+1=0; 表明有阻塞的进程 应当wakeup
当b运行完成后 s=0+1 = 1;此时没有阻塞的进程。
管程机制
管程:代表共享资源的数据结构以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序共同构成了一个操作系统的资源管理模块,称之为管程。管程被请求和释放资源的进程所调用。
组成:
- 管程的名称
- 局部于管程的共享数据说明
- 对该数据结构进行操作的一组过程
- 对局部于管程的共享数据设置初始值的语句
特性:
- 模块化,即管程是一个基本程序单位,可以单独编译
- 抽象数据类型,指管程中不仅有数据,而且还有对数据的操作
- 信息遮蔽
与进程的区别
- 二者定义了数据结构,但进程定义的是私有的PCB,而管程定义的是公共数据结构
- 二者都存在对各自数据结构的操作。但进程是顺序执行的,而管程主要是进行同步操作和初始化操作
- 设置进程的目的在于实现程序的并发性,而设置管程则是解决共享资源的互斥使用
- 进程调用管程中的过程对共享数据实行操作。
- 进程能并发执行。而管程不能
- 进程具有动态性。
条件变量
场景:当一个进程调用了管程,在管程中时被阻塞或者挂起,直到阻塞或者挂起的原因解除,在此期间如果该进程不释放管程,则其他进程无法进入管程,被迫延长事件的等待
解决:
条件变量:形式 condition x,y;对条件变量的操作仅限于wait和signal,每个条件变量都保存了一个链表,用于记录因该条件变量而阻塞的所有进程,同时提供两个操作
x.wait: 正在调用管程的进程因x条件需要被阻塞或者挂起。则调用x.wait将自己插入到x条件的等待队列上
x.signal: 正在调用管程的进程发现x条件发生了变化,则调用x.signal,重新启动一个因为x条件而阻塞的进程,如果有多个,则选择一个
如果Q进程因为x条件处于阻塞,正在调用管程的进程P执行了x.signal操作后,此时如何确定那个执行那个等待,可采用如下
P 等待,直到Q离开管程或等待另一个条件
Q等待,直到P离开管程或者等待另一个条件
解决生产者和消费者的问题
互斥信号量mutex=1 信号量empty full表示缓冲池的数量
P(empty)->P(mutex)->生产->V(mutex) V(full)
P(full)->P(mutex)->消耗->V(mutex) V(empty)
管程:
命名 PC
put(x):放入,count>=N;表示缓冲已满,无法在继续投入
get(x):取出 count<=0;没有产品可取
条件变量notfull,notempty
cwait:当管程被调用时,其他进程调用该过程被阻塞,并挂在condition上
csignal:唤醒cwait,如果有就唤醒,如果没有则无操作返回
调度和死锁
- 高级调度:又称作业调度,调度的对象是作业
- 低级调度:又称短程调度,调度的对象是进程或者内核级线程
- 中级调度:又称内存调度,引入中级调度的目的提高cpu的利用率和系统的吞吐量。
作业调度算法
先来先服务FCFS
FCFS:先来先服务。
短作业优先SJF
SJF:短作业优先。作业越短优先级越高。作业的长短是以作业所要求的时间来确定的
缺点:
- 必须预知作业的运行时间,
- 对长作业不利,长作业的周转时间会明显的增长,容易出现饥饿现象
- 采用SJF算法,人机无法实现交互
- 未考虑作业的紧迫程度。
优先级算法PSA
基于外部赋予作业的紧迫程度,赋予作业相对应的优先级,根据优先级进行作业调度
高响应比优先调度算法HRRN
Rp = (等待时间+服务时间)/要求服务时间=(响应时间)/服务时间。
进程调度
进程调度的任务
- 保存处理机的现场信息
- 按某种算法选取进程
- 把处理器分配给进程
进程调度的机制
- 排队器:为了提高进程调度的效率,应事先把系统中就绪的进程按照一定程度的策略排成一个或多个队列
- 分配器:依据进程调度程序所选定的进程,将器从就绪队列中取出,然后进行分派器到新选出进程间的上下文切换,将处理机分配给新选出的进程
- 上下文切换器
- OS保存当前进程的上下文,把当前进程的处理及寄存器内容保存到该进程的进程控制块相应的单元。在装入分派程序的上下文
- 把新选进程的CPU现场信息装入到处理机的各个相应寄存器。以便新进程运行
进程调度的方式
- 非抢占方式:一旦把处理机分配给某进程后,就一直运行,不会因为时间中断或其他原因去抢占当前进程的处理机,直至事件完成或者因为发生阻塞时,才把处理机分配给其他人。
- 此种方式引起的原因:
- 正在运行进程运行完毕,或者因为发生某事件无法继续运行
- 正在运行的进程发出IO请求
- 在进程通信或同步的过程中执行了某种原语操作如Block
- 此种方式引起的原因:
- 抢占式方式:运行调度程序依据某种原则来暂停某个正在执行的进程,将分配的进程处理机重新分配给另一个进程。
- 遵循的原则:
- 优先权原则:允许优先级高的线程抢占当前进程的处理机
- 短进程优先原则:允许新到的短的进程可以抢占当前长进程的处理机
- 时间片原则:各进程按时间片轮转时,当正在执行的进程的一个时间片用完后,便停止该进程的执行而重新进行调度。
- 遵循的原则:
轮转调度算法
原理:
系统将所有的就绪进程按FCFS排成一个就绪队列。系统设置每隔一段时间便产生一次终端。去激活进程调度程序进行调度,把CPU分配给队列中队首的进程,让其运行一个时间片。
进程切换时间:
- 若一个时间片未永远而进程已经完成。就立即激活调度程序,将其从就绪队列中删除,在调度就绪队列中队首的进程进行运行。
- 在一个时间片未完成时,计时器终端处理程序被激活,如果当前运行的程序没有完成,就把其安排在就绪队列的最后。
时间片大小的确定:
一个较为合理的时间片大小是略大于一次典型的交互时间,使大多数交互式进程能在同一时间片完成。从而获得很小的响应时间。
优先级调度算法
- 非抢占式的优先级调度算法 :一旦把处理机分配给进程后,该进程便一直运行直至完成,或者因为该进程发生某事件而放弃处理机时,系统方可以重新分配。
- 抢占式的优先级调度算法:允许后面到的优先级更高的进程抢占处理机。
优先级类型:
静态优先级:在创建时确定,整个进程运行期间不得发生改变。
动态优先级:进程在创建之初,先赋予其一个优先级,然后其值随着进程的推进或等待时间的增加而改变。
多队列调度算法
将进程就绪队列从一个拆分为若干个,将不同类型或性质的进程固定分配在不同的就绪队列,不同的就绪队列采用不同的调度算法,一个就绪队列中的进程可以设置不同的优先级,不同的就绪队列本身也可以设置优先级。
多级反馈队列
调度机制:
- 设置多个就绪队列
- 每个队列采用FCFS
- 按队列的优先级调度:只有前面1 到 i-1队列的所有进程调度完后才调度队列
死锁
产生死锁的必要条件
- 互斥条件
- 请求保持和条件
- 不可剥夺条件
- 循环等待条件
处理死锁的方法
- 预防死锁
- 避免死锁
- 检测死锁
- 解除死锁
预防死锁
破坏请求和条件
- 第一种协议:所有进程在开始运行之前就申请得到全部资源。(静态资源分配)
- 缺点:资源浪费严重,使进程发生饥饿现象,导致进程的开始严重推迟。
- 第二种协议:允许一个进程只获得初期所需的资源后,便开始运行,逐步释放分配给自己且已用毕的全部资源,然后在请求信道资源。
破坏不可剥夺条件
规定:当一个保持了某些不可被抢占资源的进程,提出新的资源请求无法得到满足时,他必须释放已有的资源。待以后重新申请
破坏循环等待条件
避免死锁
安全状态:指系统按照某种进程推进顺序为每个进程pi 分配其所需资源,直至满足每个进程对资源的最大分配,使得每个进程都可以顺利完成。这样的推进顺序为安全序列,如果无法找到就处于不安全状态。银行家算法。
死锁的解除
存储器管理
编译—>链接—>装入
程序的装入
1.绝对装入方式
当计算机系统很小时且仅能运行单到程序时,完全有可能知道程序将驻留内存的什么位置,此时可以采用绝对装入
2. 可重定位装入方式(静态重定位)
把装入时对目标程序和数据地址修改的过程称为重定位。
3.动态运行时的装入方式
不立即把装入模块的逻辑地址转换为物理地址,而是把这种转换推迟到真正执行的时候(需要一个重定位寄存器支持)。
程序的链接
1. 静态链接方式
在程序运行之前需要将各个目标模块及他们所需的库函数链接成一个完整的装配模块,以后不在拆开
需要解决的问题:
- 对相对地址进行修改。
- 变换外部调用符号。将每个模块中所用的外部调用符号也都变换位相对地址。
2. 装入时动态链接
将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式。即在装入一个目标模块时,若发生一个外部模块调用事件,将引起转入程序去找出相应的外部模块,并将他装入内存。
优点:便于更新和修改,便于实现对目标模块的共享。
3. 运行时动态链接
将某些模块的链接推迟到程序执行时才进行。即当某个被调用模块位装入内存时,立即用os去找到模块并装入内存,并链接到调用者上。
连续管理的内存分配方式
单一连续分配
单道程序环境
固定分区匹配
- 分区大小相等:缺点 缺乏灵活性,即当程序太小时,会造成内存浪费,当程序太大时,一个分区又不足以装入
- 分区大小不等,增加了存储器分配的灵活性
内存分配
通常将分区按照其大小进行排队,并为之建立一张分区使用表,其中各表项包含每个分区的起始指针,大小,状态。
动态分区分配(可变分区分配)
根据进程的需要,动态的为之分配内存和空间
所用的数据结构(2种)
- 空闲分区表:在系统中提供一张空闲分区表,用于记录每个空闲分区的状况(大小,状况,起始地址,分区号);
- 空闲分区链:双向链表
分配算法:
基于顺序的分配算法(4种)
- 首次适应算法(First Fit):从链首开始找到一个大小适合满足要求的空闲分区,按照作业大小,划分出一块内存空间,分配给请求者,缺点:会留下很多无法利用的空闲分区(碎片),每次查找都是从低位开始,无疑又会增加查找的开销。分区按照地址递增分布
- 循环首次适应算法(Next Fit):不再是从首部开始,从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个满足条件的空闲分区(这样使得空闲分区分布均匀,但是缺乏大的空闲分区)。(用一个指针记录下次查询的地址)
- 最佳适应算法(Best fit): 指每次分配内存时,总是能把满足要求的,又是最小的空闲分区分配给作业(分区按照分区大小排列)。(也会留下难以利用的分区)。
- 最坏适应算法(Worst fit):与最佳适应算法相反,总是找一个最大的空闲分区分割给作业使用。
基于索引搜索的动态分区匹配算法
- 快速适应分区算法(quick fit):又称为分类搜索算法,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表,这样系统就存在多个分区链表,在内存中建立一张管理索引表,其中的每一个索引表对应了一种空闲分区类型,并记录了该类型的空闲分区链表指针。空闲分区的分类是根据进程常用的空间大小划分的。
- 伙伴系统(buddy system):该算法规定,无论已分配分区或空闲分区,其大小均位2的k次幂(k为整数,1<=k<=m),通常2m是整个可分配的大小,也就是最大的分区大小。假设整个分区大小为2m的空闲分区。在系统运行的过程中,由于不断的划分,系统就会把相同大小的空闲分区单独设立一个分区双向链表,这样就形成了不同的k个空闲分区链表。
- hash算法`
动态可定位分区分配
把内存在的所有作业移动,使他们全部项邻接,这样就会把许多原来空闲小分区拼接成一个大分区,这种方法称为拼接。
动态可定位
重定位寄存器:存放数据在内存中的起始位置,在执行时,真正访问的内存地址是相对地址与重定位寄存器相加而形成的。
动态可重定位分区算法
和动态分区分配算法相同,仅仅是多了一个紧凑功能。
分区分配操作
- 分配内存:利用某种算法从空闲分区表(链)中找到所需大小的分区满足m.size(当前分区大小) - u.size(请求)<= size(规定的不可再分甚于分区大小),便把这个分区分给请求者。
- 内存回收:
- 回收区与插入点之前的前一个空闲分区F1相邻接 直接改变F1的大小
- 回收区与插入点之后的空闲分区相邻接,两个分区合并,用回收区的首地址作为新空闲分区的首地址
- 回收区上下的分区都是空闲的,将三者合并F1作为新的表项,取消f2的表项。
- 回收区不与F1F2相邻,直接建立空闲分区。单独建立一个新表项,填写首址和大小。
对换(中级调度)
对换:把内存中暂时不能运行的进程或者暂时不要的程序和数据交换到外存上。
对换的类型:
- 整体对换(进程兑换)
- 页面对换(部分对换)
对换的空间管理
文件区:用于存放各类文件(提高文件的空间利用率,采用离散分配方式)(
交换区:(提高进程换入换出的访问速度,采用连续分配的方式)
对换区的数据结构
空闲分区表和空闲分区链
对换区的内存分配回收(和动态分区分配一样)。
进程的换出换入
1. 换出(2步)
- 选择被换出的进程,首先选择阻塞或者睡眠的进程,当有多个这样的进程优先选择优先级最低的进程
- 进程的换出时,只能换出与非共享的程序和数据段,只要有进程需要她,就不能换出。
2. 换入
首先查看PCB集合中的所有状态,从中找出就绪状态且已换出的进程,当有多个这样的进程时,将选择其中换出事件最久的进程(必须大于规定时间),为它申请内存,如果申请成功则换入,否则将某些进程换出,在调入。
分页存储的管理方式(3种)
分页存储管理的基本方法
分页存储管理方式:在该方式中,将用户程序的地址空间分为若干个固定大小的区域,称为页或者面。典型的页面大小为1kb。相应的也将内存分为诺干个物理块或者页框,页和块大小相同。
页面
页面:将进程的逻辑地址空间分成诺干个页,并为之加以编号,从0开始。相应的也把内存的逻辑地址分成若干块,同样的编号,在为进程分内存时,由于进程的最后一页经常不满1块,形成不可利用的页内碎片。
页面大小:过小,可以减小内存的空间碎片。提高了利用率,但是会造成进程占用过多的页面。从儿导致进程的页表过长,占用大量的内存。选择过大,减少了页表的长度,但是页内碎片变多。(1kb~8kb)之间。
地址结构
地址结构:页号P[31-12]+位移量W[11-0].
4字节大小,地址空间最多有1M页。 0-11 为页内地址,12-31是页号
页表(页面映像表)
映射用户程序的页号和物理地址的块号的一张表
地址变换机构
基本的地址变换机构
变换过程:
- 分离:CPU得到逻辑地址后,用逻辑地址除以物理块的大小得到的商即为页号P,余数即为页内偏移量d,
- 判断:用P与页表长度比较,P大于页表长度则发生越界中断。反之执行3
- 查页表:P查页表得到对应的物理块号
- 合成:物理块号 乘以 物理块的大小 + 偏移量d
具有快表的地址变换机构
在地址变换机构中添加了并行查找能力的特殊高速缓存寄存器,又称为联想寄存器(TLB).
变换过程:
- 在CPU给出逻辑地址后,由硬件地址变换机构得到页号P和偏移量d,并将页号直接送入快表,与之比较
- 如果找到匹配的页号,则直接取出该页对应的页号,并形成物理地址。取出数据,注入内存
- 如果没找到,则访问主存中的页表,读出该页的表项后,同时存入快表,以便后续访问,但如果快表已满,则按照一定的算法进行替换。
分段存储管理方式
分段
在分段存储的管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。
分段地址结构
段号[31 - 16]段内地址[15 - 0 ];
段表
[段号] [ 段长] [基址]
地址变换
- 根据逻辑地址得到段号,若段号大于段表长度,则发生中断越界
- 根据段号,找到项目,根据段的偏移量判断是否大于该段段长,若是,则发生中断越界
- 由该段的起始地址+偏移量得到物理地址
注意:也可以增加一个联想寄存器,实现类似于快表查询的功能。
段页存储管理方式
虚拟存储
虚拟存储器:是指具有请求调入(分页,分段)功能和置换功能,能从逻辑上对内存容量加以扩充的存储器系统。
特性:
- 多次性:是相对于传统管理方式而言的,指一个作业中的程序和数据无需在运行时,一次性的全部装入内存,而是被分成多次调入内存运行
- 对换性:相对于传统存储器管理方式而言的。指一个作业中的程序和数据无需再一次运行时常驻内存。而是允许在作业的运行过程中进行换进换出。
- 虚拟性:(本质特性),逻辑上扩充了容量而实际上没有扩充。
- 离散性:
实现方法
1. 请求分页系统
硬件:
- 请求分页的页表机制
- 缺页中断机制
- 地址变换机构
软件:
请求调页的软件和实现页面置换的软件
2. 请求分段系统
硬件:
- 请求分段的段表机制
- 缺段中断系统
- 地址变换机构
软件
请求调段的软件和实现段置换的软件。
请求分页存储的管理方式
在请求分页的基础上,为了支持虚拟存储器的存储功能,增加了请求调页功能和页面置换功能
请求页表机制:
数据结构:请求页表 作用是把用户地址中的逻辑地址映射为内存空间中的物理地址
[页号][物理块号][状态位P][访问字段A][修改位M][外村地址]
P:占一位,指示该页是否调入内存,供程序访问时参考
A:记录本页被访问的次数,或记录本页有多久未被访问,提供给置换算法选择页面时参考
M:标识该页是否被修改过,如果修改过则将该页从新写到外存上。
外存地址:指出该页在外存上的地址,通常是物理块号。
缺页中断机制
地址变换机构
请求分页中的内存分配
1.最小物理块数的确定
2.内存分配策略(2种)
- 固定分配局部置换
- 固定分配:为每个进程分配一组固定数目的物理块,在进程运行期间不在改变
- 局部置换:是指如果进程发生缺页中断,则只能从分配给该进程的n个页面中选出一页,然后再调入一页,以保证分配给该进程的内存空间不变。
- 缺点:分配的数量少则会频繁的发生缺页中断,降低了系统的吞吐量,太大,则内存中进程数量就会减少,造成cpu浪费。
- 可变分配的全局置换
- 可变分配:指先为每个进程分配一定数目的物理块,在进程运行期间,可更具实际情况增加或者减少。
- 全局置换:是指发生缺页中断后,从所保留的空闲物理块中取出一块空闲物理块,或者一所有进程的物理块为标的,选择一块换出,然后将缺页调入
- 缺点:当空闲物理块用完之后,置换出的物理块可能导致缺页率增加
3.物理块分配算法(3种)
- 平均分配算法:将系统中所有可供分配的物理块平均分配给各个进程
- 按比例分配算法:根据进程的大小分配物理块
- 考虑优先权的分配算法:
页面调入策略
1.何时调入(2种策略)
- 预调页策略:如果进程的许多页存放在外存的一个连续区域中,一次调入若干个相邻的页会比一次调入一个要高效一些。但如果大部分不访问,则又低效。
- 请求调入策略:当进程在运行过程中按其所需要访问某部分程序和数据时,若发现其所在的页面不存在,则立即提出请求。由os调入内存(系统开销较大,增大了磁盘的IO)。
2.何处调入(3种情况)
- 系统拥有足够的对换区空间,这时可以全部从对换区调入所需的页面,以提高调页速度(先将文件从文件区拷贝到对换区空间)
- 系统缺少足够的对换区空间,凡是不会被修改的文件直接从文件区调入,凡是会被修改的文件应该先调到对换区,在从对换区调入。
- UNIX方式:由于与进程有关的文件都放在文件区,故凡是没有运行过的页面,都应在文件去寻找。
3.调入过程
页面置换算法
- 最佳置换算法:无法实现但是能用来评价其他算法的优劣
- FIFO算法:选择最老的页面作为淘汰页面(可能造成belady现象)
- LRU最近最少未使用
- 需要的硬件支持:寄存器:记录各个页面的使用情况,
- 栈:包存当前使用的各个页面的页面号。最新的在栈顶。
- LFU最少使用算法:在每一页设置一个移位寄存器,用来记录该页面的访问频率,该置换算法在最近时期使用页面最少的页面作为淘汰页。