操作系统pv原语

生产者问题

某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A、B两种零件,装车间的任务是把A、B两种零件组装成产品。两个生产车间每生产一个零件后都要分别把它们送到专配车间的货架F1、F2上。F1存放零件A,F2存放零件B,F1和F2的容量均可以存放10个零件。装配工人每次从货架上取一个零件A和一个零件B后组装成产品。请用P、V操作进行正确管理。

Semaphore mutexA=1,mutexB=0;
Semaphore fullA=0,fullB=0,emptyA=10,emptyB=10;
void producerA(){
	while(1){
		生产一个产品A;
		P(emptyA);	//判断货架F1是否有空
		P(mutexA); 	//互斥访问货架F1
		将产品A放到货架上;
		V(mutexA);	//释放货架F1
		V(fullA);	//货架F1上的零件A的个数加1	
	}
}
(B同理)
void cumsumer(){
	while(1){
	    P(fullA);
	    P(mutexA);
	    从货架上F1上取一个A产品;
	    V(mutexA);
	    V(emptyA); 
	    P(fullA);
	    P(mutexA);
	    从货架上F1上取一个A产品;
	    V(mutexA);
	    V(emptyA); 
	    P(fullB);
	    P(mutexB);
	    从货架上F2上取一个B产品;
	    V(mutexB);
	    V(emptyB);
	    讲取得的A产品和B产品组装成产品
	}
}
哲学家进餐问题(不出现死锁)

方法(最多允许有四位哲学家同时拿左边的筷子)

struct semaphore Stick[5]={1,1,1,1,1};
struct semaphore count=4;
Cobegin
void phiosopher_i(){//i=0,1,2,3,4
    while(1){
        thinking;
        hungry;
        P(count);
        P(stick[i]);
        P(stick[(i+1)%5]);
        eating;
        V(stick[(i+1)%5]);
        V(stick[i]);
        V(count);
    }    
}
Coend
文件管理问题

有一个文件F供进程共享,现把这些进程分成A,B两组,规定同组的进程可以同时读文件F;但当有A组(或B组)的进程在读文件F时就不允许B组(或A组)的进程读文件F。试用P,V操作(记录型信号量)来进行管理

//类似 读者写者 问题

Semaphore mutex=1;
Semaphore mutexsectionA=0;
Semaphore mutexsectionB=0;
int readA=0;
int readB=0;
Cobegin
void read_A_i(void){
	while(1){
		P(mutexsectionA);
		readA++;
		if(readA==1)P(mutex);
		V(mutexsectionA);
		Reading F;
		P(mutexsectionA);
		readA--;
		if(readA==0)V(mutex);
		V(mutexsectionA);
	}
}
B同理
过十字路口问题

和上面的读者写者问题类似)

Semaphore mutex=1;
Sempahore mutex13=1,mutex24=1;
int c1=0,c2=0;
Cobegin
void p1(){
   while(1){
		P(mutex13);
        c1++;
        if(c1==1) P(mutex);
        V(mutex13);
        过马路;
        P(mutex13);
        c1--;
        if(c1==0) V(mutex);
        V(mutex13);
   }
}
那么接下来的三个路口同理
游览室阅读问题

假定阅览室最多可同时容纳100个人阅读,读者进入时,必须在阅览室门口的一个登记表上登记,内容包括姓名、座号等,离开时要撤掉登记内容。用P、V操作描述读者进程的同步算法。

Semaphore seat=10,register=1;
Cobegin
void reader_i(){
	While(1){
    	P(seat);
        P(register);
        登记信息;
        V(register);
        看书;
        P(register);
        撤销信息;
        V(register);
        V(seat);
    }
}
和尚打水问题

某寺庙,有小和尚和老和尚若干,有一个水缸,由小和尚提水入缸供老和尚饮用。水缸可以容纳10桶水,水取自同一口井中,由于水井口窄,每次只能容纳一个水桶取水。水桶总数为3个。每次入水、取水仅为一桶,且不可同时进行。请用P V原语写出协调小和尚和老和尚动作的程序。

Semaphore mutex_well = 1, mutex_vat = 1;
Semaphore empty = 10, full = 0, count = 3;
Cobegin
void young_i() {//i=1,2,……,n
    while (1) {
        P(empty);
        P(count);
        P(mutex_vat);
        打水;
        V(mutex_vat);
        P(mutex_well);
        把水放入水缸;
        V(mutex_well);
        P(count);
        P(full);
    }
}
void old_i() {
    while (1) {
        P(full);
        P(count);
        P(mutex_well);
        取水;
        V(mutex_well);
        喝水;
        V(count);
        V(empty);
    }
}
Coend
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值