操作系统进程部分的习题

更新时间:2023-12-10 13:04:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

进程部分的习题

1. 在公共汽车上,司机进程和售票员进程各司其职。司机在正常行车中售票员售票,两者之间没有制约关系,可以任意并发。但是在其他环节,司机和售票员进程之间存在着如下同步关系:

1)司机停车后等待售票员关门后才能启动车辆。

2) 售票员售完票后,等待司机到站停车,停车后才能打开车门。 var door,stop:semaphore:=0,0begin

parbegin

司机进程: begin while(true){

wait(door); //等待售票员发送关门信息 启动车辆; 正常行车; 到站停车;

signal(stop); //给售票员发送到站信息 } end;

售票员进程: begin while(true){

关车门;

signal(door); //给司机发送关门信息 售票;

wait(stop); //等待司机发送到站信息 开车门; 上下乘客; } end

parend end.

2.某寺庙,有小和尚,老和尚若干。有一水缸,由小和尚提水入缸供老和尚饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次中能容下一个桶取水。水桶总数为3个。每人一次取缸水仅为1桶,且不可同时进行。试用记录型信号量给出有关取水、入水的算法描述。

根据题意,定义信号量及其初值如下:

(1)水桶为临界资源需互斥使用, 定义信号量bucket,因有3个桶,故初值为3; (2)水井一次只能允许下一个桶取水,定义互斥信号量well,初值为1; (3)水缸一次只能允许一个人取水,定义互斥信号量jar,初始值为1;

(4)empty和full用于小和尚和老和尚之间的同步制约关系。因为缸能存10桶水,所以empty初始值为10;开始时缸中没有水,full的初始值为0。

semaphore bucket=3,jar=1,full=0,empty=10,well=1; young_monk(){ /*小和尚入水算法*/ while(1){ wait(empty); wait (bucket); wait (well); 从水井中打水; signal(well); wait (jar); 倒入水缸; signal (jar); signal (bucket);

signal (full);

} }

old_monk(){ /*老和尚取水算法*/ while(1){ wait(full); wait (bucket); wait (jar); 从缸中取水; signal (jar);

signal (bucket); signal (empty); 从桶中倒入饮用; } }

3.设有3个进程A、B、C,其中A与B构成一对生产者与消费者(A为生产者,B为消费者),共享一个由n个缓冲区组成的缓冲池;B与C也构成一对生产者与消费者(此时B为生产者,C为消费者),共享另一个由m个缓冲区组成的缓冲池。用信号量机制协调它们的同步问题。

Semaphore full1 = 0, full2 = 0, empty1 = n, empty2 = m, mutex1 = 1, mutex2 = 1; int in1 = 0, out1 = 0, in2 = 0, out2 = 0; Buffer buffer1[n], buffer2[m]; A( ){

while(true){ }

to produce an item; wait(empty1); wait(mutex1);

把产品放入buffer1[in1]; in1 = (in1+1) mod n; signal(mutex1); signal(full1);

} B( ){ } C( ){

while(true){

wait(full2); wait(mutex2); while(true){ }

wait(full1); wait(mutex1);

从buffer1[out1]获得产品; out1 = (out1+1) mod n; signal(mutex1); signal(empty1); … … … wait(empty2); wait(mutex2);

把产品放入buffer2[in2]; in2 = (in2+1) mod m; signal(mutex2) signal(full2);

}

}

从buffer2[out2]获得产品; out2 = (out2+1) mod m; signal(mutex2); signal(empty2);

4.理发店里有一位理发师,一把理发椅和n把供等候理发顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉。当一个顾客到来时,他必须先叫醒理发师。如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,他们就坐下来等;如果没有空椅子,他就离开。用信号量机制来描述他们的行为。

Semaphore max=n+1, next=1, ready=0, finished=0; barber( ){ } ustomer( ){

while(true){

wait(max); while(true){ }

wait(ready); 给一个顾客理发; signal(finished); signal(next);

}

}

signal(ready); wait(next); 让理发师理发; wait(finished); signal(max); 离开;

5.三个进程P1,P2,P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这3个进程的同步与互斥活动。 Semaphore mutex=1, empty = N, even = 0, odd = 0; P1(){

while(true){

int n;

n = produce(); wait(empty) wait(mutex); put() signal(mutex) if n mod 2 == 0

}

}

signal(even);

else

signal(odd)

P2(){ } P3(){

while(true){

wait(even); wait(mutex); geteven(); signal(mutex); signal(empty); while(true){ }

wait(odd); wait(mutex); getodd(); signal(mutex); signal(empty); countodd();

}

}

counteven();

6.某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A,B两种零件,装配车间的任务是把A,B两种零件组装成产品。两个生产车间每生产一个零件后都要分别把它们送到装配车间的货架F1,F2上。F1存放A,F2存放B,F1和F2的容量均为10.装配工人每次从货架上取一个A零件和一个B零件后组装成产品。请用信号量机制来协调它们的过程。

Semaphore mutex1=1, mutex2=1, full1=0, full2=0, empty1=10, empty2=10; int in1 = in2 = out1 = out2 = 0; Buffer F1[10], F2[10] P1(){ }

while(true){ }

produce an item of A; wait(empty1); wait(mutex1);

put the item into F1[in1]; in1++;

signal(mutex1); signal(full1);

P2(){ } P3(){

while(true){

wait(full1); wait(mutex1);

get the item into F1[out1]; out1++; signal(mutex1); signal(empty1); wait(full2); wait(mutex2);

get the item into F2[out2]; while(true){ }

produce an item of B; wait(empty2); wait(mutex2);

put the item into F2[in2]; in2++;

signal(mutex2); signal(full2);

本文来源:https://www.bwwdw.com/article/wez5.html

Top