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