Linux进程间的通信(二)

来源:互联网 发布:天分玻璃优化软件下载 编辑:程序博客网 时间:2024/06/16 08:59

一、死锁

(1) 死锁是指多个进程之间相互等待对方的资源,而在得到对方资源之前又不释放自己的资源,这样,造成循环等待的一种现象。如果所有进程都在等待一个不可能发生的事,则进程就死锁了。


(2)死锁产生的必要条件:

互斥条件

进程对资源进行排它性使用,即在一段时间内某资源仅为一个进程所占用。 

请求和保持条件

当进程因请求资源而阻塞时,对已获得的资源保持不放。 

不可剥夺条件

进程已获得的资源在未使用完之前,不能被剥夺,只能在使用完时由自己释放。 

环路等待条件

各个进程组成封闭的环形链,每个进程都等待下一个进程所占用的资源


(3)防止死锁的办法

资源一次性分配:(破坏请求和保持条件)
可剥夺资源:(破坏不可剥夺条件)
资源有序分配法:(破坏循环等待条件)


(4)死锁避免

预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。
由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。


(5)银行家算法

为保证资金的安全,银行家规定: 
*  当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客; 
*  顾客可以分期贷款,但贷款的总数不能超过最大需求量
* 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款
* 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金. 


(6)哲学家就餐问题

五个哲学家围在一个圆桌就餐,每个人都必须拿起两根筷子才能用餐,当每个人都先拿起左筷子,等待右筷子的时候就会造成死锁。

哲学家就餐问题解法

服务生解法
最多4个哲学家
仅当一个哲学家两边筷子都可用时才允许他拿筷子
给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之


二、信号量与PV原语

(1)信号量

信号量和P、V原语由Dijkstra(迪杰斯特拉)提出

struct semaphore
{

int value;

pointer_PCB queue;

};

信号量

互斥:P、V在同一个进程中
同步:P、V在不同进程中

信号量值含义

S>0:S表示可用资源的个数
S=0:表示无可用资源,无等待进程
S<0:|S|表示等待队列中进程个数



(2)P原语伪代码

P(s)
{

 s.value--;

if (s.value < 0)

{

该进程状态置为等待状状态

将该进程的PCB指针插入相应的等待队列s.queue末尾

}

}

注意,PV 操作都是原子性操作,要么全部执行要么全部不执行,在阻塞后返回也算是完成一个流程,但如果设置了IPC_NOWAIT选项,当资源暂且不可用时直接返回错误,此时对信号量的操作都没有执行。


(3)V原语伪代码

V(s)
{

 s.value++;

if (s.value < =0)

{

唤醒相应等待队列s.queue中等待的一个进程

改变其状态为就绪态

并将其插入就绪队列

}

}


(4)用PV原语解决司机与售票员问题



(5)用PV原语解决民航售票问题


每个客户端都在执行PV这样的操作流程


(6)用PV原语解决汽车租赁问题

有一汽车租赁公司有两部敞篷车可以出租,假定同时来了四个顾客都要租敞篷车,那么肯定会有两个人租不到。


每个顾客都在执行PV这样的操作流程。

转载于:http://blog.csdn.net/jnu_simba/article/details/9087245
0 0
原创粉丝点击