有关进程的练习题

发布时间 : 星期五 文章有关进程的练习题更新完毕开始阅读

(1)P(S1),P(S2) (2)P(S1),V(S2) (3)V(S1),P(S2) (4)V(S1),V(S2) (5)P(S1),P(S1) (6)P(S2),V(S2) (7)V(S1),P(S1) (8)V(S2),V(S2)

答:能同时进行的包括:(1)、(2)、(3)、(4)。这些操作涉及不同信号灯变量,属于关于不同组共享变量的临界区。不能同时进行的包括:(5)、(6)、(7)、(8)。这些操作涉及相同的信号变量,属于关于同一组共享变量的临界区。

8. (见习题13)对于生产者—消费者问题,假设缓冲区是无界的,试用信号量与PV操作给出解法。

答:由于是无界缓冲区,所以生产者不会因得不到缓冲区而被阻塞,不需要对空缓冲区进行管理,可以去掉在有界缓冲区中用来管理空缓冲区的信号量及其PV操作。 semaphore mutex_in=1; semaphore mutex_out=1; semaphore empty=0; int in=0,out=0;

生产者活动: 消费者活动: while(1){ while(1){ produce next product; P(empty); P(mutex_in); P(mutex_out); add the product to buffer[in]; take the product from buffer[out]; in++; out++; v(mutex_in); V(mutex_out); V(empty); } }

9.有一个大学只有一个澡堂,门口上有一块牌子,如果有一个男生进去洗澡,他就会把牌子转到“男”字样,这样只有男生会进去,女生就不会进去了;如果澡堂没人,一个女生先进了澡堂,她就会把牌子转到“女”字样,那么女生就可以进去了;请用PV操作描述这个事件,避免男女生同时出现在澡堂。

答案:这是一个条件互斥问题,与读者写者问题类似。男生和女生都在某种条件下对澡堂互斥。因此设计一个互斥信号量mutex表示是否有一个群体占用了澡堂,设计两个整型变量用来boycount和girlcount分别表示男生和女生的数目,又因为需要对这两个变量进行互斥访问,因此设计两个互斥信号量boymutex和girlmutex分别对boycount和girlcount两个共享变量互斥访问。

Semphore boymutex=1, girlmutex=1,mutex=1 int boycount=0; girlcount=0 Parbegin Boy() begin repeat

wait(boymutex);

if boycount ==0 then wait(mutex); boycount = boycount +1; signal(boymutex); 洗澡;

wait(boymutex);

boycount = boycount -1;

if boycount ==0 then signal(mutex); signal(boymutex); until false; end; Girl() begin repeat

wait(girlmutex);

if girlcount ==0 then wait(mutex); girlcount = girlcount +1; signal(girlmutex); 洗澡;

wait(girlmutex);

girlcount = girlcount -1;

if girlcount ==0 then signal(mutex); signal(girlmutex); until false; end; Parend

10.(见习题17) 一座小桥(最多只能承重两个人)横跨南北两岸,任意时刻同一方向只允许一人过桥,南侧桥段和北侧桥段较窄只能通过一人,桥中央一处宽敞,允许两个人通过或歇息。试用信号量和PV操作写出南、北两岸过桥的同步算法。 解:桥上可能没有人,也可能有一人,也可能有两人。 (a) 两人同时过桥(b) 两人都到中间(c) 南(北)来者到北(南)段

共需要三个信号量,load用来控制桥上人数,初值为2,表示桥上最多有2人;north用来控制北段桥的使用,初值为1,用于对北段桥互斥;south用来控制南段桥的使用,初值为1,用于对南段桥互斥。 semaphore load=2; semaphore north=1; semaphore south=1;

tosouth(){ P(load);

tonorth(){ P(load);

P(north); 过北段桥; 到桥中间; V(north); P(south); 过南段桥; 到达南岸 V(south); V(load); }

P(south); 过南段桥; 到桥中间 V(south); P(north); 过北段桥; 到达北岸 V(north); V(load); }

11.某寺庙,有小和尚、老和尚若干.庙内有一水缸,由小和尚提水入缸,供老和尚饮用。水缸可容纳 30 桶水,每次入水、取水仅为1桶,不可同时进行。水取自同一井中,水井径窄,每次只能容纳一个水桶取水。设水桶个数为5个,试用信号量和PV操作给出老和尚和小和尚的活动。 解:

semaphore empty=30;// 表示缸中目前还能装多少桶水,初始时能装30桶水 semaphore full=0;// 表示缸中有多少桶水,初始时缸中没有水

semaphore buckets=5;// 表示有多少只空桶可用,初始时有5只桶可用 semaphore mutex_well=1;// 用于实现对井的互斥操作 semaphore mutex_bigjar=1; // 用于实现对缸的互斥操作

young_monk(){ while(1){ P(empty); P(buckets); go to the well; P(mutex_well); get water; V(mutex_well); go to the temple; P(mutex_bigjar);

pure the water into the big jar; V(mutex_bigjar); V(buckets); V(full); } }

old_monk(){ while(){ P(full);

P(buckets);

P(mutex_bigjar); get water;

V(mutex_bigjar); drink water; V(buckets); V(empty); } }

12.试用信号灯与PV操作实现司机与售票员之间的同步问题。设公共汽车上有一个司机和一个售票员,其活动如下图 所示。

为了安全起见,显然要求: (1)关车门后方能启动车辆;(2)到站停车后方能开车门。亦即“启动车辆”这一活动应当在“关车门”这一活动之后,“开车门”这一活动应当在“到站停车”这一活动之后。

解:如果进程P2尚未推进到②处时,进程P1已经推进到①处,则P1应等待直到P2推进到②处为止;同样,如果进程P1尚未推进到③处时,进程P2已经推进到④处,则P2应等待直到P1推进到③处为止。如果进程P1在①处发生了等待,则当进程P2执行到②处时应将P1唤醒;同样,如果进程P2在④处发生了等待,则当进程P2执行到③处时应将P1唤醒。用信号量和P、V操作解决这一问题,需要定义两个信号量,一个信号量start表示是否允许司机启动车辆,另一个信号量open表示是否允许售票员开车门。初始状态是车停在始发站,车门开着,等待乘客上车。因此,两个信号量的初值都是0。 semaphore start=0; semaphore open=0; 司机的活动: P1: do{ P(start); 启动车辆; 正常行车;

售票员的活动: P2: do{ 关车门; V(start); 售票;

联系合同范文客服:xxxxx#qq.com(#替换为@)