操作系统原理 复习
操作系统复习
第一章 操作系统概述
基本概念
- 吞吐量:单位时间内系统能处理的工作量。
- 进程:正在动态执行的程序
- 实时操作系系统:实时计算。计算的正确性不仅依赖于系统计算的逻辑结果,还依赖于产生这个结果的时间一类的计算。
- 操作系统的特征:现代操作系统大多支持多任务,具有并发、共享、虚拟、异步的特征。
单道批处理系统
- 特性:自动性、顺序性、单道性。
- 作业独占CPU和内存。
多道批处理系统
- 特性: 多道性、无序性、调度性、复杂性。
- 优点:提高CPU的利用率、提高内存和I/O设备的利用率、增加系统吞吐量。
- 缺点:平均周转时间长(每个任务都存在等待时间) (2)缺乏交互能力
操作系统的功能
1.存储器管理功能
(1) 内存分配:静态分配、动态分配
(2) 内存保护
(3) 地址映射: 需配合硬件完成。其结果为逻辑地址映射为物理地址。
逻辑地址从哪来:IR寄存器->译码->取操作数
(4) 内存扩充:虚拟存储技术。
2.进程管理功能
包括进程控制、进程同步、进程通信、进程调度
3.设备管理功能
设备管理应有以下功能:
(1) 缓冲管理:管理各种缓冲区。
(2) 设备分配:分配I/O所需的设备
(3) 设备处理:由设备驱动实现CPU与设备控制器间的通信。
(4) 设备独立性与虚拟设备
4.文件管理
主要解决:按名访问、文件存储的功能。
5.为用户提供接口
指令的执行
- 一条高级语言对应多条机器语言
- 程序的执行本质是指令一条条执行的过程,指令执行的本质只可能产生存储单元的变化。
- 取指令和执行指令是通过硬件完成的。
- 任何高级语言程序被编译成指令集合,其中的每一条指令都属于机器体系结构指令集。
- 硬件上下文:中断返回恢复被中断程序的执行时,必须要写回CPU寄存器的值。
第二章 进程的描述与控制
1.程序的并发执行
1.1 程序的顺序执行
程序的顺序执行时具有以下特点:顺序性、封闭性、可再现性。
1.2 程序的并发执行
程序的并发执行具有如下特点: 间断性、失去封闭性、不可再现性
不可再现性产生的原因:CPU交替执行指令,产生了不同的指令执行序列,导致结果不同。
2. 进程的描述
2.1 基本概念
- 进程的定义:进程是程序在一个数据集合上的运行过程。
进程时由正文段、用户数据段以及系统数据段共同组陈的一个执行环境。
-
程序的执行过程实际上是一个执行环境的总和。
-
进程的特征:1) 并发性:多个进程实体同存于内存中
2) 动态性:进程时进程实体的执行过程
3) 独立性:在没有引入线程的操作系统中,进程是独立 运行和资源调度的基本单位。
4) 异步性:进程以不可预知的速度向前推进,按异步方式运行。
5) 结构特征: 进程实体包括用户正文段、系统数据段和用户数据段。
-
进程与程序的比较:
区别:1)程序是静态的、进程是动态的。
2)程序是永久的,进程是暂时存在的。
3)进程与程序存在实体不同。程序是指令的集合,而进程包含了用户正文段、系统数据段、用户数据 段的实体。
联系: 进程是程序的一个执行,总是对应至少一个特定程序,而一个程序可对应多个进程。
-
操作系统内核是计算机硬件的第一次扩充。
2.2 进程控制块PCB
- 进程控制块是进程实体的一部分,是操作系统中最重要的记录型数据结构。
- \(time\_slice\) 字段用于记录进程在CPU上运行的时间片中还剩余的时钟节拍数。
3. 进程的控制
-
进程三种状态:就绪状态、执行状态、阻塞状态。
-
进程进程间三个基本状态之间的转换关系
-
进程的阻塞简化过程:
1) 暂停进程的执行,将进程状态改为阻塞态。
2) 将进程插入相应的阻塞队列。
3) 转进程调度程序,重新进行进程调度。
-
进程的唤醒过程简化:
1) 将进程从阻塞队列移出。
2) 将进程状态由阻塞状态改为就绪状态。
3) 将进程插入就绪队列。
-
进程的终止:父进程终止,那么操作系统也不允许子进程继续。
4. 操作系统内核
4.1 操作系统如何被加载
- BIOS将当前磁盘的活动分区的第一个扇区(引导扇区)加载到内存
- 执行boot程序,从磁盘的文件系统中找到OS内核的加载程序(loader.bin),并且将loader.bin装入内存,跳转至loader.bin的第一条命令,开始执行loader.bin程序。
- 执行loader程序,将OS内核程序从外存装入内存。
- 内核从式模式跳转到保护模式的启用分页机制。
4.2 中断
-
什么是中断?
中断时改变处理器执行顺序的一种事件。
-
为什么引入中断?
引入中断后,CPU可以与其他设备并行工作,能够有效提高CPU的利用率,改善系统性能,支持系统的异步性。
-
中断的类型
分为:同步中断(内部中断或异常)、异步中断(外部中断)。内部中断:一条指令终止执行后CPU才会发出中断。异步中断:其他硬件设备按照CPU时钟信号随机产生。
-
关中断指令:由内核或基于硬件的软件执行。
-
对于可屏蔽中断,开中断是响应中断的前提。
-
响应中断的时机:对于外部中断,CPU每执行完一条指令都会检测是不是有外部中断信号到来,若有,则转中断处理。
-
检测到有中断信号,转中断处理的过程:
1)先保护断点,将当前要执行的下一条指令的地址保存到内存中,以便中断返回时能把这个地址恢复到PC中,使得,被中断的程序从断电出开始继续执行。
2)系统关闭中断,转中断处理程序,在中断处理程序中完成保护现场的工作,即把相关硬件上下文信息保存到内存中。
3)保护完现场,根据中断向量到中断向量表中(Linux中是到中断描述符表)找到与中断处理子例程入口地址的相关信息,根据这些信息找到中断处理子例程的入口地址,并执行中断处理子例程,完成本次中断处理的特定处理工作。
4)恢复现场,开中断,CPU返回断电处继续执行被中断程序 。
-
中断向量:中断向量是对不同中断源到来的信号编号。不可屏蔽中断的向量和异常的中断向量是固定的,而可屏蔽中断的向量可通过中断控制器的编程来实现。
-
中断描述符表(IDT):一个系统表,每个中断或异常斗鱼向量联系,每个向量在表中都有唯一对应的表项,其中存有与中断或异常处理子程序入口地址的相关信息。OS初始化时,由OS执行汇编指令Idit加载进内存。
中断处理子程序的入口地址相关信息在内存中的地址 = idtr中的地址 + 8 * 中断向量
4.3 时钟管理
-
操作系统内核可以通过时间机制防止一个程序垄断CPU或者其他资源。
-
计算机系统中的时钟:
RTC时钟:又叫CMOS时钟。
OS时钟:产生于PC机主板上的定时/记数芯片。
-
可编程间隔定时器PIT:PIT按照一定的频率产生时钟中断,以告知内核又一个时间间隔过去了。
-
时钟滴答:OS时钟由可编程定时计数器输出脉冲触发中断而产生的,输出的脉冲中心叫做一个时钟滴答。
-
时钟中断间隔高:有些需要精确计时的应用无法正确运行
时钟中断间隔低:OS占用CPU高,吞吐量变低
因此,时钟中断间隔由系统性能决定。
4.4 系统调用
-
什么是系统调用?
系统调用是核心程序与用户程序之间的接口,是操作系统内核中预先定义好的模块。
-
系统调用与一般函数调用的区别:
1) 系统调用运行在系统态,一般函数运行在用户态。
2)系统调用与一般函数调用的过程不同。当系统调用执行时,当前进程被中断,由系统寻找相应的系统调用子程序,并在核心态下执行,执行结果返回进程。
3)系统调用要进行中断处理,比一般函数调用多了一些系统开销。
-
用户态执行:用户空间指的是用户进程所处的地址空间。一个用户进程不能访问其他进程的用户空间。只有核心程序所启动的进程才能访问其他用户空间。当一个进程在用户空间执行时,称该进程在用户态执行。
-
系统态执行:系统核心空间指的是含有一切系统核心代码的地址空间,当进程处于具有执行系统核心代码的权力状态时,称该进程在系统态执行。
-
系统调用的过程:
1.保存系统调用号。
2.执行中断指令,陷入内核态。
3.根据系统调用号从系统调用表中找到系统调用实现历程的实现地址。
4.执行系统调用实现历程。
5.返回用户态。
-
系统调用的优点:
1.使编程更容易,用户不用具体了解相应硬件设备。
2.极大提高了系统安全性。
第三章 进程同步
1.进程同步的基本概念
-
在多道程序环境下,进程之间可能存在如下两种关系:
1)资源共享关系
2)相互合作关系
-
进程同步的任务如下:
1)对具有资源共享关系的进程,保证诸进程以互斥的方式访问临界资源。临街资源必须以互斥方式访问的共享资源。
2)对具有相互合作关系的进程,保证相互合作的诸进程协调执行。相互合作的进程可能同时存在资源共享的关系。
1. 临界资源
-
必须以互斥方式访问的共享资源叫做临界资源。
-
临界区是进程中访问临界资源的那段代码:
{ ... 进入区(entry section); 临界区(critical section); 退出区(exit section); }
进入区代码:检查进程是否可以进入临界区并对临界区”加锁“
退出区代码:在临界区代码后执行,完成释放临界区访问权的功能。
2.同步机制应遵循的准则
- 空闲让进:无程序处于临界区时,应允许一个请求进入临界区的进程立刻进入自己的临界区。
- 忙则等待:已有进程进入临界区时,表明临界资源正在被访问,因而试图进入临界区的进程必须等待。
- 有限等待:应保证在有限时间内能进入临界区,以免陷入无限等待。
- 让权等待:进程申请不到共享资源的访问权时,应立刻释放处理机,以免进程陷入“忙等”,浪费CPU资源。
2.信号量机制
2.1 整型信号量
-
整型信号量的wait和signal操作:
var s: integer; wait(s) { while s <= 0 do no-op;//整型信号量值小于或等于0时循环执行空操作 s= s - 1; } signal(s) { s = s + 1;//释放资源 }
注意:wait和signal操作都是原子操作,既在这两个操作中对信号量的访问不能被中断。
-
整型信号量实现进程的互斥:为必须互斥访问的临界资源CS定义一个互斥信号量mutex,初始值置1,后奖临界区代码CS放入wait(mutex)与signal(mutex)之间,当CS可访问时,wait(mutex)才能正常结束使得进程进入CS
-
整型信号量实现进程的协调:
例题:有\(p_{1}\)与 \(p_{2}\) 两个进程,要求\(p_{2}\)必须在\(p_{1}\)结束后执行,为此可设置一个信号量,初始值置0。
parbegin begin p1;signal(s);end begin wait(s);p2; end parend
可见只有p1执行完时,signal操作才会执行,p2才能执行。
-
原子操作可由关中断实现。
2.2 记录型信号量
-
记录型信号量的数据类型
Type semaphore = record Value:integer; //资源数量 L: list of process; //阻塞队列
-
记录型信号量的wait(s)与signal(s)操作:
procedure wait(s) var s: semaphore; begin s.value = s.value - 1; if s.value < 0 then block(s.L) //自我阻塞 end. procedure signal(s) begin s.value = s.value + 1; if s.value <= 0 then wakeup(s.L) //唤醒 end.
-
记录型信号量的机制的优点是不存在“忙等”,采取了“让权等待”的策略。
3. 经典同步问题
3.1 生产者-消费者问题
-
需要解决的问题:
1) 实现任意两个进程对缓冲池的互斥访问。
2) 实现生产者、消费者进程的协调。只有缓冲池有消息时消费者进程才能取,否则阻塞消费者进程。同时缓冲池有空闲缓冲区时生产者才能放消息,否则阻塞生产者进程。
-
信号量的设置:
设置\(mutex = 1\),用于实现公共缓冲区互斥访问。
设置\(empty = n\),表示缓冲池中的空缓冲区数。
设置\(full = 0\),表示装有消息的缓冲区数。
-
- 生产者进程同步代码描述:
Producer: begin repeat ... produce an item in nextp; wait(empty): wait(mutex): buffer(in) = nextp;//把生产的放到 in = (in + 1) % n; signal(mutex); signal(full); until false; end
- 消费者进程同步代码描述:
Consumer: begin repeat ... wait(full); wait(signal); nextc = buffer(out); out = (out + 1) % n; signal(mutex); signal(empty); consume item in nextc; until false; end
3.2 读者-写者问题
- 问题描述
D是多个进程共享的数据区,允许多个进程同时读D区,但仅允许一个进程写D区,且有进程写D区时不能有任何其他进程读或写D区。
-
信号量的设置
1) 全局变量:readcount,用于对进入共享区的读进程计数。
2) 互斥信号量:rmutex,用于实现对多个进程共享的全局变量readcount的互斥访问。
3) 互斥信号量wmutex,用于实现读/写互斥,写/写互斥。
-
同步程序:
1) 写进程同步代码:
writer: begin: wait(wmutex): ...... writing operation ...... signal(wmutex): end:
- 读进程同步代码描述:
reader: begin: wait(rmutex): if readcount = 0 then wait(wmutex); readcount++; signal(rmutex); ..... reading file; wait(rmutex): readcount--; if readcount= 0 then signal(wmutex); signal(rmutex); end;
4. 管程
4.1 管程的定义
- 管程是描述共享资源的数据结构和在数据结构上的共享资源管理程序的集合,其包括变量的定义、变量的初始化代码以及管理共享资源的过程。
- 管程是可供程序员调用的软件包。
- 每次只有一个进程调用管程执行,任意时刻管程中只能有一个活跃进程,若多个进程同时调用一个管程中的过程,则只有一个进程进入管程继续运行,其他进程被堵塞。
4.2 管程解决经典问题
- 利用管程解决生产者消费者问题。
- 利用管程解决哲学家进餐问题。
第四章 进程调度
什么时候会发生进程调度?
1) 进程阻塞。
2) 时间片用完。
3) 程序执行结束(正常/异常)。
4) 中断返回时刻。
5) 抢占式,高优先权进程。
1. 选择调度方式和算法的若干准则
1.1 周转时间短:
如果系统有n个作业,则系统的平均周转时间\(T\)等于\(n\)个作业的周转时间之和除以\(n\)
\(T = \frac{1}{n}(\sum_{i=1}^{n}T_{i})\)
作业的周转时间与系统为它提供的服务时间\(T_{s}\)之比\(W(W = \frac{T}{T_{s}})\)称为带权周转时间。\(n\)个作业的平均带权周转时间表达式如下:
\(W = \frac{1}{n}(\sum_{i=1}^{n}\frac{T_{i}}{T_{s}})\)
其中服务时间\(T_{s}\)是一个作业在CPU上执行的总时间。
1.2 响应时间快:
响应时间是用户从键盘提交一个请求开始到直到系统首次产生响应为止的一段时间。
1.3 截止时间的保证:
截止时间是指某个任务必须开始执行的最迟时间或者必须完成的最迟时间,截止时间是评定实时系统性能的重要指标。
1.4 系统吞吐量高:
吞吐量是指单位时间内完成的作业数。
1.5 处理机利用率高
设计进程调度算法应尽可能提高CPU利用率。
2. 调度算法
2.1 先来先服务调度算法(FCFS)
-
算法
在作业调度中,FCFS就是从后备作业队列中选择最先进入该队列的作业进行调度。在进程调度中,FCFS就是从就绪队列的队首选择最先到达队列的进程,为该进程分配CPU。
-
性能分析
FCFS适合长作业,不利于短作业。FCFS会使短作业的周转时间过长,系统的平均周转时间也比较长。
2.2 短作业(进程)优先调度算法
-
算法
短作业优先调度算法是从后备作业队列中选出估计运行时间最短的作业,将它们调入内存运行。
-
算法的优点
能有效缩短作业和进程的平均等待时间,提高系统的吞吐量。
-
算法的缺陷
1) 对长作业和长进程不利,若系统不断有短作业或进程到来,则长作业及长进程可能长时间得不到调度。
2) 不能保证紧迫作业和进程的及时处理。
3) 作业和进程的长短根据用户的估计而定,因此不一定真能做到短作业或短进程优先
2.3 优先权调度算法
-
算法
在使用优先权调度的系统中,每个进程都有一个与之关联的优先权。优先权通常是固定区间的数字。优先权可通过内部(可测量数据)或外部方式(政治因素)来定义。
-
算法的类型
1) 非抢占式优先权调度算法
在支持非抢占式调度的系统中,高优先权进程一旦得到处理机,该进程便一直运行下去,直到完成或者由于发生某事件而使得该进程主动放弃处理机。
2) 抢占式优先权调度算法
在支持抢占式调度的系统中,如果新到达进程的优先权高于当前正在运行进程的优先权,则系统会抢占CPU,将其分配给新到达的高优先权的进程,而正在执行的低优先权进程暂停执行。
-
优先权的类型
1) 静态优先权
静态优先权在创建时确定,在进程的整个运行期间保持不变。
2) 动态优先权
优先权随着进程的推进或随其等待时间的延长而改变。
-
算法存在的问题以及解决方案
1) 存在的问题
主要问题是无穷阻塞或称饥饿,会使得某一低优先权进程无穷等待CPU。
2) 解决方案
老化技术,逐渐增加在系统中等待时间很长的进程的优先权,使低优先权进程在等待时间很长的情况下优先权变高而获得CPU执行。
2.4 时间片轮转调度算法
-
算法
在早期的时间片轮转调度算法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时把CPU分配给队首进程,并令其执行一个时间片,当时间片用完时,调度程序终止当前进程的执行,并将其送到就绪队列的队尾。
-
需要的硬件与软件支持:
硬件:可编程中断控制器、可编程间隔控制器
软件: 时钟中断程序、中断描述符表、中断向量
-
时间片大小的确定
1) 若时间片过长,则多数进程可以在一个时间片内处理完成,能够缩短进程的周转时间,但是交互用户的响应时间会比较长。
2) 若时间片过短,则进程切换和进程调度的开销会增加,系统的平均周转时间也会变长。、
3) 因此,应根据用户和系统的需求为系统选择大小合适的时间片。通常考虑:系统对响应时间的要求、就绪队列中进程的数目、系统的处理能力。
2.5 多级队列调度算法
-
算法
把就绪队列分成多个独立队列,根据进程的某些属性,如内存大小、进程优先权或者进程类型,进程会被永久分配到一个队列。每个队列都有自己的调度算法
-
应用举例:Minix操作系统的进程调度
-
缺点:不够灵活、对于低优先权进程会存在无穷阻塞问题。
2.6 多级反馈调度算法
在采用多级反馈队列调度的系统中建立多个优先权不同的就绪队列,为每个队列赋予大小不同的时间片。有一种反馈策略规定:队列的优先权越高,时间片越短,时间片通常成倍增长。新进程进入内存后,先排入优先权最高的队列,仅当高优先权队列为空时,才调度优先权次之的队列。在同一个队列中,采用时间片轮转的方法,使用CPU过多的进程会被移到优先权较低的队列中,在较低优先权队列中等待时间过长的进程会被转移到优先权较高的队列中。
第六章 存储器管理
1.存储器的层次结构
存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。
寄存器 -> 芯片内的L1高速缓存 -> 芯片外的L2高速缓存 -> 主存储器 -> 本地二级存储 -> 远程二级存储
1.1 程序执行的局部性原理
- 程序在执行时,除了少部分转移和过程调用指令,大多数情况下都是顺序执行。
- 大多数情况下过程调用的深度不超过5
- 程序中包含许多循环结构,需多次执行。
- 程序中包括对数据结构的处理,它们往往都局限在很小的范围内。
总的来说,局部性原理表现为时间和空间局限性。
2. 程序的装入和链接
2.1 程序的装入
将一个用户的源程序变为一个可在内存中执行的程序,通常要经过编译、链接、装入等。
-
绝对装入方式
编译程序需预先知道程序在内存中的驻留位置,编译时产生绝对地址的目标代码。绝对装入程序按照装入模块的绝对地址将程序和数据装入内存。装入模块被装入内存后,不需要对程序的数据和地址进行修改。
-
可重定位装入方式(静态重定位)
编译时生成可重定位的代码,其中的地址都是相对地址,在程序被装入内存时再把这些相对地址映射为绝对地址。
可重定位装入方式具有以下两个特点:
1) 编译程序使得目标模块的起始地址从0开始
2) 程序装入时,装入程序根据内存的是使用情况将装入模块装入到内存的某个位置,并对模块进行重定位:
绝对地址 = 有效相对地址 + 程序在内存中的起始地址
-
动态运行时装入方式(动态重定位)
1) 进程在装入内存后,还可能从一个内存段移动到另一个内存段
2) 需要重定位寄存器的支持
3) 在程序访存的过程中再进行地址转换
2.2 程序的链接
链接要解决的问题:将编译后的目标模块装配成一个可执行程序
-
静态链接
在程序运行前,用链接程序将目标模块链接成一个完整的装入模块。
其任务为:
1) 对相对地址进行修改
2) 变换外部调用符号
优点:程序运行速度较快
缺点:存储开销较大、程序开发不够灵活,修改某一个模块会导致整个程序的重新链接。
-
动态链接
-
动态链接:
可将某些目标模块的链接推迟到执行时再进行。
特点: 1) 节省内存与外存空间。
2) 方便程序开发
3) 程序运行时速度变慢
3. 连续分配存储管理方式
3.1 单一连续分配
适合单用户单任务的OS,它把内存分为系统区和任务区,系统区仅供OS使用,用户区供用户使用。
3.2 固定分区分配
固定分区分配的用户分区数量是固定的,每个分区的大小也是固定的,其大小可以相等也可以不等。
-
分区大小相等。
缺点:内存利用率比较低。
-
分区大小不等。
struct {
int num;//分区编号
int length;//分区大小
int addr;//分区起始地址
int state;//是否空闲
}mem_block[4];
3.3 动态分区分配
-
空闲分区表
struct { int num;//分区编号 int length;//分区大小 int addr;//分区起始地址 }FreeMem_block[];
-
动态分区分配的算法
1) 首次适应算法
2) 循环首次适应算法
3) 最佳适应算法
4. 基本分页存储管理方式
离散分配内存分为以下三种方式:
1) 分页存储管理
2) 分段存储管理
3) 段页式存储管理
4.1 分页存储管理的基本方法
-
地址变换过程
1) 进程执行,PCB块中页表起始地址和页表长度送页表寄存器
2) CPU访问逻辑单元a
3) 由分页地址变换机构自动将a分为页号和页内偏移两个部分
4) 由硬件检索机构,得到物理块号。
5) 物理块号和页内偏移地址送物理地址寄存器,计算物理地址。
-
页面大小的选择
1)较小的页面使得页表较长,页表所需内存空间较大。
2)较小较多的页面会导致进程的缺页率高,页面换入、换出平凡。
4.2 快表
快表也叫转换后援缓冲(TLB),是为了提高CPU访存速度而采用的专用缓冲,用来存放最近被访问过的页表项。
TLB命中:一次访问TLB的时间+一次访问内存的时间
TLB未命中: 一次访问TLB的时间+2次访问内存的时间
在有些系统中允许TLB中的某些条目固定不变的(通常与操作系统内核代码相关)。
4.3 两级和多级页表
4.3.1 两级页表
使用两级页表的系统,地址映射过程:
- 对于给定的逻辑地址A,由硬件从中分离出外部页号P1,外层页内地址P2、页内地址d。
- 根据页表寄存器(外部页表起始地址)的值和外部页号P1,从存放页表的物理块中找到页表分页所在的物理块号。
- 根据页表分页所在的物理块号和外层页内地址P2,从存放页表分页的物理块中找到进程页面所在的物理块号。
- 由A所在的进程页面的物理块号*物理块大小+ 页内地址d得到A的物理地址。
页表分页所在物理块号在内存中的地址 = 外层页表的起始地址 + \(P_{1} \times\) 页表项长度
进程页面所在物理块号的在内存中的地址=页表分页的起始地址+ $P_{2} \times $ 页表项长度
页表分页的起始地址 = 页表分页所在的物理块号 \(\times\) 物理块大小
分段存储机制
在分段的存储管理方式中,进程的地址空间被分为若干短。每个段定义了一组逻辑信息,其大小不同,由相应的逻辑信息组的长度决定。
分段系统的逻辑变换:
S段表项起始地址 = 段表起始地址 \(\times\) 段表项长度
具体步骤:
1) 以段号S为索引,从段表中找到段号为S的段表项。
2) 从找到的段表项中读取S段的基地址和段大小(段界限)
3) 如果段内偏移d小于等于段大小,则将段基地址与段内偏移d相加,得到逻辑单元S:d相应的物理单元地址。
第七章 虚拟内存管理
1. LRU近似算法
1.1 附加引用位算法
为每个内存中的页面增加一个8位的字节,每隔一段时间操作系统把每个页面自己的访问位移到8位的附加引用位的最高位,将其他位右移,并抛弃最低位。当选择淘汰页时,可以选择附加引用位值最小的页面淘汰。
1.2 简单Clock算法
为每一页设置一个访问位,再将内存中所有页面通过链接指针形成一个循环队列。当某页被访问时,其访问位
置1.选择一页淘汰时,按FIFO算法检查各页访问位,若为0,就换出,若为1,则置零。
1.3 改进型Clock算法
在改进型Clock算法中,由访问位和修改位M组合成下面四种类型的页面:
第一类: A = 0, M = 0 最近未被访问未被修改,最佳淘汰页
第二类: A = 0, M= 1 未被访问,但被修改,并不是很好的淘汰页
第三类: A = 1, M = 0,最近被访问,但没被修改,可能再被访问。
第四类: A = 1, M = 1,最近被修改且再被访问,可能再被访问。
2. 抖动
2.1 抖动产生的原因
多道程序度太高,运行进程大部分时间都用于进行页面的换入换出,而几乎不能完成任何有效的工作。
2.2 抖动的预防
- 采用局部置换策略
- 引入工作集算法