进程间通信(1)--基本概念

进程间通信就是指不同进程之间相互传播以及交换信息,我们知道不同进程的用户空间都是独立存在的,那么是如何实现进程间的通信呢?

1.进程间通信的相关概念:

同步和互斥:

进程同步:是指多个进程在执行次序上进行协调,使并发执行的众多进程之间能够按照一定规则共享资源,并能很好的相互合作,从而使程序的执行具有可再现性。 

 进程互斥:由于各个进程都要访问共享资源,而且这些资源需要排他使用,因此各个进程间需要竞争这些资源,我们将这种关系称为进程的互斥。

换句话讲,诸进程由于时序关系而形成的直接制约关系我们称之为进程同步;诸进程为竞争使用互斥性资源而形成的间接制约关系我们称之为进程互斥;因此,在某种程度上,进程互斥也是一种同步。

临界资源:

各进程采取互斥的方式,实现共享的资源称作临界资源。  

属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。

临界资源是一次仅允许一个进程将使用的共享资源。

临界区:

每个进程访问临界资源的那段代码称为临界区。

每次只允许一个进程进入临界区,进入后,不允许其他进程进入。不论是硬件临界资源还是软件临界资源,多个进程必须互斥的对它进行访问。

多个进程涉及到同一个临界资源的的临界区称为相关临界区。

为了使进程互斥的进入自己的临界区,设置了专门的同步机制来协调各进程之间的运行,所有同步机制都遵循四条准则:

空闲让行: 当无进程处于临界区时,表明临界区处于空闲状态,应允许一个请求的资源进入自己临界区,以有效利用临界资源。

忙则等待: 当已有进程进入临界区时,其他进程想要进入临界区必须等待,以保证临界资源的互斥访问

有限等待: 对要求访问临界资源的进程,应确保在有限时间进入自己的临界区,以免出现“死等”状态

让权等待:不能进入自己临界区的进程应该放弃cpu 

原子操作:

一个操作中的所有动作,要么全做,要么全不做。(基本单位)

2.进程间通信的目的:

数据传输:一个进程需要将信息发送给另一个进程。 

资源共享:  多个进程之间共享同一个资源。 

通知事件:一个进程需要向另一个进程或另一组进程发送消息,告诉它们发生了什么事件。(如进程终止要通知父进程) 

进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望拦截另一个进程的所有陷入和异常,并即使知道他的状态改变。

3.进程间通信的发展

管道 

systemV 进程间通信 

POSIX 进程间通信

4.进程间通信分类:

管道:

  • 匿名管道
  • 命名管道

systemV IPC

  • systemV IPC 消息队列
  • systemV IPC 共享内存
  • systemV IPC 信号量

POSIX IPC

  • 消息队列
  • 共享内存
  • 信号量
  • 互斥量
  • 条件变量
  • 读写锁

Socket通信(不关心)

  • 不同处理器系统之间的一种网络通信方式

5.信号量:

信号量和pv操作是迪杰斯特拉(Dijkstra)提出的。

信号量发展:

1.整型信号量 

2.记录型信号量 

3.AND信号量 

4.信号量集

信号量与P、V原语

互斥:p和v操作在同一个进程-->保证互斥操作 

同步:p和v操作在不同进程-->实现同步操作 

信号量

struct semaphore{
int value;
struct task_struct *ptr;//等待该信号量的进程,处于等待状态
};

P原语:

p(s)
{
s.value --;
if(s.value <0) 
{
    将该进程置为等待状态
    将该进程的 task_struct 插入到相应等待队列
}
}

V原语:

v(s)
{
s.value ++;
if(s.value <=0 ) 
{
    唤醒等待队列上的进程
    将其改成就绪状态
    放入就绪队列
}

信号量值的含义:

s>0 可用资源数
s=0 没有资源可以使用且没有人在该信号量上等待使用资源
s<0 有|s|(s绝对值)个进程在等待该资源,即阻塞进程数

信号量的应用:

信号量主要用于实现进程互斥和进程同步问题。

互斥示例:

多人过桥,一次只能过一人问题:

过桥

同步示例:

公交司机与售票员相互协作、同步问题:

司机和售票员

既有同步又有互斥示例:

仓库取货员与装货员之间的同步互斥问题:

仓库

6.死锁:

多个进程由于相互等待对方资源,在等待对方资源之前也不会释放自己资源造成循环等待的现象。如果所有进程都在等待一个不可能发生的事件,进程就死锁了。

产生死锁的原因:

1.竞争资源  

 -竞争非剥夺性资源(如打印机、刻录机)
 -竞争临时性资源、消息

2.进程间推进顺序非法

产生死锁四个必要条件:

资源互斥条件: 进程对所分配到的资源进行排他性使用,即在一段时间里,某资源只能被一个进程使用,如果其他进程请求该资源,必须等待直至占有该资源的进程用完并释放。

请求并保持条件: 进程已经保持了至少一个资源,但有提出新的资源请求,但该资源已被其他进程占有,此时请求进程被阻塞,但对自己占有的资源也不释放。

不可抢占条件: 进程已获得的资源在未使用完之前不能被抢占,只能自己使用完释放。

循环等待条件:在产生死锁时,必然存在一个进程--资源循环链,即进程集合中的P0正在等待P1占有的资源,而P2在等待P3占有的资源......,Pn正在等待P0占有的资源。

防止死锁的办法:

1.破坏请求并保持条件:所有进程在运行之前,必须一次性申请整个运行过程中所需要的全部资源

2.破坏不可抢占条件:采用剥夺式调度算法 

3.破坏循环等待条件:对系统所有资源线性排序,有序分配

经典的死锁避免算法:银行家算法

(1)当顾客的资金需求少于银行家现有资金总量,则接纳该客户
(2)顾客可以分期贷款,但是贷款总额不能超过最大需求量
(3)当银行家现有资金不能满足顾客的需求,可以推迟支付,但总能在有限的时间里让顾客得到贷款
(4)当顾客使用完全部资金,一定能够在有限的时间内归还所有资金

经典死锁案例:哲学家就餐问题

猜你喜欢

转载自blog.csdn.net/tanrui519521/article/details/79939488