同步的必要性:操作系统的异步性。
临界资源:一次只能为一个进程所使用的资源。
临界区:访问临界资源的一段代码。
【同步】直接制约关系,是为了达到a certain purposes 而建立的两个或者多个进程,这些进程要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。
【互斥】间接制约关系,党一个进程进入临界区使用资源时,另一个进程必须等待其退出后才能访问。
同步机制的准则:
空闲让进
忙则等待
有限等待
让权等待,权:处理机,不能进入临界区时释放处理机来等待,防止忙等。
实现互斥的基本方法:
一、软件法
1、单标志法
P1: While(turn!=0); ……critical Turn=1; ……
| P2: While(turn!=1); ……critical Turn=0; …… |
缺点:必须交替,如果P2不干了,P1也得不到,因为没人改标志。
2、双标志法——先检查
Pi: While(flag[j]){ }; Flag[i]=true; Critical; Flag[i]=false; | Pj: While(flag[i]); Flag[j]=true; Critical; Flag[j]=false; |
优点:不用交替进入,可连续使用。
缺点:情况:flag[i]和flag[j]均false时,PiPj均成功进入,违背忙则等待。
3、双标志法——后检查
直接置flag[自己]=true
在检查while(flag[别人]); 当flag[别人]false时,才继续进行
Critical section;
缺点:当均置自己为true后,检查对方的状态,均为ture;则互相谦让,造成饥饿
4、(目前)最优算法——皮特森算法
Pi Flag[i]=true; (我要!)turn=j;(但是我让给你) While(flag[j]&&turn==j){};(当你也要!那你就去吧) Critical…(我给你你不要,或者我要你也给我,我就开动了) Flag[i]=false;
| Pj Flag[j]=true; turn = i; While(flag[i]&&turn==i); Critical… Flag[j]=false;(我不要了)
|
Typedef struct{
Int value;
Struct process *L;
}semaphore;
Void wait(semaphore S)
{
S.value - - ;管你有没有,我就都要一个
If(S.value<0){
ADD a precess P from S.L;
Block(S.L);
}
}
Void signal(semaphore S){
S.value + +;
If(S.value<=0){
Remove a process P from S.L;
Wakeup(P);
}
}
管程
定义:
系统中的各种硬件资源和软件资源,均可以用数据结构抽象地描述其资源特性,即用少量信息和对资源所执行的操作来表征该资源,忽略它们内部结构和实现细节。
管程是由一组数据以及定义在这组数据之上的操作组成的软件模块,这组操作可以初始化并改变管程的数据和同步进程。
管程的组成
- 局部于管程内部的共享结构数据说明
- 对该数据结构进行操作的一组过程
- 对局部于管程的共享数据设置初始值的语句
管程的特性
- 局部于管程内部的数据只能被管程内部的过程访问(我的数据,只有我的人才能看)
- 一个进程只有通过调用管程内的过程才能进入管程访问共享数据(我的数据,你只能通过我的人,才能“帮你”看)
- 每次仅允许一个进程在管程内执行某个内部过程(每个过程每次一个进行)
死锁
定义:多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将无法向前推进。
产生的原因:
(1)系统资源的竞争(临界资源),若是共享资源,何来谈死锁
(2)进程推进顺序非法(或信号量使用不当)
(3)死锁产生的必要条件
1⃣️互斥条件(使用资源的互斥,可共享就不死了hhh)
2⃣️不剥夺条件(所持有的资源不可被剥夺,被剥夺就不死了hhh)
3⃣️请求和保持条件
4⃣️循环等待条件
死锁的处理策略
1⃣️死锁预防(事前)
破坏必要条件
「
1、破坏互斥条件(不太可行)
2、破坏不剥夺条件(当请求的不到满足的时候,释放已经获得的资源)
3、破坏请求和保持条件(预先静态分配法:一次性申请所有需要的资源,当全部获取后才不可剥夺地执行)
4、破坏循环等待条件(顺序资源分配法)
」
2⃣️死锁避免(事前)
「
1、系统安全态(系统按照某种进程推进顺序,为每个进程Pi分配其所需要的资源,直至满足每个进程对资源对最大需求,使每个进程都可以顺利完成。这个P1P2…Pn称只为安全序列。如果找不到这么一个顺利完成的序列,则系统处于不安全态。)
2、银行家算法MAX. NEED. ALLOCATION. AVAILABLE
」
3⃣️死锁的检测和解除(事后)
「
1、资源分配图,进程是圆圈,资源数量是框框内的圆圈,进程到资源的有向边是请求边,资源到进程的是分配边
资源数=总数-出度
2、死锁定理
可通过资源分配化简的方法来检测系统状态S是否为死锁。
3、死锁解除1⃣️资源剥夺法(挂起某些死锁进程,分配其资源)2⃣️撤销进程法(按优先级和撤销代价进行——撤销部分进程或者全部!)3⃣️进程回退法(让一个或者多个进程回退到足以避免死锁的地步,是自愿回退的而不是被剥夺的)
」