4.2.2 实现临界段的硬件方法
利用处理机提供的特殊指令实现临界区加锁
常见硬件指令有:
1、屏蔽中断(单CPU系统)
举例:存取count
Parbegin
A(amount){
disableInterrupt();
R1=count;
R2=amount;
R1=R1+R2;
count=R1;
enableInterrupt();
};
B(amount) {
disableInterrupt();//屏蔽中断
R1=count;
R2=amount;
R1=R1-R2;
count=R1;
enableInterrupt();//允许中断
};
Parend;
2、“Test_and_Set”指令(多CPU)
该指令功能描述为:
boolean Test_and_Set(boolean target){
Boolean rv=target;
target = true;
return rv;
}
实质上是一条指令
利用Test&Set指令实现对互斥资源的加锁与解锁:
设Lock为全局布尔变量(初值为false)
do {
while Test_and_Set (lock) ;//入口区
critical section;//临界区
lock = false;//退出区 false含义为0,解锁
non-critical section //其余代码区
while(1);
举例:“test&set” 指令实现互斥汇编程序:
- T&S Ri,Aj (读后置1汇编指令。将(Aj)地址所指内存单元内容读到Ri寄存器中,同时将1置入Aj所指的内存单元中)
- 设Lock为临界段锁变量,则安排如下指令,即可实现加锁与解锁:
- A1<=&Lock;(将Lock单元地址送A1寄存器。Lock单元初始值为0)
- Loop:T&S R1,A1;
- JRN R1,Loop; (如果R1=1,表示已上锁,则转 Loop 循环,重新测试)
- 临界段
-
A1 <=&Lock;
-
(A1) <=0;(0置Lock内存单元)
-
非临界段
3、“Swap”指令
该指令功能描述为:
void Swap(boolean a, boolean b) {
boolean temp=a;
a = b;
b = temp;
}
利用Swap指令实现对临界区的加锁与解锁:
设Lock为全局布尔变量(初值为false),每个进程设一个局部布尔变量Key。
do {
key = true;
while(key==ture)
Swap (lock, key);//如果key=1则认为lock=0,Swap将其变为lock加锁
critical section;//临界区
lock = false;
non-critical section//其余代码区
while(1);
4.2.3 信号量
信号量机制:“信号量”及“P、V操作”
- 信号量S为一整型变量
//P操作
P(S): while S≤0
;空操作
S = S-1;
//V操作
V(S): S = S+1;
P、V操作是两条原语,即保证P、V操作对变量S的访问是互斥操作。
一、 原语概念与实现
原语:指完成某种功能且不被分割或逻辑上不被中断执行的操作序列。
原语可通过纯硬件实现不可中断性;或通过实现临界段的元方法达到不被逻辑上中断。
实现临界段的元方法:
- 屏蔽中断(只用于单机)
- 加硬锁(利用test&set等)
举例:用屏蔽中断方法实现P(s)和V(s)的原子性。
P(s){
disableInterrupt();
while (s≤0){
enableInterrupt();//如果s大于0,当执行P操作时,
//s不会更新,只会一直空循环,所以要先关中断,再开屏蔽中断
disableInterrupt();
};
s = s - 1;
enableInterrupt();
}
V(s){
disableInterrupt();
s = s + 1;
enableInterrupt();
}
未待完续。。。