[操作系统]进程同步和死锁 笔记-xp

同步的必要性:操作系统的异步性。

临界资源:一次只能为一个进程所使用的资源。

临界区:访问临界资源的一段代码。

【同步】直接制约关系,是为了达到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. 局部于管程内部的数据只能被管程内部的过程访问(我的数据,只有我的人才能看)
  2. 一个进程只有通过调用管程内的过程才能进入管程访问共享数据(我的数据,你只能通过我的人,才能“帮你”看)
  3. 每次仅允许一个进程在管程内执行某个内部过程(每个过程每次一个进行)

 

 

死锁

 定义:多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将无法向前推进。

产生的原因:

(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⃣️进程回退法(让一个或者多个进程回退到足以避免死锁的地步,是自愿回退的而不是被剥夺的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值