为了解决进程互斥进入临界区的问题,需要采取有效措施。利用硬件实现互斥的方法有禁止中断和专用机器指令两种方法。
1、禁止中断
在单处理机环境中,并发执行的进程不能在CPU上同时执行,只能交替执行。另外,对一个进程而言,它将一直运行,直到被中断。因此,为了保证互斥,只要保证一个进程不被中断就可以了,这可以通过系统内核开启、禁止中断来实现。
由于在临界区内进程不能被中断,故保证了互斥。但该方法的代价很高,进程被限制只能交替执行。
另外,在多处理机环境中,禁止中断仅对执行本指令的CPU起作用,对其他CPU不起作用,也就不能保证对临界区的互斥进入。
2、专用机器指令
在很多计算机(特别是多处理机)中设有专用指令来解决互斥问题。依据所采用指令的不同,硬件方法分为TS指令和Swap指令两种。
1)TS(Test and Set)指令
TS指令的功能是读出指定标志后把该标志设为true,TS指令的功能可以用如下函数来描述。
boolean TS(lock);
boolean lock;
{
boolean temp;
temp = lock;
lock = true;
return temp;
}
为了实现进程对临界区的访问,可为每个临界资源设置一个布尔变量lock,表示资源的两种状态,true表示正被占用;false表示空闲。在进入区检查和修改标志lock;有进程在临界区时,循环检查,直到其他进程退出时通过检查进入临界区。所有访问临界资源的进程在进入区和退出区的代码是相同的。
2)Swap指令
Swap指令的功能是交换两个字节的内容,可以用如下函数描述Swap指令。
void Swap(a, b);
boolean a, b;
{
boolean temp;
temp = a;
a = b;
b = temp;
}
利用Swap指令实现进程互斥算法,为每个临界资源设置一个全局布尔变量lock,初始值为false;每个进程设置一个局部布尔变量key。在进入区利用Swap指令交换lock与key的内容,然后检查key的状态;有进程在临界区时,循环交换和检查过程,直到其他进程退出时检查通过,进入临界区。