操作系统中的经典同步问题

学习记录

欢迎大家一起学习,共同分享学习经验!

生产者-消费者问题

semaphore full=0;			//满冲存数目
semaphore empty=n;			//空冲存数目
semaphore mutex=1;			//对有界缓冲
producer()
{
	while(ture)
	{
		produce an item put in nextp;		//nextp为临时缓冲池
		P(empty);							//申请一个空缓冲池
		P(mutex);							//申请使用缓冲池
		将产品放入缓冲池;
		V(mutex);							//释放互斥信号量
		V(full);							//增加一个满缓冲区
	}
}
consumer()
{
	while(ture)
	{
		P(full);							//申请一个满缓冲池
		P(mutex);							//申请使用缓冲池
		取出产品;
		V(mutex);							//释放互斥信号量
		V(empty);							//增加一个空缓冲区
		consumer the item in nextc;			//消费产品
	}
}

其中P(full)/P(empty)与P(mutex)的顺序不能颠倒,必须先对资源信号量进行P操作,再对互斥信号量进行P操作,否则会导致死锁。

P操作(wait操作)相当于此类资源数量-1;V操作(signal操作)相当于此类资源数+1

理发师问题

理发椅、等待椅子、顾客看做不同的量

int waiting=0;   //顾客数量
semaphore mutex=1;    //用于互斥操作waiting
semaphore bchair=1;   //理发椅的信号量
semaphore wchair=n;   //等待座椅的信号量
semaphore ready=finish=0;  //理发师与顾客的同步信号量

barber()     			//理发师进程
{
	while(ture)
	{
		P(ready);       //叫一位顾客来理发
		理发;
		V(finish);      //声明理发已经结束,已空闲
	}
}

customer()      //顾客进程
{
	P(mutex)    //写waiting权限
	if(waiting<=n)    //如果还有空座位
	{
		waiting++;    //等待数加1
		V(mutex);     //释放让别人也可以使用waiting变量
	}
	else
	{
		V(mutex);
		离开;
	}
	P(wchair);			//占用等待座椅
	P(bchair);			//占用理发座椅
	V(wchair);			//离开等待座椅
	V(ready);			//离开等待位置去理发
	P(finish);			//占用理发师
	V(bchair);			//理发结束离开理发椅
	P(mutex);			//占用使用waiting变量权限
	waiting--;
	V(mutex);
}

顾客、凳子、理发椅统一为一个变量

int chairs=n+1;			//凳子和理发椅
semaphore ready=0;		//等待理发顾客数量
semaphore finish=1;		//理发师状态
semaphore mutex=1;		//互斥信号量
barber()
{
	while(ture) 
	{
		P(ready);		//检查有没有要理发的顾客
		理发;
		P(mutex);		//申请对chairs操作权限
		chairs++;		//空闲座位+1
		V(mutex);		//释放互斥信号量
		V(finish);		//理发师空闲
	}
}
customer()
{
	P(mutex);			//申请使用chairs变量值
	if(chairs>0)		//如果还有座位
	{
		chairs--;		//空闲座位-1
		V(mutex);		//释放互斥信号量
		V(ready);		//等待状态、等待理发师
		P(finish);		//开始理发、占用理发师
	}
	else
		V(mutex);		//直接离开
}

哲学家进餐问题

(哲学家按照编号逆时针围桌而坐,0号哲学家左手筷子为0号筷子,右手筷子为1号筷子,依次类推)
为了避免死锁,规定奇数号的哲学家先拿起左边筷子,然后拿起右边筷子;偶数号的哲学家则相反

semaphero Fork[5]={1,1,1,1,1};     //五根筷子信号量初值都为1
philosopher(int i)    //i=1,2,3,4,5
{
	while(ture)
	{
		思考;
		想吃饭;
		if(i%2 !=0{
			P(Fork[i];				//拿起左边筷子
			P(Fork[(i+1)%5]);		//拿起右边筷子
			进餐;
			V(Fork[i]);		
			V(Fork[(i+1)%5]);
		}
		else
		{
			P(Fork[(i+1)%5]);		//拿起右边筷子
			P(Fork[i];				//拿起左边筷子
			进餐;
			V(Fork[(i+1)%5]);
			V(Fork[i]);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值