IPC习题(下)

IPC习题

IPC习题上链接:https://blog.csdn.net/qq_37221167/article/details/99964617

5 面包师问题

面包师问题。面包师有很多面包和蛋糕,由 n 个销售人员销售。每个顾客进店后先取一个号,并且等着叫号。当一个销售人员空闲下来,就叫下一个号。请分别编写销售人员和顾客进程的程序。

Semaphore buyer= 0;                //顾客人数
Semaphore seller = n;            //销售人员数
Semaphore mutex_s = 1;            //用于销售人员的互斥信号量
Semaphore mutex_b = 1;            //用于顾客的互斥信号量
int count_s = 0;                //记录取号的值
int count_b = 0;                //记录叫号的值 
 
void Buy()                    //顾客进程
{
	进店();
	P(mutex_b);           //取号
	count_b++; 
	V(mutex_b);
	V(buyer);
	P(seller);            //等待叫号
 	买面包();
 	离开();             
}

void Sell()
{
    while(true)
    {
         P(buyer);
         P(mutex_s);   //叫号
         count_s++;
         叫编号为count_s的顾客();
         V(mutex_s);
         V(seller);
    }
}

6 水果问题(2)

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

Semaphore S = 1;      	//S 表示盘子是否为空; 
Semaphore Sa = 0;        //Sa 表示盘中是否有苹果; 
Semaphore Sb = 0;    	//Sb 表示盘中是否有桔子; 

void Father(){
	while(true){
		P(S);
		放入苹果或桔子();
		if(放入苹果){
			V(Sa);
		}else{
			V(Sb);
		}
	}
}

void Son(){
	while(true){
		P(Sb);
		拿桔子();
		V(S);
		吃桔子();
	}
}

void Daughter(){
	while(true){
		P(Sa);
		拿苹果();
		V(S);
		吃苹果();
	}
}

7 写者优先的读者–写者问题

读者-写者问题为数据库访问建立了一个模型。例如,一 个系统,其中有许多竞争的进程试图读写其中的数据,多个进程同时读是可以接受的,但如果一个进程正在更新数据库,则所有的其他进程都不能访问数据库,即使读操作也不行。 写者优先是指当一个写者到达时,将阻止其后面的读者进入数据库,直到其离开为止。

semaphore fmutex=1, rdcntmutex=1, wtcntmutex=1, queue=1;
int reader_count = 0, writer_count = 0;

void reader(){
    while( true){
        P(queue);
        P(rdcntmutex);
        if( reader_count == 0 ) { P(fmutex); }
        reader_count = reader_count + 1;
        V(rdcntmutex);
        V(queue);
        //Do read operation ...
        P(rdcntmutex);
        reader_count = reader_count - 1;
        if( reader_count == 0 ) { V(fmutex); }
        V(rdcntmutex);
    }
}

void writer(){
    while( TRUE ){
        P(wtcntmutex);
        if( writer_count == 0 ) { P(queue); }
        writer_count = writer_count + 1;
        V(wtcntmutex);
        P(fmutex);
        //Do write operation ...
        V(fmutex);
        P(wtcntmutex);
        writer_count = writer_count - 1;
        if( writer_count == 0 ) { V(queue); }
        V(wtcntmutex);
    }
}

8 天南大路径问题

在天津大学与南开大学之间有一条弯曲的小路,这条路上每次每个方向上只允许一辆自 行车通过。但其中有一个小的安全岛 M,同时允许两辆自行车停留,可供两辆自行车已从两端进入小路的情况下错车使用。如图所示。 下面的算法可以使来往的自行车均可顺利通过。其中使用了 4 个信号量,T 代表天大路 口资源,S 代表南开路口资源, L 代表从天大到安全岛一段路的资源,K 代表从南开到 安全岛一段路的资源。程序如下,请在空白位置处填写适当的 PV 操作语句,每处空白 可能包含若干个 PV 操作语句。

在这里插入图片描述

	begin
    t:=1;s:=1;l:=1;k:=1;
    cobegin
    从天大到南开的进程
        begin
            ______(1)______
           通过 L 路段;
           进入安全岛 M;
           ______(2)______
           通过 K 路段
           ______(3)______
        end
   从南开到天大的进程
       begin
          略,与“从天大到南开的进程”相反。
       end
    coend
end

解答

(1) P(T); P(L);
(2) V(L); P(k);
(3) V(K); V(T);

9 缓冲区问题

三个进程 P1、P2、P3 互斥使用一个包含 N(N>0)个单元的缓冲区。P1 每次用 produce() 生成一个正整数并用 put()送入缓冲区某一空单元中;P2 每次用 getodd()从该缓冲区中取出一个奇数并用 countodd()统计奇数个数;P3 每次用 geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义信号量的含义。要求用伪代码描述。

思路:

定义信号量S1控制P1与P2之间的同步;S2控制P1与P3之间的同步;
empty控制生产者与消费者之间的同步;mutex控制进程间互斥使用缓冲区。

semaphore s1=0,s2=0,
empty=N,mutex=1P1()
{ 
	X=produce( );//生成一个数
	P(empty);//判断缓冲区是否有空单元
	P(mutex);//缓冲区是否被占用
	Put();
	if(x%2==0)//如果是偶数,向P3发出信号
		V(s2)else //如果是奇数,向P2发出信号
		V(s1)V(mutex)//使用完缓冲区,释放
P2()
{
	P(s1);//收到P1发来的信号,已产生一个奇数
	P(mutex);//缓冲区是否被占用
	getodd( );
	countodd( )=countodd( )+1;
	V(mutex); //释放缓冲区
	V(empty); //向P1发信号,多出一个空单元
P3()
{
	P(s2);//收到P1发来的信号,已产生一个偶数
	P(mutex);//缓冲区是否被占用
	geteven();
	counteven()=counteven()+1;
	V(mutex);
	V(empty);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值