操作系统复习.docx
《操作系统复习.docx》由会员分享,可在线阅读,更多相关《操作系统复习.docx(87页珍藏版)》请在冰豆网上搜索。
操作系统复习
第一章
什么叫操作系统?
操作系统是计算机系统中的一个系统软件,管理和控制计算机系统中的硬件和软件资源,合理地组织计算机的工作流程,以便有效利用这些资源为用户提供一个功能强、使用方便的工作环境,从而在计算机与用户之间起到接口的作用。
第二章
1.进程的结构
?
组成(进程映像):
程序、数据集合、进程控制块PCB
?
PCB是进程存在的唯一标志。
创建进程时,创建PCB;进程结束时,系统将撤消其PCB。
2.PCB
?
进程标识信息:
进程的内部和外部标识符
?
处理机状态信息:
通用寄存器值、指令计数器值、程序状态字PSW值、用户栈指针值
?
进程调度信息:
进程状态、进程优先权、进程调度的其它信息
?
其它信息:
程序及数据地址、进程同步和通讯机制、资源清单、链接指针
PCB的组织方式之一--单一队列
所有进程的PCB通过链表组织成为一个单一队列。
适用于进程数目不多的系统。
如,Windows操作系统。
PCB的组织方式之二--表格结构
?
PCB按进程状态不同,组织成不同的表格:
就绪进程表、执行进程表(多机系统中)及阻塞进程表
?
系统分别记载各PCB表的起始地址
PCB的组织方式之三--多级队列
?
PCB按进程状态不同用链接指针组成不同队列:
就绪进程队列、阻塞进程队列(可按阻塞原因不同,分别组织)
?
系统分别记载各PCB链表的起始地址
3进程的五状态
执行状态;就绪状态;阻塞状态;新状态;终止状态
1)新状态:
进程已经创建,但未被OS接纳为可执行进程
2)就绪状态:
准备执行
3)执行状态:
占用处理机(单处理机环境中,某一时刻仅一个进程占用处理机)
4)阻塞状态:
等待某事件发生才能执行,如等待I/O完成等
5)终止状态:
因停止或取消,被OS从执行状态释放
①空新状态新创建的进程首先处于新状态。
②新状态就绪状态当系统允许增加就绪进程时,操作系统接纳新建状态进程,将它变为就绪状态,插入就绪队列中。
③就绪状态执行状态当处理机空闲时,将从就绪队列中选择一个进程执行,该选择过程称为进程调度,或将处理机分派给一个进程,该进程状态从就绪转变为执行。
④执行状态终止状态执行状态的进程执行完毕,或出现诸如访问地址越界、非法指令等错误,而被异常结束,则进程从执行状态转换为终止状态。
⑤执行状态就绪状态分时系统中,时间片用完,或优先级高的进程到来,将中断较低优先级进程的执行。
进程从执行状态转变为就绪状态,等待下一次调度。
⑥执行状态阻塞状态执行进程需要等待某事件发生。
通常,会因为进程需要的系统调用不能立即完成,如读文件、共享虚拟内存、等待I/O操作、等待另一进程与之通信等事件而阻塞。
⑦阻塞状态就绪状态当阻塞进程等待的事件发生,就转换为就绪状态。
进入就绪队列排队,等待被调度执行。
注:
?
某些系统允许父进程在任何情况下终止其子进程。
?
如果一个父进程被终止,其子孙进程都必须终止。
1)新状态终止
2)就绪状态终止
3)阻塞状态终止
4.进程的挂起状态
?
进程被交换到外存,状态变为挂起状态
?
进程挂起的原因
1)进程全部阻塞,处理机空闲。
2)系统负荷过重,内存空间紧张。
3)操作系统的需要。
操作系统可能需要挂起后台进程或一些服务进程,或者某些可能导致系统故障的进程。
4)终端用户的请求。
5)父进程的需求。
?
被挂起进程的特征
1)不能立即执行
2)可能是等待某事件发生,若是,则阻塞条件独立于挂起条件,即使阻塞事件发生,该进程也不能执行
3)使之挂起的进程为:
自身、其父进程、OS
4)只有挂起它的进程才能使之由挂起状态转换为其他状态
?
挂起与阻塞问题
1)是否只能挂起阻塞进程?
2)如何激活一个挂起进程?
?
挂起与阻塞
区分两个概念:
1)进程是否等待事件,阻塞与否
2)进程是否被换出内存,挂起与否
?
4种状态组合:
就绪:
进程在内存,准备执行
阻塞:
进程在内存,等待事件
就绪/挂起:
进程在外存,只要调入内存即可执行
阻塞/挂起:
进程在外存,等待事件
注:
处理机可调度执行的进程有两种:
新创建的进程或换入一个以前挂起的进程
通常为避免增加系统负载,系统会换入一个以前挂起的进程执行
?
具有挂起状态的进程状态转换
*
阻塞 阻塞/挂起:
OS通常将阻塞进程换出,以腾出内存空间
*
阻塞/挂起就绪/挂起:
当阻塞/挂起进程等待的事件发生时,可以将其转换为就绪/挂起
*
就绪/挂起 就绪:
OS需要调入一个进程执行
*
就绪就绪/挂起:
一般,OS挂起阻塞进程。
但有时也会挂起就绪进程,释放足够的内存空间
*
新 就绪/挂起(新 就绪):
新进程创建后,可以插入到就绪队列或就绪,挂起队列。
若无足够的内存分配给新进程,则需要新就绪/挂起
*
阻塞/挂起阻塞:
当阻塞/挂起队列中有一个进程的阻塞事件可能会很快发生,则可将一个阻塞/挂起进程换入内存,变为阻塞
*
执行就绪/挂起:
当执行进程的时间片用完时,会转换为就绪。
或,一个高优先级的阻塞/挂起进程正好变为非阻塞状态,OS可以将执行进程转换为就绪/挂起状态
*
所有状态终止:
通常,执行终止。
但某些OS中,父进程可以终止其子进程,使任何状态的进程都可转换为退出状态
5.执行模式:
两种执行模式
1)系统模式(又称为系统态)、控制模式或内核模式:
-具有较高的特权
-运行系统特定的指令,包括读/写控制寄存器的指令、基本I/O指令以及与存储器管理有关的指令,及一些特定的内存区
-内核模式下的处理机及其指令、寄存器和内存都受到完全控制和保护
2)用户模式(或用户态)
-具有较低的特权
-用户程序一般运行在用户模式
***模式切换
a.用户模式系统模式:
用户程序执行到一条系统调用,进入操作系统内核执行
b.系统模式用户模式:
执行完系统调用的功能,返回到用户程序
c.特殊情况:
程序执行到结束语句时,切换到系统模式,不再返回到用户程序
6.进程调度算法
?
?
?
先来先服务(FCFS)
1)该方法按照进程到达的先后顺序排队,每次调度队首的进程。
2)FCFS算法属于非剥夺调度方式,实现简单,看似公平。
3)但,对于那些后进入队列而运行时间较短的进程,或I/O型的进程而言,可能需要长时间等待。
!
!
假设:
就绪队列中从队首开始依次排列有四个进程P1,P2,P3和P4(假设它们同时到达就绪队列),它们的预计执行时间分别为16,12,4和3个单位时间。
若采用FCFS方法调度,试计算P1,P2,P3和P4的周转时间分别为多少?
平均周转时间是多少?
!
!
对短进程不公平。
!
!
由于长进程可能排在队列前面,必将增加队列后部进程的等待时间,从而将增加平均周转时间。
!
!
不利于I/O型进程,未有效利用系统资源。
!
!
一般地,FCFS与其他调度算法混合使用。
例如,系统可以按照不同的优先级维护多个就绪队列,每个队列内部按照FCFS算法调度。
!
!
FCFS算法同时适合于长程、中程和短程调度三种调度类型。
?
?
?
短进程优先
1)当需要调度进程(或作业)时,通过计算判断就绪进程队列中哪一个进程的预期执行时间最短,或后备作业队列中哪一个或几个作业的预期执行时间最短,就调度谁。
2)属于非剥夺调度算法。
当某进程获得处理机,直到其执行完成,或需要等待某事件而阻塞时,才自动释放处理机。
系统又调度新的进程(或作业)。
3)若采用短进程优先算法调度上例的4个进程,按照进程预期执行时间排序(升序)为P4,P3,P2,P1,试分别计算4个进程的周转时间和他们的平均周转时间。
4)与FCFS算法比较,短进程优先调度算法改善了系统的性能,降低了系统的平均等待时间,提高了系统的吞吐量。
但是,该算法也存在一些问题:
⑴很难准确预测进程的执行时间;
⑵可能导致长进程饥饿,这对长进程不公平;
⑶采用非剥夺调度方式,未考虑进程的紧迫程度,不适合于分时系统和事务处理系统。
?
?
?
时间片轮转调度法
1)例如:
在一个分时联机系统中,同时有n个人通过各自的终端共享一台主机(服务器)。
终端完成输入/输出操作,主机负责处理从终端发来的请求,为之建立进程、协调各进程的运行、调度各个进程等,并尽量满足每个终端用户对响应时间的要求。
2)在分时联机系统中,n个进程循环地获得时间片而执行。
从系统中来看它们是交替执行的,但就每个终端用户而言,都感觉到自己独占了一台主机,不受其他用户的影响。
这是通过进程并发执行实现的。
3)如果用户数太多,主机处理的进程将会急剧增加,进程排队等待的时间也会很长,进程的响应时间也可能增长,用户将明显感觉到主机的速度变慢而不满意。
4)另外,时间片的大小也会影响进程的响应时间。
***时间片的设置
a.进程切换将会增加系统的额外开销。
b.时间片设定得太短,进程切换会非常频繁,从而降低处理机的效率;时间片设定得太长,将无法满足交互式用户对响应时间的要求。
c.因此,时间片大小的确定应综合考虑系统的最大用户数、响应时间、系统效率等多种因素。
5)采用基于时间片轮转调度算法调度上例的4个进程,并分别按照两种时间片大小轮转调度(1个单位时间和4和单位时间),分析该算法的性能。
6)首先按照进程到达的先后顺序组织就绪队列,即P1,P2,P3,P4。
从队首开始调度,首先调度P1,执行一个时间片,强行中断P1,P1回到就绪队列队尾排队;切换到P2,执行一个时间片,强行中断P2,P2回到就绪队列队尾排队(排在P1之后)…
7)为了简单,图中忽略了进程切换时的系统开销,而实际操作系统中,这类额外开销是客观存在的。
8)可见,采用基于时间片轮转调度法,进程的周转时间和平均周转时间并不比采用FCFS和短进程优先调度算法小。
9)加上进程切换所需的系统开销时间,该算法的平均周转时间还会增长。
10)常用于分时系统及事务处理系统,合理的时间片大小将带来满意的响应时间。
11)通常,合理的时间片指,能让80%左右的进程在一个时间片内完成。
12)对于短的、计算型的进程较有利。
13)不适合于批处理系统的进程调度
14)不利于I/O型的进程。
15)改进的方法之一,可以将I/O阻塞事件完成的进程单独组织一个就绪队列,该队列进程的时间片可以设置的小一些,且优先调度。
?
?
?
基于优先级的调度算法
1)基于时间片轮转调度法循环式地为每个被调度的进程分配一个时间片,对每个进程都是公平的。
2)然而,实际应用中,进程的性质可能是不同的。
例如,一个与用户进行交互的前台进程急迫地需要对用户的输入作出响应,而一个后台打印进程的迫切性也许就不那么重要。
3)因此,可以为每个进程定义一个优先级,优先级越高的进程将优先获得处理机的调度。
***如何设定进程的优先级呢?
a.进程完成功能的重要性
b.进程完成功能的急迫性
c.为均衡系统资源的使用,指定进程(作业)优先级
d.进程对资源的占用程度例如,可以为短进程(或作业)赋予较高的优先级。
***静态与动态优先级
a.静态优先级:
一旦确定,则进程运行期间优先级一直不改变。
b.动态优先级:
#系统首先赋予进程一个初始优先级,该优先级将随着进程的运行而改变。
#典型的动态优先级变化方式为:
-优先级随着进程运行的剩余时间的减少而上升,使将要执行结束的进程尽快完成;
-或随着进程排队等待时间的增长而上升,使等待时间越长的进程优先得到调度,不至于长时间饥饿。
#具体实现方法,可以在每个时钟中断时,或需要进程切换时,重新计算就绪队列中各进程的优先级,并优先调度高优先级的进程。
#采用动态优先级的两种调度算法:
剩余时间最短者优先和响应比高者优先。
?
?
?
剩余时间最短者优先
1)为了使将要结束的进程尽早结束,释放系统资源,让别的进程执行。
可以在每个时钟中断时,根据就绪队列中各进的剩余执行时间动态调整其优先级,剩余时间最短的进程优先级最高。
2)显然,该算法是剥夺型的短进程优先调度算法,调度程序总是选择剩余执行时间最短的进程调度执行。
3)与短进程优先调度算法一样,该调度算法很难准确估计进程的剩余执行时间。
4)由于长进程在未执行时,或刚开始执行的一段时间内,其剩余执行时间都不会最短,所以该算法对长进程不公平。
5)但是,它不象FCFS算法偏袒长进程,也不象轮转调度算法会产生很多中断而增加系统负担。
6)由于短进程提前完成,故采用剩余时间最短者优先的调度算法获得的平均周转时间比采用短进程优先算法短。
?
?
?
响应比高者优先
1)将进程的等待时间和进程的预期执行时间纳入优先级的计算,进程(预期执行时间)越长优先级越低,而随着进程的等待时间增长优先级上升,即进程的优先级与等待时间成正比,与进程执行时间成反比。
令w表示等待时间,s表示预期执行时间,则响应比:
2)调度方法:
若当前执行进程执行完毕,或需要阻塞等待某事件而释放处理机,调度程序选择就绪队列中响应比最大的进程执行。
3)若等待时间相同,短进程因为s较小,R较大而优先调度。
若进程的预期执行时间相同,则等待时间长的进程优先调度,相当于FCFS。
4)随着等待时间的增加,长进程的响应比不断增大,在某个时刻,也必然被调度。
5)同短进程优先和剩余时间最短者优先调度算法一样,很难准确估计进程的预期执行时间。
6)每次调度之前都需要计算响应比,增加了系统开销。
?
?
?
反馈调度法
1)前面介绍的几种调度算法都存在各自不同的问题,尤其是短进程优先、剩余时间最短者优先以及响应比高者优先调度算法都需要估计进程的预期执行时间,如果估计不准确,将影响调度结果和系统性能。
2)如果根据进程执行历史,而非未来,进行调度,将解决这个问题。
3)反馈调度法就是一种根据进程执行历史调整调度方式的调度方法,它结合了优先级和时间片轮转调度思想。
4)该方法有利于交互型短进程或短批处理作业,因为它们一般只需要一个或很少的几个时间片即可完成,
5)但可能使长进程的周转时间急剧增加。
6)如果不断地有新进程到来,还可能出现长进程长期饥饿现象。
7)为此,可以为各队列设置不同的时间片,优先级愈低时间片愈长。
?
?
?
进程调度算法小结
1)如何选择进程调度算法与系统设计的目标有关。
2)交互式多任务系统,主要考虑联机用户对响应时间的要求,一般采用基于时间片轮转调度算法,同时,根据进程的性质设置不同的优先级;
3)批处理系统往往以作业的平均周转时间来衡量调度性能,常选用基于优先级的短进程(或作业)优先调度算法。
7.进程与线程的关系
1)传统操作系统中,一个进程可以创建一个线程,如MSDOS就是一个单用户、单进程、单线程的操作系统,UNIX是一个多用户、多进程、单线程的操作系统。
2)现代操作系统和软件设计大多支持多线程运行。
例如,Java虚拟机是一个单进程、多线程的运行环境,Windows系列操作系统和Linux操作系统都采用了多进程、多线程技术。
***进程与线程-调度
a.传统操作系统中,进程既是拥有资源的基本单位,又是独立调度的基本单位。
b.引入线程的操作系统中,线程是独立调度的基本单位,进程是资源拥有的基本单位,从而可以显著地提高系统的并发程度。
c.同一进程中的线程间切换不会引起进程切换,但当一个进程中的线程切换到另一进程中的线程时,将会引起进程切换。
***进程与线程-并发
a.进程之间可以并发执行
b.同属于一个进程的多个线程之间,亦可并发执行
c.因而使操作系统具有更好的并发性,从而能更有效地使用系统资源和提高系统吞吐量。
d.例如:
#在一个未引入线程的单处理机操作系统中,若仅设置一个文件服务进程,当它由于某种原因而被阻塞时,便没有其它的文件服务进程来提供服务。
#引入线程以后,可以在一个文件服务进程中设置多个服务线程,当第一个线程阻塞时,文件服务进程中的第二个线程可以继续运行;当第二个线程阻塞时,第三个线程可以继续执行,从而显著地提高了文件服务的质量和系统吞吐量。
***进程与线程-拥有资源
a.进程是拥有资源的独立单位,它有权申请系统的各类资源。
b.线程除了拥有很少的私有资源以外,不能申请系统资源,可以共享其所属进程的资源。
即,进程的代码段、数据段以及系统资源,如已打开的文件、I/O设备等,都可被其内的所有线程共享。
***进程与线程-系统开销
a.操作系统管理进程的开销显著地大于管理线程所需的开销。
b.进程切换的开销也远大于线程切换的开销。
c.由于同一进程中的多个线程具有相同的地址空间,使它们之间的同步和通信也比较容易。
d.有些类型的线程切换、同步和通信都无需操作系统内核的干预。
8.临界资源:
在一段时间内只允许一个进程使用的资源。
特征:
只允许诸多进程以互斥方式使用的一种共享资源。
临界区:
每个进程中访问临界资源的那段程序代码。
说明:
1)进程必须互斥地进入自己的临界区,才能对临界资源互斥地访问。
2)进入临界区之前检查临界资源是否正被访问:
若未被访问,则进入临界区,访问临界资源,并设置访问标志。
若正被访问,则进程被阻塞,等待访问临界资源。
3)退出临界区之前要清除访问标志。
9.互斥与同步的解决策略:
软件方法、硬件方法、信号量方法、管程方法以及消息传递方法
?
?
?
信息量方法
1)软件方法和硬件方法都存在“忙等”问题,浪费了处理机时间。
2)信号量方法能实现进程互斥与同步,而不必“忙等”
3)实例:
交通信号灯:
红灯停,绿灯行
***信号量实现互斥的基本原理
a.两个或多个进程可以通过传递信号进行合作,可以迫使进程在某个位置暂时停止执行(阻塞等待),直到它收到一个可以“向前推进”的信号(被唤醒)。
b.相应地,将实现信号灯作用的变量称为信号量,常定义为记录型变量s,其中一个域为整型,另一个域为队列,其元素为等待该信号量的阻塞进程(FIFO)。
***信号量定义
typesemaphore=record
count:
integer;
queue:
listofprocess
end;
vars:
semaphore;
***定义对信号量的两个原子操作
1)wait(s)和signal(s)
2)早期这两个原语被称作P(s)和V(s)
***wait(s)
s.count:
=s.count–1;
ifs.count<0
thenbegin
进程阻塞;
进程进入s.queue队列;
end;
***signal(s)
s.count:
=s.count+1;
ifs.count≤0
thenbegin
唤醒队首进程;
将进程从s.queue阻塞队列中移出;
end;
***Wait、signal的应用
a.进程进入临界区之前,首先执行wait(s)原语,若s.count<0,则进程调用阻塞原语,将自己阻塞,并插入到s.queue队列排队。
b.注意,阻塞进程不会占用处理机时间,不是“忙等”。
直到某个从临界区退出的进程执行signal(s)原语,唤醒它。
c.一旦其它某个进程执行了signal(s)原语中的s.count+1操作后,发现s.count≤0,即阻塞队列中还有被阻塞进程,则调用唤醒原语,把s.queue中第一个进程修改为就绪状态,送就绪队列,准备执行临界区代码。
***信号量的类型
1)信号量分为:
互斥信号量和资源信号量。
2)互斥信号量用于申请或释放资源的使用权,常初始化为1。
3)资源信号量用于申请或归还资源,可以初始化为大于1的正整数,表示系统中某类资源的可用个数。
4)wait操作用于申请资源(或使用权),进程执行wait原语时,可能会阻塞自己;
5)signal操作用于释放资源(或归还资源使用权),进程执行signal原语时,有责任唤醒一个阻塞进程。
***信号量的物理意义
1)s.count≥0表示还可执行wait(s)而不会阻塞的进程数(可用资源数)。
每执行一次wait(s)操作,就意味着请求分配一个单位的资源
2)当s.count<0时,表示已无资源可用,因此请求该资源的进程被阻塞。
此时,s.count的绝对值等于该信号量阻塞队列中的等待进程数。
执行一次signal操作,就意味着释放一个单位的资源。
若s.count<0,表示s.queue队列中还有被阻塞的进程,需要唤醒该队列中的第一个进程,将它转移到就绪队列中。
***s.count的取值范围
1)当仅有两个并发进程共享临界资源时,互斥信号量仅能取值0、1、-1。
其中,
-s.count=1,表示无进程进入临界区
-s.count=0,表示已有一个进程进入临界区
-s.count=-1,则表示已有一进程正在等待进入临界区
2)当用s来实现n个进程的互斥时,s.count的取值范围为1~-(n-1)
3)操作系统内核以系统调用形式提供wait和signal原语,应用程序通过该系统调用实现进程间的互斥。
4)工程实践证明,利用信号量方法实现进程互斥是高效的,一直被广泛采用。
***互斥和同步实例
1)两个进程共享某个缓冲区的互斥实现
-扩展到N个进程的互斥(理解实现的过程,和互斥变量的变化)
2)两个进程,P1生产、P2消费,两个进程是合作关系,实现同步(理解同步的条件,同步信号量的定义、信号量值的变化)
***同步和互斥问题解决方法总结
1)首先判断进程之间的关系是互斥还是同步
2)定义信号量(互斥是共享资源的个数;同步时进程之间相互传递的信号)
3)写出每个进程用Wait和signal,控制信号量的实现过程。
4)了解信号量的变化范围
10.生产者/消费者问题
1)生产者与消费者是一个广义的概念,可以代表一类具有相同属性的进程。
2)生产者和消费者进程共享一个大小固定的缓冲区,其中,一个或多个生产者生产数据,并将生产的数据存入缓冲区,并有一个消费者从缓冲区中取数据。
3)假设缓冲区的大小为n(存储单元的个数),它可以被生产者和消费者循环使用。
4)分别设置两个指针in和out,指向生产者将存放数据的存储单元和消费者将取数据的存储单元,如图
***不控制生产者/消费者
1)指针in和out初始化指向缓冲区的第一个存储单元。
2)生产者通过in指针向存储单元存放数据,一次存放一条数据,且in指针向后移一个位置。
3)消费者从缓冲区中逐条取走数据,一次取一条数据,相应的存储单元变为“空”。
每取走一条数据,out指针向后移一个存储单元位置。
4)试想,如果不控制生产者与消费者,将会产生什么结果?
***生产者/消费者必须互斥
1)生产者和消费者可能同时进入缓冲区,甚至可能同时读/写一个存储单元,将导致执行结果不确定。
2)这显然是不允许的。
必须使生产者和消费者互斥进入缓冲区。
即,某时刻只允许一个实体(生产者或消费者)访问缓冲区,生产者互斥消费者和其它任何生产者。
***生产者/消费者必须同步
生产者不能向满缓冲区写数据,消费者也不能在空缓冲区中取数据,即生产者与消费者必须同步。
***注意
1)进程应该先申请资源信号量,再申请互斥信号量,顺序不能颠倒。
2)对任何信号量的wait与signal操作必须配对。
同一进程中的多对wait与signal语句只能嵌套,不能交叉。
3)对同一个信号量的wait与signal可以不在同一个进程中。
4)wait与signal语句