竞争条件
processA
操作同一个数据
processB
进程互斥
由于各进程要求使用共享资源(变量,文件等)
而这些资源需要排他性使用
个进程之间竞争使用这些资源
-- 这一关系称为进程互斥
临界资源
系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源或共享变量
临界区
各个进程中对某个临界资源(共享变量)实施操作的程序片段
临界区的使用原则
1.没有进程在临界区时,想进入临界区的进程可以进入
2.不允许2各进程同时进入临界区
3.临界区外运行的进程不得阻塞其他进程进入临界区
4.不得使进程无限期等待进入临界区
软件解法
1.错误解法
P:
...
while (free)
free = true;
临界区
free = false;
...
Q:
...
while (free)
free = true;
临界区
free = false
free:临界区空闲标志
true:有进程在临界区
false:无进程在临界区
初值: free为false
//P加锁时,CPU切换到了Q加完锁后,CPU切换到了P,P也进行了加锁,借鉴意义,将加锁,解锁封装成原语操作,此时就正确了
1.错误解法
P:
...
while(not turn)
临界区
turn = false
...
Q:
...
while(turn)
临界区
turn = true
...
turn:谁进临界区的标志
true: P进程临界区
false: Q进程临界区
初值任意
//P想进临界区,Q不想进临界区,P永远进不了临界区
1.错误解法
P:
...
pturn = true;
while (qturn)
临界区
pturn = false
...
Q:
...
qturn = true;
while(pturn)
临界区
qturn = false
...
pturn,qturn,初值为false
p进入临界区的条件,pturn ^ not qturn
q进入临界区的条件,not pturn ^ qturn
//P想进临界区时,CPU切换成Q进程,Q想进临界区时,CPU切换到了P,P,Q互相谦让都进不去临界区
dekker算法
P:
pturn = true
while (qturn){
if(turn == 2){
pturn = false;
while(turn == 2){
pturn = true;
}
}
临界区
}
turn = 2;
pturn = false
Q:
qturn = true;
while(pturn){
if(turn == 1){
qturn = false;
while(turn == 1)
qturn = true;
}
临界区
turn = 1
qturn = false
}
//循环判断turn的值,如果turn=1Q就让出CPU给Q,并且不断循环,看自己什么时候可以上CPU
//自旋锁问题造成了忙等待,该进程只有等时间片用完了才会切换CPU
peterson算法
enter_region(i)
临界区
leave_region(i)
//内部实现
#define FALSE 0
#define TRUE 1
#define N 2 //进程的个数
int turn //轮到谁
int interested[N]; //兴趣数组,初始值为FALSE
void enter_region(int process){
//process = 0 or 1
int other //另外一个进程的进程号
other = 1 - process
interested[process] = TRUE;//表明本进程感兴趣
turn = process //设置标志位
while(turn == process && interested[other] == TRUE);
}
void leave_region(int process){
interested[process] = FALSE
//本进程离开临界区
}