2024年3月11日发(作者:)
一、单项选择题:
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_是解决进程间同步和互斥的一对低级通信原语。
和unlock B.P和V
C.W和S 和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.已知一个求值公式(A
2
+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.进程A
1
、A
2
、…、An
1
通过m个缓冲区向进程B
1
、B
2
、…、Bn
2
不
断地发送消息。发送和接收工作遵循如下规则:
①每个发送进程一次发送一个消息,写入一个缓冲区,缓冲区大小等
于消息长度;
②对每一个消息,B
1
、B
2
、…、Bn
2
都须各接收一次,读入各自的数据
区内;
③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
A
1
( ) ;
A
2
( ) ;
An
1
( ) ;
B
1
( ) ;
B
2
( ) ;
Bn
2
( );
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 ( ) /*进程B
1
接收消息*/
{
p ( full [i] ) ;
P ( mutex ) ;
将消息从缓冲区中取出;
v ( mutex );
…
…
v ( empty[i] ) ;
}
A
i
( ) /*因发送进程A
1
、A
2
,
…
An
1
的程序类似,这里只给出进程
A
i
的描述*/
{
while ( 1 )
{
send ( );
}
B
i
( ) /*因接受进程B
1
、B
2
,
…Bn
1
的程序类似,这里只给出进程
B
i
的描述*/
{
while ( 1 )
{
receive ( i );
}
…
…
…
…


发布评论