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指令,从而导致“忙等”。




















![C嘎嘎~~[类和对象 精华篇]](https://img-blog.csdnimg.cn/1cfc5d6eee5d4ae097b034aa16f707ed.png)