哈工大-操作系统L17

信号量临界区保护

一.共同修改信号量引出的问题

empty初值为-1,生产者p1先执行完empty=-2,生产者p2执行完empty=-3,但是p1还没有执行完时,就跳转到p2执行,empty!=-3

二.竞争条件

右图两人的方法加入空循环,改变时间片,这次解决了,下一次就不一定了

在写共享变量empty时阻止其他进程也访问empty

三.临界区

进入区退出区之间的是临界区

当p1进入临界区修改时,其它进程不能修改对应的临界区

四.轮换法

初始turn=0,p0进程进入临界区,此时p1尝试进入临界区但此时的turn=0,p1无法进入临界区,while循环空转,当p0从临界区出来之后,turn=1,p1就可以进入临界区了

轮转法明显符合第一条原则互斥进入,但却不符合第二条有空就进。

当p0走出临界区之后,p1由于阻塞或其它的一些原因不能进入临界区,此时的临界区是空的,p0想进入临界区是不行的因为此时的turn=0

五.标记法

上面的方法类似于值日表,一三五该你,二四六该他

p0执行(1)flag[0]=true,切换到p1执行(2)flag[1]=true,再切换到p0执行(3)当无法进入临界区,

切换到p1(4)也无法进入临界区,此时p0和p1都会无线等待

六.非对称标记

这个算法只用于两个进程,多个进程就不能使用flag[0]和flag[1]了

七.多进程解决办法

面包店算法类似于银行排队取号,choosing[i]=true,表示有人在取号,每次取号都是找到最大的数加1

每次区号都比前一个取的号要大,因为这个算法是最小的号码先进入,choosing[i]=false表示选完号了

while(chosing[j])表示有人在选好,需要等待,序号不为0,表示想进入并且num[j]>num[i],就可以进入临界区

面包店算法满足所以条件,但是却太复杂了,还需要考虑编号月结问题

八.硬件原子指令法

硬件方法就当有进程在临界区时阻止其它进程调度,cil()为关中断,stu()为开中断

对于多CPU(多核)就不好用了

CPU上面有一个中断寄存器INTR当发生中断时如时间中断,INTR就标记上一个1,当CPU执行完一条指令,CPU就会去看INTR是否被标记了1,做了标记就进入时间中断修改时间片,就有可能引起调度,

cil() 就是让CPU不再关注INTR

多个CPU中断时就会分别给各自的INTR标记上1,但是cil()只会控制第一个CPU,无法控制第二个CPU怎么样执行,CPU完全可以执行p2进入临界区修改empty

进入区就是一个锁一个整形或者说是信号量,用这个锁把临界区保护起来,要想进入这个锁,比如说这个锁,等于1时进入,等于0时无法进入,当一个进程进入时,再将锁给锁上,出来的时候再将锁给解开,

但是又产生了另一个问题,这个锁也需要保护起来,要用这种方法就没完没了了。

 核心问题就是在临界区执行的时候不能被打断,要么执行完,要么不执行,瞬间执行完,瞬间锁上。

TestAndSet(&lock),进入后保存lock后瞬间将lock锁上,原来lock的值是true,就无法进入了,lock原来是false就可以进入,出来后再锁上

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值