Dekker's算法和Peterson算法

本文介绍了Dekker's算法和Peterson算法,这两种用于解决临界区互斥访问的软件方法。通过反例解释了算法设计中需避免的忙等待、竞争条件和死锁问题。Dekker's算法类比于上课回答问题的情景,确保没有同时进入临界区的情况。Peterson算法则提供了一个更简洁的解决方案。
摘要由CSDN通过智能技术生成

首先了解几个术语
mutual access:互斥访问,即一次只允许一个进程访问
critical region:临界区,一些会引起冲突的共享变量,共享内存等,所以要进行互斥访问
race condition:竞争条件,即哪个进程进入临界区完全取决于哪个进程获得了cpu

Dekker’s算法和Peterson算法都是用于实现critical region的互斥访问的软件方法。
先看几个反例,理解为什么算法要设计的这么麻烦。

例1:

void p1(void){
    while(true){
        while(turn==2){
            //busy waiting...
        }
        critical_section();
        turn=2;
    }
}
void p2(void){
    while(true){
        while(turn==1){
            //busy waiting...
        }
        critical_section();
        turn=1;
    }
}

这段代码确实可以确保互斥访问,但是存在如下两个问题:
1. busy waiting的问题,一直忙等待浪费了cpu时间
2. 并不满足race condition,即两个进程是相互交替执行的,而且那个最开始先执行取决于turn的初始值,并不是两个进程哪个先竞争得到了cpu时间片

例2:

void p1(void){
    while(true){
        
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值