首先了解几个术语
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){

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

被折叠的 条评论
为什么被折叠?



