首页 > 系统相关 >进程间通信的6种方式

进程间通信的6种方式

时间:2022-11-28 20:22:43浏览次数:28  
标签:信号量 方式 间通信 访问 进程 操作 共享内存

1、管道:

1)管道传输数据是单向的,如果想相互通信,需要建立两个管道。

2)管道这种通信方式效率低, 不适合进程间频繁地交换数据。

3)优点是简单,很容易得知管道里的数据已经被另一个进程读取了。

 

2、消息队列:

1)消息队列是保存在内核中的消息链表,AB进程互相发送消息,只要把数据放在消息队列即可,之后进程遍可以正常返回,另一个进程会从消息队列中读取数据。

2)缺点:消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销。

 

3、共享内存:

1)操作系统对于内存管理,采用的是虚拟内存技术,也就是每个进程都有自己独立的虚拟内存空间,不同进程的虚拟内存映射到不同的物理内存中。所以,即使进程A和 进程B的虚拟地址是一样的,其实访问的是不同的物理内存地址,对于数据的增删查改互不影响。

2)共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。这样这个进程写入的东西,另外一个进程马上就能看到了,都不需要拷贝来拷贝去,传来传去, 大大提高了进程间通信的速度。

3)缺点:当多个进程向同一个共享内存中写入数据时可能会产生覆盖(如在工作中,当多人同时修改一份共享文档时别人可能会将你添加的内容修改删除或覆盖),如果只读则没有任何问题。

 

4、信号量:

1)为了防止多进程竞争共享资源,而造成的数据错乱,所以需要保护机制,使得共享的资源,在任意时刻只能被一个进程访问。正好,信号量就实现了这一保护机制。

2)信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步。

3)信号量表示资源的数量,控制信号量的方式有两种原子操作:

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

举例说明:

A:如果要使得两个进程互斥访问共享内存,我们可以初始化信号量为1。

具体的过程如下:

  • 进程A在访问共享内存前,先执行了P操作,由于信号量的初始值为1,故在进程A执行P操作后信号量变为0,表示共享资源可用,于是进程A就可以访问共享内存。
  • 若此时,进程B也想访问共享内存,执行了P操作,结果信号量变为了-1,这就意味着临界资源已被占用ェ因此进程B被阻塞。
  • 直到进程A访问完共享内存,才会执行V操作,使得信号量恢复为0,接着就会唤醒阻塞中的进程B,使得进程B可以访问共享内存,最后完成共享内存的访问后,执行 V操作,使信号量恢复到初始值1。

可以发现,信号初始化为1,就代表着是互斥信号量,它可以保证共享内存在任何时刻只有一个进程在访问,这就很好的保护了共享内存。

B:用信号量来实现多进程同步的方式,我们可以初始化信号量为0。

具体过程如下:

  • 如果进程B比进程A先执行了,那么执行到P操作时,由于信号量初始值为0,故信号量会变为-1,表示进程 A 还没生产数据,于是进程B就阻塞等待。
  • 当进程A生产完数据后,执行了V操作,就会使得信号量变为0,于是就会唤醒阻塞在P操作的进程B。
  • 进程B被唤醒后,意味着进程A已经生产了数据,于是进程B就可以正常读取数据了。

可以发现,信号初始化为0,就代表着是同步信号量,它可以保证进程A应在进程B之前执行。

 

5、信号:

1)信号一般用于一些异常情况下的进程间通信,是一种异步通信,它的数据结构一般就是一个数字。

2)信号是进程间通信机制中唯一的异步通信机制。

3)进程需要为信号设置相应的监听处理,当收到特定信号时,执行相应的操作,类似很多编程语言里的通知机制。

 

 

6、套接字:

1)前面提到的管道、消息队列、共享内存、信号量和信号都是在同一台主机上进行进程间通信,那要想跨网络与不同主机上的进程之间通信,就需要Socket通信了。

2)Socket通信不仅可以跨网络与不同主机的进程间通信,还可以在同主机上进程间通信。

 

小结:

 

标签:信号量,方式,间通信,访问,进程,操作,共享内存
From: https://www.cnblogs.com/wyj510/p/16933008.html

相关文章

  • xml_解析_解析方式以及常见的解析器
    xml_解析_解析方式操作xml文档中解析(读取):操作xml文档,将文档中的数据读取到内存中写入:将内存中的数据保存到xml文档中,持久化的存储 解析xml的方式:DOM:将......
  • zabbix监控进程和监控日志
    zabbix监控进程和监控日志文章目录zabbix监控进程和监控日志一、自定义监控进程1、新建脚本存放目录2、修改zabbix_agentd.conf文件3、zabbixserver端进行测试......
  • java面试题,上楼梯有多少种方式
     java面试题,上楼梯有多少种方式题目:一个小孩上一个N级台阶的楼梯,他可以一次走1阶、2阶或3阶,那么走完N阶有多少种方式。很自然的想法是使用递归:publicclassTest04{pub......
  • IOS中的数据存储方式,特点,使用情况
    数据存储的核心都是写文件,主要有四种持久化方式:属性列表(Plist),对象序列化,SQLite数据库,CoreData。存储Plist:     键值进行存储,不能存储对象。对象需要序列化编码才能......
  • 自定义UICollectionViewController之后如何设置布局方式
    今天使用了自定义UICollectionViewController,发现了布局问题,所以给初学者讲解一下,当我们自定义了UICollectionViewController就无法设置UICollectionView的布局样式的问题......
  • Java中数组、集合初始化及遍历方式
    一、数组1.一维数组一维数组两种初始化方式静态初始化int[]array={1,2,3};int[]array=newint[]{1,2,3};动态初始化int[]array=newint[3......
  • C++ 进程间通信
    https://blog.csdn.net/weixin_38416696/article/details/90719388一,C++常用进程间通信管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖......
  • mysql表 自动生成word文档,java方式
    1、新建一个maven项目,并引入包<!--导出文档包--><dependency><groupId>cn.smallbun.screw</groupId><artifactId>screw-core</artifactId><version>1.0......
  • Redis 大key的影响及处理方式
    什么是redis的大key大key并不是指key的值很大,而是key对应的value很大。一般而言,下面这两种情况被称为大key:String类型的值大于10KB;Hash、List、Set、ZSe......
  • USB应用实战视频教程第3期:手把手玩转USB BULK方式下位机和QT6.4上位机开发(上篇)
    ​​​​ 为防止视频时间太长,本期视频先发布上篇USB下位机和USB驱动设计安装,以及以前基于emWin电脑端模拟器设计的上位机效果展示。下期视频教程分享QT6.4设计的上位机。......