操作系统学习笔记【P16】——进程同步

问题引入

多个进程之间,难免会出现合作,如何让多进程之间的合作合理有序地推进?
一个生活中的例子——司机与售票员
一个计算机科学中的经典例子——生产者与消费者问题

基本同步模型——信号机制

A、B两个进程执行不同的任务,A进程执行的任务a以B进程执行的任务b为前提,
当A需要执行a时,需要b先执行,(A怎么知道另一个进程有没有完成呢?需要一个信号告诉A),
所以A阻塞,等待B执行并发出信号
(这里的发信号不是B给A打个电话这种,而是像放狼烟一样给一个共享变量)
A感知(分支判断)到信号,再继续往下执行

通俗来说:就是通过进程的走走停停,实现多进程合作合理有序
因此要搞清楚什么时候停,什么时候走(解除停的状态)(一般是在对方进程里发出信号进行唤醒)
其中,停更关键,等待是进程同步的核心,知道什么情况会停,情况相反就会继续执行。

信号机制的缺陷

信号机制的缺陷
此处,counter的数值等于 目前缓存区中有多少个生产出来的的资源,
问题原因:
由代码知,消费者唤醒生产者的条件是 counter = = BUFFER_SIZE - 1,并且唤醒时只唤醒一个生产者(老师没明说,但是只有在“只能唤醒一个”的条件下才能成立)
如果有两个及以上生产者被阻塞了,那么唤醒时,只会唤醒最近一个被阻塞的进程,之前都不会被唤醒
这说明,仅用信号的话,记录的信息是不够的,这里我们不仅希望记录下缓冲区中资源的个数(用于判断什么时候停),还希望记录下有多少个进程被阻塞了(用于判断是否需要发信号,需要发几个信号)
个人思考
学这里之前,已经学过其他OS课程了,
1、这里的wakeup是怎么实现的?真的是只能唤醒一个吗?
2、发信号的判断改成,消费者的代码 counter < BUFFER_SIZE 生产者的代码 counter > 1
是否不会出现上述问题?无论wakeup是不是只能唤醒一个

信号量机制

首先回顾信号机制的问题:记录的信息太少,希望记录下缓冲区中资源的个数(用于判断什么时候停),还希望记录下有多少个进程被阻塞
通过设置一个信号量sem来解决这个问题,sem表征一种资源的个数,sem>0 表示资源充裕,有sem个空闲,sem<0 表示资源不足,有|sem|个申请了但没分配,处于阻塞中
这也是信号量机制的核心,通过正负反映资源缺少还是富余(用于判断什么时候停),通过数值判断有多少个(比信号机制多表达的信息)

一个例子了解信号量使用过程
信号量执行过程例子
我们可以总结出
对信号量的基本操作是 申请一个资源P(test) 释放一个资源V(increment)

**什么时候停呢?**肯定是消费了资源才会导致资源不足而阻塞等待,所以消费一个资源后(sem–),要看一下sem,
若sem<0,表示资源不足,需等待(sleep),加入阻塞队列(sem.queue)
若sem>=0,表示资源富余,直接拿到这个资源,不需等待
P操作:申请一个资源,调用P的进程阻塞,直到获得资源

**什么时候发信号呢?**肯定是先执行一下自己的操作(sem++),才可能发出信号让别的进程继续执行,所以生产后要考虑是否满足发信号的条件,看一下sem,
若sem<0,说明释放了一个资源后还是有些进程缺,但是已经释放了一个呀,所以可以唤醒一个,
若sem=0,因为是+1后才变为0的,说明之前是有一个进程缺资源,要唤醒这一个,
若sem>0,没有在等待的,不需要唤醒
V操作:释放一个资源,并唤醒等待中的进程

信号量机制应用——生产者消费者问题

制约关系分析:1、缓冲区的大小是定值,2、一个缓冲区是临界资源,只能互斥使用
3、缓冲区满后,生产者需等待消费者消费后,才可生产 →
生产者什么时候等待?缓冲区满 生产者什么时候继续执行?消费者消费了资源,消费者发信号
4、缓冲区空后,消费者需等待生产者生产后,才可消费 →
消费者什么时候等待?缓冲区空 消费者什么时候继续执行?生产者生产了资源,生产者发信号

代码书写:
1、信号量设置
生产者需要的是空资源empty,消费者需要的是满资源full,而信号量只能记录一种资源,所以要分开设置两种资源
假设BUFFER_SIZE=10,empty初始=10,full初始=0

2、生产者
生产者进程中,先申请一个空资源,P(empty)
若资源不够,在P里阻塞,不能往后执行,直到被唤醒后从这里开始执行
若资源充足,则执行生产操作,
生产后,full增加了,需要修改full值,并判断是否需要发信号,V(full)

3、消费者(略)

4、互斥访问
设置信号量mutex初值为1,
要修改缓冲区时,需先申请P(mutex)
资源充足时再执行
执行完后要释放V(mutex)
信号量解决生产者消费者问题

其他博主整理的进程同步联系题

一些难题还不会写,要多练习
系列一–消费者生产者问题
系列二–读者,写者问题
系列四–真题练习

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值