Race Condition(资源竞争) 解决方案总结

在很多门课上都接触到race condition, 其中也举了很多方法解决这个问题。于是想来总结一下这些方法。

Race condition

它旨在描述一个系统或者进程的输出依赖于不受控制的事件出现顺序或者出现时机。此词源自于两个信号试着彼此竞争,来影响谁先输出。
举例来说,如果计算机中的两个进程同时试图修改一个共享内存的内容,在没有并发控制的情况下,最后的结果依赖于两个进程的执行顺序与时机。而且如果发生了并发访问冲突,则最后的结果是不正确的。
竞争冒险常见于不良设计的电子系统,尤其是逻辑电路。但它们在软件中也比较常见,尤其是有采用多线程技术的软件。 – 维基百科

从维基百科的定义来看,race condition不仅仅是出现在程序中。以下讨论的race conditon全是计算机中多个进程同时访问一个共享内存,共享变量的例子。

Critical Section

要阻止出现race condition情况的关键就是不能让多个进程同时访问那块共享内存。访问共享内存的那段代码就是critical section。所有的解决方法都是围绕这个critical section来设计的。

想要成功的解决race condition问题,并且程序还可以正确运行,从理论上应该满足以下四个条件:
1、不会有两个及以上进程同时出现在他们的critical section。
2、不要做任何关于CPU速度和数量的假设。
3、任何进程在运行到critical section之外时都不能阻塞其他进程。
4、不会有进程永远等在critical section之前。

互斥

以下将介绍几种实现互斥的方法。(担心翻译不到位,就不翻译这些名字了)

  • Disabling interrupts(几乎没用)
  • Lock variables(错误)
  • Strict alternation(有问题)
  • Perterson’s solution(有效)
  • Test and set lock(有效)
  • Sleep/ Wakeup(有缺陷)
  • Semaphores(有效)
  • Mutexes(有效)
    虽然这些方法中很多是有缺陷的,但是考试会有拿这些有问题的版本来问的。

Disabling Interrupts

首先这个方法几乎没有用。不敢兴趣可以直接忽略的。

Time-slicing(时间片)依赖于timer interrupt,如果这个中断被禁用了,那么调度器(scheduler)就不能切换到另一个进程了。 (这个具体就和调度有关了,也许我会写一篇博客来总结一下调度吧)

但是很明显,这个方法是有问题的
1、这样随意的禁用中断会导致整个系统运行不流畅。比如,如果我们的电脑是这样实现的,那么我在使用编辑器时打字就会很卡,因为当系统里某个进程在critical section时,我打的字产生的interruption就会被忽略,处理这个打字的进程就拿不到我打的字,也就没法在屏幕上显示。
2、这仅仅在只有一个处理器的电脑上试用,因为禁用中断的本质是将一个CPU中的状态寄存器中关于中断是否可用的那一个bit 置为0。所以当在这个CPU上将此bit置为0了,其他CPU可能就不是0,或者不能保证其他CPU和当前CPU被同时置为0。

Lock variables

这个方法完全不能解决问题,但是还是介绍一下他的思路。

1、有一个全局变量“lock“初始被置为1。
2、进程1读这个变量,将其置为0然后进入critical section
3、进程2读lock变量,发现它是0,等待它变成1。
4、进程1从critical section出来,将lock置为1。
5、进程2发现lock为1,进入critical section。

这里致命的问题就是会引入对于lock 变量的race condition。

Strict Alternation

这个方法违背了之前提出的四条规则中的第三条,存在一些问题。

假设有两个进程,进程0和进程1

//进程0
while(True){
    while(turn!=0);
    critical_section();
    turn = 1;
    noncritical_section();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值