当前位置:网站首页>IPC机制

IPC机制

2022-06-24 20:55:00 黄元宝

前言

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

通信方式

1. 管道

1.1 匿名管道

场景
cat xx.txt|grep a

敲过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协议

原网站

版权声明
本文为[黄元宝]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43380311/article/details/125377389