第二章-进程-管理资料课件_第1页
第二章-进程-管理资料课件_第2页
第二章-进程-管理资料课件_第3页
第二章-进程-管理资料课件_第4页
第二章-进程-管理资料课件_第5页
已阅读5页,还剩218页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

现代OS的重要特性:程序的并发性和资源的共享性。现代OS是围绕进程和线程进行设计和构造的。OS必须交替执行多个进程,使处理器的利用率最大。OS必须按照特定的策略给进程分配资源,同时避免死锁。OS可以支持进程间的通信和用户创建进程。本章主要内容进程的概念进程的描述:PCB、状态、进程的控制:创建、撤消、阻塞、唤醒…进程调度:分配CPU给某一进程线程的引入:进程的低级通信:互斥、同步、P/V操作、管程进程的高级通信:消息传递死锁:多进程竞争有限资源1.程序的顺序执行程序的顺序执行:在任何时刻,机器只执行一个操作,只有在前一个操作执行完后,才能执行后继操作。[例]作业i的输入操作、计算操作和打印操作分别用Ii、Ci、Pi表示。则顺序执行过程为:2.1进程的引入及其概念I1I2I3P1C1P2P3C2C3程序顺序执行的特点:顺序性:在任何时刻,机器只执行一个操作,只有在前一个操作完成后,才进行下一个操作。封闭性:程序在运行时独占全机资源。因此,这些资源的状态只能由运行的这个程序决定和改变。不受外界因素影响。可再现性:程序执行时,只要初始条件相同,无论程序连续运行,或断断续续地运行,程序的执行结果与其执行速度无关,其最终结果不变。优点:由于顺序程序的封闭性和可再现性,为程序员调试程序带来了很大方便。缺点:由于资源的独占性,使得系统资源利用率非常低。2.程序的并发执行

程序的并发执行:是指若干个程序(或程序段)同时在系统中运行,这些程序(或程序段)的执行在时间上是重叠的,一个程序(或程序段)的执行尚未结束,另一个程序(或程序段)的执行已经开始。以资源的共享为条件提高了系统资源利用率、系统吞吐量。[例]在下面的有向无环图中,作业i的输入操作、计算操作和打印操作分别用Ii、Ci、Pi表示。虽然同一作业中的输入操作、计算操作和打印操作必须顺序执行,但对一批作业而言,情况就不同了。I1I2I3I4P1C1P2P3C2C3P4C4并发执行并发执行程序并发执行的特征:(1,2,3)(1)失去了程序的封闭性和可再现性

程序在并发执行时,多个程序共享系统中的各种资源,因而这些资源的状态将由多个程序来改变,致使程序的运行失去了封闭性;由于失去了封闭性,也将导致失去其可再现性。[例]有两个循环程序A和B,共享一个变量N。A每执行一次时都要做N=N+1;B每执行一次时都要做print(N),N=0。并以不同的速度运行。这样,可能出项下述三种情况(假设某时刻变量N的值为n)。N=N+1,print(N),N=0:N分别为n+1,n+1,0。Print(N),N=N+1,N=0:N分别为n,n+1,0。Print(N),N=0,N=N+1:N分别为n,0,1。其计算结果与并发程序的执行速度有关,从而失去了可再现性y=balance;if(y>=100)y=y-100;balance=y;x=balance;if(x>=100)x=x-100;balance=x;Balance=1000ATM1:ATM2:Balance=??银行自动取款机例(2)并行执行的程序间产生了相互制约关系

因共享资源或协调完成同一任务,使得并发程序之间发生了相互制约关系。[例]系统中并发执行的程序段A和B在运行过程中都希望使用打印机输出计算结果,若系统只有一台打印机,分得打印机的程序段(假设A得到)可以继续运行,而没有得到打印机的程序段B就不得不暂停,等到有可用打印机时才能继续执行。我们称这种制约关系为间接关系。(3)程序与CPU执行的活动之间不再一一对应程序:是完成某一特定功能的指令序列,是静态的概念;CPU执行的活动:是一个动态概念,它是程序的执行过程。[例]在分时系统中,多个用户都调用C编译对自己的源程序进行编译,实际系统只保留一个编译程序,多个用户通过共享执行它完成各自源程序的编译工作。这样,系统虽然只保留一个编译程序,但CPU现正在为多个用户执行编译。

由于并发程序的上述这些特点,使得系统中的活动以及各种活动之间的相互关系非常复杂。因此,“程序”这个静态的概念已不能如实地反映系统中的活动情况。为此,现代操作系统引入了进程的概念。3.进程的概念进程定义

一个具有一定独立功能的程序对某个数据集在处理机上的一次执行过程和分配资源的基本单位。进程这个概念是为了描述系统中各并发活动而引入的。

“进程”(process)这一术语,在60年代初期,首先在美国的麻省理工学院的MULTICS系统和IBM公司的CTSS/360系统中引入的。只是IBM/360使用了另一个术语——任务(task),但两者的实际含义是相同的。进程是程序的一次执行。进程是可以和其它计算并行执行的计算。进程是一个程序与其使用的数据在处理机上顺序执行时发生的活动。进程是程序在一个数据集合上的运行过程。进程是系统进行资源分配和调度的一个独立单位。进程是可以和其他程序并行执行的程序的一次执行OS设置进程是为了描述程序的动态执行过程.

进程的内涵2、进程的特征(5个)(1)动态性:进程是程序的一次执行,它是一个动态的概念,是临时的,有生命期的,表现在它由创建而产生,完成任务后被撤消。程序是完成某个特定功能的指令的有序序列,它是一个静态的概念。程序可以作为一种软件资源长期保存。进程是把程序作为它的运行实体,没有程序,也就没有进程。

我们把程序看成是一个菜谱,而进程则是按照菜谱进行烹调的过程。(2)并发性:多个进程实体,同存于内存中,能在一段时间内同时执行;程序是不能并发执行的。(3)独立性:进程是系统进行资源分配和调度的一个独立单位;程序则不是。

[例]以多用户进程共享一个编译程序为例,为多个用户执行编译时,显然CPU的分配是以进程为单位,而不是以程序为单位。因为主存只有一个编译程序,但几个用户的源程序都得到编译。(4)异步性:进程以各自独立的、不可预知的速度向前推进;或者说,进程按异步方式运行。正是这一特征,将导致程序执行的不可再现性。因此,在OS中必须采取措施来保证各程序之间能协调运行。

进程间可以相互作用。(5)结构特性:为了描述和记录进程的运行变化过程,并使之能正确运行,应为每个进程配置一个进程控制块。这样,从结构上看,每个进程是由程序段、数据段和进程控制块三部分组成。进程与程序的区别进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件,是静态和可以复制的。进程是暂时的,程序是永久的:进程是一个状态变化的过程,动态地被创建,执行后消亡;程序可长久保存。进程与程序的组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)。进程具有并发特征(独立性和异步性);而程序没有。进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。作业与进程的区别作业是用户向计算机提交任务的实体,被提交后进入外存的作业等待队列。而进程是完成用户任务的执行实体,被创建后,总有相应部分常驻内存;一个作业至少由一个进程来执行完成,反之不然;作业的概念主要用于批处理操作系统;而进程的概念几乎用于所有的多道系统中。4.OS的控制结构OS为了管理进程和资源,必须掌握关于每个进程和资源当前状态的信息。OS构造并维护它所管理的每个实体的信息表。共分四种不同类型的表。存储器----存储表I/O设备----I/O表文件----文件表进程----基本进程表存储表:用于跟踪主存储器和辅助(虚拟)存储器。保留在辅存中的进程使用某种类型的虚拟存储或简单的交换机制。I/O表:用于管理计算机系统中的I/O设备和通道。是否已分配给某个进程?文件表:提供关于文件是否存在、文件在辅存中的位置、当前状态和其它属性的信息。进程表:用于管理进程。在UNIX系统V里,进程控制块中的基本控制块占有进程表(proc[])中的一项。2.2进程的描述1.进程控制块PCB(ProcessControlBlock)OS在管理和控制进程时必须知道什么?它必须知道有哪些进程及他们的位置。它必须知道在管理时所必需的进程属性进程控制块:与每个进程相关联的所有OS用于控制进程的属性的集合。PCB是进程存在系统中的唯一标识。进程映像(进程实体):用户程序、用户数据、系统栈和进程控制块。

操作系统为了管理进程和资源,必须掌握关于每个进程和资源当前状态的信息进程映像(进程实体)--组成用户程序:将被执行的程序。用户数据:用户空间中的可修改部分。可以包括程序数据、用户栈区域和可修改的程序。系统栈:每个进程有一个或多个系统栈,用于保存参数、过程调用地址和系统调用地址。PCB:OS控制进程所需要的数据。进程空间任一进程都有自己的地址空间,称为进程空间,由用户空间和系统空间组成。用户程序在用户空间执行,只能执行普通指令,称处于用户态;操作系统内核在系统空间执行,可执行所有指令,称处于系统态(核心态、管理态)。PCB中的基本信息进程标识符:用于唯一地标识一个进程。

外部标识符:由创建者提供,通常是由字母、数字所组成,往往是由用户访问进程时使用,便于记忆。如计算进程、打印进程、发送进程、接收进程等。

内部标识符:OS为每一个进程赋予了一个唯一的整数,作为内部标识。父进程标识符、子进程标识符、用户标识符。

进程的状态:说明进程目前所处的状态,进程可能的状态在下一节描述。CPU现场保护区:当进程由于某种原因不能继续运行时,要将其CPU运行的现场信息保存起来,以便下次继续运行。通常,CPU的现场信息包括:程序计数器(PC)、工作寄存器、程序状态字等。CPU的调度信息:包括进程优先级、进程所在各种队列的指针。进程要执行的程序在主存和外存起始地址,及存取保护信息。进程使用的资源信息:包括分配给进程的I/O设备、正在执行的I/O请求信息、当前进程正打开的文件等。记帐信息:包括CPU占用量,实际所用时间量,帐号等。进程之间的家族关系:在进程的树型结构系统(如UNIX)中,进程之间存在着家族关系。创建进程的进程称为父进程,被创建进程称为子进程。进程的连接指针:将相同状态的进程连接在一起。PCB表系统把所有PCB组织在一起,并把它们放在内存的固定区域,就构成了PCB表PCB表的大小决定了系统中最多可同时存在的进程个数,称为系统的并发度可以根据进程的不同状态进行组织进程上下文进程上下文是对进程执行活动全过程的静态描述。进程上下文由进程的用户地址空间内容(正文段、数据集等)、硬件寄存器内容及与该进程相关的核心数据结构组成。

一个进程的执行是在该进程的上下文中执行的,当系统调度新进程占用处理机时,新老进程的上下文将进行切换。三种基本状态。进程执行时的间断性,决定了进程可能具有多种状态。(1)运行态(running):正在CPU上执行的进程所处状态为运行状态。单CPU系统只有一个进程处于运行状态;多CPU系统可能有多个进程处于执行状态。(2)阻塞态(blocked):又称等待态。当一个进程因等待某个条件发生而不能运行时处于阻塞态。处于阻塞态的进程在逻辑上是不能运行的,即使CPU空闲,它也不能占用CPU。2.进程的状态

(3)就绪态(ready):已分配到除CPU之外的所有必要的资源后,只要能再获得CPU,便可立即执行。多个处于就绪状态的进程排成一个或多个队列—--就绪队列。

这三种状态的相互转换如下图所示:运行态就绪态阻塞态时间片用完进程调度等待某个事件发生某个事件已经发生图2.2进程的状态及其转换就绪态--运行态:处于就绪态的某进程被进程调度程序的执行选中时。运行态--阻塞态:是由运行进程自己主动改变的。[例]一个正在运行的进程启动了某一外围设备后,等待该外围设备传输完成时,使自己由运行态变为阻塞态。阻塞态--就绪态:是由外界事件引起的。[例]上面所述的外围设备传输已经完成时,请求中断,由I/O中断处理程序把因等待这一I/O完成而阻塞的进程变为就绪态。由进程状态转换图可以看出:运行态--就绪态:处于运行态的进程被剥夺CPU时。[例]采用时间片轮转法调度时,当前运行进程用完分给它的时间片后,将由运行态变为就绪态;或采用优先级调度时,若有更高优先级的进程变为就绪态,当前进程被迫放弃CPU,使自己由运行态变为就绪态,之后转进程调度。由于系统、进程自身和外界的原因,可能使一个进程多次反复地经历三个基本状态的转换,才能最终达到完成而撤消。(4)创建态:刚刚建立,还未送入就绪队列的状态。刚创建,并为它分配资源。(5)终止状态:已正常结束或异常结束,但尚未撤消时。暂留在系统中,以便其它进程去收集该进程的有关信息。

创建态—就绪态:OS准备好再接纳一个进程时,把一个进程从新建状态转换到就绪状态。大多数系统基于现有的进程数或分配给现有进程的虚存数量设置一些限制,以确保不会因为活跃进程的数量过多而导致系统的性能下降。图2.3进程的五种状态创建态运行态阻塞态终止态进程调度被抢占事件完成等待事件进程完成就绪态Fork()接纳进程的七种状态将主存中某个进程的一部分或全部移到磁盘的挂起队列中

PCB是系统对进程进行统一管理的依据。一个系统可有几十个、几百个PCB。为了便于系统查找,目前常用的组织方式如下:(1)线性方式:3.进程队列图2-4PCB线性队列示意图

(2)链接方式:把具有相同状态的PCB,用其中的连接字,链接成一个队列。每一个队列有一个专用队列指针指出该队列中第一个进程PCB所在位置。这样就形成了就绪队列、阻塞队列。处于就绪态的进程可按照某种策略排成多个就绪队列。处于阻塞态的进程又可以根据阻塞的原因不同组织成多个阻塞队列。[例]等待磁盘I/O队列,等待磁带I/O队列等。图2-5PCB链接队列示意图(2)索引方式:系统根据进程的状态,建立几张索引表,并把索引表在内存的首地址记录于内存中一些专用单元。图2-6PCB索引结构示意图2.3进程的控制进程控制:指系统使用一些具有特定功能的程序段来创建、撤消进程以及完成进程各状态间转换。原语:是原子操作。一个操作中的所有动作,要么全做,要么全不做,不允许中断。不可分割的操作。用于进程控制的程序段。用于进程控制的原语有:创建原语;撤消原语;阻塞原语;唤醒原语等。

为了防止OS及关键数据如PCB等,受到破坏,通常处理机有两种执行状态:系统态:核心态(管态)。具有较高的特权,能执行一切指令,访问所有寄存器和存储区。用户态:目态,具有较低特权,只能执行规定的指令,访问指定的寄存器和存储区。用户程序:运行在用户态,不能去执行OS指令和访问OS区域。OS内核:运行在系统态。进程控制:是由OS内核实现的。(1)创建进程的时机用户登录:在分时系统中,用户在终端键入登录命令后,系统将为该终端用户建立一进程,并把它插入就绪队列。提供服务:当运行中的用户程序提出某种请求后,系统将专门创建一个进程来提供用户所需要的服务。[如]用户程序请求文件打印,OS将为之创建一个打印进程,打印进程和用户进程可并发执行。1.创建原语(UNIX系统用fork())作业调度:在批处理系统中,将作业装入内存时,为它分配必要的资源,系统并立即为它创建进程,再插入就绪队列。应用请求:基于应用进程的需要,由它自己创建一个新进程(子进程),可并发执行。

[如]某应用程序需要:从键盘读入数据(建立键盘输入进程)、处理数据、以表格形式在屏幕上显示结果(表格输出进程)。一旦OS发现了要求创建新进程的事件后,便调动进程创建原语,步骤如下:申请空白PCB,分配唯一的数字标识符。为新进程分配资源。为其程序和数据,以及用户栈分配必要的内存空间。初始化进程控制块。把调用者提供的参数:进程名、进程优先级、实体所在主存的起始地址、所需的资源清单、记帐信息及进程家族关系等填入PCB结构中。将新进程插入就绪队列。(2)进程的创建

入口查PCB链表有空PCB?PCB(I)入进程家族或进程链PCB(I)入就绪队列将有关参数填入PCB(I)相应项取空表PCB(I)返回创建失败无创建原语流程图有撤消:是指撤消进程存在的标志(PCB)。(1)进程终止的时机正常结束:进程运行完,将产生一个中断,通知OS进程已运行完毕。异常结束:进程运行期间,出现某些错误或故障,而迫使进程终止。故障中断。外界干预:操作员或OS干预。如发生死锁。父进程请求。父进程有权终止子进程。父进程终止。此时,OS将其子进程终止。2.撤消原语根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出其状态。若正处于执行状态,则终止。若有子孙进程,也须终止,以防成为不可控的。将其全部资源或归还其父进程或归还系统。将其PCB从所在队列中移出,等待其它程序来搜集信息。(2)进程终止的过程

入口返回查进程链表或进程家族有此PCB吗?该PCB有子进程吗?释放该进程所占有的资源释放该PCB结构本身出错处理有无有无(1)引起进程的阻塞和唤醒的事件请求系统服务,暂得不到满足。[例]一进程请求打印机,无,被阻塞,由释放打印机者将其唤醒。启动某种操作。[例]进程启动某I/O操作。新数据尚未到达。相互合作的进程,一个须等待另一个提供的数据后才能运行。无新工作可做。[例]发送进程,无新的发送请求时,边将自己阻塞起来。3.进程的阻塞和唤醒无法运行的进程自己调用阻塞原语阻塞自己。中断CPU.将其运行现场保存在其PCB的CPU现场保护区。置状态为阻塞态。插入相应事件的等待队列(阻塞队列)中。转进程调度。(2)阻塞过程被阻塞进程所期待的事件出现了,则由有关进程调用唤醒原语将其唤醒。把被阻塞进程从阻塞队列中移出。将其PCB的现行状态改为就绪状态。插入就绪队列中。(4)阻塞原语和唤醒原语是一对作用刚好相反的原语。若在某进程中调用了阻塞原语,则须在另一相关进程调用唤醒原语,否则,被阻塞进程会长久地处于阻塞状态,无机会运行。(3)唤醒过程入口入口保存当前进程的CPU现场从等待队列中摘下被唤醒进程置该进程的状态被阻塞进程入等待队列转进程调度将被唤醒进程置为就绪状态将被唤醒进程送入就绪队列转进程调度返回阻塞原语唤醒原语挂起状态的引入用户的需要:用户在自己的程序运行期间,发现有问题时,希望暂时使自己的进程静止下来。把这种静止状态称为挂起状态。

执行状态——暂停执行;就绪状态--暂不接受调度。父进程的需要:考查和修改子进程或协调子进程间的活动时。交换的需要:内存不够,从内存换至外存。负荷调整的需要:实时系统工作负荷较重。4.挂起和解挂(激活)(2)进程的挂起过程运行态——静止就绪活动就绪——静止就绪活动阻塞——静止阻塞(3)解挂(激活)过程发生激活进程的事件,系统调用激活原语将指定的进程激活。静止就绪——活动就绪静止阻塞——活动阻塞若在外存处于静止就绪,则从外存调入内存,活动就绪。2.4进程调度用户进程数往往超过处理机数。操作系统还要建立若干个系统进程。进程调度程序完成分配处理机的任务。将处理机动态地分配给系统中的各个就绪进程,使之执行。多级调度:一个作业从提交到执行,通常都要经过多级调度,如作业调度、进程调度和交换调度等。系统运行性能:在很大程度上取决于调度。如吞吐量大小、周转时间长短、响应及时性。作业调度:又称宏观调度或高级调度。把外存上处于后备队列中的作业调入内存,并为之创建进程、分配必要的资源,然后再将新创建的进程排在就绪队列上,准备执行。用于批处理系统。在分时和实时系统,通常无须作业调度。进程调度:又成微观调度或低级调度。按照某种策略和方法选取一个处于就绪状态的进程,将处理机分配给它。运行频率很高,一般几十毫秒要运行一次。交换调度:又称中级调度。按照某种策略,将处于外存交换区中的重又具备运行条件的就绪进程调入内存,或将处于内存就绪状态或内存阻塞状态的进程交换到外存交换区。它主要涉及内存管理与扩充。进程调度:就是系统按照某种算法把CPU分配给某一就绪进程。进程调度程序:完成进程调度工作的程序。(1)记录系统中各进程的执行状况

管理系统中各进程的进程控制块,将进程的状态变化及资源需求情况及时地记录到PCB中。

进程调度程序就是通过PCB变化来准确地掌握系统中所有进程的执行情况和状态特征的。当需要时,从就绪队列中选出一个进程占有CPU。1.进程调度的功能(2)选择进程真正占有CPU按照系统规定的调度策略从就绪队列中选择一个进程占有CPU执行。进程调度依据的算法是与系统的设计目标相一致。对于批处理系统常采用短作业的进程优先,以减少各作业的周转时间。对于分时系统,更多地采用时间片轮转。(3)进行进程上下文的切换当进程调度选中一个进程占有CPU时,进程调度程序要做的主要工作则是进行进程上下文切换:将正在执行进程的上下文保留在该进程的PCB中,以便以后该进程恢复执行。将刚选中进程的运行现场恢复起来,并将CPU的控制权交给被选中进程,使其执行。(1)进程调度方式①非抢先方式(Nonpreemptivemode)一旦把CPU分配给某一进程后,便让它一直运行下去,直到进程完成或发生某事件而不能运行时,才将CPU分给其它进程。该方式通常用在批处理系统中。主要优点是简单、系统开销小。2.进程调度的方式和调度时机②抢先方式(Preemptivemode)允许调度程序基于某种策略(优先级策略、时间片策略等)剥夺现行进程的CPU给其它进程。该方式通常用在分时系统和实时系统中,以便及时响应各进程的请求。

是指什么情况下引起进程调度程序工作。(1)现行进程完成或错误终止;(2)现行进程提出I/O请求,等待I/O完成时,转进程调度;(3)在分时系统,按照时间片轮转,分给进程的时间片用完时;(4)优先级调度时,有更高优先级进程变为就绪时;(5)在进程通讯中,执行中的进程执行了某种原语操作,如P操作、阻塞原语和唤醒原语时,都可能引起进程调度。(2)进程调度的时机3.进程调度算法

所采用的进程调度算法是与整个系统的设计目标相一致的。在批处理系统中,系统的设计目标是增加系统吞吐量和提高系统资源的利用率;分时系统则保证每个分时用户能容忍的响应时间。因此,进程调度通常采用如下一些算法。(1)优先级调度法当发生进程调度时,将CPU分配给就绪队列中优先级最高的进程。静态优先级:在进程创建时确定的,运行时保持不变。通常赋予系统进程较高优先级;申请资源量少的赋予较高优先级。优点是简单。动态优先级:原优先级可随进程的推进而改变,以便获得更好的调度性能。通常根据进程占用CPU时间的长短或等待CPU时间的长短动态调整。(如,UNIX系统进程优先级正是采用这种方法实现的。占用CPU时间长的优先级低。)

(2)轮转法(RoundRobin)通常用在分时系统,它轮流地调度系统中所有就绪进程。实现:利用一个定时时钟,使之定时地发出中断。时钟中断处理程序在设置新的时钟常量后,即转入进程调度程序,选择一个新的进程占用CPU。时间片长短的确定原则:既要保证系统各个用户进程及时地得到响应,又不要由于时间片太短而增加调度的开销,降低系统的效率。(3)前后台法用在批处理和分时相结合的系统中。将分时用户作业放在前台,把批处理作业放在后台。系统对前台作业按照时间片轮转法进行调度,仅当前台无作业时,才把处理机分配给后台作业的进程。后台进程通常按先来先服务方式运行。这样既能使分时用户进程得到及时响应,又提高了系统资源的利用率。(4)多级反馈队列轮转法就绪进程的种类:刚刚被创建的进程等待进程调度;已经被调度执行过,但还没有执行完,等待下一次调度;正在执行的进程还未用完时间片,因请求I/O,等待I/O完成被迫放弃CPU,当等待原因解除后,进入就绪队列等待运行。系统通常设置多个就绪队列,且进程在其生命期内可能在多队列中存在。就绪队列1就绪队列2就绪队列3就绪队列ns1s2s3sn至CPU至CPU至CPU至CPU(时间片:s1<s2<s3)各个队列赋予不同的优先权,第一个队列的优先权最高,其余队列的优先权逐个降低。各个队列中进程执行时间片的大小也不相同。刚创建的进程和因请求I/O未用完时间片的进程排在最高优先级队列,在这个队列中运行2~3个时间片未完成的进程排到下一个较低优先级队列。调度时,总是先调度优先级高的队列。仅当该队列空时,才调度次高优先级队列,以此类推,第n个队列进程被调度时,必须是前n-1个队列为空。既能使分时用户作业得到满意的响应时间,又能使批处理用户的作业获得较合理的周转时间。

(5)时钟驱动法:系统使用一个硬件定时器,这个定时器被周期性地进行设置,时间到期后,系统启动要执行的任务。(用在实时系统中)(6)加权轮转法:每次轮转时,各个进程获得处理机的时间就是它具有的权值长度。(用在高速开关网的实时控制中)(1)线程的概念引入进程的目的:为了使多个程序并发执行,以改善资源利用率及提高系统吞吐量。进程的两个基本属性:进程是一个可拥有资源的独立单位;进程同时又是一个可以独立调度和分派的基本单位。进程数目不宜过多,进程切换的频率也不宜过高。进程是一个资源拥有者,因而在进程的创建、撤消和切换中,系统必须为了付出较大的时空开销。因而限制了并发程度的进一步提高。2.5线程的引入(thread)线程的引入,则是减少程序并发执行时系统付出的时空开销,使操作系统更加有效。试图提高系统内程序并发执行程度和提高系统吞吐量线程是80年代引入的。MS-DOS是一种支持单用户进程和单线程的OS;UNIX支持多用户进程,但只支持每个进程一个线程;支持多线程的多进程的包括Windows2000、Solaris、Linux、AIX、OS/2等。每个进程由若干代码和数据块组成,此外它还拥有文件、主存以及至少一个线程。进程被创建时,系统同时为进程创建第一个线程。进程中的其它线程是通过调用线程创建原语显式创建;一线程可创建和撤消另一线程。将进程的两个属性分开。即让进程只作为资源的容器,而让线程作为系统的调度单位。线程是进程中的一个执行单位。同一进程中的各个线程分别有一组CPU指令、一组CPU寄存器和一个堆栈。它们共享进程的主存和文件。这些线程被操作系统调度执行。进程在逻辑上表示操作系统必须做的一个作业,线程表示完成该作业的许多可能的子任务。线程是进程中的一个可执行实体,是被操作系统独立调度和分派的一个独立单位。一个进程内的多线程共享该进程的全部资源,如代码段、数据段以及系统资源(已打开文件、I/O设备等)。线程自己拥有很少资源单线程进程模式:进程控制块用户地址空间用户栈核心栈多线程进程模式:进程控制块用户地址空间线程控制块用户栈核心栈线程控制块用户栈核心栈线程控制块用户栈核心栈线程线程线程一个进程内的多线程共享该进程的所有资源同一线程组中的线程共享它们的全局变量,并有相同的堆,因此使用malloc给线程组中的一个线程分配的内存可以被该线程组中的其他线程读写。但拥有不同的堆栈。一个线程一般由如下部分组成:有一个唯一的标识符;有一组表示处理机状态的寄存器;有两个堆栈,分别用于用户态执行和核心态执行;有一个独立的程序计数器。由于线程拥有较少的资源,又具有传统进程的许多特性,因此有的把线程叫做轻型进程。浏览器:一个线程显示图像和文本;另一个线程则从网络接收数据。Word进程:一个线程显示文件;另一个线程在读用户输入(击键);第三个线程在执行拼写和语法检查。Web服务器:为了满足多个并发的客户访问请求,在一个进程里需要多个线程来为多个客户服务。RPC(remoteprocedurecall):通过提供类似于函数或过程调用的通讯机制允许进程间通讯。服务器进程通过分离的线程来为多个并发消息(message)服务。例子从拥有的资源、调度、并发性和安全性诸方面进行的比较:(1)拥有的资源

进程是拥有资源的一个独立单位。线程自己不拥有系统资源(只有一点必不可少的资源),可以访问其隶属进程的资源。2、线程与进程的比较在引入线程的OS中,把线程作为调度和分派的基本单位。进程调度:系统要进行进程上下文的切换,需要系统大量的开销;线程调度:由于同一进程内的线程共享进程的资源,其切换是把线程仅有的一小部分资源变换即可,从而提高了系统的效率。线程切换比进程切换快得多。从一个进程的线程向另一个进程的线程切换:将引起进程上下文的切换。(2)调度引入线程后,使得系统的并发执行程度更高。进程之间可以并发执行,同一进程内的多线程也可并发执行。[例]在引入了线程的操作系统中,可以在一个文件服务进程中,设置多个服务线程,当第一个线程等待时,第二个线程可以继续运行;当第二个线程受阻塞时,第三个线程可以继续执行,从而显著地提高了文件服务的质量以及系统吞吐量。(4)安全性同一进程的多线程共享进程的所有资源,一个线程可以改变另一个线程的数据,而多进程实现则不会产生这个问题。(3)并发性进程与线程的关系系统进程和用户进程在进行切换时都要依赖于内核中的进程调度。核心级线程:在内核中保留了一张线程控制块表,内核根据该控制块而感知该线程的存在并对线程进行控制。所有线程的创建、撤消和切换都由内核实现。用户级线程:有关线程的所有管理工作都由用户程序通过调用线程库完成,内核并不知道其存在,应用程序在同一进程中创建线程,自己设计调度算法,调度指定线程运行。内核是单线程的,仍以进程为单位进行调度。3、系统对线程的支持优点:线程切换不需要内核模式特权,节省切换开销调度策略可以是应用程序特定的用户级线程可以在任何操作系统中运行,不需要对底层内核进行修改以支持用户级线程缺点:一个线程被阻塞时,进程中所有线程都被阻塞一个多线程应用程序不能利用多处理器技术,内核一次只把一个进程分配给一个处理机用户级线程内核级线程W2K,Linux,OS/2采用有关线程管理的所有工作由内核完成优点:同一进程内线程可被分配到不同处理器上一线程被阻塞,可切换到另一线程内核例程本身也可是多线程的组合的方法Solaris(最成功最广泛的商业UNIX版本)操作系统采用结合前两种线程优点,同时减少其缺点线程创建完全在用户空间完成,线程调度和同步在应用程序内进行n个用户级线程被映射到一些(少于n个)内核级线程上,程序员可为应用程序和机器调整内核级线程数目,以达到最佳效果2.6.0进程间通信的类型低级通信:只能传递状态和整数值(控制信息),包括进程互斥和同步所采用的信号量和管程机制。优点是速度快。缺点是:传送信息量小:效率低,每次通信传递的信息量固定,若传递较多信息则需要进行多次通信。编程复杂:用户直接实现通信的细节,编程复杂,容易出错。高级通信:能够传送任意数量的数据,包括三类:共享存储区、管道、消息。1.低级通信和高级通信2.直接通信和间接通信直接通信:信息直接传递给接收方,如管道。在发送时,指定接收方的地址或标识,也可以指定多个接收方或广播式地址;在接收时,允许接收来自任意发送方的消息,并在读出消息的同时获取发送方的地址。间接通信:借助于收发双方进程之外的共享数据结构作为通信中转,如消息队列。通常收方和发方的数目可以是任意的。2.6进程低级通信

多道程序系统中进程是并发执行的,这些进程之间存在着不同的相互制约关系,为了协调进程之间的相互制约关系,就需要实现进程的同步。互斥是同步的一种特殊情况。互斥关系:通过共享资源而使进程之间产生的关系叫做间接制约关系,又叫做互斥关系。可用“进程-资源-进程”来描述。[例]进程P1和P2在运行中都要使用打印机,为了使各进程输出的完整性,打印机的使用必须独占。一旦系统将打印机分配给进程P1,那么进程P2必须等待,等待P1使用完打印机并释放后,才能使用。1.各并发进程对资源的共享同步关系:通常,一个用户作业涉及一组并发进程(输入、计算和输出进程),这些进程须相互协作共同完成这项任务。这样,在运行过程中,这些进程可能要在某些同步点上等待协作者发来信息后才能继续运行。进程之间的这种制约关系叫做直接制约关系。进程通讯:是指进程的上述相互依赖关系。进程之间的这种相互依赖又相互制约、相互合作又相互竞争的关系,也即进程的同步与互斥关系。又叫进程的低级通信。2.系统中存在若干协作进程1、进程的互斥是由于共享资源而引起的

共享资源:①慢速的硬设备,如打印机等资源,②软件资源,如共享变量、共享文件等。

临界资源:就是一次仅允许一个进程使用的资源。临界区(criticalsection):就是并发执行的进程访问临界资源的那个必须互斥执行的程序段。2.6.1进程之间的互斥空闲则入:其他进程均不处于临界区;忙则等待:已有一进程处于其临界区;有限等待:等待进入临界区的进程不能无限等待;让权等待:不能进入临界区的进程,应释放CPU(如转换到阻塞状态),不阻止其它进程进入。为了正确而有效地使用临界资源,系统中的并发进程需要遵循如下四个准则:(1)关中断解决进程互斥的最简单办法是当一个进程正在临界区执行时,关闭所有的中断。因为CPU从一个进程转接到另一个进程是由于时钟中断(时间片到)或其它中断引起的。当进程退出临界段时,再开中断。之后要进入临界区的进程就可进入。描述如下:

关中断(disable)〈criticalsection〉开中断(enable)2.解决进程之间互斥的方法

优点:简单。缺点:限制了处理机交叉执行程序的能力。在多处理机情况下,这种方法不灵。因为当一个计算机系统包含多个处理机时,任何时候同时有多个进程在不同的处理机上运行。这样关中断就不能保证在不同处理机上运行的进程对临界区的互斥执行。锁位变量W

:为每个临界资源设置一个,以指示资源当前的状态。系统初始化时,将W置为0。

W=0,表示资源空闲可用;W=1,表示资源被占用。testset指令可定义如下:

booleantestset(intw){if(w==0){w=1;returnTRUE;}else{returnFALSE;}}//一条机器指令,其执行不可被中断。(2)使用测试和设置指令(testandset)Constintn=/*进程数*/intw;voidp(inti){while(TRUE){

while(!testset(w));<criticalsection>w=0;<remaindersection>}}voidmain(){w=0;

parbegin(p(1),p(2),…,p(n));}procedurep(n)--每个进程应执行的代码过程beginloop

loopLOCK(W);--该语句的执行是不可中断的endloop;〈临界区代码〉W:=0;…endloop;end;begin(--主程序)W:=0;Parbeginp(1);p(2);…p(n);parendend;同步的原因:一组进程要合作完成一项任务。[例]两个用户进程通过共享缓冲区完成其计算和打印任务。计算进程负责将计算结果送入共享缓冲区,打印进程从缓冲区取数据打印。当缓冲区空时,不允许取数据,满时不允许送数据。否则,将出现错误。计算进程与打印进程这种关系,不是由于两个进程同时访问共享缓冲区,而是由于它们访问缓冲区的速度不匹配造成的。需要进行同步处理。为了使进程同步,需要引入信号量机制。2.6.2

进程之间的同步1965年,由荷兰学者Dijkstra提出(所以P、V分别是荷兰语的test(proberen)和increment(verhogen)),是一种卓有成效的进程同步机制。每个信号量S除一个整数值S.value(计数)外,还有一个进程等待队列S.pointer,队列中是阻塞在该信号量的各个进程的标识信号量只能通过初始化和两个标准的原语来访问初始化指定一个非负整数值,表示空闲资源总数(又称为"资源信号量")--若为非负值表示当前的空闲资源数,若为负值其绝对值表示当前等待临界区的进程数2.6.3信号量和P,V操作用记录型数据结构描述:typedefstruct{

intvalue;//表示该类资源的可用数量

structprocess*pointer;//等待使用该类资源的进程排成队列的队列头指针。

}semaphore,sem;信号量的值与相应资源的使用情况关系

信号量的一般结构及PCB队列对信号量的操作有如下严格限制:1.信号量可以赋初值,且初值为非负数。2.信号量的值可以修改,但只能由P和V操作来访问--s.value; //表示申请一个资源;if(s.value<0) //表示没有空闲资源;{调用进程进入等待队列s.pointer;阻塞调用进程;}P原语wait(s)V原语signal(s)++s.value; //表示释放一个资源;if(s.value<=0) //表示有进程处于阻塞状态;{从等待队列s.pointer中取出一个进程P;进程P进入就绪队列;}V原语通常唤醒进程等待队列中的头一个进程voidwait(sem&s){s.value=s.value-1;//请求一个资源。

if(s.value<0){addthisprocesstos.pointer;block();}

//资源用完,调用阻塞原语。“让权等待”}//又称P操作原语(通过信号量s接受信号)voidsignal(sem&s){s.value=s.value+1;//释放一个资源。

if(s.value<=0){removeaprocessPfroms.pointer;wakeup(P);}

//表示在信号链表中,仍有等待该资源的进程被阻塞。调用唤醒原语。}

//又称V操作原语

(通过信号量s发信号)

引入一个互斥信号量,用mutex表示。对于互斥使用的资源,其信号量的初值为1。欲进入临界区执行的进程须先对互斥信号量mutex执行P操作,若减1后mutex值为0,表示临界资源空闲,可以进入临界区执行;若mutex减1后的值为负,说明已有进程占有临界资源,进程必须等待,直到临界资源空闲为止。进程完成临界区操作后,通过执行V操作释放临界资源,供其它进程使用。1.利用信号量实现进程之间的互斥用P、V操作解决进程间互斥问题P(mutex)V(mutex)P1P2P3互斥区P(mutex)P(mutex)V(mutex)V(mutex)

使用信号量的互斥:constintn=/*进程数*/intmutex=1;voidPro(inti){

P(mutex);//申请资源<criticalsection>V(mutex);//释放资源<remaindersection>}voidmain(){parbegin(Pro(1),Pro(2),…,Pro(n));}mutex:integer:=1;parbeginp1:beginp2:beginlooploop

p(mutex)p(mutex)<criticalsection><criticalsection>v(mutex)v(mutex)……endloopendloopendend…parend用信号量可以方便地解决n个进程互斥地使用临界区的问题。信号量的取值范围是+1~-(n-1)。信号量的值为负时,说明有一个进程正在临界区执行,其它的正排在信号量等待队列中等待,等待的进程数等于信号量值的绝对值。[例]若P、V操作的信号量初值为1,当前值为-3,则表示有3个等待进程。使用P,V操作实现互斥时应注意两点①在每个程序中用于实现互斥的P(mutex)和V(mutex)必须成对出现,即先做P,进入临界区;后做V,退出临界区。②互斥信号量mutex的初值一般为1。进程的同步:是指相互合作的一组共行进程,各自以独立的、不可预知的速度向前推进,在前进过程中彼此之间需要相互协调步伐,才能更好地完成同一项任务。为了解决进程的同步,同样也可引入信号量。2.利用信号量实现进程之间的同步利用信号量来描述前趋关系前趋关系:并发执行的进程P1和P2中,分别有代码C1和C2,要求C1在C2开始前完成;为每个前趋关系设置一个互斥信号量S12,其初值为0[例]用信号量实现计算进程与打印进程之间的同步过程。假定计算进程和打印进程共同使用一个单缓冲区。为此,引入两个同步信号量s1和s2。

S1:表示缓冲区是否空,s1的初值为1;

S2:表示缓冲区中是否有可供打印的计算结果,其初始值为0。计算进程(Pc)和打印进程(Pp)之间的同步算法如下:ints1,s2;s1=1;s2=0;void

Pc(){/*计算进程*/while(TRUE){computenextnumber

P(s1);/*wait(s1)*/

addthenumbertobufferV(s2);/*signal(s2)*/…}}voidPp(){/*打印进程*/while(TRUE){

p(s2);/*wait(s2)*/

takenextnumberfrombuffer

V(s1);/*signal(s1)*/printthenumber…}}voidmain(){parbegin(Pc,Pp);}Parbegin--计算进程--打印进程Pc:beginPp:begincomputernextnumber;p(s2)

p(s1)takenextnumberaddthenumberfrombuffer;tobuffer;v(s1)

v(s2)printthenumber;…...endendparend用P和V操作实现同步时应注意如下三点①分析进程间的制约关系,确定信号量种类。②信号量的初值与相应资源的数量有关,也与P,V操作在程序代码中出现的位置有关。③同一信号量的P,V操作要“成对”出现,但是,它们分别出现在不同的进程代码中。3.利用信号量解决生产者和消费者问题生产者和消费者问题是相互合作进程关系的一种抽象。生产者:运行中的进程当其释放一个资源时,可把它看成是该资源的生产者,消费者:当运行中的进程申请使用一个资源时,又可把它看成该资源的消费者。[例]上述例子中计算进程:打印数据的生产者;空缓冲的消费者打印进程:打印数据的消费者;空缓冲的生产者

[例]假定有一组生产者和一组消费者进程,通过一个有界环行缓冲区发生联系。正常情况下,生产者将生产的产品放入缓冲区,消费者从缓冲区取用产品。当缓冲区满时,生产者要等消费者取走产品后才能向缓冲区放下一个产品;当缓冲区空时,消费者要等生产者放一个产品入缓冲区后才能从缓冲区取下一个产品。设有界缓冲区的容量为k。为了正确地存取缓冲区,要求各生产者与消费者进程互斥地使用缓冲区。要设两个同步信号量,作为生产者进程和消费者进程能否正确前进的标志。用empty表示空缓冲个数,初值为k;用full表示装满产品的缓冲个数,初值为0。实际上,full和empty是同一个含义:full+empty==k再设置一个互斥使用临界区的信号量mutex,初值为1。

每个进程中各个P操作的次序是重要的:先检查资源数目,再检查是否(访问缓冲区)互斥――否则可能死锁(为什么?)intmutex=1,empty=k,full=0,array[k],i=0,j=0;voidproducer(){produceaproductx;

P(empty);//申请空缓冲区

P(mutex);//实现对缓冲池的互斥使用array[i]=x;//addtheproducttobuffer;

i=(i+1)modk;

V(mutex);V(full);//满缓冲区的个数加1……}voidconsumer(){P(full);//申请满缓冲区

P(mutex);//实现互斥y=array[j];//takeaproductfrombuffer;j=(j+1)modk;

V(mutex);

V(empty);//空缓冲区的个数加1……}voidmain(){parbegin(producer,consumer);}[注意]

无论是生产者还是消费者,P操作的顺序是重要的。应该将互斥使用的信号量P操作放在紧挨临界区的位置。如果把生产者进程中的两个P操作交换次序,当缓冲区满时,生产者欲向缓冲区放产品时,将在P(empty)上等待,但它已得到了使用缓冲区的权力。若此后,消费者欲取产品时,由于申请使用缓冲区不成功,它将在P(mutex)上等待。从而导致生产者等待消费者取走产品,而消费者却在等待生产者释放缓冲区的使用权,这种相互等待是无休止的,从而造成系统死锁。[例]

桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V操作实现爸爸、儿子、女儿三个并发进程的同步。盘子爸爸初始状态:同步信号量s1=1,表示盘子为空。放苹果发同步信号s2,放桔子发同步信号s3儿子等信号s3,发信号s1女儿等信号s2,发信号s1苹果桔子Father(){while(1){

p(s1);if(放入的是苹果)v(s2);elsev(s3);}}daughter(){while(1){

p(s2);从盘中取出苹果;

v(s1);}}Son(){while(1){

p(s3);从盘中取出桔子;

v(s1);}}4.利用信号量解决读者和写者问题

读/写问题:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间,甚至可以是一组处理器寄存器;有一些只读取这个数据区的进程(reader)和一些只往数据区中写数据的进程(writer);此外还必须满足以下条件:任意多的读进程可以同时读这个数据区;一次只有一个写进程可以往数据区中写;若一个写进程正在写,禁止任何进程读。解决读者/写者问题,需设置两个信号量:(1)读互斥信号量rmutex,用于使读者互斥地访问共享变量readcount,这里readcount是记录有多少读者正在读;(2)写互斥信号量wmutex,用于实现读写互斥和写写互斥地访问共享文件。

读者/写者问题进行如下描述:intrmutex,wmutex,readcount;

rmutex=1;wmutex=1;voidreader(){

P(rmutex);//互斥访问readcountifreadcount=0thenP(wmutex);readcount++;

V(rmutex);

performreadoperation;…

P(rmutex);readcount=readcount-1;ifreadcount=0thenV(wmutex);

V(rmutex);……}voidwriter(){while(TRUE){

P(wmutex);

performwriteoperation;V(wmutex);}}voidmain(){

readcount=0;

parbegin(reader,writer);}[解析]读进程也使用wmutex实现互斥,为允许多个读进程同时读,当没有读进程正在读时,第一个试图读的读进程需要在wmutex上等待;当至少已经有一个读进程在读时,随后的读进程无需等待,可以直接进入。rmutex是为了保证互斥访问readcount的。5经典进程同步问题哲学家进餐问题哲学家进餐问题哲学家进餐问题===========================================#defineN5#defineLEFT(i-1)%N#defineRIGHT(i+1)%N#defineTHINKING0#defineHUNGRY1#defineEATING2typedefstruct{/*定义结构型信号量*/intvalue;structPCB*list;}semaphore;intstate[N];semaphoremutex=1;/*互斥进入临界区*/semaphores[N]; /*每位哲学家一个信号量*/哲学家进餐问题voidphilosopher(inti){while(TRUE){think(); /*哲学家在思考问题*/take_chopstick(i);/*拿到两根筷子或者等待*/eat(); /*进餐*/put_chopstick(i);/*把筷子放回原处*/}}voidtake_chopstick(inti){P(mutex);state[i]=HUNGRY;test(i);/*试图拿两根筷子*/V(mutex);P(s[i]);}哲学家进餐问题voidput_chopstick(inti){P(mutex);state[i]=THINKING;test(LEFT); /*查看左邻,现在能否进餐*/test(RIGHT); /*查看右邻,现在能否进餐*/V(mutex);}voidtest(inti){if(state[i]==HUNGRY&&state[LEFT]!=EATING&&state[RIGHT]!=EATING){state[i]=EATING;V(s[i]);}}===============================================经典进程同步问题打瞌睡的理发师打瞌睡的理发师问题打瞌睡的理发师问题理发师和每位顾客都分别是一个进程。

===============================#defineCHAIRS5typedefstruct{intvalue;structPCB*list;}semaphore;semaphorecustomers=0;semaphorebarbers=0;semaphoremutex=1;intwaiting=0;voidbarber(void){while(TRUE){P(customers);/*如果没有顾客,则理发师打瞌睡*/P(mutex);/*互斥进入临界区*/waiting--;V(barbers);/*一个理发师准备理发*/V(mutex);/*退出临界区*/cut_hair();/*理发(在临界区之外)*/}}打瞌睡的理发师问题打瞌睡的理发师问题

voidcustomer(void){P(mutex); /*互斥进入临界区*/if(waiting﹤CHAIRS){waiting++;V(customers); /*若有必要,唤醒理发师*/V(mutex);/*退出临界区*/P(barbers); /*如果理发师正忙着,则顾客打瞌睡*/get_haircut();}elseV(mutex); /*店里人满了,不等了*/}1)信号量的物理含义:S>0表示有S个资源可用S=0表示无资源可用S<0则|S|表示S等待队列中的进程个数P(S):表示申请一个资源V(S)表示释放一个资源。信号量的初值应该大于等于0PV操作讨论2)P.V操作必须成对出现,有一个P操作就一定有一个V操作当为互斥操作时,它们同处于同一进程当为同步操作时,则不在同一进程中出现如果P(S1)和P(S2)两个操作在一起,那么P操作的顺序至关重要:一个同步P操作与一个互斥P操作在一起时同步P操作在互斥P操作前而两个V操作无关紧要3)P.V操作的优缺点优点:简单,而且表达能力强(用P.V操作可解决任何同步互斥问题)缺点:不够安全:P.V操作使用不当会出现死锁;遇到复杂同步互斥问题时实现复杂思考题购物问题:某超级市场,可容纳100人同时购物。入口处备有篮子,每个购物者可持一个篮子入内购物。出口处结帐,并归还篮子(出、入口仅容纳一个人通过,篮子有无限多个)。(1)请用P、V操作解决购物问题。(2)若顾客最多为N个人,写出算法中同步信号量值的可能变化范围设信号量S代表“能进入超市购物的人“资源,初值为100;入口互斥信号量Inmutex的初值为1;出口互斥信号量Outmutex的初值为1。购物者进程为P,其算法如下:ProcessPBeginP(S);P(Inmutex);

进入口处,取一篮子;V(Inmutex) ;

选购商品

;P(Outmutex);

结账,并归还篮子;V(Outmutex)V(S)End(2)同步信号量S最大值为100,最小值为100-N。

2.6.4管程信号量:编程负担重,易出错。管程(Monitor):一种新的进程间同步机制。管程:把对信号量的控制集中在管程内部,保证进程互斥地访问共享变量。管程比信号量好控制。1.管程的定义基本思想:将共享变量及对共享变量能够进行的所有操作集中在一个模块中。管程:是关于共享资源的数据结构及一组针对该资源的操作过程所构成的软件模块。管程保证最多只有一个进程执行管程中的代码,从而提供互斥机制,保证管程数据的一致性。组成:①局部于该管程的共享数据的说明,②对共享数据执行的一组操作过程的说明,③共享数据的初值设置语句。2.利用管程解决进程之间的同步与互斥(1)用管程解决临界资源的互斥使用mutexshow:Monitor管程名字busy:boolean;临界资源是否可用标志,初值falsenonbusy:semaphore;进程等待队列头指针

definerequest,release;管程中可供调用的过程说明usewait,signal;引用的外部模块的过程说明beginbusy:=false;为管程局部变量赋初值,资源空闲nonbusy:=1;end;procedurerequest申请临界资源过程beginifbusythenwait(nonbusy);busy:=true;设置资源已经占用标志end;procedurerelease释放临界资源过程beginbusy:=false;设置资源已经空闲标志signal(nonbusy);向等待者发信号end;进程调用管程的request过程申请使用临界资源,进程调用管程的release过程释放临界资源。(2)用管程解决生产者和消费者问题prod_conshow:Monitorrbuffer:array[0..n-1]ofitem;有n个元素的环形缓冲区k:integer;缓冲区中的元素个数nextempty,nextfull:integer;送取元素的指针nonempty,nonfull:semaphore;条件变量defineput,get;管程中定义的过程说明usewait(),signal();引用外部模块的过程说明begink=0;nextempty=nextfull=0;end;procedureput(product:item)向缓冲区送元素过程begin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论