操作系统第2章.ppt_第1页
操作系统第2章.ppt_第2页
操作系统第2章.ppt_第3页
操作系统第2章.ppt_第4页
操作系统第2章.ppt_第5页
已阅读5页,还剩159页未读 继续免费阅读

下载本文档

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

文档简介

1、第二章 进程管理,2.1 进程的基本概念 2.2 进程控制 2.3 进程同步 2.4 经典进程的同步问题 2.5 管程机制 2.6 进程通信 2.7 线程,2.1 进程的基本概念,2.1.1 程序的顺序执行及其特征,1. 程序的顺序执行 仅当前一操作(程序段)执行完后,才能执行后继操作。 例如,在进行计算时,总须先输入用户的程序和数据(I),然后进行计算(C),最后才能打印计算结果(P)。 S1: a=x+y; S2: b=a-5; S3: c=b+1;,图 2-1 程序的顺序执行,2. 程序顺序执行时的特征,顺序性: (2) 封闭性: (3) 可再现性:,2.1.2 前趋图,前趋图(Prec

2、edence Graph)是一个有向无循环图,记为DAG(Directed Acyclic Graph),用于描述进程之间执行的前后关系。图中的每个结点可用于描述一个程序段或进程,乃至一条语句;结点间的有向边则用于表示两个结点之间存在的偏序(Partial Order)或前趋关系(Precedence Relation)“”。 =(Pi, Pj)|Pi must complete before Pj may start, 如果(Pi, Pj),可写成PiPj,称Pi是Pj的直接前趋,而称Pj是Pi的直接后继。在前趋图中,把没有前趋的结点称为初始结点(Initial Node),把没有后继的结点

3、称为终止结点(Final Node)。,每个结点还具有一个重量(Weight),用于表示该结点所含有的程序量或结点的执行时间。,IiCiPi和S1S2S3,图 2-2 前趋图,对于图 2-2(a)所示的前趋图, 存在下述前趋关系:,P1P2, P1P3, P1P4, P2P5, P3P5, P4P6, P4P7, P5P8, P6P8, P7P9, P8P9 或表示为: P=P1, P2, P3, P4, P5, P6, P7, P8, P9 = (P1, P2), (P1, P3), (P1, P4), (P2, P5), (P3, P5), (P4, P6), (P4, P7), (P5,

4、 P8), (P6, P8), (P7, P9), (P8, P9) 应当注意,前趋图中必须不存在循环,但在图2-2(b)中却有着下述的前趋关系: S2S3, S3S2,2.1.3 程序的并发执行及其特征,1. 程序的并发执行,图 2-3 并发执行时的前趋图,I1,I2,I3,I4,C1,C2,C3,C4,P1,P2,P3,P4,I2,C1,I3,C2,P1,I4,C3,P2,C4,P3,在该例中存在下述前趋关系: IiCi,IiIi+1, CiPi, CiCi+1,PiPi+1 而Ii+1和Ci及Pi-1是重迭的,亦即在Pi-1和Ci以及Ii+1之间,可以并发执行。 对于具有下述四条语句的程

5、序段: S1: a=x+2 S2: b=y+4 S3: c=a+b S4: d=c+b S1和S2可以并发执行,它们彼此互不依赖。,图 2-4 四条语句的前趋关系,2. 程序并发执行时的特征,1) 间断性:相互制约将导致并发程序具有“执行暂停执行”这种间断性的活动规律。 2) 失去封闭性:程序并发执行时,是多个程序共享系统中的各种资源,因而这些资源的状态将由多个程序来改变,致使程序的运行失去了封闭性。 3) 不可再现性:由于失去了封闭性,也将导致其再失去可再现性。,例如,有两个循环程序A和B,它们共享一个变量N。程序A每执行一次时,都要做N:=N+1操作;程序B每执行一次时, 都要执行Prin

6、t(N)操作,然后再将N置成“0”。程序A和B以不同的速度运行。 (1) N:=N+1在Print(N)和N:=0之前,此时得到的N值分别为n+1, n+1, 0。 (2) N:=N+1在Print(N)和N:=0之后,此时得到的N值分别为n, 0, 1。 (3) N:=N+1在Print(N)和N:=0之间,此时得到的N值分别为n, n+1, 0。,2.1.4 进程的特征与状态,1. 进程的特征和定义,1) 结构特征:由程序段、相关的数据段和PCB组成 2) 动态性 :最基本的特征 3) 并发性 4) 独立性 5) 异步性,较典型的进程定义有: (1) 进程是程序的一次执行。 (2) 进程是

7、一个程序及其数据在处理机上顺序执行时所发生的活动。 (3) 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。 在引入了进程实体的概念后,可以把传统OS中的进程定义为:“进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位”。,进程与程序的区别: (1)程序是指令的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。 (2)程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。 (3)进程更能真实地描述并发,而程序不能 (4)进程是由程序和数据两部分组成的 (5

8、)进程具有创建其他进程的功能,而程序没有 (6)同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程。也就是说同一程序可以对应多个进程,思考?,为什么引入进程的概念?,2. 进程的三种基本状态,1) 就绪(Ready)状态 (可能有多个进程处于就绪状态) 2) 执行状态(单处理机中,只有一个进程处于执行状态; 多处理机系统中,则有多个进程处于执行状态) 3) 阻塞状态 (可能有多个进程处于阻塞状态),图 2-5 进程的三种基本状态及其转换,就绪,阻塞,执行,进程调度,时间片完,I/O请求,I/O完成,3. 挂起状态 引入挂起状态的原因 终端用户的请求。 (2) 父进程请求。 (3) 负

9、荷调节的需要。 (4) 操作系统的需要。,2) 进程状态的转换,活动就绪静止就绪。 (2) 活动阻塞静止阻塞。 (3) 静止就绪活动就绪。 (4) 静止阻塞活动阻塞。,活动 阻塞,静止 阻塞,活动 就绪,静止 就绪,执行,激活,激活,挂起,挂起,释放,释放,挂起,调度,I/O请求,图 2-6 具有挂起状态的进程状态图,4创建状态和终止状态 1) 创建状态 首先,为一个新进程创建PCB,并填写必要的管理信息; 其次,把该进程转入就绪状态并插入就绪队列之中。 当一个新进程被创建时,系统已为其分配了PCB,填写了进程标识等信息,但由于该进程所必需的资源或其它信息,如主存资源尚未分配等,对于处于创建状

10、态的进程,获得了其所必需的资源,以及对其PCB初始化工作完成后,进程状态便可由创建状态转入就绪状态。,2) 终止状态 首先等待操作系统进行善后处理,然后将其PCB清零,并将PCB空间返还系统。当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。进入终止态的进程以后不能再执行,但在操作系统中依然保留一个记录,其中保存状态码和一些计时统计数据,供其它进程收集。一旦其它进程完成了对终止状态进程的信息提取之后,操作系统将删除该进程。,创建,就绪,阻塞,执行,终止,许可,释放,I/O请求,I/O完成,进程调度,时间片完,图2-7

11、进程的五种基本状态及转换,图2-8 具有创建、终止和挂起状态的进程状态图,活动 阻塞,静止 阻塞,活动 就绪,静止 就绪,执行,激活,激活,挂起,挂起,释放,释放,挂起,调度,I/O请求,创建,终止,许可,许可,释放,思考?,1如果系统中有N个进程,运行的进程最多几个,最少几个;就绪进程最多几个最少几个;等待进程最多几个,最少几个? 2. 有没有这样的状态转换,为什么? 阻塞运行; 就绪阻塞,对于单处理机,运行进程最多一个,最少0个,就绪进程最多n-1个,最少0个,等待进程最多n个,最少0个(可能全部等待)。,2.1.5 进程控制块,1. 进程控制块的作用,进程控制块的作用是使一个在多道程序环

12、境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。,系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志 进程与PCB是一一对应的,2. 进程控制块中的信息,1) 进程标识符 进程标识符用于惟一地标识一个进程。一个进程通常有两种标识符: (1) 内部标识符。在所有的操作系统中,都为每一个进 程赋予一个惟一的数字标识符,它通常是一个进程的序号。 (2) 外部标识符。它由创建者提供,通常是由字母、数字组成,往往是由用户(进程)在访问该进程时使用。为了描述进程的家族关系, 还应

13、设置父进程标识及子进程标识。此外,还可设置用户标识,以指示拥有该进程的用户。,2) 处理机状态 处理机状态信息主要是由处理机的各种寄存器中的内容组成的。 通用寄存器 指令计数器 程序状态字PSW 用户栈指针,3) 进程调度信息 进程状态 进程优先级 进程调度所需的其它信息 事件,4) 进程控制信息 程序和数据的地址 进程同步和通信机制 资源清单 链接指针,3. 进程控制块的组织方式,1) 链接方式,图 2-9 PCB链接队列示意图,2) 索引方式,图 2-10 按索引方式组织PCB,2.2 进 程 控 制,进程控制就是对系统中的所有进程实施管理,进程控制一般有原语来实现。 所谓原语是一种特殊的

14、系统功能调用,它可以完成一个特定的功能,其特点是原语执行时不可被中断。 原语的作用是为了进程的通信和控制,保证进程状态的确定性。 常用原语: 创建原语、终止原语、阻塞原语、唤醒原语,2.2.1 进程的创建,1. 进程图(Process Graph),图 2-11 进程树,2. 引起创建进程的事件,用户登录。 (2) 作业调度。 (3) 提供服务。 (4) 应用请求。,3. 进程的创建(Creation of Progress),通过调用创建原语Create创建一个新进程 (1) 申请空白PCB。 (2) 为新进程分配资源。 (3) 初始化进程控制块。 (4) 将新进程插入就绪队列,如果进程就绪

15、队列能够接纳新进程, 便将新进程插入就绪队列。,2.2.2 进程的终止,1. 引起进程终止(Termination of Process)的事件 1) 正常结束 2) 异常结束: 越界错误。 保护错。 非法指令。 权指令错。 运行超时。 等待超时。 算术运算错。 I/O故障。 3) 外界干预: 操作员或操作系统干预。 父进程请求。 父进程终止。 ,2. 进程的终止过程 调用进程终止原语 (1) 根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态。 (2) 若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度。

16、(3) 若该进程还有子孙进程,还应将其所有子孙进程予以终止,以防他们成为不可控的进程。 (4) 将被终止进程所拥有的全部资源,或者归还给其父进程, 或者归还给系统。 (5) 将被终止进程(它的PCB)从所在队列(或链表)中移出, 等待其他程序来搜集信息。,2.2.3 进程的阻塞与唤醒,1. 引起进程阻塞和唤醒的事件,1) 请求系统服务不能立即满足 2) 启动某种操作必须在完成另一操作之后才能执行 3) 新数据尚未到达 4) 无新工作可做,2. 进程阻塞过程 通过调用阻塞原语block把自己阻塞 先立即停止执行,把进程控制块中的现行状态由“执行”改为阻塞,并将PCB插入阻塞队列。如果系统中设置了

17、因不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞(等待)队列。最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换,亦即,保留被阻塞进程的处理机状态(在PCB中),再按新进程的PCB中的处理机状态设置CPU的环境。,3. 进程唤醒过程 通过调用唤醒原语wakeup将阻塞进程唤醒 首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。,2.2.4 进程的挂起与激活,1. 进程的挂起 利用挂起原语suspend( )将指定进程或处于阻塞状态的进程挂起 首先检查被挂起进程的状态,若处于活动就绪状态,

18、便将其改为静止就绪;对于活动阻塞状态的进程,则将之改为静止阻塞。为了方便用户或父进程考查该进程的运行情况而把该进程的PCB复制到某指定的内存区域。最后,若被挂起的进程正在执行,则转向调度程序重新调度。,2. 进程的激活过程 利用激活原语active( )将指定进程激活 激活原语先将进程从外存调入内存,检查该进程的现行状态,若是静止就绪,便将之改为活动就绪;若为静止阻塞便将之改为活动阻塞。假如采用的是抢占调度策略,则每当有新进程进入就绪队列时,应检查是否要进行重新调度,即由调度程序将被激活进程与当前进程进行优先级的比较,如果被激活进程的优先级更低,就不必重新调度;否则,立即剥夺当前进程的运行,把

19、处理机分配给刚被激活的进程。,思考?,为什么创建进程要用原语来实现? 请设想一下进程在什么情况下会变为阻塞状态? 阻塞进程在什么情况下会被唤醒?谁来唤醒它?,2.3 进 程 同 步,2.3.1 进程同步的基本概念,1. 两种形式的制约关系,间接相互制约关系。 (2) 直接相互制约关系。,同步,同步是进程间共同完成一项任务时直接发相互作用的关系 同步进程间具有合作关系 在执行时间上必须按一定的顺序协调进行,互斥,互斥是并发执行的多个进程由于竞争同一资源而产生的相互排斥的关系 互斥进程彼此在逻辑上是完全无关的 它们的运行不具有时间次序的特征,2. 临界资源(Critical Resouce),生产

20、者-消费者(producer-consumer)问题是一个著名的进程同步问题。它描述的是:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中; 消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。,利用数组表示具有n个(0,1,n-1)缓冲区的缓冲池。 in:指示下一个可投放产品的缓冲

21、区,每当生产者进程生产并投放一个产品后,输入指针加1; out:指示下一个可从中获取产品的缓冲区,每当消费者进程取走一个产品后,输出指针加1。 当(in+1) mod n=out时 ,满;而in=out,空。 整型变量counter, 其初始值为0。每当生产者进程向缓冲池中投放一个产品后,使counter加1;反之,每当消费者进程从中取走一个产品时, 使counter减1。,Var n, integer; type item=; var buffer:array0, 1, , n-1 of item; in, out: 0, 1, , n-1; counter: 0, 1, , n; 指针in

22、和out初始化为1。,producer: repeat produce an item in nextp;/nextp:每次放入的产品数 while counter=n do no-op; bufferin: =nextp; in: =in+1 mod n; counter: =counter+1; until false; consumer: repeat while counter=0 do no-op; /nextc:每次取出的产品数 nextc: =bufferout; out: =(out+1) mod n; counter:=counter-1; consumer the item

23、 in nextc; until false;,虽然上面的生产者程序和消费者程序,在分别看时都是正确的,而且两者在顺序执行时其结果也会是正确的,但若并发执行时,就会出现差错,问题就在于这两个进程共享变量counter。生产者对它做加1操作,消费者对它做减1操作,这两个操作在用机器语言实现时, 常可用下面的形式描述: register1:=counter; register2:=counter; register1:=register1+1; register2:=register2-1; counter:=register1; counter:=register2;,假设:counter的当前

24、值是5。如果生产者进程先执行左列的三条机器语言语句,然后消费者进程再执行右列的三条语句, 则最后共享变量counter的值仍为5;反之,如果让消费者进程先执行右列的三条语句,然后再让生产者进程执行左列的三条语句,counter值也还是5,但是,如果按下述顺序执行: register1:=counter; (register1=5) register1:=register1+1; (register 1=6) register2:=counter; (register 2=5) register2:=register2-1; (register 2=4) counter:=register1;

25、(counter=6) counter:=register2; (counter=4),3. 临界区(critical section),可把一个访问临界资源的循环进程描述如下: repeat critical section; remainder section; until false;,entry section,exit section,4. 同步机制应遵循的规则,空闲让进。 (2) 忙则等待。 (3) 有限等待。 (4) 让权等待。,2.3.2 信号量机制,1. 整型信号量 最初由Dijkstra把整型信号量定义为一个整型量,除初始化外,仅能通过两个标准的原子操作(Atomic Op

26、eration) wait(S)和signal(S)来访问。这两个操作一直被分别称为P、V操作。 wait和signal操作可描述为: wait(S): while S0 do no-op/ 申请一个单位资源 S:=S-1; signal(S): S:=S+1; /释放一个单位资源,2. 记录型信号量 procedure wait(S) var S: semaphore; begin S.value: =S.value-1; if S.value0 then block(S,L) end procedure signal(S) var S: semaphore; begin S.value:=

27、S.value+1; if S.value0 then wakeup(S,L); end,S.value的初值表示系统中某类资源的数目 wait操作,意味着进程请求一个单位的该类资源,S.value:=S.value-1; 当S.value0时,表示该类资源已分配完毕,入等待队列S.L,当S.value0时,继续 。 signal操作,表示执行进程释放一个单位资源,S.value:=S.value+1;若加1后仍是S.value0,则表示在该信号量链表中,仍有等待该资源的进程被阻塞,将S.L链表中的第一个等待进程唤醒。当S.value0时,继续。 如果S.value的初值为1,表示只允许一个进

28、程访问临界资源,此时的信号量转化为互斥信号量。,3. AND型信号量,在两个进程中都要包含两个对Dmutex和Emutex的操作, 即 process A: process B: wait(Dmutex); wait(Emutex); wait(Emutex); wait(Dmutex); 若进程A和B按下述次序交替执行wait操作: process A: wait(Dmutex); 于是Dmutex=0 process B: wait(Emutex); 于是Emutex=0 process A: wait(Emutex); 于是Emutex=-1 A阻塞 process B: wait(Dm

29、utex); 于是Dmutex=-1 B阻塞,AND同步机制的基本思想是:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有可能为之分配的资源,也不分配给他。亦即,对若干个临界资源的分配,采取原子操作方式:要么全部分配到进程,要么一个也不分配。 由死锁理论可知,这样就可避免上述死锁情况的发生。为此,在wait操作中,增加了一个“AND”条件,故称为AND同步,或称为同时wait操作, 即Swait(Simultaneous wait)定义如下:,Swait(S1, S2, , Sn) if Si1 and and S

30、n1 then for i =1 to n do Si=Si-1; endfor else place the process in the waiting queue associated with the first Si found with Si1, and set the program count of this process to the beginning of Swait operation endif Ssignal(S1, S2, , Sn) for i =1 to n do Si=Si+1; Remove all the process waiting in the

31、queue associated with Si into the ready queue. endfor;,4. 信号量集,Swait(S1, t1, d1, , Sn, tn, dn) if Sit1 and and Sntn then for i=1 to n do Si=Si-di; endfor else Place the executing process in the waiting queue of the first Si with Siti and set its program counter to the beginning of the Swait Operatio

32、n. endif Ssignal(S1, d1, , Sn, dn) for i=1 to n do Si =Si+di; Remove all the process waiting in the queue associated with Si into the ready queue endfor;,一般“信号量集”的几种特殊情况: (1) Swait(S, d, d)。 此时在信号量集中只有一个信号量S, 但允许它每次申请d个资源,当现有资源数少于d时,不予分配。 (2) Swait(S, 1, 1)。 此时的信号量集已蜕化为一般的记录型信号量(S1时)或互斥信号量(S=1时)。 (3

33、) Swait(S, 1, 0)。这是一种很特殊且很有用的信号量操作。当S1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。,2.3.3 信号量的应用,1. 利用信号量实现进程互斥,利用信号量实现进程互斥的进程可描述如下: Var mutex:semaphore:=1; begin parbegin process 1: begin repeat wait(mutex); critical section signal(mutex); remainder seetion until false; end ,process 2: begin r

34、epeat wait(mutex); critical section signal(mutex); remainder section until false; end parend,2. 利用信号量实现前趋关系,图 2-12 前趋图举例,Var a,b,c,d,e,f,g; semaphore=0,0,0,0,0,0,0; begin parbegin begin S1; signal(a); signal(b); end; begin wait(a); S2; signal(c); signal(d); end; begin wait(b); S3; signal(e); end; be

35、gin wait(c); S4; signal(f); end; begin wait(d); S5; signal(g); end; begin wait(e); wait(f); wait(g); S6; end; parend end,2.4 经典进程的同步问题,2.4.1 生产者消费者问题,1. 利用记录型信号量解决生产者消费者问题 mutex:实现诸进程对缓冲池的互斥使用; empty:表示缓冲池中空缓冲区; full:表示满缓冲区的数量。 假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个消息。,Var mute

36、x, empty, full:semaphore=1,n,0; buffer:array0, , n-1 of item; in, out: integer=0, 0; begin parbegin proceducer:begin repeat producer an item nextp; wait(empty); wait(mutex); buffer(in):=nextp; in:= (in+1) mod n; signal(mutex); signal(full); until false; end,consumer:begin repeat wait(full); wait(mut

37、ex); nextc:=buffer(out); out: = (out+1) mod n; signal(mutex); signal(empty); consumer the item in nextc; until false; end parend end,2. 利用AND信号量解决生产者消费者问题,ar mutex, empty, full:semaphore=1, n, 0; buffer:array0, , n-1 of item; in out:integer: =0, 0; begin parbegin producer:begin repeat produce an ite

38、m in nextp; Swait(empty, mutex); buffer(in):=nextp; in: = (in+1)mod n; Ssignal(mutex, full); until false; end,consumer:begin repeat Swait(full, mutex); nextc: =buffer(out); out: = (out+1) mod n; Ssignal(mutex, empty); consumer the item in nextc; until false; end parend end,生产者与消费者对单缓冲区的同步信号量 S1:缓冲区空

39、否(初值为1) S2:缓冲区满否(初值为0),生产者进程 L1:wait(S1) 生产产品 signal(S2) goto L1,消费者进程 L2: wait(S2) 从缓冲区消费产品 signal(S1) goto L2,【思考题】,【思考题】,如果生产者消费者问题中的缓冲区是无界的,又该如何解呢?,设信号量S1, mutex 初值分别为0,1,P:i = 0;while (1) 生产产品; P(mutex); 往Buffer i放产品; i = (i+1) % n; V(mutex); V(S1); ;,Q: j = 0; while (1) P(S1); P(mutex); 从Buffe

40、rj取产品; j = (j+1) % n; V(mutex); 消费产品; ;,2.4.2 哲学家进餐问题,1. 利用记录型信号量解决哲学家进餐问题 有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。 为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信号量数组。其描述如下: Var chopstick: array0, , 4 of semaphore;,所有信号量均被初始化为1,

41、 第i位哲学家的活动可描述为: repeat wait(chopsticki); wait(chopstick(i+1) mod 5); eat; signal(chopsticki); signal(chopstick(i+1) mod 5); think; until false;,可采取以下几种解决方法: (1) 至多只允许有四位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕时能释放出他用过的两只筷子,从而使更多的哲学家能够进餐。 (2) 仅当哲学家的左、右两只筷子均可用时,才允许他拿起筷子进餐。 (3) 规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子;而

42、偶数号哲学家则相反。按此规定,将是1、 2号哲学家竞争1号筷子;3、4号哲学家竞争3号筷子。即五位哲学家都先竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一位哲学家能获得两只筷子而进餐。,2. 利用AND信号量机制解决哲学家进餐问题 在哲学家进餐问题中,要求每个哲学家先获得两个临界资源(筷子)后方能进餐,这在本质上就是前面所介绍的AND同步问题,故用AND信号量机制可获得最简洁的解法。 Var chopsiick array 0, , 4 of semaphore =(1,1,1,1,1); processi repeat think; Sswait(chopstick(i+1) mo

43、d 5, chopstick i); eat; Ssignat(chopstick (i+1) mod 5, chopstick i); until false;,2.4.3 读者-写者问题,1. 利用记录型信号量解决读者-写者问题 允许多个进程同时读一个共享对象,但不允许一个Write进程和其他的Reader进程或Writer进程同时访问对象。 为实现Reader与Writer进程间在读或写时的互斥而设置了一个互斥信号量Wmutex。另外,再设置一个整型变量Readcount表示正在读的进程数目。还应该为Readcount设置一个互斥信号量rmutex。,读者-写者问题可描述如下: Var

44、rmutex, wmutex:semaphore:=1,1; Readcount:integer: =0; begin parbegin Reader:begin repeat wait(rmutex); if readcount=0 then wait(wmutex); Readcount:=Readcount+1; signal(rmutex); perform read operation; ,wait(rmutex); readcount: =readcount-1; if readcount=0 then signal(wmutex); signal(rmutex); until f

45、alse; end writer:begin repeat wait(wmutex); perform write operation; signal(wmutex); until false; end parend end,2. 利用信号量集机制解决读者-写者问题,Var RN integer; L, mx:semaphore =RN,1; reader:begin repeat Swait(L,1,1); Swait(mx,1,0); perform read operation; Ssignal(L,1); until false; end,writer:begin repeat Swa

46、it(mx,1,1; L,RN,0); perform write operation; Ssignal(mx,1); until false; end parend end,思考,对于N个并发进程,信号量的取值范围是什么,有什么含义。,信号量及P、V操作讨论,对于两个并发进程,互斥信号量的值仅取1、0和-1三个值 若1表示没有进程进入临界区 若0表示有一个进程进入临界区 若-1表示一个进程进入临界区,另一个进程等待进入。,信号量及P、V操作讨论(续1),1) 信号量的物理含义: S0表示有S个资源可用 S=0表示无资源可用 S0则| S |表示S等待队列中的进程个数 wait(S):表示申请

47、一个资源 signal(S):表示释放一个资源。 信号量的初值应该大于等于0,信号量及P、V操作讨论(续2),2) wait、signal操作必须成对出现,有一个wait操作就一定有一个signal操作 当为互斥操作时,它们同处于同一进程 当为同步操作时,则不在同一进程中出现 如果wait(S1)和wait(S2)两个操作在一起,那么wait操作的顺序至关重要,而两个signal操作无关紧要 一个同步wait操作与一个互斥wait操作在一起时同步wait操作在互斥Swait操作前,信号量及P、V操作讨论(续3),3)wait、signal操作的优缺点 优点: 简单,而且表达能力强(用wait、

48、signal操作可解决任何同步互斥问题) 缺点: 不够安全,wait、signal操作使用不当会出现死锁; 遇到复杂同步互斥问题时实现复杂,【思考题】,如图,试用信号量实现这三个进程的同步。 解:设有两个信号量S1、S2,初值均为 P1: P2: P3: wait(S1) signal(S1); signal(S2); signal(S2),【思考题】,用PV操作解决司机与售票员的问题,售票员进程: while(1) 关门 售票 开门 ,司机进程: while(1) 启动车辆 正常驾驶 到站停车 ,设有两个信号量S1,S2,初值均为0。,P(S2),P(S1),V(S2),V(S1),总结 进

49、程互斥:在OS中,当某一进程正在访问cs时,就不允许其它进程来读写(访问),否则就会发生后果无法估计的错误,进程之间的这种相互制约关系为进程互斥。 进程同步:并发进程在一些关键点上可能需要互相等待与互通消息,这种相互制约的等待与互通消息,称为进程同步。,进程同步与互斥关系:都反映了在异步环境下并发进程间的相互制约关系。可归于同步范畴,但互斥是同步问题的一个特例,互斥解决临界区的使用,同步是并发进程在一些关键点上需互相等待互发消息。,同步: 进程1 进程2 P(S1) V(S1) V(S2) P(S2),互斥: 进程1 进程2 P(S) P(S) V(S) V(S),【练习】,有一个仓库,可以存

50、放A和B两种产品,但要求: (1) 每次只能存入一种产品(A或B) (2) NA产品数量B产品数量M。 其中,N和M是正整数。试用P、V操作描述产品A与B的入库过程。 提示:设两个信号量Sa、Sb Sa表示允许A产品比B产品多入库的数量 Sb表示允许B产品比A产品多入库的数量,A产品入库进程:i = 0;while (1) 生产产品; P(Sa); P(mutex); A产品入库 V(mutex); V(Sb); ;,B产品入库进程: j = 0; while (1) 生产产品; P(Sb); P(mutex); B产品入库 V(mutex); V(Sa); ;,设两个信号量Sa、Sb,初值分

51、别为M-1,N-1 设互斥信号量mutex,初值为1,【练习】,有一阅览室,读者进入时必须先在一张登记表上进行登记,该表为每一座位列一表目,包括座号和读者姓名。读者离开时要消掉登记信号,阅览室中共有100个座位,请问: (1) 为描述读者的动作,应编写几个程序?设置几个进程?进程与程序间的对应关系如何? (2) 用类Pascal语言和P, V操作写出这些进程间的同步算法。,答:(1) 应编写1个程序;设置2个进程;进程与程序间的对应关系是:多对1。,(2)beginS1:=100 (有100个座位)S2:=0 (有没阅读者)mutex: =1cobeginP1: repeatP(S1);P(m

52、utex);登记信息;V(muetx);V(S2);就座,阅读; until false coendend,P2: repeatP(S2)P(mutex);消掉信息;V(muetx);V(S1);离开阅览室; until false,【练习】,理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉。一个顾客到来时,它必须叫醒理发师。如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。,var waiting : integer; /*等候理发的顾客数*/ CHAIRS:integer; /*为顾客准备的椅子数*/ cus

53、tomers, barbers,mutex : semaphore; customers := 0; barbers := 0; waiting := 0; mutex := 1;,Procedure barber; begin while(TRUE); /*理完一人,还有顾客吗?*/ P(cutomers); /*若无顾客,理发师睡眠*/ P(mutex); /*进程互斥*/ waiting := waiting 1; /*等候顾客数少一个*/ V(barbers); /*理发师去为一个顾客理发*/ V(mutex); /*开放临界区*/ cut-hair( ); /*正在理发*/ end;

54、,procedure customer begin P(mutex); /*进程互斥*/ if waitingCHAIRS begin /*看看有没有空椅子*/ waiting := waiting+1; /* 等候顾客数加1*/ V(customers); /*必要的话唤醒理发师*/ V(mutex); /*开放临界区*/ P(barbers); /*无理发师, 顾客坐着养神*/ get-haircut( ); /*一个顾客坐下等理发*/ else V(mutex); /*人满了,走吧!*/ end;,【练习】,假设机房共有2m台机器,有2n名学生选课,规定:每两个学生组成一组,各占一台机器

55、协同完成;只有一组两个学生到齐,并且此时有空闲机器时,该组学生才能进入机房。用PV操作模拟上机实习过程。,student=2n,computer=2n,enter=0,finish=0,test=0,Guard: begin P(student); P(student); V(enter); V(enter); end,Student: begin P(computer); V(student); P(enter); 上机实习; V(finish); P(test); V(computer); end,Teacher: begin P(finish); P(finish); 检查结果; V(t

56、est); V(test); end,2.5 管 程 机 制,2.5.1 管程的基本概念,1. 管程的定义,一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据。 管程由三部分组成: 局部于管程的共享变量说明; 对该数据结构进行操作的一组过程; 对局部于管程的数据设置初始值的语句。此外,还须为管程赋予一个名字。,图 2-13 管程的示意图,管程的语法如下: type monitor-name=monitor variable declarations procedure entry P1(); begin end; procedure

57、 entry P2(); begin end; procedure entry Pn(); begin end; begin initialization code; end,局部于管程内部的数据结构,仅能被局部于管程内部的过程所访问,任何管程外的过程都不能访问它;反之,局部于管程内部的过程也仅能访问管程内的数据结构。 管程每次只准许一个进程进入管程。,管程的特征: (1) 模块化。管程是一个基本程序单位,可以单独编译。 (2) 抽象数据类型。管程中不仅有数据,而且有对数据的操作。 (3) 信息掩蔽。管程中的数据结构只能被管程中的过程访问,这些过程也是在管程内部定义的,供管程外的进程调用,而管程中的数据结构以及过程(函数)的具体实现外部不可见。,管程和进程不同,主要体现在以下几个方面: (1) 虽

温馨提示

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

评论

0/150

提交评论