3、一组生产者进程和一组消费者进程共享10个缓冲区,每个缓冲区可以存放一个整数;生产者进程每次一次性向3个缓冲区写入3个整数,消费者进程每次从缓冲区取出一个整数。用信号量实现进程的同步关系。 4、写者优先的读者写者问题:
wmutex:semaphore=1 //读者与写者之间、写者与写者之间互斥使用共享数据
S:semaphore=1 //当至少有一个写者准备访问共享数据时,它可使后续的读者等待
写完成
S2:semaphor=1 //阻塞第二个以后的等待读者
readcount,writecount: semaphore = 0,0; //当前读者数量、写者数量 mutex1 :semaphore = 1 //多个读者互斥使用readcount mutex2 :semaphore = 1 //多个写者互斥使用writecount Cobegin:
Reader: begin Repeat Wait(S2); wait(S);
wait(mutex1)
if readcount=0 then wait(wmutex); readcount++; signal (mutex1); signal(S); signal(S2); reading… wait(mutex1); readcount--;
if readcount=0 then signal(wmutex); signal(mutex1); until false; begin; writer: begin repeat;
wait(mutex2);
if writecount=0 then wait(S); writecount++;
signal (mutex2); wait(wmutex); writing…
signal(wmutex); wait(mutex2); writecount--;
if writecount=0 then signal(S);
signal (mutex2); until false; end;
13
coend;
5、有座可双向通行的单车道桥,最大载重负荷为4辆汽车。请给出任一辆车通过该桥的管理算法。
6、设公共汽车上,司机和售票员的活动分别是:
司机的活动:启动车辆; 正常行车; 到站停车; 售票员的活动:
关车门; 售票; 开车门;
在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用P、V操作实现它们的同步。
设两个信号量S和C,初值为S=0;C=0;
司机: L1: 正常行车 售票员: L2: 售票
到站停车 P(S) V(S) 开车门 P(C) 关车门 启动开车 V(C) GO TO L1 GO TO L2
7、桌子上有一个空盘子,允许存放一只水果,爸爸可以向盘中放苹果,妈妈向盘子中放橘子,女儿专门吃盘子中的苹果,儿子专门吃盘子中的橘子。规定当盘子空的时候一次只能放一只水果,请用信号量实现他们之间的同步与互斥。 S, S1, S2 :semaphore=1,0,0; Cobegin:
Process Father:
Begin:
L1: P(S);
Put Apple; V(S1); GO TO L1; End; Process Mother:
Begin:
L2: P(S);
Put Orange; V(S2); GO TO L2; End; Process Son:
Begin:
14
L3: P(S2);
Get Orange; V(S);
GO TO L1; End;
Process Daughter:
Begin:
L4: P(S1); Get Apple; V(S);
GO TO L4; End; CoEnd;
8、进程A1、A2、……An1通过m个缓冲区向进程B1、B2……Bn2不断地发送消息。发送和接收工作遵循如下规则:
(1) 每个发送进程一次发送一个消息,写入一个缓冲区,缓冲区大小等于消息长度; (2) 对每一个消息,B1,B2,…,Bn都必须接收一次,读入各自的数据区内; (3)m个缓冲区都满时,发送进程等待;没有可读的消息时,接收进程等待。
解答:本题是生产者——消费者问题的一个变形,一组生产者A1,A2,…….An1和一组消费者B1,B2,……Bn2公用m个缓冲区,每个缓冲区只要写一次,但需要读n2次,因此,我们可以把这一组缓冲区看成n2组缓冲区,每个发送者需要同时写n2组缓冲区,而每一个接收者只需读它自己对应的那组缓冲区中的对应单元。 Mutex,empty[n2],full[n2]:semaphore; Mutex=1; //多进程互斥使用缓冲区
empty[0,1,……n2]={m,m,……m}; full[0,1,…..n2]={0,0,……0}; int I; Cobegin:
Process Ai Begin: Loop:
Int I;
For ( I=0; I 将消息放入缓冲区; v(Mutex); for( I=0; I Process Bi Begin: 15 Loop: P (full[I]); P(Mutex); 从消息缓冲区取出消息; v(Mutex); v(empty[I]); Goto Loop; End; CoEnd; 9、进程A、B、C坐在圆桌旁讨论问题(面朝圆桌),每个人都从其右边那个人的信箱里取得讨论的问题,回答完一个问题后提出一个新问题放在左边的信箱中。假设A右边的信箱可放3个问题,B右边的信箱可以放2个问题,C右边的信箱可以放3个问题,初始时A右边的信箱中有2个问题。用信号量写出三个人讨论问题的同步算法。 A信箱A信箱BC信箱CB 10、战地指挥官通过无线电不断向他的三个士兵下达作战指令,但是他必须在得到所有士兵对前一条指令的“确认”之后才能下达新的指令。请用信号量或管程进行指挥官和士兵之间的协同管理。 11、有三个并发进程R,M,P,它们共享了一个可循环使用的缓冲区B,该缓冲区共有N个单元。进程R负责从输入设备读信息,每读一个字符后,把它存入缓冲区B的一个单元中;进程M负责处理读入的字符,若发现读入的字符中有空格符是,则把它改成“,”;进程P负责吧处理后的字符取出并打印输出。当缓冲区单元中的字符被进程P取出后,则又可用来存放下一次读入的字符。用P,V操作写出能正确并发执行的程序。 12、有4个进程A,B,C,D共享一个缓冲区,进程A负责循环地从文件读一个整数放入缓冲区,进程B从缓冲区取出MOD 3为0的整数并累计求和;进程C从缓冲区取出MOD 3为1的整数并累计求和;进程D从缓冲区取出MOD 3为2的整数并累计求和.请用PV操作写出能够正确执行的程序。 2.5 进程通信 1、在UNIX中,()用于吧一个进程的输出连接到另一个进程的输入(普通文件;索引文件;目录文件;管道文件) 2、关于进程通信的说法,判断: (1)进程通信有两种方式,直接通信和间接通信。 (2)直接通信固定在一对进程之间。 16