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

操作系统

  • 进程与线程
    • L17 信号量临界区保护
    • L18 信号量临界区保护
    • L19 死锁处理

进程与线程

L17 信号量临界区保护

靠临界区保护信号量操作系统 李治军 进程与线程(四:信号量与死锁)_第1张图片
为什么要保护信号量?如何保护信号量。
操作系统 李治军 进程与线程(四:信号量与死锁)_第2张图片
操作系统 李治军 进程与线程(四:信号量与死锁)_第3张图片
共享数据不保护就会出现错误,因为时间片什么切出去不知道,导致程序执行顺序出错,比如下面这个案例,ij
操作系统 李治军 进程与线程(四:信号量与死锁)_第4张图片
右边的图,想通过添加空循环来改变时间片分配,这种方法是不可以的。
操作系统 李治军 进程与线程(四:信号量与死锁)_第5张图片
操作系统 李治军 进程与线程(四:信号量与死锁)_第6张图片
原子操作,但是不懂为什么不用empty++,为什么只通过register改变
信号量必须要予语义正确操作系统 李治军 进程与线程(四:信号量与死锁)_第7张图片
哦哦明白了
操作系统 李治军 进程与线程(四:信号量与死锁)_第8张图片
互斥保证了临界区。值日法,也成轮换法
操作系统 李治军 进程与线程(四:信号量与死锁)_第9张图片
只能交替切,另一个不切下面就不能切换了。
操作系统 李治军 进程与线程(四:信号量与死锁)_第10张图片
实现信号量的另一个方法是标记法。
flag[0]标记是0想进去
操作系统 李治军 进程与线程(四:信号量与死锁)_第11张图片
但是问题还是有,就是两个人同时留条
操作系统 李治军 进程与线程(四:信号量与死锁)_第12张图片
操作系统 李治军 进程与线程(四:信号量与死锁)_第13张图片
操作系统 李治军 进程与线程(四:信号量与死锁)_第14张图片
非对称标记
操作系统 李治军 进程与线程(四:信号量与死锁)_第15张图片

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

L18 信号量临界区保护

操作系统 李治军 进程与线程(四:信号量与死锁)_第21张图片
操作系统 李治军 进程与线程(四:信号量与死锁)_第22张图片
操作系统 李治军 进程与线程(四:信号量与死锁)_第23张图片
内核栈的使用
操作系统 李治军 进程与线程(四:信号量与死锁)_第24张图片
while把所有阻塞进程全部唤醒,if的话只是将一个进程唤醒。
这样的话全部唤醒,然后判断优先级和轮转两者选择一个执行,把其他的睡眠。
这边不需要负数,因为负数代表几个进程等待,因为这边不管多少,全部唤醒然后竞争出现一个要执行的。

L19 死锁处理

操作系统 李治军 进程与线程(四:信号量与死锁)_第25张图片
多进程相互锁死。
对于empty,mutex交换:
环路等待
操作系统 李治军 进程与线程(四:信号量与死锁)_第26张图片
操作系统 李治军 进程与线程(四:信号量与死锁)_第27张图片
操作系统 李治军 进程与线程(四:信号量与死锁)_第28张图片
操作系统 李治军 进程与线程(四:信号量与死锁)_第29张图片
死锁最恨的办法就是重启。。。只有占用高位资源去申请低位资源会出现
操作系统 李治军 进程与线程(四:信号量与死锁)_第30张图片
操作系统 李治军 进程与线程(四:信号量与死锁)_第31张图片
m是资源的个数,n是进程个数。
操作系统 李治军 进程与线程(四:信号量与死锁)_第32张图片
每次申请都得判断,代价也比较大。
怎么回滚,就是回滚到可以通过银行家算法。
操作系统 李治军 进程与线程(四:信号量与死锁)_第33张图片
操作系统 李治军 进程与线程(四:信号量与死锁)_第34张图片
操作系统 李治军 进程与线程(四:信号量与死锁)_第35张图片

你可能感兴趣的:(计算机基础,操作系统)