进程与线程
L17 信号量临界区保护
靠临界区保护信号量
为什么要保护信号量?如何保护信号量。
共享数据不保护就会出现错误,因为时间片什么切出去不知道,导致程序执行顺序出错,比如下面这个案例,ij
右边的图,想通过添加空循环来改变时间片分配,这种方法是不可以的。
原子操作,但是不懂为什么不用empty++,为什么只通过register改变
信号量必须要予语义正确
哦哦明白了
互斥保证了临界区。值日法,也成轮换法
只能交替切,另一个不切下面就不能切换了。
实现信号量的另一个方法是标记法。
flag[0]标记是0想进去
但是问题还是有,就是两个人同时留条
非对称标记
这里面是两个进程,现在要是多个进程
num[i]!=0就是这个进程想进去,然后判断比其他进程的号码小不小
轮换加标记的算法 总结出面包店算法。
选号的时候也有判断有没有人在取号码
溢出怎么办,以上就是只用软件。软硬件协同处理,中断处理才能调度,所以可以通过屏蔽中断的方式。INIR中断寄存器,硬件处理的时候都是按汇编计算的。
这种方法不适用于多CPU。
临界区的不能跳出去 不能被打断。
mutex是硬件原子指令,只有一条指令,要么计算完了 要么没计算,一步完成
用临界区保护信号量,用信号量实现同步。
L18 信号量临界区保护
内核栈的使用
while把所有阻塞进程全部唤醒,if的话只是将一个进程唤醒。
这样的话全部唤醒,然后判断优先级和轮转两者选择一个执行,把其他的睡眠。
这边不需要负数,因为负数代表几个进程等待,因为这边不管多少,全部唤醒然后竞争出现一个要执行的。
L19 死锁处理
多进程相互锁死。
对于empty,mutex交换:
环路等待
死锁最恨的办法就是重启。。。只有占用高位资源去申请低位资源会出现
m是资源的个数,n是进程个数。
每次申请都得判断,代价也比较大。
怎么回滚,就是回滚到可以通过银行家算法。