进程间通信

进程间通信

一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并能够相互传递交换信息

为什么要通信(重点)
  • 数据传输:一个进程需要将它的数据发送到另一个进程

  • 资源共享:多个进程之间需要共享资源

  • 事件通知:一个进程要向另一个或者一组进程发送消息,通知它(们)发生的事件(比如进程终止要通知父进程)

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

怎么通信(主要三种方式),通信本质(重点)
管道(Unix中最古老的进程间通信的方式)

我们把一个进程连接到另一个进程的一个数据流称为管道

  • 匿名管道(通常就叫管道)

    创建方法
    
    #include <unistd.h>
    
    int pipe(int fd[2])
    
    参数:文件描述符数组,fd[0]表示读端,fd[1]表示写端
    返回值:成功返回0,失败返回错误代码

    特点:
    1. 单向传输(单工),只能在父子进程间或兄弟进程间使用
    2. 管道是临时对象
    3. 管道和文件的使用方法类似,都能使用read、write、open等普通IO函数
    4. 管道面向字节流,即提供流式服务
    5. 一般来讲,管道生命周期随进程,进程退出,管道释放
    6. 一般来讲,内核会对管道操作进行同步与互斥
    7. 本质上Linux上的管道是通过空文件夹实现的
    8. 事实上,管道使用的文件描述符、文件描述符、文件指针最终都会转化成系统内核中SOCKET描述符,都收到了SOCKET描述符的限制
    9. 补充:Linux中,用两个file数据结构来实现管道

  • 命名管道

    创建方法
    $ mkfifo filename //命令行创建
    
    int mkfifo(count char* filename, mode_t mode)//函数

    特点:

    1. 命名管道也是单向传输,但它可以在不相关的进程间使用
    2. 命名管道不是临时对象,它们是文件系统真正的实体
    3. Linux下,在写进程打开命名管道之前,必须处理读进程对命名管道的打开,在写进程写数据之前,也必须处理处理读进程对管道的读
    4. 除了以上的特点与管道不同,其他的都是都与管道一样,包括数据结构和操作

    匿名管道和命名管道的区别?

    答:匿名管道只能在父子进程间或兄弟进程间使用,命名管道可以在不相关的进程间使用;匿名管道是临时对象,命名管道是文件系统真正的实体;匿名管道和命名管道打开和关闭方式不同。

  • 管道的缺陷

    1. 管道读数据的同时也将数据移除,所以管道不能对多个接收者广播数据
    2. 管道中的数据被当作字节流,所以无法识别信息的边界
    3. 如果一个进程中有多个读进程,写进程无法发送到指定的读进程,如果有多个写进程,无法知道数据是哪一个发送的
系统IPC(System V IPC资源生命周期随内核)
  • 消息队列

    提供了一个由一个进程向另外一个进程发送一块数据的方法

    特点:
    1. 消息队列是随内核,只有重启和手动删除才会被真正的删除
    2. 每个数据块都被认为是有个类型,接受者进程接受的数据块可以是不同类型值
    3. 每个消息是有最大长度的上限的,每个消息队列的字节数也是有上限的,系统上消息队列数也有上限
    4. 可用于机器上的任何进程间通信

    消息队列与管道的区别:
    1. 提供有格式的字节流,减少开发人员的工作量
    2. 消息具有类型,实际应用中,可以当做优先级使用
    3. 消息队列随内核,生命周期比管道长,应用空间更大

  • 共享内存

    由一个进程创建,其余进程对这块内存进行读写

    特点:

    1. 最快的IPC形式
    2. 进程间数据传递不再涉及到内存(不执行进入系统的内核调用来传递彼此的数据)
    3. Linux无法对共享内存进行同步,需要程序自己对共享内存做同步运算,这种运算很多时候就是通过信号量来实现的
  • 信号量

    主要用于同步与互斥

    1. 进程互斥

      1. 由于有些进程需要共享资源,而且需要互斥使用,所以个进程竞争使用这些资源,这种关系被称为进程互斥
      2. 系统中某些进程一次只能被一个进程使用,称这样的资源为临界资源或者互斥资源
      3. 在进程中涉及互斥资源的的程序段叫做临界区
    2. 进程同步
      多个进程需要配合完成同一个任务

    3. 信号量和P、V原语

      1. 由Dijkstra提出
      2. 信号量
        1. 互斥:P、V在同一个进程
        2. 同步:P、V在不同的进程
      3. 信号量值的含义
        1. S>0:表示可用资源个数
        2. S=0:表示没有可以用的资源,无等待进程
        3. S<0:表示等待队列中有|S|个进程
      4. 为什么引入同步与互斥机制?点击进入答案
套接字(socket)
  • TCP用主机的ip地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字或插口

  • 用(IP地址:端口号)表示

  • 特点:

    1. 是网络通信过程中端点的抽象表示,是支持TCP/IP的网络通信的基本操作单元
    2. 包含进行网络通信必须的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远地主机的IP地址、远地进程的协议端口
    3. 在所有提供了TCP/IP协议栈的操作系统都适用,且编程方法几乎一样
    4. 要通过Internet进行通信,至少需要一对套接字
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_长风_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值