您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 扬州大学操作系统综合题
1.生产者与消费者设有一缓冲池P,P中含有20个可用缓冲区,一个输入进程将外部数据读入P,另有一个输出进程将P中数据取出并输出。若讲程每次操作均以一个缓冲区为单位,试用记录型信号量写出两个进程的同步算法,要求写出信号量的初值。解:semaphoremutex=1;semaphoreempty=20;semaphorefull=0;intin,out=0;itemp[20];voidProducer(){while(ture){produceraniteminnextp;wait(empty);wait(mutex);p[in]:=nextp;in:=(in+1)mod20;signal(mutex);signal(full);}}voidConsumer(){while(ture){wait(full);wait(mutex);nextc:=p[out];out:=(out+1)mod20;signal(mutex);signal(empty);}}有一群生产者进程在生产产品,此产品提供给消费者去消费。为使生产者和消费者进程能并发执行,在它们之间设置一个具有n个缓冲池,生产者进程可将它所生产的产品放入一个缓冲池中,消费者进程可从一个缓冲区取得一个产品消费。semaphoremutex=1,empty=n,full=0;itembuffer[n];//缓冲区intin=out=0;//输入、输出指针voidproducer(){while(1){生产一个产品nextp;…wait(empty);//等待空缓冲区的数目非0wait(mutex);//等待无进程操作缓冲区buffer[in]=nextp;//往Buffer[in]放产品in=(in+1)modn;signal(mutex);//允许其它进程操作缓冲区signal(full);//增加已用缓冲区的数目}}voidconsumer(){while(1){……wait(full);//等待已用缓冲区的数目非0wait(mutex);//等待无进程操作缓冲区nextc=buffer[out];//从Buffer[out]取产品out=(out+1)modn;signal(mutex);//允许其它进程操作缓冲区signal(empty);//增加空缓冲区的数目消费nextc产品;}}main(){cobegin{producer();consumer();}}}利用AND信号量解决生产者-消费者问题semaphoremutex=1,empty=n,full=0;itembuffer[n];//缓冲区intin=out=0;//输入、输出指针voidproducer(){while(1){…生产一个产品nextp;…swait(empty,mutex);buffer[in]=nextp;//往Buffer[in]放产品in=(in+1)modn;ssignal(mutex,full);}}voidconsumer(){while(1){……swait(full,mutex);nextc=buffer[out];//从Buffer[out]取产品out=(out+1)modn;signal(mutex,empty);消费nextc产品;}}有一阅览室,共有100个座位。读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。读者离开时要注销掉登记内容。试用wait和signal原语描述读者进程的同步问题varmutex,readcount:semaphore:=1,100;BeginParbeginProcessReader:beginrepeatwait(readcount);wait(mutex);填入座号和姓名完成登记;signal(mutex);阅读wait(mutex)删除登记表中的相关表项,完成注销signal(mutex);signal(readcount);untilfalse;end;parend;End;在公共汽车上,司机和售票员各行其职,司机负责开车和到站停车;售票员负责售票和开、关车门;当售票员关好车门后驾驶员才能开车行驶。试用wait和signal操作实现司机和售票员的同步。vars1,s2:semaphore:=0,0;beginparbeginProcessDriverbeginrepeatgoright;stopbus;signal(s2);wait(s1);untilfalse;end;ProcessBookingClerk;beginrepeatticketing;wait(s2);openthedoor;closethedoor;signal(s1);untilfalseend;parend;end;2.吃水果桌上有一只盘子,可以放一个水果。父亲总放苹果;母亲总放香蕉;儿子专等吃盘里的香蕉;女儿专等吃盘里的苹果。设三个信号量:dish表示是否可以放水果apple表示是否盘中有苹果banana表示是否盘中有香蕉Father:……P(dish);放苹果;V(apple);mother:……P(dish);放香蕉;V(banana);son:……P(banana);eat;V(dish);daughter:……P(apple);eat;V(dish);桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子;儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿3个并发进程的同步。BeginPlate:=1;apple:=0;orange:=0;CobeginFather:beginrepeatp(plate);将水果放入盘中;if放入的是桔子thenV(orange)elseV(apple)UntilfalseEnd;Son:beginrepeatp(orange);从盘中取出桔子;V(plate)吃桔子UntilfalseEnd;Daughter:beginrepeatp(apple);从盘中取出苹果;V(plate)吃苹果UntilfalseEndCoendEnd;3.5个哲学家围绕一张圆桌而坐,进餐时需要同时拿起他左边和右边的两支筷子Philosopheri:Repeatthink;P(chopstick[i]);P(chopstick[(i+1)mod5]);eat;v(chopstick[i]);v(chopstick[(i+1)mod5]);think;Untilfalse3.读者写者问题读者:{if(readcount=0)thenP(wmutex);readcount=readcount+1;读;readcount=readcount-1;if(readcount=0)thenV(wmutex);};写者:{P(S);P(wmutex);写V(wmutex);……V(S);};4.设有观察者和报告者在一条单向行驶的公路上统计通过的卡车数。其中观察者负责对通过的卡车计数;报告者负责将计数值打印出来,然后将计数值清零。Begincount:integer;count:=0;CobeginObserver;Reporter;CoendendObserverBeginL1:observenextcar;count:=count+1;gotoL1;endReporterbeginL2:printcounter;count:=0;gotoL2;end
本文标题:扬州大学操作系统综合题
链接地址:https://www.777doc.com/doc-2416047 .html