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 ( ) { … …