预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共83页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第3章进程管理本章学习目标3.1引言3.2进程的引入和定义3.2.1进程的引入1.程序的顺序执行及其特性一切顺序执行的程序都具有下列特性:(1)顺序性。(2)资源独占。(3)结果的无关性。2.资源共享3.程序的并发执行及其特性图3.2并行计算的先后次序程序的制约方式有如下两种:(1)间接制约方式。这是由于竞争相同资源而引起的,得到资源的程序段可以投入运行,而得不到资源的程序段就是暂时等待,直至获得可用资源时再继续运行。(2)直接制约方式。这通常是在那些逻辑上相关的程序段之间发生的。一般是由于各种程序段要求共享信息引起的。3.2.2进程的定义3.3进程的状态和进程控制块3.3.1进程的状态及状态变化图图3.3典型的进程状态演变图状态变化:(1)就绪状态变化到运行状态。(2)运行状态变化到就绪状态。(3)运行状态变化到阻塞状态。(4)阻塞状态变化到就绪状态。3.3.2进程控制块进程控制块是进程存在的标志,当系统或父进程创建一个进程时,实际上就是为其建立一个进程控制块。进程控制块既能标识进程的存在,又能刻画出进程的动态特征,它是一个进程仅有的被系统真正感知的部分。对操作系统而言,所有进程控制块将构成并发执行控制和维护系统工作的依据。3.4进程控制3.4.1原语图3.5进程家族示例3.4.2进程控制原语3.5线程的基本概念3.5.1线程的引入3.5.2线程与进程的比较3.5.3用户级线程和内核支持线程3.6进程调度3.6.1进程调度的职能3.6.2进程调度算法2.轮转调度先来先服务的一个重要变形,就是轮转规则。轮转调度算法是系统把所有就绪进程按先后次序排队,处理机总是优先分配给就绪队列中的第一个就绪进程,并分配它一个固定的时间片(如100毫秒)。当该运行进程用完规定的时间片时,被迫释放处理机给下一个处于就绪队列中的第一个进程,分给这个进程相同的时间片,每个运行完时间片的进程,当未遇到任何阻塞时,就回到就绪队列的尾部,并等待下次转到它时再投入运行。于是,只要是处于就绪队列中的进程,按此种算法迟早总可以分得处理机投入运行。3.分级轮转法所谓分级轮转法就是将先前的一个就绪队列。根据进程的优先数不同划分两个或两个以上的就绪队列,并赋给每个队列不同的优先数。以两个就绪队列为例,一个具有较高优先数,另一个具有较低优先数,前者称为前台队列,后者称为后台队列。4.优先数法根据已占有处理机的进程是否可被剥夺而分为优先占有法和优先剥夺法两种。优先占有法的原理是:一旦某个最高优先数的就绪进程分得处理机之后,只要不是其自身的原因被阻塞(如要求I/O操作)而不能继续运行时,就一直运行下去,直至运行结束。优先剥夺法的原理是:当一个正在运行的进程即使其时间片未用完,无论什么时候,只要就绪队列中有一个比它的优先数高的进程,优先数高的进程就可以取代以前正在运行的进程,投入运行。确定进程的优先数通常应考虑如下几个因素:(1)进程类型。(2)运行时间。(3)作业的优先数。(4)动态优先数。3.6.3调度用的进程状态切换图3.7进程通信3.7.1临界资源和临界区3.7.2进程的通信方式之一——同步与互斥lock和unlock大部分同步方案均采用某个物理实体(如锁、信号灯等)实现通信,进程通信原语中关锁(lock)和开锁(unlock)是最简单的原语。在这两个原语中设置一个公共变量x代表某个临界资源的状态。如:x=0,表示资源可用,x=1,表示资源正在使用。关锁原语1ock(x):L:ifx=1thengotoLelsex:=1;开锁原语unlock(x):x:=0;图3.7开锁和关锁程序流程图3.7.3两个经典的同步/互斥问题1.生产者与消费者问题图3.8环形缓冲池下面给出基于环形缓冲区的生产者与消费者关系的形式描述,设:(1)公用信号量mutex:初值为1,用于实现临界区互斥。(2)生产者私用信号量empty:初值为n,指示空缓冲块数目。(3)消费者私用信号量full:初值为0,指示满缓冲块数目。(4)整型量i和j初值均为0,i指示首空缓冲块序号,j指示首满缓冲块序号。模块设计如下:Varmutex,empty,full:semaphore;i,j:integer;buffer:array[0…n一1]ofitem;Procedureproducer;生产者进程beginwhiletruedobeginproduceaproduct;P(empty);P(mutex);Buffer(i):=Product;i:=(i+1)modn;V(mutex);V(full)endend;procedureconsumer;消费者进程beginWhiletruedobeginP(full);P(mutex)goods:=buffer(j);j:=(j+1)modn;V(mutex);