标签:
一 基本概念:
1 临界资源(critical resource): 系统中的某些资源一次只允许一个进程使用。
2 临界区(critical section): 各个进程中对某些临界资源进行操作的程序片段。
3 临界区的使用原则:
1) 无进程在临界区,进程可进入
2) 不允许两个进程同时处于临界区
3) 临界区外进程不可阻塞其他进程进入临界区
4) 进程不可无限期处于临界区
二 进程互斥的解决方案
进程互斥的解决方案可划分为软件解决方案和硬件解决方案。软件解决方案主要包括:Dekker解法、Peterson解法。
1 软件解决方案
1) Dekker解法
1 P: 2 ...... 3 pturn = true 4 while(qturn) { 5 if(turn == 2){ 6 pturn = false; 7 while(turn == 2); 8 pturn = true; 9 } 10 } 11 12 进入临界区 13 14 turn = 2; 15 pturn = false; 16 ...... 17 18 Q: 19 ...... 20 qturn = true; 21 while (pturn) { 22 if(turn==1) { 23 qturn = false; 24 while(turn==1); 25 qturn = true; 26 } 27 } 28 29 进入临界区 30 31 turn = 1; 32 qturn = false; 33 .....
2) Peterson解法
1 进程i: 2 ...... 3 enter_region(i); 4 进入临界区 5 leave_region(i); 6 ...... 7 8 #define FALSE 0 9 #define TRUE 1 10 #define N 2 11 int turn; 12 int interested[N]; 13 void enter_region(int process) //process 为0或1 14 { 15 int other; 16 other = 1 - process; 17 interested[process] = TRUE; 18 turn = process; 19 while(turn == process && interested[other] == TRUE); //先给turn赋值的进程先运行 20 } 21 22 void leave_region(int process) 23 { 24 interested[process] = FALSE; 25 }
2 硬件解决方案
1) 中断屏蔽方案
特点:(1) 简单高效(2)代价高,限制CPU并发能力(3)不适用于多处理器(4)适用于操作系统本身,不适用于用户进程
2) 测试并加锁 TSL (Test and Set Lock)
enter_region: TSL REGISTER, LOCK //复制锁到寄存器并且将锁置1 CMP REGISTER,#0 JNE enter_region RET leave_region: MOVE LOCK, #0 RET
3) 交换指令 XCHG
enter_region: MOVE REGISTER, #1 XCHG REGISTER, LOCK //复制锁到寄存器并且将锁置1 CMP REGISTER,#0 JNE enter_region RET leave_region: MOVE LOCK, #0 RET
上述解决方案都具有忙等待的特点。即进程在进入临界区之前,持续测试而不做其他事情,浪费一定的CPU资源。
标签:
原文地址:http://www.cnblogs.com/darrensun/p/4629886.html