1、同步与互斥的基本概念
1)临界资源
(1)临界资源:是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。
(2)临界区:每个进程中访问临界资源的那段代码称为临界区,每次只允许一个进程进入临界区,进入后,不允许其他进程进入。
多个进程涉及到同一临界资源的临界区称为相关临界区。
临界资源的访问过程分为4个部分:
a.进入区。负责检查是否可以进入临界区,设置正在访问临界资源的标志。
b.临界区。访问临界资源的那段代码。
c.退出区。负责接触正在访问临界资源的标志。
d.剩余区。做其他处理。
2)进程同步
同步也称直接制约关系,它指的是多个进程一起完成某个任务,这些进程因为合作、因为需要在某些位置上协调他们的工作次序而产生了某些制约关系。
注意:不要把进程同步和进程调度搞混了
(1)进程调度是为了最大程度的利用CPU资源,选用合适的算法调度就绪队列中的进程。
(2)进程同步是为了协调一些进程以完成某个任务,比如读和写,肯定先写后读,不能先读后写,这就是进程同步做的事情了,指定这些进程的先后执行次序使得某个任务能够顺利完成。
3)进程互斥:
进程互斥也称间接制约关系。当某个进程A在访问临界区使用临界资源时,另一个B进程必须等待,直到A进程访问结束并释放打印机资源后,B进程才能去访问。
为禁止两个进程同时进入临界区,同步机制应遵循以下准则:
(1)空闲让进。临界区空闲时,可以允许一个请求进临界区的进程立即进入临界区
(2)忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待
(3)有限等待。对请求访问的进程,应保证能在有限时间内进入临界区。
(4)让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待
2、进程同步机制
1)软件同步机制
一个经典的解决方案:Peterson算法。
算法思想:为防止两个进程为进入临界区而无限等待,设置了变量turn,每个进程先设置自己的标志后再设置turn标志。这时,再同时检测另一个进程状态标志和不允许进入标志,以便保证两个进程同时要求进入临界区时,只允许一个进程进入临界区。
算法如下:
bool flag[2];
int turn=0;
p0进程:
flag[0]=true;
turn=1;
while(flag[1]&&turn==1);
critical section;//临界区
flag[0]=false;
remainder section;//释放资源
P1进程:
flag[1]=true;
turn=0;
while(flag[0]&&turn=0);
critical section;//临界区
flag[1]=false;
remainder section;//释放资源
注:turn变量的含义:进程在试图访问临界资源时,首先设置自己的flag变量为TRUE,表示希望访问;但又会设置turn变量为对方的进程编号,表示谦让,由于turn变量会有一个最终值,因此先做出谦让的进程先进入临界区,后做出谦让的进程则需要循环等待,不会造成“饥饿”现象。
Peterson算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待三个原则,但是依然未遵循让权等待的原则。但相较于其他算法,这种解决方案是最好的。
2)硬件同步机制
(1)关中断
关中断是实现互斥最简单的方法之一,在进入锁测试之前,关闭中断,直到完成锁测试并上锁之后才能打开中断。
优点:简单、高效
缺点:不适合多CPU系统;只适合操作系统内核进程,不适合用户进程。
(2)利用Test-and-Set指令实现互斥
简称TS指令或TSL指令。TSL指令是由硬件实现的,执行过程不允许被中断,即一条原语。
bool TestAndSet(bool*lock){
bool old;
old=*lock;
*lock=true;
return old;
}
while(TestAndSet(&lock));
临界区代码段...
lock=false;
剩余区代码段...
优点:实现简单,适用于多CPU系统;
缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”。
(3)利用swap指令执行进程互斥
swap指令被称为对换指令,是由硬件实现,执行过程也是不允许被中断的。
(4)实时系统
实时系统是指系统及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。
estAndSet(
swap(bool*a,bool*b){
bool temp;
temp=*a;
*a=*b;
*b=temp;
}
bool old=ture;
while(old==ture)
swap(&lock,&old);
临界区代码段...
lock=false;
剩余区代码段...
值得注意的是:在逻辑上swap指令和TSL并无太大区别。
优点:实现简单,适用于多CPU系统。
缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”。