进程互斥

竞争条件

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
    //本进程离开临界区
}
posted @ 2018-12-06 12:47  pluscat  阅读(418)  评论(0编辑  收藏  举报