操作系统-进程同步与互斥易混点

解惑1:

为使多个进程能互斥的访问某临界资源,只须为该资源设置

   一个互斥信号量 mutex初值为 1(代表临界资源只有一个)

mutex初值为1.取值范围为[-1,0,1]

mutex=1时,表示两个进程皆未进入需要互斥访问的临界区;

mutex=0时,表示有一个进程进入临界区运行,另一个必须等待,挂入阻塞队列

mutex=-1时,表示有一个进程正在临界区运行,而另一个进程因等待而阻塞在信号量队列中,需要被当前已在临界区运行的进程在退出时唤醒。

mutex为0和为1的区别是:为0的时候等待的进程没有申请该资源,为-1的时候申请了,即进行了P操作,所以阻塞了。

解惑2:

信号量的初值表示系统中资源的数目。

解惑3:

empty代表空闲缓冲区的数量;full代表产品的数量。

根据进程同步的前V后P。

缓冲区没满,生产者才可以生产

缓冲区没空,消费者才可消费。设置同步信号量:full=0,empty=N。

从而画出下面的图:

 

 消费者消费产品,非空闲缓冲区个数减一,所以针对full是P操作。空闲缓冲区加一,所以针对empty是V操作。

生产者生产产品,使用一个空闲缓冲区,所以空闲缓冲区减一,所以针对empty是P操作,但是非空闲缓冲区个数加一,所以针对full是V操作。

那么,为什么生产者消费者问题,为什么不能用一个信号量实现同步?

解释一:

如果缓冲区满,生产者是不能生产的,所以生产者进程受到消费者进程的制约;

如果缓冲区空,消费者是不能消费的,所以消费者进程受到生产者进程的制约

所以 需要两个同步信号量

解释二:

首先,假设只有一个同步信号量empty=5,也就是缓冲区有5个空位;

生产者每次生产就申请一个空位,即p(empty)。

假设5次生产之后,满了,临界区满了=生产者不生产了,现在生产者被阻塞,cpu切换到消费者;

消费者在每次消费成功后,执行v(buffer),但是在消费前并没有受到任何制约!这时候的效果就是,消费者可以无限消费,然后empty的值会无限增加,消费者已经消费了刚才生产的5个产品之后都还可以继续消费。

或者假设现在有另一个同步信号量full=0,也就是,缓冲区有0个产品,但是不知道缓冲区有多大的限制。现在每次生产都在生产之后执行v(full),也就是full++,然而full可以一直增加,因为没有上限,也就是消费者被制约但是生产者没被制约。

2个信号量,一个限制生产者,一个限制消费者;1个信号量无法同事限制他们2个。

解惑4

实现写优先代码:

 

当顺序为:读者1-写者1-读者2时:

读者进程在读文件时,发生进程调度,写者进程执行,此时,写者进程阻塞在P(rw)中,当再有读者进程2执行时,会阻塞到P(W)中,此时,读者进程释放rw后,写者进程最先被唤醒,然后执行,实现了先来先服务。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chde2Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值