互斥锁原理

如果有交互的公共数据区域,我们需要让一个进程先执行,一个进程后执行,互斥锁就是用锁的方式让他们的竞争关系变得有序。
在这里插入图片描述

临界区问题
临界区是在程序之间有公共数据交互时产生的区域,没有两个进程可以在它们各自的临界区同时执行
在这里插入图片描述

临界区的i协议
在这里插入图片描述

临界区管理准则
临界区必须有一个进程,因为如果临界区为空且满足互斥性那么其他进程都无法在临界区运行,临界区运行的程序也不能一直占用临界区,必须要让其他进程等待时间为有限的。

在这里插入图片描述
喂养金鱼问题
在这里插入图片描述在这里插入图片描述上面代码还是会有问题
在这里插入图片描述

那么这段代码的临界区在哪里
这楼里fish和feed变量都是公共的,所以这块区域就是临界区
在这里插入图片描述

我们修改这段伪代码,将异步尝试转为同步
这里这个note代表一个记号,表示正在判断是否喂鱼,remove note走时候撕掉记号。

在这里插入图片描述但上个代码还是有问题
在这里插入图片描述我们再次修改伪代码
在这里插入图片描述

但这里金鱼就不是撑死了,是饿死了
违反了有空让进原则
在这里插入图片描述
那么对于计算机系统来说,饿死好,还是撑死好呢?
对于计算机数据来说,我认为是饿死更好,因为撑死就等于数据被修改为错误了,而饿死代表计算机的数据并没有被修改。

我们再次修改伪代码
空循环,让alice等待tom移除note

在这里插入图片描述我们再次分析
在这里插入图片描述

这里我自己对这个代码分析了一下:tom要执行需要满足alice没留下note,一但留下note,tom就无法喂食,而alice是一定会喂食的,所以这里需要alice这个设备性能比tom好

这两个算法和上面的算法思想是差不多的
在这里插入图片描述互斥锁
一个进程拿到锁,其他进程如果与这个进程互斥,那么再要取得锁的使用权,就会进入loop状态,进程使用完需要释放锁

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

上锁和测试是不能被打断的
在这里插入图片描述既然我们知道了上锁和测试是不可以被打断的,我们引用一个原子操作的概念
在这里插入图片描述在这里插入图片描述
解决浪费cpu周期的缺点,我们可以将这个等待进程进入等待队列里,但是我们要注意,万一自旋的时间比切换队列消耗的时间更久,那么这个操作反而浪费了资源。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白帽小丑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值