前言:Linux进程通信的方式

什么是进程通信?进程通信是指进程之间交换信息

进程通信方式共有6种:

管道(pipe),包括流管道(s_pipe)和有名管道(named pipe)

信号(signal)

消息队列

共享内存

信号量

套接字(socket)

RPC

下面详细说说各种通信方式和区别

一、管道

管道是指连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又称为pipe文件,管道内数据以字符流形式传输

管道机制:

1. 互斥,一个进程在进行读/写操作,另一个线程必须等待

2. 同步,生产者消费者问题,写进程写完便挂起,知道读进程读取之后唤醒

3. 双方必须存在才能进行通信

缺点:

1. 半双工的通信,数据只能单向流动(写到读)

2. 只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

于是出现了流管道(s_pipe)和有名管道(named pipe)

1. 1流管道(s_pipe)

可以双向传输

1.2 有名管道(named pipe)即FIFO

克服了管道没有名字的限制,允许无亲缘关系进程间的通信,但还是半双工的

二、信号量

主要作为进程间以及同一进程内不同线程之间的同步手段。

进程间通信处理同步互斥的机制。信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。

三、信号 ( singal )

主要作为进程间以及同一进程内不同线程之间的同步手段。

进程间通信处理同步互斥的机制。信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。

四、消息队列( message queue )

消息队列是消息的链表,包括Posix消息队列systemV消息队列。

有足够权限的进程都可以向队列中添加消息,有足够读权限的进程都可以读走队列中的消息。

消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

我们开发时常用各种mq

五、共享内存( shared memory )

共享数据结构,例如生产者消费者的缓冲区,生产者放入缓存区,消费者从缓冲区取出,实现了进程通信

共享存储区,在内存中划出一块共享内存,诸进程可通过对该共享区的读或写交换信息,实现通信,例如共享某个文件

是最快的可用IPC形式(因为共享内存区中的单个数据副本对于共享该内存的所有线程或进程都是可用的)

为什么会比其它的IPC形式更快?

一般IPC形式(管道、FIFO、消息队列)的问题在于,两个进程要交换信息,这些信息必须经由内核传递。

而进程间共享内存时,交换数据就不再涉及内核。这些进程必须协调或同步对该共享内存区的使用。

就拿一个客户-服务器的文件复制流程来说:

对于共享内存,该共享内存区同时存在于客户和服务器的地址空间

数据只需复制两次:

一次从输入文件到共享内存区,另一次从共享内存区到输出文件

对于其他IPC形式(管道、FIFO、消息队列)则需要四次复制:

从输入文件复制到服务器中,服务器将其复制到IPC形式(管道、FIFO、消息队列),IPC形式中复制到客户机中,客户机再复制到输出文件中

六、套接字( socket )

套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

七、RPC

RPC(Remote Procedure Call)远程过程调用,基于Socket之上的一个协议,从一个系统(客户主机)上某个程序调用另一个系统上(服务器主机)某个函数的一种方法,它的调用进程和被调用进程可在不同主机上执行,客户和服务器运行在不同主机上,而且过程调用中涉及网络I/O,RPC是透明的,它使得远程过程调用看上去就像本地调用一样,给使用者屏蔽了底层的实现

举例:

两个老板手下各有一个负责接通MSN的秘书. 这两个秘书就是基于RPC协议建立的会话层通信. 老板不需要知道怎么使用MSN, 只要告诉秘书,秘书就会通过MSN与对方建立会话请求和相应. 而基于Socket的通信, 老板需要会使用MSN,这样,虽然老板需要实现培训一下关于MSN的知识, 但与对方通信时,就不用经过秘书了,效率会更高.

Socket和RPC的优缺点:

(Socket)越底层,代码越复杂、灵活性越高、效率越高;(RPC)越上层,抽象封装的越好、代码越简单、效率越差

例如可以用netty来实现RPC。

这种通信方式的具体事例,就如我之前写的 Netty实现服务器推Push(Android推送)

各种通信方式的总结

1. 管道

速度慢,只能承载无格式字节流,容量有限,只有父子进程能通讯,半双工

2. 流管道

缺点:管道有的缺点

优点:可以双向传递

3. 有名管道

缺点:管道有的缺点

优点:没有血缘关系的进程也可以通信

3. 消息队列

缺点:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题

优点:可以传递有格式字节流

4. 信号量

不能传递复杂消息,只能用来同步

5. 共享内存区

优点:能够很容易控制容量,速度快(两次复制),而上面的IPC方式是四次复制

缺点:要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存

6. Socket

前面所说的IPC方式,都只能用于一台机器内部的进程通信,Socket可以实现不同计算机之间的进程通信

7.RPC

基于Socket,具有Socket的优点,具有透明性

linux进程管道通信缺点,Linux进程通信(IPC)的方式详解相关推荐

  1. Linux进程最大socket数,Linux下高并发socket最大连接数所受的各种限制(详解)

    1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每 ...

  2. linux修改zip中文件,Linux下修改jar、zip等文件内的文件详解

    Linux下修改jar.zip等文件内的文件详解 Linux下修改jar.zip等文件内的文件详解 看到很多同事在Linux环境下修改jar包内的文本文件或zip中的文本文件时,经常是先把jar包或z ...

  3. linux upstart脚本,Linux upstart启动方式详解

    Ubuntu从6.10开始逐步用Upstart()代替原来的SysVinit进行服务进程的管理.RHEL(CentOS)也都从版本6开始转用Upstart代替以往的init.d/rcX.d的线性启动方 ...

  4. linux如何确定共享库路径,摘录Linux下动态共享库加载时的搜索路径详解

    对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似"error while loading shared libraries"这样的错误,这是典型的因为需要的动态库不在动态链接器 ...

  5. linux shell 字符串操作(长度,查找,替换)详解 BASH

    linux shell 字符串操作(长度,查找,替换)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系 ...

  6. Linux 创建网页服务,Linux使用Node.js建立访问静态网页的服务实例详解

    Linux使用Node.js建立访问静态网页的服务实例详解 一.安装node.js运行所需要的环境,: 二.创建node目录(/node/www),并在目录下创建node.js服务文件server.j ...

  7. linux两台服务器传输,Linux两台服务器之间高速数据传输命令:scp应用详解

    Linux两台服务器之间高速数据传输命令:scp应用详解 Linux scp命令用于Linux之间复制文件和目录到另外一台,这个命令在多台服务器之间传输还是非常有用的,速度也是非常快的.比window ...

  8. 19. linux中权限详解,Linux权限位,读写执行权限真正含义,chmod详解

    linux中权限详解,Linux权限位,读写执行权限真正含义,chmod详解 文章目录 Linux权限位 读写执行 三种权限真正含义和作用 权限对文件的作用 权限对目录的作用 示例 chmod 使用数 ...

  9. linux服务器3306端口,linux系统对外开放3306、8080等端口,防火墙设置详解

    linux系统对外开放3306.8080等端口,防火墙设置详解 发布时间:2020-10-10 23:08:49 来源:脚本之家 阅读:141 作者:julielele 栏目:服务器 我们很多时候在l ...

  10. linux系统编程笔记02——Linux命令:修改文件权限命令chmod、chgrp、chown详解

    Linux命令:修改文件权限命令chmod.chgrp.chown详解 Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限 ...

最新文章

  1. 阿里云maven镜像地址
  2. 在世界第二届半机械人奥运会上,瘫痪飞行员在Cybathlon BCI竞赛中争夺金牌
  3. tankwar的java坦克子弹撞墙_TankWar 单机(JAVA版)版本2.0.5 坦克撞墙的处理
  4. linux中的keeplived源码装,Keepalived高可用集群搭建
  5. 几个支持生成Python代码的UML工具
  6. Android怎么自定义listview布局,Android ListView自定义布局
  7. java8 时间加一秒_Java8中新增的日期和时间API
  8. content 控件(24)
  9. 面试: 华为综合测试
  10. USB 3.0 高清音视频采集芯片——MS2130
  11. 首届“中科杯”全国软件设计大赛获奖名单揭晓
  12. Spring Boot pdf文件转图片
  13. VS2008(2010)开发C++
  14. c语言输出姓名JACK,C语言讲义——变量的输出
  15. 推荐一个好用的拍照解题的软件?三款老牌拍照解题的软件在这里
  16. 段永平抄底腾讯:高手不是最完美的,而是最淡定的
  17. 单片机io口定义C语言,怎样把单片机的8个不同管脚定义成同一个IO口??
  18. 赛迪专访《提升ROI,这才是人工智能要做的事》
  19. matlab去除语音噪声,基于MATLAB的语音噪声处理及实现
  20. javaweb基于SSM开发减脂训练营营员管理系统的设计与实现+论文+任务书+PPT+中期检查表

热门文章

  1. 【周记:距gdoi43天】
  2. 【selenium学习笔记一】python + selenium定位页面元素的办法。
  3. 在SQL中使用PL/SQL函数存在的问题
  4. Shell脚本:Linux下定时备份MySQL数据库
  5. oracle rac war配置,Oracle RAC安装配置流程
  6. sql累计求和时间太长_(七)SQL知识点--窗口函数
  7. 理解字节序(大小端)
  8. eclipse theia_Eclipse的Theia发布,缺少KubeCon,还有更多行业趋势
  9. 两大开源硬件之树莓派与a_开源硬件之美
  10. 业务分析岗所需具备的技能_成功的业务分析师需要具备的3种技能