进程同步

【1】 桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。

muteApple=0,muteOrange=0,empty=1;
main(){
		cobegin
		father();
		son();
		daughter();
		coend
}
father(){							son(){					daughter(){
while(1){						   while(1){				while(1){
p(empty);			    			p(muteOrange);	p(muteApple);
放水果				    			取桔子					取苹果
if (苹果) v(muteApple);		v(empty); 			v(empty); 	
else v(muteOrange); 		吃桔子					吃苹果
}}										}}							}}

【2】四个进程A、B、C、D都要读一个共享文件F,系统允许多个进程同时读文件F。但限制是进程A和进程C不能同时读文件F,进程B和进程D也不能同时读文件F。为了使这四个进程并发执行时能按系统要求使用文件,现用PV操作进行管理,请回答下面的问题:
(1)应定义的信号量及初值:

muteAC=1, muteBD=1;

(2)在下列的程序中填上适当的P、V操作,以保证它们能正确并发工作:

     A()                B()                  C()                 D()
      {                 {                    {                  {
      p(muteAC);    	 p(muteBD);   		p(muteAC);   		 v(muteBD);
      read F;             read F;           read F;       		 read F;
     v(muteAC);           v(muteBD);	    v(muteAC);		     v(muteBD);
      }                  }                    }                  } 

【3】测量控制系统中的数据采集任务把所采集的数据送一单缓冲区;计算任务则 从该缓冲区中取出数据并进行计算。试写出利用信号量机制实现两者共享单缓冲区的同步算法。

 empty=1, muteData=0;
 
collect(){					fetch(){
while(true){				while(true){
	采集数据						p(muteData);
	p(empty);					从缓冲区取数据
	放数据到缓冲区				v(empty);
	v(muteData);				计算数据
}}							}}

【4】有一阅览室,共有100个座位。读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。读者离开时要注销掉登记内容。试用wait和signal原语描述读者进程的同步问题。

读者:进、登记、占座位、注销、释放座位
mutex=1,//互斥信号量,登记和注销在一个本子上,且只能有一人执行一种操作
empty=100,//空位数

reader(){
	while(true){
		wait(empty);
		wait(mutex);
		登记
		signal(mutex);
		阅览文章
		wait(mutex);
		注销
		signal(mutex)
		signal(empty);
}}

【5】在4×100米接力赛中,4个运动员之间存在如下关系,运动员1跑到终点把接力棒交给运动员2;运动员2一开始处于等待状态,在接到运动员1传来的接力棒后才能往前跑,他跑完100米后交给运动员3,运动员3也只有在接到运动员2传来的棒后才能跑,他跑完100米后交给运动员4,运动员4接到棒后跑完全程。请试用信号量机制对其上过程进行分析。

mute1=0, mute2=0, mute3=0;
2等1跑完才能跑,3等2跑完才能跑,4等3跑完才能跑

athlete1(){		athlete2(){        athlete3(){			athlete4(){
run 100m		wait(mute1);		wait(mute2);		wait(mute3);
signal(mute1); run 100m				run 100m			run 100m
}				signal(mute2);		signal(mute3);     }
				}					}

【6】在公共汽车上,司机和售票员各行其职,司机负责开车和到站停车;售票员负责售票和开、关车门;当售票员关好车门后驾驶员才能开车行驶。试用wait和signal操作实现司机和售票员的同步。

s1=1, s2=0;

driver(){						conductors(){
while(true){					while(true){							
wait(s1)//申请开车变量			关车门
开车							signal(s1);//释放开车变量
正常行驶							售票//关门后才售票
到站停车							wait(s2);//请求开门变量
signal(s2);//释放开门变量		开车门
}}								}}

【7】假设有3个并发进程P,Q,R,其中P负责从输入设备上读入信息,并传送给Q,Q将信息加工后传送给R,R负责打印输出。进程P,Q共享一个有m个缓冲区组成的缓冲池;进程Q,R共享一个有n个缓冲区组成的缓冲池(假设缓冲池足够大,进程间每次传输信息的单位均小于等于缓冲区长度),请写出满足上述条件的并发程序。

p:	读信息、申请缓冲池、放信息到PQ缓冲池
Q:	从PQ取信息、释放PQ缓冲池、加工信息、申请QR缓冲池 
R:	从QR取信息、释放QR缓冲池、输出信息
 
dataPQ=0, dataQR=0, //初始PQ、QR缓冲池中数据都为空
bufferPQ=m, bufferQR=n,//初始缓冲池数量
mutePQ=1, //互斥信号量。PQ不能同时访问缓冲池
muteQR=1; //互斥信号量。QR不能同时访问缓冲池

P(){						Q(){							R(){
	while(true){				while(true){					while(true){
		读取信息						wait(dataPQ);   				wait(dateQR);
		wait(bufferPQ);				wait(mutePQ);					wait(muteQR);
		wait(mutePQ);				从PQ缓冲区取信息				   从QR缓冲区取信息
		放信息到缓冲池PQ				signal(mutePQ);					signal(muteQR);
		signal(mutePQ);				signal(buffePQ);          		signal(bufferQR);
		signal(dataPQ);				加工信息							输出信息
}}									wait(bufferQR);			}}
									wait(muteQR);
									放信息到QR缓冲区
									signal(muteQR);
									signal(dataQR);
							}}

【8】有一只铁笼子,每次只能放入一只动物,猎手向笼子里放入老虎,农民向笼子里放入猪;动物园等待取笼子里的老虎,饭店等待取笼子里的猪。现请用wait和signal操作写出能同步执行的程序。

empty=1, //笼子为空
tiger=0, wildBoar=0;//没有动物

hunter(){		 zoo(){}			farmer(){			restaurant(){
while(true){    while(true){		while(true){		while(true){
wait(empty);	wait(tiger);        wait(empty);	  	wait(wildBoar);		
放老虎			取老虎		        放野猪				取野猪
signal(tiger);	signal(empty);		signal(wildBoar);	signal(empty);	
}}				}}					}}					}}

你可能感兴趣的:(操作系统)