前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >进程间通信

进程间通信

作者头像
猎户星座1
修改2020-08-11 10:22:58
7560
修改2020-08-11 10:22:58
举报
文章被收录于专栏:Java StudyJava Study

进程间的通信 方式 直接看大佬的 文章

https://mp.weixin.qq.com/s/mblyh6XrLj1bCwL0Evs-Vg

linux 中的管道

其实所谓的管道 ,就是内存中的一串缓存,从管道的一段写入数据,

实际是缓存在内核中,另一端读取,也就是从内核中读取这段数据,

另外,管道传输的的数据是无格式的流且大小受限。

创建匿名的管道 : int pipe(int fd[2])

使用 fork 创建子进程,创建的子进程会 复制父进程的文件描述符 ,这样就做到了两个进程各有两个「 fd[0] 与 fd[1]」,

两个进程就可以通过各自的 fd 写入和读取同一个管道文件实现跨进程通信了。

管道 只能一端写入 一端读出,而 父进程和子进程能同时写入 也可以同时写出,容易造成混乱解决办法:

只允许一端开放 读或写 的

命名管道和 匿名管道的 通信之间的区别:

我们可以得知,对于匿名管道,它的通信范围是存在父子关系的进程。

因为管道没有实体,也就是没有另外,对于命名管道,它可以在不相关的进程间也能相互通信。

因为命令管道,提前创建了一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信。

不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,

另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则,管道文件,

只能通过 fork 来复制父进程 fd 文件描述符,来达到通信的目的。

消息队列

管道的通信方式的效率低下,不适合频繁的进行交换数据

消息队列的通信模式就可以进行解决,A要给B 发消息 A进程把数据放在消息队列中就正常返回了,B进程去读取数据就可以了。

消息队列是保存在内核中的消息链表,在发送数据时,会分成一个一个独立的数据单元,也就是消息体(数据块),

消息体是用户自定义的数据类型,消息的发送方和接收方要约定好消息体的数据类型,

所以每个消息体都是固定大小的存储块,不像管道是无格式的字节流数据。

如果进程从消息队列中读取了消息体,内核就会把这个消息体删除。

在发送数据时,会分成一个一个独立的数据单元,也就是消息体(数据块),

消息体是用户自定义的数据类型,消息的发送方和接收方要约定好消息体的数据类型,

所以每个消息体都是固定大小的存储块,不像管道是无格式的字节流数据。如果进程从消息队列中读取了消息体,内核就会把这个消息体删除。

但邮件的通信方式存在不足的地方有两点,一是通信不及时,二是附件也有大小限制,这同样也是消息队列通信不足的点。

消息队列不适合比较大数据的传输 :

因为在内核中每个消息体都有一个最大长度的限制,同时所有队列所包含的全部消息体的总长度也是有上限。在 Linux 内核中,会有两个宏定义 MSGMAX 和 MSGMNB,它们以字节为单位,分别定义了一条消息的最大长度和一个队列的最大长度。

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

因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程,同理另一进程读取内核中的消息数据时,会发生从内核态拷贝数据到用户态的过程。

共享内存

用了共享内存通信方式,带来新的问题,那就是如果多个进程同时修改同一个共享内存,很有可能就冲突了。例如两个进程都同时写一个地址,那先写的那个进程会发现内容被别人覆盖了。

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

信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。

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

一个是 P 操作,这个操作会把信号量减去 -1,相减后如果信号量 < 0,则表明资源已被占用,进程需阻塞等待;相减后如果信号量 >= 0,则表明还有资源可使用,进程可正常继续执行。

另一个是 V 操作,这个操作会把信号量加上 1,相加后如果信号量 <= 0,则表明当前有阻塞中的进程,于是会将该进程唤醒运行;相加后如果信号量 > 0,则表明当前没有阻塞中的进程;

信号 和 信号量 用途完全不一样

上面说的进程间通信,都是常规状态下的工作模式。对于异常情况下的工作模式,就需要用「信号」的方式来通知进程。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • linux 中的管道
  • 消息队列
  • 共享内存
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档