• IPC机制


    前言

    IPC - 进程间通信,常用于多进程编程中用以共享数据, 系统学习,概念性的东西,过往的操作中经常使用 socket进行IPC,但是其他也要做些了解,本篇简单总结

    通信方式

    1. 管道

    1.1 匿名管道

    场景
    cat xx.txt|grep a
    
    • 1

    敲过linux命令的都能看懂这个命令,这就是一种匿名管道的使用,匿名管道只能在通过 fork 的方式创建的进程下面进行通信,所以信息流是单向的

    原理

    内核空间无格式的字节流数据,
    依赖文件系统,进程结束自动销毁
    单向通信,上下游进程默认同步
    fork的进程会继承父进程打开的fd所以,适用于父子进程或者亲缘关系进程

    总结

    匿名管道,它的通信范围只能是存在父子/亲缘关系的进程

    1.2 命名管道FIFO

    场景

    双向信息流

    原理

    内核空间无格式的字节流数据
    设备文件
    事先创建管道文件,使用 mkfifo fifo 创建命名管道

    总结

    可用于任意进程间通信

    不管匿名管道还是命名管道,在实际场景中都较少使用,但是一些特定场景可能使用他比其他方式来的效率更高,比如本机大文件的传输


    2. 消息队列

    原理

    内核空间消息链表
    消息体由用户自定义格式,每个消息体固定大小存储

    问题

    内核态用户态切换和数据拷贝
    必须显示释放,否则不会随着进程结束而释放掉内存,除非操作系统重启

    总结


    3. 共享内存

    原理

    虚拟内存映射相同的物理地址,避免内核态用户态切换和数据拷贝

    问题

    并发问题,非并发安全的,当多个进程向同一个共享内存中写入数据时可能产生覆盖,如何解决?加锁呗,即信号量机制

    4. 信号量

    场景

    用于进程间互斥和同步

    原理

    内核直接管理,是一个整数型计数器,实现进程间的互斥和同步,非用于缓存进程间的通信数据,有两类:二值信号量计数信号量, 二值信号量即1/0 用来实现互斥/同步, 计数信号量用作程序计数用

    • 两种原子操作

      • P操作
        信号量 -1,相减后若信号量<0,则表明资源已被占用,进程需阻塞等待;相减后若信号量>=0,则表明还有资源可使用,进程可正常继续执行。
      • V操作
        信号量 +1,相加后若信号量<=0,则表明当前有阻塞中的进程,于是会将该进程唤醒运行;相加后若信号量>0,则表明当前没有阻塞中的进程。
    • 实例

      • 互斥信号量: 信号量初始值为1, 此机制保证内存在任何时刻只有一个进程访问。

        互斥流程 - 信号量=1
        进程1
        进程2
        END
        V操作 +1
        wait
        START 信号量 1
        P操作 -1
        信号量是否 >= 0
        临界区
        START 信号量 0
        P操作 -1
        信号量是否 >= 0
        临界区
        V操作 +1
        END

        可以看到互斥需两个因素, ①信号量=1 ②同一个进程执行PV操作


      • 同步信号量:信号量初始值为0, 此机制除了保证互斥外,亦可保证同步顺序

      同步流程 - 信号量=0
      进程1
      进程2
      END
      V操作 +1
      wait
      START 信号量 0
      临界区
      START 信号量 0
      P操作 -1
      信号量是否 >= 0
      临界区
      END

      上图展示了两个进程,其中进程1在进程2之前执行可以看到同步需两个因素, ①信号量=0 ②PV操作不在同一进程


      上面两图提到了临界区对应的有一个临界资源,怎么理解?
      临界资源: 同一时刻,只允许一个进程或线程访问的资源
      临界区:访问临界资源的代码段,这段代码中进程/线程将访问共享资源,当另外一个进程/线程已经在这段代码中运行时.这个进程/线程就不能在这段代码中执行,控制对临界资源的访问就是控制程序进入临界区来完成的


    5. 信号

    异步通信, 一个数字, 信号是进程间通信机制中唯一的异步通信机制

    • 场景
      kill -9 xx:SIGKILL信号,立即结束进程
      ctrl+c: SIGINT信号,强制中断程序的执行,杀死程序的进程
      ctrl+z: SIGTSTP信号,中断任务,挂起进程, fg重新执行,bg直接杀掉, vim一个文件可以测试下

    6. Socket

    跨网络和不同主机需要使用socket进行通信了,以上的5种全部是同台主机的机制
    一般这类的是通过TCP/UDP协议

  • 相关阅读:
    java源码系列:HashMap底层存储原理详解——2、技术本质-原理过程-数据结构
    SpringBoot + Redis的Bitmap实现活跃用户统计
    你必须要知道CNN模型:ResNet残差网络
    [附源码]java毕业设计st音乐网站论文
    【执行数据库操作时Tomcat报错但不影响使用】error testWhileIdle is true, validationQuery not set
    2023年视频号视频下载提取使用教程
    最大公约数的四种方法
    006:连续跌三天,第四天上涨的概率--用python统计
    Python采集天气数据,做可视化分析【附源码】
    pandas学习资源
  • 原文地址:https://blog.csdn.net/weixin_43380311/article/details/125377389