操作系统复习
操作系统
第一章:操作系统引论
一、操作系统的目标和作用
1.操作系统的目标
特点:
- 方便性:用户的观点
- 有效性:系统管理人员的观点
- 可扩充性
- 开放性
2.操作系统的作用
计算机的资源包括处理机、存储器、I/O设备及数据和程序等
-
计算机系统资源的管理者
-
管理的内容:资源的当前状态(数量和使用情况)、资源的分配、回收和访问操作,相应管理策略(包括用户权限)
-
处理机管理
- 存储器管理
- I/O设备管理
- 文件管理
-
-
推动操作系统发展的动力
- 不断提高计算机资源利用率
- 方便用户
- 器件的不断更新换代
- 计算机体系结构的不断发展
- 不断提出新的应用需求
二、操作系统的发展过程
1.单道批处理系统
特征:
- 自动性
- 顺序性
- 单道性:容易忙闲不均
2.多道批处理系统
-
应用需求
- 人机交互
- 共享主机
- 便于用户上机
-
特征
- 多道性
- 无序性
- 调度性
- 宏观上并发、微观上串行
-
优缺点
- 优点
- 资源利用率高:CPU、内存和I/O设备利用率较高
- 系统吞吐量大:单位时间内完成的工作总量大
- 缺点
- 无交互能力:整个作业完成后或中间出错时,才与用户交互,不利于调试和修改
- 作业平均周转时间长:短作业的周转时间显著增长
- 优点
-
需要解决的问题
- 处理机管理(争用)问题(第3章)
- 内存管理(分配和保护)问题(第4章)
- I/O设备管理(分配)问题(第5章)
- 文件(组织和)管理问题(第6章)
- 作业管理问题(第3章)
- 用户与系统的接口问题
-
单道与多道的对比
单道 多道 内存使用 每次一个作业 每次多个作业(充分利用内存) 作业次序 顺序,先进先出 无确定次序 占用CPU 独占 交替占用 是否需要调度 不需要 需要
3.分时系统
-
概念
分时系统:指在一台计算机上连接了多个带有显示器和键盘的终端,同时允许多个用户共享主机中的资源,每个用户都可通过自己的终端以交互方式使用计算机
-
关键问题
- 及时接收(只需配置多路卡,同时接收各终端数据)
- 及时处理(在不长的时间能响应用户命令)
-
特征
- 多路性
- 独立性
- 及时性
- 交互性
4.实时系统
-
应用需求
- 实时控制
- 实时信息处理
-
与分时系统的比较
-
多路性
实时系统:表现为对多个对象的信息采集和控制。分时系统:为多个终端服务。
-
独立性
实时系统:表现为对多个对象的互不干扰(分别为温度、压力采集)。分时系统:每个用户独占主机。
-
及时性
实时系统:在规定的时间内对外部事件响应。分时系统:在一定时间处理各个终端用户作业。
-
交互性
实时系统:一般情况下无交互性。分时系统:由交互引入。
-
可靠性
实时系统:要求高度可靠。分时系统:可靠性低。
-
三、操作系统的基本特性
1.基本特征
-
并发
概念
- 并发:即宏观上在一段时间内有多道程序在同时运行;在微观上,这些程序是在交替执行的。
- 为使程序能并发执行,为每个程序建立进程。
- 进程:是能独立运行并作为资源分配的基本单位,是活动实体。
- 引入线程后,进程是分配资源的基本单位,线程作为独立运行的基本单位。
-
共享
-
概念
在操作系统环境下,所谓共享是指系统中的资源可供内存中多个并发执行的进程(线程)共同使用。
-
两种共享方式
-
互斥共享方式
概念
- 互斥共享方式:若果资源空闲,则分配使用;若果资源不空闲,则等待
- 临界资源(或独占资源):在一段时间内只允许一个进程访问的资源
- 计算机系统中的大多数物理设备,以及栈、变量和表格,都属于临界资源,它们要求被互斥地共享。
-
同时访问方式
这里所谓的“同时”往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问。典型的可供多个进程“同时”访问的资源是磁盘设备。
-
-
-
虚拟
-
同步
四、操作系统的主要功能
-
处理机管理功能
- 进程控制
- 进程同步
- 进程通信
- 调度
- 作业调度:从外存调入内存
- 进程调度:是从内存中的进程就绪队列中选一个分配处理机
-
存储器管理功能
管理目标:提高利用率、方便用户使用、提供足够的存储空间、方便进程并发运行。
-
内存分配
- 静态分配:每个作业的内存空间是在作业装入时确定的;在作业装入后的整个运行期间,不允许该作业再申请新的内存空间,也不允许作业在内存中“移动”
- 动态分配:每个作业所要求的基本内存空间,也是在装入时确定的,但允许作业在运行过程中,继续申请新的附加内存空间,以适应程序和数据的动态增涨,也允许作业在内存中“移动”。
- 为了实现内存分配,在内存分配的机制中应具有这样的结构和功能:
- 内存分配数据结构:该结构用于记录内存空间的使用情况,作为内存分配的依据
- 内存分配功能:系统按照一定的内存分配算法, 为用户程序分配内存空间
- 内存回收功能:系统对于用户不再需要的内存,通过用户的释放请求,去完成系统的回收功能。
-
内存保护
内存保护的主要任务,是确保每道用户程序都只在自己的内存空间内运行,彼此互不干扰
- 下界寄存器:存放程序装入内存后的开始地址(首址)
- 上界寄存器:存放程序装入内存后的末地址
- 判别式:下界寄存器 ≤ 物理地址 < 上界寄存器
-
地址映射
-
内存扩充
-
-
设备管理功能
-
缓冲管理
缓冲机制:
- 单缓冲机制
- 能实现双向同时传送数据的双缓冲机制
- 循环(环形)缓冲
- 能供多个设备同时使用的公用缓冲池机制
-
设备分配
-
设备处理
-
设备独立性和虚拟设备
-
-
文件管理功能
文件管理的主要任务:对用户文件和系统文件进行管理,以方便用户使用并保证文件安全
- 文件存储空间的管理
- 目录管理
- 文件的读/写管理和保护
-
用户接口
- 命令接口
- 联机用户接口
- 脱机用户接口
- 图形用户接口
- 程序接口
- 命令接口
第二章:进程管理
一、进程的基本概念
1.程序的执行方式
-
顺序执行
特征
- 顺序性
- 封闭性
- 可再现性
-
并发执行:引入并发执行的目的是为了提高资源利用率。
-
特征
- 间断性
- 失去封闭性
- 不可再现性
-
读集写集
-
读集:运算的读集R(Pi)是指在运算执行期间参考的所有变量的集合;
-
写集:运算的写集W(Pi)是指在运算执行期间要改变的所有变量的集合。
-
-
2.进程的特征与状态
-
进程实体
- 程序:进程要进行的操作。
- 数据段:包括操作的数据和程序自己的变量。
- 进程控制块PCB(Process Control Block):存放进程标识符、进程运行的当前状态、程序和数据的地址、程序运行时的CPU环境等。
-
进程的特征
- 动态性
- 并发性
- 独立性:进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的基本单位;
- 异步性:各进程按各自独立的、不可预知的速度向前推进;
- 结构特征:程序段、数据段和PCB;程序文件中通常也划分了代码段和数据段,进程的创建与撤消就是PCB的创建与撤消。
-
进程的定义
- 进程是程序的一次执行。
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
- 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
- 在引入了进程实体的概念后,我们可以把传统OS中的进程定义为:“进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位”。
-
进程与程序的区别
- 进程是动态的,程序是静态的:程序是有序代码的集合,它可以复制;进程是程序在数据集上的一次执行。
- 进程是暂时的,程序是永久的:进程是一个状态变化的过程,有它的撤销,程序可长久保存。
- 进程具有结构特征,由程序段、数据段和进程控制块三者组成,而程序仅是指令的有序集合,是进程的组成部分之一。
- 进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;
-
进程的三种状态
-
就绪状态:进程已获得除处理机外的所需资源,等待分配处理机资源;只要分配CPU就可执行。一个系统中多个处于就绪状态的进程排成就绪队列。
-
执行状态:处于就绪状态的进程一旦获得了处理机,就可以运行,进程状态也就处于执行状态。处于此状态的进程的数目小于等于CPU的数目。
-
阻塞状态:由于进程等待某种事件(如I/O操作或进程同步),在事件发生之前无法继续执行。该事件发生前即使把处理机分配给该进程,也无法运行。如:请求I/O操作,申请缓冲空间等通常阻塞进程也排成多少个队列?
-
进程状态的转换
-
新(创建)状态:当一个新进程刚刚建立,还未将其放入就绪队列时的状态,称为新(创建)状态。 当一个新进程刚刚建立,还未将其放入就绪队列时的状态,称为新(创建)状态。
-
终止状态:当一个进程已经正常结束或异常结束,操作系统已将其从系统队列中移出,但尚未撤消,这时称为终止状态。
-
-
进程控制块(PCB):PCB是进程存在的唯一标志。
-
进程控制块中的信息
- 进程控制块的作用:是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。
- 进程标识符:进程标识符用于惟一地标识一个进程
- 内部标识符:在所有的操作系统中,都为每一个进程赋予一个惟一的数字标识符,它通常是一个进程的序号。设置内部标识符主要是为了方便系统使用。
- 外部标识符:它由创建者提供,通常是由字母、数字组成,往往是由用户(进程)在访问该进程时使用。为了描述进程的家族关系,还应设置父进程标识及子进程标识。此外,还可设置用户标识,以指示拥有该进程的用户
-
处理机状态
- 通用寄存器
- 指令计数器PC
- 程序状态字PSW
- 用户栈指针
-
进程调度信息
- 进程状态
- 进程优先级:用于描述进程使用处理机的优先级别的一个整数,优先级高的进程应优先获得处理机
- 进程调度所需的其他信息
- 事件:指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因
-
进程控制信息
- 程序和数据的地址
- 进程同步和通信机制
- 资源清单
- 链接指针
-
-
进程控制块的组织方式
- 线性方式
- 链接方式
- 索引方式
3.补充内容
处理机的执行状态分系统态和用户态两种:
- 系统态(管态、核心态):有较高特权,能执行一切指令,访问所有寄存器和存储区。
- 用户态(目态):有较低特权,能执行规定指令,访问指定寄存器和存储区。
- 用户程序运行在用户态,不能执行OS指令及区域。
- OS内核运行在系统态,进程控制是由OS内核实现的。
二、 进程控制
三、进程同步
1.同步机制应遵循的规则
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待
2.信号量机制
利用信号量实现进程同步
- 信号量只有2种操作,赋初值和P、V操作
- P(mutex)和V(mutex)成对出现(有时可能距离远)
- 尽量先执行同步P,后执行互斥P
- 某些问题中,互斥问题存在,但不一定需要信号量解决(可能同步信号量已经解决了)
- 整型信号量:忙等
- 记录型信号量:增加进程链表L
- AND型信号量:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放
- 信号量集:一次申请多个资源
四、经典进程的同步问题
0.实现前驱图
Var a,b,c,d,e,f,g: semaphore:=0,0,0,0,0,0,0;
begin
parbegin
begin S1; V(a); V(b); end;
begin P(a); S2; V(c); V(d); end;
begin P(b); S3; V(e); end;
begin P(c); S4; V(f); end;
begin P(d); S5; V(g); end;
begin P(f); P(g); P(e); S6; end;
parend
end
1.生产者消费者问题
-
记录型信号量解决
Var mutex, empty, full:semaphore:=1,n,0; buffer:array[0, …, n-1] of item; in, out: integer:=0, 0; begin parbegin producer: {生产者进程} begin repeat … 生产一条消息=>nextp; … P(empty); {empty减1} P(mutex); buffer(in):=nextp; in:=(in+1)mod n;{移动生产指针} V(mutex); V(full); {full增1} until false; end consumer: {消费者进程} begin repeat P(full); P(mutex); nextc: =buffer(out); out:=(out+1) mod n; V(mutex); V(empty); 消费nextc中的一条消息; until false; end parend end
-
AND信号量解决
Var mutex, empty, full:semaphore:=1, n, 0; buffer:array[0, …, n-1] of item; in out:integer:=0, 0; begin parbegin producer: begin repeat … 生产一条消息=>nextp; … SP(empty, mutex); buffer(in):=nextp; in:=(in+1)mod n; SV(mutex, full); until false; end consumer: begin repeat SP(full, mutex); nextc:=buffer(out); out:=(out+1) mod n; SV(mutex, empty); 消费nextc中的一条消息; until false; end parend end
2.哲学家进餐问题
-
记录型信号量解决
Var chopstick: array[0, …, 4]of semaphore:=(1,1,1,1,1); count:semaphore:=4; begin repeat P(count); P(chopstick[i]); P(chopstick[(i+1) mod 5]); … eat; {进餐} … V(chopstick[i]); V(chopstick[(i+1) mod 5]); V(count); … think; {思考} until false; end
-
AND型信号量解决
Var chopstick array [0, …, 4] of semaphore:=(1,1,1,1,1); process i repeat SP(chopstick[(i+1) mod 5], chopstick[i]); eat; SV(chopstick[(i+1) mod 5], chopstick[i]); think; until false;
3.读者-写者问题
-
记录型号量解决
Var rmutex, wmutex:semaphore:=1,1; readcount:integer:=0; begin parbegin Reader:begin repeat P(rmutex); if readcount=0 then P(wmutex); readcount:=readcount+1; V(rmutex); … perform read operation; … P(rmutex); readcount:=readcount-1; if readcount=0 then V(wmutex); V(rmutex); until false; end writer:begin repeat P(wmutex); perform write operation; V(wmutex); until false; end parend end
-
信号量集解决
Var RN:integer; L, mx:semaphore:=RN,1; begin parbegin reader:begin repeat SP(L,1,1); SP(mx,1,0); … perform read operation; … SV(L,1); until false; end writer:begin repeat SP(mx,1,1; L,RN,0); perform write operation; SV(mx,1); until false; end parend end
五、管程机制
1.管程的基本概念
-
定义
一个管程定义了一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。
管程由三部分组成,管程还必须有一个名字- 局部于管程的共享变量说明
- 对该数据结构进行操作的一组过程
- 对局部于管程的数据设置初始值的语句
六、进程通信
七、线程
1.引入线程的目的
-
是为了实现程序的并发执行,改善系统资源的利用率,提高系统的处理能力和吞吐量。
-
将进程原有的两个角色分派给两种不同实体来实现:第一个角色仍由进程担当,即进程仍作为资源分配的独立单位,在运行中不必频繁切换;第二个角色由线程担当,即线程作为可独立调度的一个执行单位,它基本上不拥有或只拥有极少的资源。
2.进程的特征
- 进程是拥有自己资源的独立单位。
- 进程是可独立调度和分派在处理机上运行的基本单位。
3.线程与进程的区别和联系
- 线程是进程的一个组成部分,一个进程包括多个(至少一个)线程。
- 进程的多个线程都在进程的地址空间内活动。
- 资源分配对象是进程,系统为分给进程的资源规定了配额。
- 调度的基本单位是线程。进程“不干活”,通过线程工作。线程执行中所需资源,从进程的资源配额中扣除。(多线程共享进程资源)
- 在不同进程的线程间的同步用消息通信办法。通信是线程,用的消息队列是进程的资源。
第三章:处理机的调度与死锁
一、处理机调度的基本概念
1.三种调度方式
-
高级调度
又称为作业调度或长程调度(Long-Term Scheduling)将外存上处于后备队列上的作业调入内存,并创建进程、分配资源,安排在就绪队列上有时也称为接纳调度(Admission Scheduling)
-
中级调度(Intermediate-Level Scheduling)
- 中级调度又称中程调度(Medium-Term Scheduling)
- 引入中级调度的主要目的:是为了提高内存利用率和系统吞吐量,使那些暂时不能运行的进程不再占用宝贵的内存资源,而将它们调至外存上去等待,把此时的进程状态称为就绪驻外存状态或挂起状态。当这些进程重又具备运行条件、且内存又稍有空闲时,由中级调度来决定把外存上的哪些又具备运行条件的就绪进程,重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待进程调度
-
低级调度
- 概念:也称为进程调度或短程调度(Short-Term Scheduling),决定就绪队列中的哪个进程应获得处理机。
- 非抢占式(Non-preemptive Mode)(非剥夺方式)
- 概念:一旦将处理机分配给某进程,便让该进程一直执行,直至该进程完成或阻塞时再分配给其他进程
- 引起进程调度的因素有以下几种
- 正在执行的进程执行完毕,或因发生某事件而不能再继续执行
- 执行中的进程因提出I/O请求而暂停执行;
- 在进程通信或同步过程中执行了某种原语操作,如P操作(wait操作)、Block原语等
- 优点:简单,系统开销小
- 缺点:不适合时间要求严格的实时系统
- 抢占方式(Preemptive Mode)(剥夺方式)
- 概念:允许调度程序根据某种原则,暂停正在执行的进程,将处理机分配给其他进程
- 抢占式调度主要有以下原则
- 优先权原则:重要作业赋予高优先权,优先占用处理机
- 短作业(进程)优先原则:执行时间短的进程优先执行
- 时间片原则:时间片用完后停止执行,适用于分时系统
- 特点:它增加了进程调度的次数,增加了系统的开销,但保证了系统的实时性
-
三种比较
运行频率:低级调度>中级调度>高级调度
2.调度方式和调度算法
调度算法的准则
-
面向用户准则
-
周转时间短
平均周转时间:
作业的周转时间T与系统为它提供服务的时间TS之比,即W=T/TS ,称为带权周转时间,而平均带权周转时间则可表示为:
-
响应时间快
响应时间是指从用户通过键盘提交一个请求开始,直至屏幕上显示出处理结果为止的一段时间间隔。响应时间包括键盘输入请求信息传送到处理机的时间、处理机对请求的处理时间和响应信息送回到终端的时间
-
截止时间保证
截止时间是指某任务必须开始执行的最迟时间或必须完成的最迟时间。截止时间是实时系统中的重要指标
-
优先权原则
在批处理、实时和分时系统中都可以选择优先权准则,以便让紧急任务先处理。有时还选择抢占式调度方式
-
-
面向系统的原则
-
系统吞吐量高
吞吐量指单位时间内系统所完成的作业数
-
处理机利用率高
-
各类资源的平衡利用(性)
-
-
准则
- 公平性(处理机调度算法的共同目标)。各个进程获得合理的CPU时间,不会发生进程饥饿。
- 策略强制执行(处理机调度算法的共同目标)。对所指定的策略,例如安全策略,只要需要,就必须予以准确地执行,即使会造成某些工作的延迟
- 均衡性(分时系统的目标之一)。用户对响应时间的要求并非完全相同。所谓均衡性是指系统响应时间的快慢应与用户所请求服务的复杂性相适应。
- 可预测性(实时系统的目标之一)。实时系统中,可预测下一个需要处理的,提取读取或者处理。
二、调度算法
调度算法:是指根据系统的资源分配策略所规定的资源分配算法
一般的表头:作业名、进入磁盘时间、需要服务时间、装入主存时间、开始执行时间、结束执行时间、周转时间、带权周转时间
周转时间=结束执行时间-进入磁盘时间;带权周转时间=周转时间/服务时间
-
先来先服务(FCFS):
- 按照作业进入系统的先后次序进行调度,先进入系统者先调度;即启动等待时间最长的作业
- 是一种最简单的调度算法,即可用于作业调度,也可用于进程调度
- FCFS算法比较有利于长作业(进程),而不利于短作业(进程)
-
短作业优先算法(SJF):
- 短作业(进程)优先调度算法SJ(P)F,以要求运行时间长短进行调度,即启动要求运行时间最短的作业
- 可以分别用于作业调度和进程调度
- 短作业优先(SJF)的调度算法,是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行;而短进程优先(SPF)调度算法,则是从就绪队列中选出一估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时,再重新调度
-
高优先权优先调度算法
-
两种方式
-
非抢占式优先权算法
- 系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。
- 主要用于批处理系统中,也可用于某些对实时性要求不严的实时系统中。
-
抢占式优先权算法
能更好地满足紧迫作业的要求,故而常用于要求比较严格的实时系统中, 以及对性能要求较高的批处理和分时系统中
-
-
优先权类型
-
静态优先权
特点
- 系统简单易行
- 系统开销小
- 不够精确
- 一般用在要求不高的系统中
-
动态优先权
-
确定优先权的依据
- 进程类型
- 进程对资源的需求
- 用户需求
-
-
高响应比优先调度算法(HRF)
- 该算法是FCFS和SJF的结合,克服了两种算法的缺点
- 响应比最高的作业优先启动
- 由于等待时间与服务时间之和,就是系统对该作业的响应时间,故该优先权又相当于响应比RP。据此,又可表示为:优先权 = (等待要求时间+要求服务时间)/要求服务时间 = 响应时间/要求服务时间
- 解释:
- 如果作业的等待时间相同,则要求服务的时间愈短,其优先权愈高,因而该算法有利于短作业。
- 当要求服务的时间相同时,作业的优先权决定于其等待时间,等待时间愈长,其优先权愈高,因而它实现的是先来先服务。
- 对于长作业,作业的优先级可以随等待时间的增加而提高,当其等待时间足够长时,其优先级便可升到很高,从而也可获得处理机。
-
-
基于时间片的轮转调度算法
三、实时调度
1.实现实时调度的基本条件
-
提供必要的信息
- 就绪时间
- 开始截止时间
- 处理时间
- 资源要求
- 优先级
-
系统处理能力强
假定系统中有m个周期性的硬实时任务,它们的处理时间可表示为C**i,周期时间表示为P**i,则在单处理机情况下,必须满足下面的限制条件,系统才是可调度的。
-
采用抢占式调度机制
-
具有快速切换机制
2.实时调度算法的分类
-
根据实时任务性质的不同,可将实时调度算法分为:
硬实时调度算法、软实时调度算法
-
按调度方式的不同,可将实时调度算法分为:
非抢占调度算法、抢占调度算法 -
因调度程序调度时间的不同,可将实时调度算法分为:
静态调度算法、动态调度算法 -
在多处理机环境下,可将实时调度算法分为:
集中式调度算法、分布式调度算法
3.常用的几种实时调度算法
- 最早截止时间优先EDF(Earliest Deadline First)算法
- 根据任务的开始截止时间来确定任务的优先级,截止时间越早优先级越高
- 既可用于抢占式调度也可用于非抢占式调度方式
- 最低松弛度优先即LLF(Least Laxity First)算法
- 根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度愈高,为该任务所赋予的优先级就愈高, 以使之优先执行
- 该算法主要用于可抢占调度方式中
四、多处理机系统中的调度
五、产生死锁的原因和必要条件
1.产生死锁的原因
死锁的概念:是指多个进程因竞争资源而造成的一种僵局,若无外力的作用,这些进程将都不能再继续执行。
如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的。
竞争资源引起进程死锁:
- 可剥夺(可抢占)和非剥夺(不可抢占)性资源
- 竞争非剥夺(不可抢占)性资源
- 竞争临时性(可消耗)资源
2.产生死锁的必要条件
- 互斥条件
进程对所分配到的资源进行排它性的使用。临界(独占)资源,即一次只有一个进程可以使用资源。 - 请求和保持条件
进程已经至少保持了一个资源,但又提出了新的资源请求,而该资源又已被其他进程占有。 - 不剥夺(不可抢占)条件
进程已获得的资源在未使用完之前不能被剥夺。 - 环路等待条件
在发生死锁时,必然存在一个进程--资源的环形链。
3.处理死锁的基本方法
-
预防死锁。
通过设置限制条件,破坏产生死锁的必要条件的一个或几个。 -
避免死锁。
在分配资源时,用某种方法防止系统进入不安全的状态。
-
检测死锁。
确定与死锁有关的进程和资源,采取措施,清除死锁。 -
解除死锁。
与检测死锁配套的一种措施。
六、预防死锁的方法
1.预防死锁
原理:该方法是通过对资源分配的原则进行限制,从而使产生死锁的四个必要条件中的第2、3、4个条件之一不能成立,来预防产生死锁。
- 摒弃(破坏)“请求和保持”条件
- 所有进程在开始运行之前必须一次性(第一种协议)的申请整个运行过程所需的全部资源
- 优点:简单、易于实现、安全
- 缺点:资源浪费严重;进程延迟运行(使进程经常会发生饥饿现象)
- 摒弃(破坏)“不剥夺(不可抢占)”条件
- 系统规定:进程逐个地申请所需资源
- 当一个已经保持了某些资源的进程申请新资源而不能得到满足时,必须放弃所有已保持的资源
- 实现复杂、代价高昴(例如:打印机)
- 摒弃(破坏)“环路等待”条件
- 系统将所有资源按类型分配序号并排队(例如打印机为1、磁带机为2、磁盘为3、等等)。
- 所有进程申请资源必须按序号递增的顺序
- 对比前两种方法:资源利用率和系统吞吐量较高
- 缺点:
- 序号固定,限制了新设备类型的增加
- 资源浪费(不像前边那么严重,考虑进程使用资源顺序了)
- 限制用户自由编程(因限制了序号)
2.系统安全状态
所谓安全状态,是指系统能按某种进程顺序(P1, P2, …,Pn)(称〈P1, P2, …, Pn〉序列为安全序列),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
3.利用银行家算法避免死锁
银行家算法的设计思想是:当用户申请一组资源时,系统必须做出判断;如果把这些资源分出去,系统是否还处于安全状态。若是,就可以分出这些资源;否则,该申请暂不予满足。
-
银行家算法的数据结构
-
可利用资源向量Available
这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果Available[j]=K,则表示系统中现有Rj类资源K个
-
最大需求矩阵Max
这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K
-
分配矩阵Allocation
这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K
-
需求矩阵Need
这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。Need[i,j]=Max[i,j]-Allocation[i,j]
-
-
银行家算法
设Requesti是进程Pi的请求向量,如果Requesti(1,0,2),表示进程Pi需要1个R1类型的资源,需要0个R2类型的资源,需要2个R3类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:
- 如果Requesti≤Needi,便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值
- 如果Requesti≤Available,便转向步骤(3);否则,表示尚无足够资源,Pi须等待
- 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值;
Available:=Available-Requesti;
Allocationi:=Allocationi+Requesti;
Needi:=Needi-Requesti; - 系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待
-
安全性算法
-
设置两个向量初值;
- 工作向量Work;它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work:=Available;
- Finish[];它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]:=false;当有足够资源分配给进程时,再令Finish[i]:=true
-
(2)从进程集合中找到一个能满足下述条件的进程;
Finish[i]=false; Needi≤Work;若找到,执行步骤(3),否则,执行步骤(4)
-
当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行;
Work:=Work+Allocation; Finish[i]:=true; go to step 2;
-
如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态
-
七、死锁的检测与解除
-
检测
死锁定理:
- 在资源分配图中找出一个既不阻塞又非孤立的进程结点Pi。在顺利的情况下Pi可获得资源而继续运行,再释放所有资源。相当于消去Pi所有的请求边和分配边,使之成为孤立结点
- Pi释放资源后,便可使Pi+1获得资源而继续运行,直至Pi+1完成又释放出所占有资源
- 在进行一系列化简后若能消去图中所有的边,使所有进程结点成为孤立结点,则称该图是可完全简化的;否则是不可完全简化的
- 已经证明:所有的化简顺序都得到相同的不可简化图。同样可以证明,S为死锁的充分条件是:当且仅当S状态的资源分配图是不可完全简化的。该充分条件称为死锁定理
-
解除
第四章:存储器的管理
一、程序的装入和链接
1.程序的装入
- 源程序通常经过三步才能运行
- 编译:由编译程序将用户源代码编译成若干个目标模块。
- 链接:由链接程序将编译后形成的目标模块以及它们所需要的库函数,链接在一起,形成一个装入模块。
- 装入:由装入程序将装入模块装入主存的过程。
- 三种装入方式
- 绝对装入方式(Absolute Loading Mode)(适合“单道”)
- 可重定位装入方式(Relocation Loading Mode)(可用于“多道”)
- 把在装入时对目标程序中指令和数据的修改过程称为重定位,又因为地址变换通常是在装入时一次完成的,以后不再改变,故称为静态重定位。
- 静态重定位特点:简单、不能在内存中移动、要求连续。
- 动态运行时装入方式(Denamic Run-time Loading) (可用于“多道”)
- 可重定位方式不允许程序运行时在内存中移动位置
- 动态重定位特点:在内存中可移动
2.程序的链接
-
静态链接方式(Static Linking)
- 在程序运行前,先将各目标模块及所需的库函数链接成一个完整的装入模块,以后不再拆开
- 在将这几个目标模块装配成一个装入模块时,须解决以下两个问题
- 对相对地址进行修改
- 变换外部调用符号
-
装入时动态链接方式(Run-time Dynamic Linking)
这样不仅可加快程序的装入过程,而且可节省大量的内存空间
二、连续分配方式
1.单一连续分配
- 最简单的一种存储管理方式;只能用于单用户、单任务
- 采用这种存储管理方式时,可把内存分为系统区和用户区两部分,系统区仅提供给OS使用,通常是放在内存的低址部分;用户区是指除系统区以外的全部内存空间,提供给用户使用
- 一般情况下无存储器保护机构(早期有)
- 特点:简单易行,系统开销小;资源利用率低(一次只能装入一个作业)
2.固定分区分配
最简单的可运行多道程序的存储管理方式。将内存用户空间划分为若干个固定大小的区域,每个分区中只装入一道作业
- 划分分区的方法
- 分区大小相等:容易资源不够和浪费
- 分区大小不等:划分为多个大、中、小搭配的分区
- 内存分配:按分区使用表进行分配,依分区大小排序
- 管理特点
- 一个作业只能装入一个分区,不能装入两个或多个相邻的分区。一个分区只能装入一个作业,当分区大小不能满足作业的要求时,该作业暂时不能装入。
- 通过对“分区使用表”的改写,来实现主存的分配与回收。作业在执行时,不会改变存储区域,所以采用静态地址重定位方式。此方法易于实现,系统开销小。
- 当分区较大作业较小时,仍然浪费许多主存空间,很难避免内部碎片。并且分区总数固定,限制了并发执行的作业数目
3.动态分区分配
- 分区分配中的数据结构:空闲分区链:实现对空闲分区的分配和链接
- 分区分配算法
- 基于顺序搜索
- 首次适应算法(FF)
- 空闲分区链以地址递增顺序链接
- 分配时从链首开始查找,找到一个大小可满足的空闲分区,划出一块给请求者
- 可能会造成在低地址部分很多难以利用的小空闲分区
- 优点:分配算法简单;优先利用低址部分,保留了高址的大空闲区,为大作业装入提供条件。
- 缺点:每次从链首开始,增加了查找开销,并且留下许多难以利用的”碎片”(外碎片)
- 循环首次适应算法
- 该算法是由首次适应算法演变而成的
- 空闲分区链以地址递增顺序链接,链表为循环链表
- 每次分配时从上一次找到空闲分区的下一个空闲区开始
- 优点:使空闲分区分布均匀,减少查找空闲分区开销
- 缺点:会缺乏大的空闲分区
- 最佳适应算法
- 每次分配时,把能满足要求、又是最小的分区分配给作业
- 空闲分区链以大小递增顺序链接
- 从头开始,第一次找到满足要求的空闲分区,必然是最优的,避免了“大材小用”
- 宏观上看,会在存储器中留直许多难以利用的小分分区
- 特点:解决了大作业的分配问题;每次总是最小的,容易产生不可利用的空闲区(“小碎片”):收回主存时,要按分区大小递增顺序插入到空闲区表中。
- 最差(坏)适应算法
- 每次分配时,把能满足要求、又是最大的分区分配给作业
- 空闲分区链以大小递减顺序链接
- 可以保证不出现太小的“碎片”
- 特点:不会产生过多的碎片;影响大作业的分配;收回主存时,要按大小递减的顺序插入到空闲区表中。
- 首次适应算法(FF)
- 基于索引搜索
- 快速适应算法(分类搜索法)
- 按照分区大小设置多个空闲分区链,增加一个索引表,可以快速对应到一个空闲分区链上。
- 空闲分区链分类:常用的大小分类,如2KB,4KB,8KB
- 特点:分配速度快,不进行分区分割;存在一定的主存浪费;典型的以空间换时间的作法。
- 伙伴(buddy)系统
- 哈希算法
- 引入原因:上述的分类搜索法和伙伴系统中,都是把空闲分区进行分类,再查找这些分类的分区上会使时间性能下降。
- 原理:哈希算法就是利用哈希快速查找的优点,对索引表进行快速查找
- 快速适应算法(分类搜索法)
- 基于顺序搜索
4.可重定位分区分配(动态)
- 优点:可以消除碎片,能够分配更多的分区,有助于多道程序设计,提高内存的利用率。
- 缺点:紧凑花费了大量CPU时间;
5.对换(Swapping)
三、基本分页存储管理方式
- 程序的逻辑地址由页号和页内地址组成,页号的长度决定了分页的多少,页内地址的长度决定了页面的大小。
- 在为作业分配主存时,以块为单位将作业中的若干页分别装入多个可以不相邻接的块中。作业执行时根据逻辑地址中的页号找到它所在的块号,再确定当前指令要访问的主存的物理地址。
- 分页的概念:程序地址空间分成大小相等的页面,同时把内存也分成与页面大小相等的块,当一个用户程序装入内存时,以页面为单位进行分配。页面的大小是为2n,通常为1KB,2KB,nKB等。
1.页面与页表
-
页面和物理块
- 页面或页:是将一个进程的逻辑地址空间分成若干个大小相等的片。并为各页加以编号,从0开始,如第0页、第1页等。
- 物理块或页框(frame):也把内存空间分成与页面相同大小的若干个存储块。也同样为它们加以编号,如0#块、1#块等等
- 页表:分页系统中,将进程的每一页离散地存储在内存的任一物理块中,为每个进程建立一张页面映像表。
- 页表作用:是实现从页号到物理块号的地址映射
-
页面大小
-
页面若太小,一方面虽然可使内存碎片减小,从而减少了内存碎片的总空间,有利于提高内存利用率,但另一方面也会使每个进程占用较多的页面,从而导致进程的页表过长,占用大量内存;此外,还会降低页面换进换出的效率
-
如果选择的页面较大,虽然可以减少页表的长度,提高页面换进换出的速度,但却又会使页内碎片增大。因此,页面的大小应选择得适中,且页面大小应是2的幂,通常为1KB~8KB
-
地址结构:包括页号和页内便宜量
-
若给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d可按下式求得:
-
2.地址变换机构
- 基本地址变换机构
- 用于实现从逻辑地址到物理地址的转换,将逻辑地址中的页号转换为内存中的物理块号,通过页表来完成
- 页表大多驻留在内存中,在系统中设置页表寄存器PTR(Page–Table Register),在其中存放页表在内存中的始址和页表的长度
- 进程未执行时,页表的始址和页表长度存放在本进程的PCB中,当调度程序调度到某进程时,才将这两个数据装入页表寄存器
- 内存地址=物理块号×页大小+页内地址
- 具有块表的地址变换机构
- 由于页表是存放在内存中,因此每次CPU存取一个数据要两次访问内存即,查页表时要作一次访问内存的工作,然后是访问程序要求访问的内存,这样,存取速度降低一倍,将会影响整个系统的使用效率。
- 为提高地址变换速度,在地址变换机构中增设一个具有并行查寻能力的高速缓冲寄存器,又称为“联想寄存器”(Associative Memory)或“快表”,用以存放当前访问的那些页表项,价格贵。
3.两级和多级页表
四、基本分段存储管理方式
分页存储管理的主要目的是为了提高内存利用率;分段存储管理的主要目的是为了满足用户在编程和使用上的要求
分页和分段的主要区别
- 页是信息的物理单位,分页仅仅是由于系统管理的需要而不是用户的需要。
- 段则是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地满足用户的需要
- 页的大小固定且由系统决定(由机器硬件决定),一个系统只有一种大小的页面;而段的长度却不固定,决定于用户所编写的程序
- 分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址空间则是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址
- 相同:都是采用离散分配方式,且都要通过地址映射机构实现地址变换。
分段管理特点
- 段长可以根据需要动态增长。这样,便于对具有完整逻辑功能的信息段共享,便于实现程序的动态链接。
- 存在外碎片问题,若采用“紧凑”技术合并空闲区,会增加系统开销。
- 段的大小受主存可用空闲区大小的限制。
段页式管理特点
- 根据程序情况把程序分成若干段,再根据页面大小把每一段分成若干页,主存仍然分成与页大小相等的块。分配主存时,把程序的每一段的页分配到主存块中。
- 这种分配方式既照顾到了用户共享和使用方便的需求,又考虑到了主存的利用率,提高了系统的性能。
- 这种分配方式比分页管理的空间浪费要多。程序各段的最后一页都有可能浪费一部分空间。另外段表和页表占用空间,都比分页和分段多一些,这样就增加了硬件成本、系统的复杂性和开销。
五、虚拟存储器的基本概念
- 虚拟存储器的引入
- 常规处理器的特征
- 一次性
- 驻留性
- 虚拟存储器:指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。
- 常规处理器的特征
- 虚拟存储器的实现方法
- 虚拟存储器的特征
- 离散性
- 多次性
- 对换性
- 虚拟性
六、请求分页存储管理方式
请求分页存储管理方式的特点
- 优点:
- 不需要程序段和数据在内存中连续存放,便于有效利用内存;
- 提供了内外存统一管理的虚拟存储技术,扩大了内存空间。
- 缺点:
- 需要有相应的硬件支持,增加了成本;
- 缺页中断增加了系统开销;
- 请求调页的算法选择不当,可能产生抖动现象;
- 最后一页总有部分空间未被利用(页内碎片)。
七、页面置换算法
-
最佳(Optimal)置换算法
其所选择的被淘汰页面,将是以后永不使用的, 或许是在(未来)最长时间内不再被访问的页面;通常可保证获得最低的缺页率
写法:缺页次数:9次(算前3个);缺页率:9/20=45%
-
先进先出(FIFO)置换算法
- 实现:内存中页面按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。
- 特点:这种算法简单,实现容易;貌似公平,实际上不公平,不切实际,有些页面经常被访问,可能先被淘汰。
-
最近最久未使用(LRU(Least Recently Used))置换算法
硬件支持:寄存器和栈
-
CLOCK置换算法
- 简单的CLOCK算法
- 当采用简单的Clock算法时,只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列
- 当某页被访问时,其访问位被置1
- 置换算法在选择一页淘汰时,只需检查页的访问位
- 由于该算法是循环地检查各页面的访问情况,故称为Clock算法,又称为最近未用算法NRU(Not Recently Used)
- 改建的CLOCK算法
- 1类(A=0,M=0):表示该页最近既未被访问,又未被修改,是最佳淘汰页
- 2类(A=0,M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页
- 3类(A=1,M=0):最近已被访问,但未被修改,该页有可能再被访问
- 4类(A=1,M=1):最近已被访问且被修改,该页可能再被访问
- 简单的CLOCK算法
-
其它置换算法
- 最少使用(LFU:Least Frequently Used)置换算法
- 页面缓冲算法(PBA:Page Buffering Algorithm)
八、请求分段存储管理方式
第五章:设备管理
一、I/O系统
- I/O设备
- 按传输速率分
- 低速设备:每秒几个字节至数百字节;键盘、鼠标、语音输入输出设备等
- 中速设备:每秒数千至数万字节;行式打印机、激光打印机等
- 高速设备:每秒数百K至数十M字节;磁盘机、磁带机、光盘机等
- 按信息交换的单位
- 块设备
- 信息的存取总是以数据块为单位
- 基本特征是其传输速率较高,通常每秒钟为几兆位
- 可寻址,即对它可随机地读/写任一块
- 属于有结构设备
- 磁盘的I/O常采用DMA方式,每个盘块的大小为512B~4KB
- 字符设备
- 基本单位是字符
- 基本特征是其传输速率较低,通常每秒钟为几个字节到数千字节
- 不可寻址
- 属于无结构设备
- 通常采用中断驱动方式
- 例:交互式终端、打印机
- 块设备
- 按设备的共享性
- 独占设备
- 共享设备
- 虚拟设备
- 按操作特性分类
- 存储设备:例软盘、磁盘、光盘和磁带等
- I/O设备:如键盘、鼠标、显示器、打印机
- 按传输速率分
- 设备控制器
- 基本功能
- 接收和识别命令
- 数据交换
- 标识和报告设备的状态
- 地址识别
- 数据缓冲
- 差错控制
- 设备控制器
- I/O通道
- 是一种特殊处理机,专门负责输入/输出工作
- 有自己简单的指令系统,只有数据传送指令和设备控制指令
- 主要目的是为了建立独立的I/O操作,使有关对I/O操作的组织、管理及其结束处理也独立于CPU
- CPU向I/O通道发送I/O命令,由通道执行程序
- 通道与一般处理机的区别
- 指令类型单一,局限于与I/O操作有关命令。
- 没有独立的内存,通道与CPU共享内存。
- 基本功能
二、I/O控制方式
-
程序I/O方式(使用轮询的可编程I/O方式)
特点:由于CPU的速度远远高于I/O设备的速度,工作过程简单,CPU等待时间过多,利用率太低,有“忙—等待” 现象
-
中断驱动I/O方式(使用中断的可编程I/O方式)
特点
- 中断控制方式比程序直接控制方式提高了CPU的利用率。
- 每输入输出一个数据都发生中断,传输一次数据需要多次中断,浪费了CPU的处理时间。
- I/O以字节为单位
- CPU与I/O设备并行操作。
-
直接存储器访问方式(DMA)
特点
- 数据传输的基本单位是数据块(连续)
- 大大减少中断次数
- 所传送的数据是从设备直接送入内存的,或者相反
- 仅在传送一个或多个数据块的开始和结束时才需CPU干预,整块数据的传送是在DMA控制器控制下完成的。
- I/O数据传输速度快,CPU负担少。
- 在DMA方式下,数据的传送方向、存放数据的内存始址及传送数据的长度等都由CPU控制。每台设备需要配一个DMA控制器。
-
I/O通道控制方式
特点
- I/O通道是一种特殊的处理器,它具有执行I/O操作指令的能力。
- I/O通道通过执行通道(I/O)程序来控制I/O操作,完成I/O任务。
- 通道程序是放在内存中的,即通道与CPU共享内存。
- CPU、通道、I/O设备三者并行工作。
- 能传送多个数据块。
三、缓冲管理
四、设备分配
五、设备处理
六、磁盘存储器管理
第六章:文件管理
一、文件和文件系统
- 概念
- 数据项
- 基本数据项:用于描述一个对象的属性的字符集,是数据组织中可以命名的最小逻辑数据单位,即原子数据,又称为数据元素或字段
- 组合数据项:由若干个基本数据项组成,简称组项
- 记录:记录是一组相关数据项的集合,用于描述一个对象在某方面的属性
- 文件:文件是指由创建者所定义的、具有文件名的一组相关元素的集合
- 有结构文件:有结构文件由若干个相关记录组成
- 无结构文件: 无结构文件则被看成是一个字符流
- 文件属性:类型、长度。物理位置、建立时间
- 数据项
- 文件类型
- 按用途分类
- 系统文件
- 用户文件
- 库文件
- 按文件中数据的形式分类
- 源文件
- 目标文件
- 可执行文件
- 按存取控制属性分类
- 只读文件
- 只执行文件
- 读写文件
- 按组织形式和处理方式分类
- 普通文件
- 目录文件
- 特殊文件
- 按用途分类
二、文件的逻辑结构
三、外存分配(组织)方式
四、目录管理(文件目录)
-
文件控制块和索引结点
-
目录结构的组织
-
单级
- 优点
- 易于实现,管理简单
- 能实现按名存取
- 缺点
- 查找速度慢(顺序查找,N/2)
- 不允许重名(在多道程序设计下,很难保证)
- 不便于实现文件共享(所有用户必须用同一个名字共享一个文件)
- 只能适用于单用户环境
- 优点
-
两级
特点
- 提高了检索目录的速度(n+m,n*m)
- 在不同的用户目录中,可以使用相同的文件名。
- 不同用户还可使用不同的文件名来访问系统中的同一个共享文件
- 可实现对文件的保护和保密作用。
- 两级文件目录虽然解决了不同用户之间文件同名的问题,但同一用户的文件不能同名。
-
多级(树形)
特点
- 层次清楚
- 解决了用户文件重名问题
- 搜索速度快
-
-
目录查询技术
五、文件存储空间的管理
成组链表法
- 空闲盘块的组织
- 将空闲表和空闲链表结合形成的空闲盘块管理方法
- 空闲盘块号栈:用来存放当前可用的一组空闲盘块号以及栈中尚有的空闲盘块数N
- 文件区中的所有空闲盘块被分成若干个组,如100块/组
- 将每组含的有盘块数和该组所有盘块号记入前一组第一个盘块中
- 将第一组的空闲盘块数和所有盘块号记入空闲盘块号栈
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具