操作系统 李治军 进程与线程(四:信号量与死锁)

进程与线程

L17 信号量临界区保护

靠临界区保护信号量
为什么要保护信号量?如何保护信号量。
在这里插入图片描述
在这里插入图片描述
共享数据不保护就会出现错误,因为时间片什么切出去不知道,导致程序执行顺序出错,比如下面这个案例,ij
在这里插入图片描述
右边的图,想通过添加空循环来改变时间片分配,这种方法是不可以的。
在这里插入图片描述
在这里插入图片描述
原子操作,但是不懂为什么不用empty++,为什么只通过register改变
信号量必须要予语义正确在这里插入图片描述
哦哦明白了
在这里插入图片描述
互斥保证了临界区。值日法,也成轮换法
在这里插入图片描述
只能交替切,另一个不切下面就不能切换了。
在这里插入图片描述
实现信号量的另一个方法是标记法。
flag[0]标记是0想进去
在这里插入图片描述
但是问题还是有,就是两个人同时留条
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
非对称标记
在这里插入图片描述

在这里插入图片描述
这里面是两个进程,现在要是多个进程
在这里插入图片描述
num[i]!=0就是这个进程想进去,然后判断比其他进程的号码小不小
轮换加标记的算法 总结出面包店算法。
选号的时候也有判断有没有人在取号码
在这里插入图片描述
溢出怎么办,以上就是只用软件。软硬件协同处理,中断处理才能调度,所以可以通过屏蔽中断的方式。INIR中断寄存器,硬件处理的时候都是按汇编计算的。
在这里插入图片描述
这种方法不适用于多CPU。
临界区的不能跳出去 不能被打断。
mutex是硬件原子指令,只有一条指令,要么计算完了 要么没计算,一步完成
在这里插入图片描述
用临界区保护信号量,用信号量实现同步。

L18 信号量临界区保护

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
内核栈的使用
在这里插入图片描述
while把所有阻塞进程全部唤醒,if的话只是将一个进程唤醒。
这样的话全部唤醒,然后判断优先级和轮转两者选择一个执行,把其他的睡眠。
这边不需要负数,因为负数代表几个进程等待,因为这边不管多少,全部唤醒然后竞争出现一个要执行的。

L19 死锁处理

在这里插入图片描述
多进程相互锁死。
对于empty,mutex交换:
环路等待
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
死锁最恨的办法就是重启。。。只有占用高位资源去申请低位资源会出现
在这里插入图片描述
在这里插入图片描述
m是资源的个数,n是进程个数。
在这里插入图片描述
每次申请都得判断,代价也比较大。
怎么回滚,就是回滚到可以通过银行家算法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值