进程间通信1

进程同步与互斥

顺序程序特征:顺序性、封闭性、确定性、可再现性
并发程序特征:共享性、并发性、随机性
互斥:由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程间互斥。系统中某些资源一次只允许一个进程使用,这样的资源为临界资源互斥资源。在进程中涉及到互斥资源的程序段叫临界区。例:两个小孩挣钱同一个玩具
同步:多个进程需要互相配合共同完成一项任务。例:公共汽车安全行驶司机与售票员

进程间通信目的

数据传输:一个进程需要将它的数据发送给另一个进程
资源共享:多个进程之间共享同样的资源
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)
进程控制:有些进程希望完全控制另一个进程的执行(如debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

进程间通信发展

  1. 管道
  2. system V进程间通信
  3. POSIX进程间通信

进程间通信分类

  1. 文件
  2. 文件锁
  3. 管道(pipe)和有名管道(FIFO)
  4. 信号(signal)
  5. 消息队列
  6. 共享内存
  7. 信号量
  8. 互斥量
  9. 条件变量
  10. 读写锁
  11. 套接字(socket)

进程间共享信息的三种方式

  1. 文件系统
  2. 内核
  3. 共享内存区

IPC对象的持续性

  1. 随进程持续:一直存在直到打开的最后一个进程结束(如pipe和FIFO)
  2. 随内核持续:一直存在直到内核自举或显示删除(如systemV消息队列、共享内存、信号量)
  3. 随文件系统持续:一直存在直到显示删除,即使内核自举还存在(POSIX消息队列、共享内存、信号量如果是使用映射文件来文件)

死锁

多个进程相互等待对方的资源,而在得到对方资源之前有不释放自己的资源,这样造成循环等待的一个现象。如果所有进程都在等待一个不可能发生的事,则进程就死锁了。哲学家就餐问题
四个必要条件:

  1. 互斥条件:进程对资源进行排他性作用,即在一段时间内某资源仅为一个进程所占用
  2. 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放
  3. 不可剥夺条件:进程已获得的资源在未使用完之前,不能被剥夺,只能在使用完时由自己释放
  4. 环路等待条件:各个进程组成封闭的环形链,每个进程都等待下一个进程所占用的资源。

防止死锁方法

  1. 资源一次性分配
  2. 可剥夺资源
  3. 资源有序分配法
    预防死锁的几种策略,会严重损害系统性能,因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。银行家算法

信号量与PV原语

Dijkstra 提出

信号量

互斥:P、V在同一个进程中
同步:P、V在不同进程中
S>0:S表示可用资源的个数
S=0:表示无可用资源,无等待进程
S<0:|S|表示等待队列中进程个数
P原语

P(s)
{
	s.value=s.value--;
	if(s.value<0)
	{
		该进程状态置为等待状态
		将该进程的PCB插入相应的等待队列s.queue末尾
	}
}

V原语

V(s)
{
	s.value=s.value++;
	if(s.value<=0)
	{
		唤醒相应等待队列s.queue中等待的一个进程
		改变其状态为就绪态
		并将其插入就绪队列
	}
}

实际问题

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

司机进程

S1(0);
while(1)
{
	P(S1)
	启动车辆
	正常运行
	到站停车
	V(S2)
}

售票员进程

S2(0);
while(1)
{	
	关门
	V(S1);
	售票
	P(S2)
	开门
}

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值