临界区管理

临界区的调度原则

临界区与临界资源

并发进程中与共享变量有关的程序段成为临界区,共享变量代表的资源成为临界资源。

临界区调度原则

  • 一次只允许一个进程进入临界区内执行
  • 如果已有进程在临界区,其他视图进入的进程等待
  • 进入临界区内的进程应在有限的时间内进出,一遍使等待进程中的一个进入

实现临界区管理的几种错误算法

  • 两个进程都认为对方不在临界区中,同时进入了临界区
  • 两个进程都认为对方在临界区中,进而永久等待

实现临界区管理的Peterson算法

该算法为每个进程设置一个标志,当该标志为true时表示此进程要进入临界区另外设置一个指示器turn,一直是哪个进程可以进入临界区

boolean flag[2];
int turn;
void procedure0()
{
while(true)
{
flag[0]=true;
turn=1;
while(flag[1]&&turn==1) /*若flag[1]为false,P0就进入临界区;若flag[1]为tureP0循环等待,只要P1退出临界区,P0即可进入*/
{
/* donothing*/
}
visit();/*访问临界区*/
flag[0]=false;/*访问临界区完成,procedure0释放出临界区*/
/*remainder section*/
}
}
void procedure1()
{
while(true)
{
flag[1]=true;
turn=0;
while(flag[0]&&turn==0)
{
/* donothing*/ ;
}
visit();/*访问临界区*/
flag[1]=false;/*访问临界区完成,procedure1释放出临界区*/
/*remainder section*/
}
}
void main()
{
flag[0]=flag[1]=false;
/*start procedure0 and procedure1*/ ;
}

在上面的例子中,我们先假设turn被赋值为1,后赋值为0,那么线程0就该进入临界区,线程1则因为flag[0]&&turn==0而等待,当线程0访问临界区结束后释放了临界区资源–flag[0]=false;,那么此时flag[0]&&turn==0不成立,线程1因此可以运行临界区

实现临界区管理的硬件设施

关中断

  • 进程在进入临界区之前关中断,退出临界区时开中断,关中断期间,进程调度程序失去终端机或的机会,不会切换线程,保证了临界区的互斥执行
  • 关中断缺点:限制交叉执行程序的能力,关中断方法不适合多CPU系统,关中断权利赋予给用户十分危险

测试并建立指令

TS(X){
若x=true,则x=false;
return true;
否则 return false;
}

用TS指令实现临界区管理(互斥)的算法如下

bool TS(bool &x){
	if(x){
	x=false;
	return true;
	}
}

利用TS指令实现进程会吃的算法如下

bool s=true;
cobegin
	process Pi(){
	//i=1,2,3...n;
	while(!TS(s))
	s=true;
	}

对换指令

void SWAP(bool &a,bool &b){
bool temp=a;
a=b;
b=temp;
}

你可能感兴趣的:(Java,新手)