信号量机制

一个信号量对应一种资源
信号量的值 = 这种资源的剩余数量(信号量的值如果小于0,说明此时有进程在等待这种资源)

实现进程互斥

P——申请一个资源,如果资源不够,那就会阻塞
V——释放一个资源,如果有进程在等待该资源,则唤醒阻塞队列队头的进程

1.分析并发进程的关键活动,划定临界区(如对临界资源打印机的访问就放在临界区)
2.设置互斥信号量mutex,初值设为1(表示进入临界区的名额数量,初始值为1,说明一开始能进入临界区的名额只有1个)

//记录型信号量结构体
typedef struct {
	int val;		//剩余的资源数量
	struct process* L;//等待队列
} semaphroe;

semaphore mutex = 1;
p1() {
	……
	P(mutex); //使用临界资源前要上锁,mutex--
	临界区代码……
	V(mutex);//使用临界资源后要解锁,mutex++
	……
}

注意:对不同的临界资源需要设置不同的互斥信号量,这个很容易理解。打印机跟摄像机没必要互斥访问。

信号量机制实现进程同步

进程异步:各并发进程的推进顺序不确定
进程同步:各并发进程按要求有序推进,比如你要读取数据之前必须先写入数据,这个操作必须有先后顺序

用信号量实现进程同步:
1.分析什么地方需要“同步”,既保证“一前一后”的两个操作顺序
2.设置同步信号量S,初始化为0;
3. 在“前操作”之后 执行 V(S);
4. 在“后操作”之前 执行 P(S);

信号量机制实现前驱关系

1.对每一对前驱关系设置一个同步信号量
2.在“前操作”之后进行V操作
3.在“后操作”之前进行P操作

生产者与消费者问题

在这里插入图片描述

能够改变相邻P、V操作的顺序呢?
不能!实现互斥的P操作一定要在实现同步的P操作之后(P操作是有阻塞操作的)
V操作不会导致阻塞,因此V可以随便换(V操作是有唤醒操作的)
生产产品其实可以放在缓冲区里面(PV操作之间),但是这样让临界区代码变长,上锁时间增长,系统效能会降低。
在这里插入图片描述

多生产者多消费者模型

在这里插入图片描述

注:如果缓冲区的大小大于1,就必须专门设置一个互斥信号量mutex来保证互斥访问缓冲区,否则可能会造成写入缓冲区的数据被覆盖。
实现互斥的P操作一定要在实现同步的P操作之后,否则可能会引起死锁。

吸烟者问题

在这里插入图片描述
在这里插入图片描述

读者-写者问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值