操作系统习题(F.L)答案 下载本文

一、单项选择题:

1.在进程管理中,当_C_时,进程从阻塞状态变为就绪状态。 A.进程被进程调度程序选中 B.等待某一事件 C.等待的事件发生 D.时间片用完 2.分配到必要的资源并获得处理机时的进程状态是_B_。 A.就绪状态 B.执行状态 C.阻塞状态 D.撤消状态 3.P、V操作是_A_。

A.两条低级进程通信原语 B.两组不同的机器指令 C.两条系统调用命令 D.两条高级进程通信原语

4.对进程的管理和控制使用_B_。

A.指令 B.原语 C.信号量 D.信箱通信 5.进程的并发执行是指若干个进程_B_。

A.同时执行 B.在执行的时间上是重叠的

C.在执行的时间上是不可重叠的 D.共享系统资源

6.若P、V操作的信号量S初值为2,当前值为 –1,则标志有_B_等待进程。

A.0个 B.1个 C.2个 D.3个

7.程序的顺序执行通常在_①A_的工作环境中,具有_②C_特征;程序的并发执行在_③B_的工作环境中,具有_④D_特征。 A.单道程序 B.多道程序 C.程序的可再现性 D.资源共享 8.进程的三个基本状态在一定条件下可以相互转化,进程由就绪状态变为运行状态的条件是_①D_,由运行状态变为阻塞状态的条件是_②B_。

A.时间片用完 B.等待某事件发生

C.等待的某事件已发生 D.被进程调度的程序选中 9.下列的进程状态变化中,_C_变化是不可能发生的。 A.运行→就绪 B.运行→等待 C.等待→运行 D.等待→就绪

10.一个运行的进程用完了分配给它的时间片后,它的状态变为_A_。

A.就绪 B.等待

C.运行 D.由用户自己确定 11.用P、V操作管理临界区时,信号量的初值应定为_C_。 A. –1 B. 0

C. 1 D.任意值

12.用V操作唤醒一个等待进程时,被唤醒进程的状态变为_B_。 A.等待 B.就绪 C.运行 D.完成

13.进程间的同步是指进程间在逻辑上的相互_B_关系。 A.联接 B.制约 C.继续 D.调用

14. _D_是一种只能进行P操作和V操作的特殊变量。 A.调度 B.进程 C.同步 D.信号量

15. _B_是解决进程间同步和互斥的一对低级通信原语。 A.lock和unlock B.P和V

C.W和S D.Send和Receive 16.下面对进程的描述中,错误的是_D_。

A.进程是动态的概念 B.进程执行需要处理机 C.进程是有生命期的 D.进程是指令的集合 17.下面的叙述中正确的是_D_。

A.操作系统的一个重要概念是进程,因此不同进程所执行的代码有一定不同。

B.为了避免发生进程死锁,各进程只能逐个申请资源。 C.操作系统用PCB管理进程,用户进程可以从PCB中读出与本身运行状况有关的信息。

D.进程同步是指某些进程之间在逻辑上的相互制约关系。

18.进程控制就是对系统中的进程实施有效的管理,通过使用_C_、进程撤消、进程阻塞、进程唤醒等进程呢感控制原语实现。 A.进程运行 B.进程管理 C.进程创建 D.进程同步 19.信箱通信是一种_B_通信方式。

A.直接通信 B.间接通信 C.低级通信 D.信号量 20.操作系统通过_B_对进程进行管理。

A.进程 B.进程控制块

C.进程启动程序 D.进程控制区 21.操作系统通过_B_对进程进行管理。

A. JCB B. PCB C. DCT D. CHCT 22.在操作系统中,解决进程间的_①D_和_②B_问题的一种方法是使用_③F_。

A.调度 B.互斥 C.通讯 D.同步 E.分派 F.信号量 23.某胸的进程状态如图2.5所示,a是_①B_状态,b是_②D_状态,c是_③C_状态。1表示_④B_,2表示_⑤A_,3表示发生了等待事件,4表示等待事件结束。下列情况中,当发生前者的状态转换时,_⑥A_会导致发生后者的状态转换。 ①②③: A.挂起 B.运行 C.等待 D.就绪 E.睡眠

④⑤: A.落选 B.选中 C.等待 ⑥: A.2→1 B.4→2

a 2 3

1 c b 4 图2.5某系统进程状态图

24.用P、V操作可以解决_A_互斥问题。

A.一切 B.某些 C.正确 D.错误 25.通常,用户进程被建立后,_B_。

A.便一直存在于系统中,直到被操作人员撤消。 B.随着作业运行正常或不正常结束而撤消。 C.随着时间片轮转而撤消与建立。

D.随着进程的阻塞或唤醒而撤消与建立。

26.在操作系统中,进程是一个具有一定独立功能的程序在某个数据集上的一次_B_

A.等待活动 B.运行活动 C.单独操作 D.关联操作

27.一个进程被唤醒意味着_D_。

A.该进程重新占有了CPU B.它的优先权变为最大 C.其PCB移至等待队列队首 D.进程变为就绪态 28.下面所述步骤中,_ A_不是创建进程所必需的。

A.由调度程序为进程分配CPU B.建立一个进程控制块

C.为进程分配内存 D.将进程控制块链入就绪队列 29.多道程序环境下,操作系统分配资源以_C_为基本单位。 A.程序 B.指令 C.进程 D.作业 30.对于两个并发进程,设互斥信号量为mutex,若mutex=0,则_B_。 A.表示没有进程进入临界区 B.表示有一个进程进入临界区

C.表示有一个进程进入临界区,另一个进程等待进入 D.表示有两个进程进入临界区

31.两个进程合作完成一个任务。在并发执行中,一个进程要等待其合作伙伴发来消息,或者建立某个条件后再向前执行,这种制约性合作关系被称为进程的_A_。

A.同步 B.互斥 C.调度 D.执行

32.为了进行进程协调,进程之间应当具有一定的联系,这种联系通常采用进程间交换数据的方式进行,这种方式称为_D_。 A.进程互斥 B.进程同步 C.进程制约 D.京城通信

二、填空题:

1.进程的基本特征有_动态_、_并发_、独立、异步及结构特征。 2.信号量的物理意义是当信号量值大于零时表示_可用资源的树目_;当信号量值小于零时,其绝对值为_因请求该资源而被阻塞的进程数目_。

3.临界资源的概念是_一次仅允许一个进程访问的资源_,而临界区是指_进程中访问临界资源的那段程序代码_。

4.进程在运行过程中有三种基本状态,它们是_运行_、_就绪_、_等待_。

5.进程主要由_程序段_、_数据段_、 PCB 三部分内容组成,其中_PCB_是进程存在的惟一标志。而_程序段_部分也可以为其他进程共享。

6.系统中各进程之间逻辑上的相互制约关系称为_进程同步_。

7.若一个进程已进入临界区,其他欲进入临界区的进程必须_等待_。 8.将进程的_PCB_链接在一起就形成了进程队列。

9. 用P、V操作管理临界区时,任何一个进程在进入临界区之前应调用_P_操作,退出临界区时应调用_V_操作。

10.用信箱实现通信时,应_发送_和_接收_两条基本原语。 11.在多道程序系统中,进程之间存在着不同制约关系可以划分为两类:_同步_与_互斥_。_同步_指进程间具有的一定逻辑关系;_互斥_是指进程间在使用共享资源方面的约束关系。

12.对于信号量可以做_P_操作和_V_操作,_P_操作用于阻塞进程,_V_操作用于释放进程。程序中的_P_和_V_操作应谨慎使用,以保证其使用的正确性,否则执行时可能发生死锁。

13.程序顺序执行时有顺序性、_封闭性_和可再现性的特点。

14.m个进程共享同一临界资源,若使用信号量机制实现对临界资源的互斥访问,则信号量值的变化范围是_1至(m-1)_。

15.设系统中有n(n﹥2)个进程,且当前不在执行进程调度程序,试考虑下述四种情况:

①没有运行进程,有2个就绪进程,n个进程处于等待状态。 ②有1个运行进程,没有就绪进程,n-1进程处于等待状态。 ③有1个运行进程,有1个就绪进程,n-2进程处于等待状态。 ④有1个运行进程,有n-1个运行进程,没有进程处于等待状态。 上述情况中,不可能发生的情况是_①_。

16.进程是一个_动_态概念,而程序是一个_静_态概念。

17.在一个单处理机系统中,若有5个用户进程,且假设当前时刻为用户态,则处于就绪状态的用户进程最多有_4_个,最少有_0_个。 18.操作系统中,对信号量S的P原语操作定义中,使进程进入相应等待队列等待的条件是_s<0_。

19.下面关于进程的叙述不正确的是_③_。

①进程申请CPU得不到满足时,其状态变为等待状态。 ②在单CPU系统中,任一时刻有一个进程处于运行状态。 ③优先级是进行进程调度的重要依据,一旦确定不能改变。 ④进程获得处理机而运行是通过调度而实现的。

20.信箱逻辑上分成_信箱头_和_信箱体_两部分。_信箱头_中存放有关信箱的描述。_信箱体_由若干格子组成,每格存放一信件,格子的数目和大小在创建信箱时确定。

解 析 题

1.叙述进程和程序的主要区别。

2.在测量控制系统中,数据采集任务把所采集的数据送入一单缓冲区;计算任务从该单缓冲区中去出数据进行计算。试写出利用信号量机制实现两者共享单缓冲区的同步算法。 3.已知一个求值公式(A2+3B)/(B+5A),若A、B已赋值,试画出该公式求值过程的前驱图。

4.图2.7给出了四个进程合作完成某一任务的前趋图,试说明这四个进程间的同步关系,并用P、V操作描述它。

S1

S2 S3

S4

图2.7 四个合作进程的前趋图

5.某系统的今年成状态转换图如图2.8所示,请说明: (1)引起各种状态转换的典型事件有哪些?

(2)当我们观察系统中某些进程时,能够看到某一进程产生的一次状态转换能引起另一进程作一次状态转换。在什么情况下,当一个进程发生转换3时能立即引起另一进程发生转换1? (3)试说明是否会发生下述因果转换:

2→1 ; 3→2 ; 4→1

执行 2 3

1 6.在单处理机的分时系统中,分配给进程P的时间片用完后,系统进行就绪 阻塞 切换,结果调度到的仍然是进程P。有可能出现上述情形吗?如果可能4 请说明理由。 图2.8某系统进程状态图

7.桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。

8.哲学家甲请哲学家乙、丙、丁到某处讨论问题,约定全体到齐后开始讨论;在讨论的间隙四位哲学家进餐,每人进餐时都需使用刀、叉各一把,餐桌上的布置如图2.9所示,请用信号量及P、V操作说明这四位哲学家的同步、互斥过程。

9.某数据库有一个写进程,多个读进程,它们之间读、写操作的互斥要求是:写进程正在写该数据库时不能有其他进程读该数据库,也不能有其他进程写该数据库;读进程之间不互斥,可以同时读该数据库。请用信号量及P、V操作描述这一组进程的工作过程。 10.设在公共汽车上,司机和售票员的活动分别是: 司机的活动: 启动车辆;

正常行车; 到站停车;

售票员的活动:关车门;

售票; 开车门;

在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用信号量和P、V操作实现它们的同步。

11.设有一个发送者进程和一个接受者进程,其流程土如图2.10所示。S是用于实现进程同步的信号量,mutex是用于实现进程互斥的信号量。试问流程图中的A、B、C、D四框中应填写什么?假定缓冲区无限多个,s和mutex的初值应为多少? 发送者进程: 申请缓冲区

B 把信息写入缓冲区

V(s)

A

将缓冲区放到消息链尾

接收者进程: :

C

D

从消息链首取一个缓冲区

V(mutex)

从缓冲区中取出信息

释放缓冲区

12.下述程序是解决两个进程互斥访问临界区温暖体的一种方法,试从“互斥”、“有空让进”、“有限等待”等三个方面讨论它是否正确。 int c1=0; int c2=0; main ( ) {

cobegin

p1 ( );

p2 ( ); /*进程p1、p2并发执行*/ coend }

p1 ( ) /*第一个进程p1*/ {

while ( 1 ) {

other section 1 ; /*其他部分*/ do c1=1 – c2 ; while ( c2==0 );

critical section ; /*临界区*/ c1 =1; } }

p2 ( ) /*第二个进程p2*/ {

while ( 1 ) {

other section 2 ; /*其他部分*/ do

c2=1 – c1 ; while ( c1==0 );

critical section ; /*临界区*/ c2 =1; } }

13. ①写出P、V操作的定义。

②有三个进程PA、PB和PC合作解决文件打印问题:PA将文件记录从磁盘读入主存的缓冲区1,每执行一次读一个记录;PB将缓冲区1的内容复制到缓冲区2,每执行一次复制一个记录;PC将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小等于一个记录大小。请用P、V操作来保证文件的正确打印。

14.设有八个程序prog1、prog2、…、prog8。它们在并发系统中执行时

有如图2.13所示的制约关系,试用P、V操作实现这些程序见的同步。 prog1 prog2 prog3 prog5

prog4

prog6 prog7 prog8

图2.13 进程并发执行的制约关系

15.有一个仓库,可以存放A和B两种产品,但要求: (1)每次只能存入一种产品(A或B); (2) - N﹤A产品数量 – B产品数量﹤M。

其中,N和M只正整数。试用P、V操作描述产品A与产品B的入库过程。

16.进程A1、A2、…、An1通过m个缓冲区向进程B1、B2、…、Bn2不断地发送消息。发送和接收工作遵循如下规则:

①每个发送进程一次发送一个消息,写入一个缓冲区,缓冲区大小等于消息长度;

②对每一个消息,B1、B2、…、Bn2都须各接收一次,读入各自的数据区内;

③m个缓冲区都满时,发送进程等待;没有可读的消息时,接收进程等待。

试用P、V操作组织正确的发送和接收工作。

解析题:

1.(1)程序是指令的有序集合,其本身没有任何运行的含义,它是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。

(2)程序的存在是永久的,而进程则是有生命期的,它因创建而产生,因调度而执行,因得不到资源而暂停,因撤消而灭亡。

(3)程序仅是指令的有序集合。而进程则由程序、数据和进程控制块组成。

(4)进程与程序之间不是一一对应的,即同一程序同时运行于若干不同的数据集合上,它将属于若干个不同的进程,而一个进程可以执行多个程序。

2.在本题中,应设置两个信号量Sf、Se,信号量Sf表示缓冲区中是否有可供打印计算结果,其初值为0;信号量Se用于表示缓冲区有无空位置存放新的信息,其初值为1。本题的同步描述如下: int Se=1; int Sf=0; {

cobegin get ( ) ;

compute ( ) ; coend }

get ( ) {

while (采集工作未完成) {

采集一个数据; P ( Se ) ;

将数据送入缓冲区中; V ( Sf ) ; } }

compute ( ) {

while (计算工作未完成) {

P ( Sf ) ;

从缓冲区中取出数据; V ( Se) ;

进行数据计算; } }

3.

4. 图2.7说明任务启动后S1先执行。当S1结束后,S2、S3可以开始执行。S2、S3完成后,S4才能开始执行。为了确保这一执行顺序,设三个同步信号量b2、b3、b4分别表示进程S2、S3、S4是否可以开始执行,其初值均为0。这四个进程的同步描述如下:

int b2=0; /* 表示进程S2 是否可以开始执行*/ int b3=0; /* 表示进程S3 是否可以开始执行*/ int b4=0; /* 表示进程S4 是否可以开始执行*/ main ( ) {

cobegin S1 ( );

S2 ( ); S3 ( ); S4 ( ); coend }

S1 ( ) {

v ( b2 ); v ( b3 ); }

S2 ( ) {

p ( b2 );

v ( b4 ); }

S3 ( ) { … … p ( b3 );

v ( b4 );

}

S4 ( ) {

p ( b4 );

v ( b4 ); /* 因在S2及S3 完成时对b4做了v 操作,因此此

处需两个p操作*/

}

5.(1)在本题所给的进程状态转换图中,存在四种状态转换。当进程调度程序从就绪队列中选取一个进程投入运行时间引起转换1;正在执行的进程如因时间片用完而被暂停执行就会引起转换2;正在执行的进程因等待的事件尚未发生而无法执行(如进程请求完成I/O)则会引起转换3;当进程等待的事件发生时(如I/O完成)则会引起转换4。 (2)如果就绪队列非空,则一个进程的转换3会立即引起另一个进程的转换1。这是因为一个进程发生转换3意味着正在执行的进程由执行状态变为阻塞状态,这时,处理机空闲,进程调度程序必然会从就绪队列中选取一个进程并将它投入运行,因此只要就绪队列非空,一个进程的转换3能立即引起另一个进程的转换1。

(3)所谓因果转换指的是有两个转换,一个转换的发生会引起另一个转换的发生,前一个转换称为因,后一个转换称为果,这两个转换称为因果转换。当然这种因果关系并不是什么时候都能发生,而是在一定条件下才会发生。

2→1:当某进程发生转换2时,就必然引起另一进程的转换1。因为当发生转换2时,正在执行的进程从执行状态变为就绪状态,进程调度常年工序必然会从就绪队列中选取一个进程投入运行,即发生转换1。

3→2:某个进程的转换3决不可能引起另一进程发生转换2。这是因为当前执行进程从执行状态变为阻塞状态,不可能又从执行状态变为就绪状态。

4→1:当处理机空闲且就绪队列为空时,某一进程的转换4就会引起该进程的转换1。因为此时处理机空闲,一旦某个进程发生转换4,

… … 就意味着有一个进程从阻塞状态变为就绪状态,因而调度程序就会将就绪队列中的此进程投入运行。

6.有可能出现上述情况。例如:若在进程P时间片用完后,被迫回到就绪队列时,就绪队列为空,这样进程P就是就绪队列中惟一的一个进程,于是调度程序选种的进程必然是进程P;又如在按有限级调度的系统中,就绪队列按进程优先级排列,在进程P时间片用完之后回到就绪队列时,若其优先级高于当前就绪队列中的其他进程,则它将排在就绪队列之首,从而再次被调度程序选中并投入运行。

7.在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为1;信号量So表示盘子中是否有橘子,其初值为0;信号量Sa表示盘子中是否有苹果,其初值为0。同步描述如下: int S=1; int Sa=0; int So=0; main ( ) {

cobegin

father ( );

son ( );

daughter ( ); coend }

father ( ) {

while ( 1 ) {

P ( Se ) ;

将水果放入盘中;

if (放入的是橘子) v ( So ); else v ( Sa ) ; } }

son ( ) {

while ( 1 ) {

P ( So ) ;

从盘中取出橘子; v ( S ); 吃橘子; }

}

daughter ( ) {

while ( 1 ) {

P ( Sa ) ;

从盘中取出苹果; v ( S ); 吃苹果; } }

8.在本题中,应设置四个信号量fork1、 fork2、knife1、knife2,其初值均为1,分别表示资源叉1、叉2、刀1、刀2是否可用。同步描述如下:

int fork1=1; int fork2=1; int knife1=1;

int knife2=1; main ( ) {

cobegin

Pa ( ) ;

Pb ( ) ; Pc ( ) ; Pd ( ) ; coend }

Pa ( )

{

while ( 1 ) {

P ( knife1 ) ; P ( fork1 ) ; 进餐;

v ( knife1 ) ;

v (fork1 ) ; 讨论问题; }

}

Pb ( ) {

while ( 1 ) {

P ( knife2 ) ; P ( fork1 ) ; 进餐;

v ( knife2 ) ;

v (fork1 ) ; 讨论问题; } }

Pc ( ) {

while ( 1 ) {

P ( knife2 ) ; P ( fork2 ) ; 进餐;

v ( knife2 ) ;

v (fork2 ) ; 讨论问题; } }

Pd ( )

{

while ( 1 ) {

P ( knife1 ) ; P ( fork2 ) ; 进餐;

v ( knife1 ) ;

v (fork2 ) ; 讨论问题; }

}

9.在本题中,允许读进程同时读数据库,但写进程正在写数据库时不允许其他进程读数据库,也不允许其他进程写该数据库。为了解决读、写进程之间的同步,一贯设置两个信号量和一个共享变量:读互斥信号量rmutex,用于使读进程互斥地访问共享变量count,其初值为1;写互斥信号量wmutex,用于实现写进程与读进程繁荣互斥及写进程与写进程的互斥,其初值为1;共享变量count,用于记录当前正在读数据库的读进程数目,初值为0。其工作过程如下: int rmutex=1; int wmutex=1; int count=0; main ( ) {

cobegin

reader ( ) ;

writer ( ) ; coend }

reader ( ) {

while ( 1 ) {

P ( rmutex ) ;

if ( count==0) p ( wmutex ); /*当第一个读进程读数据库时,阻止进程写*/

count ++; v ( rmutex ) ; 读数据库; p ( rmutex ) ;

count -- --;

if ( count==0) v ( wmutex ); /*当最后一个读进程读完数据

库时,允许写进程写*/

v ( rmutex ) ; } }

writer ( ) {

while ( 1 ) {

P ( wmutex ) ; 写数据库; v ( wmutex ); } }

10.在本题中,应设置两个信号量:S1、S2,S1表示是否允许司机启动汽车,其初值为0;S2表示是否允许售票员开门,其初值为0。用P、V原语描述如下: int S1=0; int S2=0; main ( ) {

cobegin

driver ( ) ;

busman ( ) ; coend }

driver ( ) {

while ( 1 ) {

P ( S1 ) ; 启动车辆; 正常行车; 到站停车; v ( S2 ) ; }

}

busman ( ) {

while ( 1 ) {

关车门; v ( S1 ); 售票;

p ( S2 ); 开车门; 上下乘客; } }

11.由上述分析可知,A、B、C、D四框应分别填入: A框 P(mutex) B框 V(mutex) C框 P(s)

D框 P(mutex)

开始时,消息链上没有可供接收的信息,所以s的初值为0;互斥信号量mutex的初值为1。 12. 13.

①P、V操作是两条原语,它们的定义如下: P操作: P操作记为P(S),其中S为一信号量,它执行时主要完成下述动作:

S = S – 1

若S≧0,则进程继续运行。

若S﹤0,则该进程被阻塞,并将它插入该信号量的等待队列中。 V操作: V操作记为V(S),其中S为一信号量,它执行时主要完成下述动作: S = S + 1

若S﹥0,则进程继续执行。 若S≦0,则从信号量等待队列中移出队首进程,使其变为就绪状态。 ②在本题中 ,进程PA、PB、PC之间的关系为:PA与PB共用一个单缓冲区,而PB 又与PC共用一个单缓冲区, 其合作方式可用图2.12表示。当缓冲区1为空时,进程PA可将一个记录读入其中;若缓冲区1中有数据且缓冲区2为空,则进程PB可将记录从缓冲区1复制到缓冲区2中;若缓冲区2中有数据,则进程PC可以打印记录。在其他条件下,相应进程必须等待。事实上,这是一个生产者—消费者问题。

为遵循这一同步规则。应设置四个信号量empty1、empty2、full 1、full 2,信号量empty1及empty2分别表示缓冲区1及缓冲区2是否为空,其初值为1;信号量full 1及full 2分别表示缓冲区1及缓冲区2是否有记录可供处理,其初值为0。其同步描述如下: int empty1=1; int empty2=1; int full 1=0;

int full 2=0; main ( ) {

cobegin

PA ( ) ;

PB ( ) ; PC ( ) ; coend }

PA ( ) {

while ( 1 ) {

从磁盘读一个记录;

P ( empty1 ) ;

将记录存入缓冲区1;

v ( full 1 ) ; }

}

PB ( ) {

while ( 1 ) {

P ( full 1 ) ;

从缓冲区1中取出记录;

v ( empty1); P ( empty2 ) ;

将记录存入缓冲区2; v ( full 2 ) ; } }

PC ( ) {

while ( 1 ) {

P ( full 2 )) ;

从缓冲区2中取出记录;

v ( empty2 ) ; 打印记录; } } 14.

int f1=0;

int f2=0; int f3=0; int f4=0; int f5=0;

int f6=0; int f7=0;

main ( ) {

cobegin

prog1 ( );

prog2 ( ); prog3 ( ); prog4 ( ); prog5 ( prog6 ( prog7 ( coend }

prog1 ( ) {

… v ( f1 ); v ( f1 ); v ( f1 ); }

prog2 ( ) {

… v ( f2 ); v ( f2 ); v ( f2 ); }

prog 3 ( ) {

p ( f1 ); p ( f2 );

… v ( f3 ); }

prog 4 ( ) {

p ( f1 ); ); ); ); p ( f2 );

v ( f4 );

}

prog 5 ( ) {

p ( f1 ); p ( f2 );

v ( f5 ); }

prog 6 ( ) {

p ( f3 );

v ( f6 ); }

prog 7 ( ) {

p ( f5 );

v ( f7 ); }

prog8 ( ) {

p ( f4 ); p ( f6 ); p ( f7 ); }

15.在本题中,我们可以设置两个信号量来控制A、B产品的存放数量,sa表示当前允许A产品比B产品多入库的数量,即在当前库存量和B产品不入库的情况下,还可以允许sa个A产品入库;sb表示当前允许B产品比A产品多入库的数量,即在当前库存量和A产品不入库的情况下,还可以允许sb个B产品入库。初始时,sa为M – 1,sb为N

… … … … … – 1。当往库中存放一个A产品时,则允许存入B产品的数量也增加1;当往库中存放一个B产品时,则允许存入A产品的数量也增加1。 产品A、B的入库过程描述如下: int mutex=1; int sa= M – 1; int sb= N – 1; main ( ) {

while ( 1 ) {

取一个产品; if ( 取的是A产品) {

P ( sa ) ;

P ( mutex ) ; 将产品入库; v ( mutex ) ;

v ( sb ) ; }

else /*取的产品是B*/ {

P ( sb ) ;

P ( mutex ) ; 将产品入库; v ( mutex ) ;

v ( pa ) ; } } }

16.在本题中,应设置一个信号量mutex实现诸进程对缓冲区的互斥访问;两个信号量数组empty[n2]和full [n2]描述n2组缓冲区的使用情况。Mutex的初值为1;数组empty中的元素初值为m;数组full中的元素初值为0。其同步关系描述如下: int mutex , empty[n2] , full [n2] ; int i ;

mutex =1;

for ( i = 0; i≦n2 – 1 ; i ++) {

empty[i]=m; full [i]=0; }

main ( ) {

cobegin

A1 ( ) ;

A2 ( ) ;

An1 ( ) ; B1 ( ) ; B2 ( ) ;

Bn2 ( ); coend }

send ( ) /*发送消息*/ {

int i;

for ( i = 0; i≦n2 – 1 ; i ++)

p ( empty[i] ) ; P ( mutex ) ;

将消息放入缓冲区;

v ( mutex );

for ( i = 0; i≦n2 – 1 ; i ++)

v ( full [i] ) ;

}

receive ( ) /*进程B1接收消息*/ {

p ( full [i] ) ; P ( mutex ) ;

将消息从缓冲区中取出;

v ( mutex );

… … v ( empty[i] ) ;

}

Ai ( ) /*因发送进程A1、A2,…An1的程序类似,这里只给出进程Ai的描述*/ {

while ( 1 ) {

send ( ); }

Bi ( ) /*因接受进程B1、B2,…Bn1的程序类似,这里只给出进程Bi的描述*/ {

while ( 1 ) {

receive ( i ); }

… … … …