内容正文:
操作系统原理(第2版)
3.2.1 实现进程互斥的硬件方法
通过计算机提供的一些机器指令来实现进程的互斥。
机器指令是指在一个指令周期内执行完成的指令,而专用机器指令的执
行则不会被中断。专用机器指令有3个:
1.开关中断指令:
进程在进入临界区之前先执行“关中断”指令来屏蔽掉所有中断;进程完成临界区的任务后,再执行“开中断”指令将中断打开。程序结构如下:
cobegin //伪代码cobegin和coend表示其间的进程可以并发执行
process Pi() // i=1, 2, 3, …, n
{
… //与临界资源无关的代码
lock out interrupts; //关中断
临界区;
unlock interrupts; //开中断
… //与临界资源无关的剩余代码
}
coend
3.2 进程互斥方法
2. 测试与设置指令TS(Test and Set):
要为每个临界资源设置一个整型变量s,可以将它看成一把锁。若s的值为0(开锁状态),则表示没有进程访问该锁对应的临界资源。若s的值为1(关锁状态),则表示该锁对应的临界资源已被某个进程占用。
3.2 进程互斥方法
TS指令的函数描述:
int TS(int s)
{
if(s)
return 1;
else
{
s=1;
return 0;
}
} 应用:
int s=0;
cobegin
process Pi() //i=1,2,3,…,n
{
… //与临界资源无关的代码
while(TS(s)); //进入区
临界区;
s=0; //退出区
… //与临界资源无关的剩余代码
}
coend
3. 交换指令(Swap):要为每个临界资源设置一个整型的全局变量s;若s的值为0则表示没有进程在临界区,若s的值为1则表示有进程在临界区(即访问临界资源)。此外,还要为每个进程设置一个整型局部变量key。只有当s的值为0并且key的值为1时,本进程才能进入临界区。进入临界区后,s的值为1且key的值为0;退出临界区时,应将s的值置为0。
3.2 进程互斥方法
交换指令的函数描述:
void Swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
int s=0; //s为全局变量
cobegin
process Pi() //i=1,2,3,…,n
{
… //与临界资源无关的代码
int key=1; //key为局部变量
do{ //进入区
Swap(&s,&key);
}while(key);
临界区;
s=0; //退出区
… //与临界资源无关的剩余代码
}
coend
3.2.2实现进程互斥的软件方法
1. 两标志进程互斥算法
基本思想:为希望访问临界资源的两个并发进程设置的两个标志T1和T2来表示某个进程是否在临界区;若Ti(i=1, 2)等于0则表示进程Pi(i=1, 2)没有在临界区,若Ti(i=1, 2)等于1则表示进程Pi(i=1, 2)在临界区。每个进程在进入临界区之前,先判断临界区是否已被另一进程访问,若是则本进程等待,否则本进程进入临界区。
3.2 进程互斥方法