Linux IPC-概述

顺序程序与并发程序

顺序程序特征

  • 顺序性
  • 封闭性
  • 确定性(运行结果)
  • 可再现性(指的是运行结果)

并发程序特征

  • 共享性
  • 并发性
  • 随机性

 

进程的同步与互斥

   进程互斥: 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥;系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源, 而在进程中涉及到互斥资源的程序段叫临界区.

 进程同步: 多个进程需要相互配合共同完成一项任务。

进程间通信目的

  • 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。

  • 资源共享:多个进程之间共享同样的资源。

  • 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。

  • 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

 

进程间通信发展

  • 管道
  • System V 进程间通信
  • POSIX进程间通信

进程间通信方式

  文件

   文件锁  (互斥,读写锁)

   管道(pipe)和命名管道(FIFO)

   信号(signal)

   消息队列

   共享内存

   信号量

   互斥量

   条件变量

   读写锁

   套接字(socket)

System V IPC

  • System V 消息队列
  • System V 共享内存
  • System V 信号量

POSIX IPC

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

进程间共享信息方式

IPC对象的持续性

   随进程持续:一直存在直到打开的最后一个进程结束。(如pipe和FIFO(进程结束,数据删除))

   随内核持续:一直存在直到内核自举或显式删除(如System V消息队列、共享内存、信号量)

   随文件系统持续:一直存在直到显式删除,即使内核自举还存在。(POSIX消息队列、共享内存、信号量如果是使用映射文件来实现)

     [IPC对象是由Linux内核管理的]

共享内存方式效率较高,因为不涉及对内核的访问。

进程死锁及处理

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

死锁产生的四个必要条件

(1)互斥条件

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

(2)请求和保持条件

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

(3)不可剥夺条件

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

(4)环路等待条件

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

 

死锁预防

   资源一次性分配:(破坏请求和保持条件)

   可剥夺资源:破坏不可剥夺条件)

   资源有序分配法:(破坏循环等待条件)

死锁避免

   预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。

   由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。

 

信号量

   信号量和P、V原语由Dijkstra(迪杰斯特拉)提出, 迪杰斯特拉的三大贡献: goto有害, PV原语, 迪杰斯塔拉最短路算法; 

信号量

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

同步:P、V在不同进程中

信号量值含义

   S>0:S表示可用资源的个数

   S=0:表示无可用资源,无等待进程

   S<0:|S|表示等待队列中进程个数

//信号量定义
typedef struct{
   int value;
   struct process_control_block *list;
}semaphore;
//P原语
//P(semaphore *S)
wait(semaphore *S)
{
    -- S->value;
    if (S->value < 0)
    {
        //将当前进程设置为阻塞状态
        //将当前进程的PCB插入相应的阻塞队列S->list末尾
        block(S->list);
    }
}
//V原语
//V(semaphore *S)
signal(semaphore *S)
{
    ++ S->value;
    if (S->value <= 0)  //表示有进程处于阻塞状态
    {
        //唤醒阻塞队列S->list中等待的一个进程,将其置为就绪态;
        //将其插入就绪队列;
        wakeup (S->list);
    }
}

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值