------管道

管道的优点是不需要加锁,缺点是默认缓冲区太小,只有4K,同时只适合父子进程间通信,而且一个管道只适合单向通信,如果要双向通信需要建立两个。而且不适合多个子进程,因为消息会乱,它的发送接收机制是用read/write这种适用流的,缺点是数据本身没有边界,需要应用程序自己解释,而一般消息大多是一个固定长的消息头,和一个变长的消息体,一个子进程从管道read到消息头后,消息体可能被别的子进程接收到

------消息队列

消息队列也不要加锁,默认缓冲区和单消息上限都要大一些,在我的suse10上是64K,它并不局限于父子进程间通信,只要一个相同的key,就可以让不同的进程定位到同一个消息队列上,它也可以用来给双向通信,不过稍微加个标识,可以通过消息中的type进行区分,比如一个任务分派进程,创建了若干个执行子进程,不管是父进程发送分派任务的消息,还是子进程发送任务执行的消息,都将type设置为目标进程的pid,因为msgrcv可以指定只接收消息类型为type的消息,这样就实现了子进程只接收自己的任务,父进程只接收任务结果

------共享内存

共享内存的几乎可以认为没有上限,它也是不局限与父子进程,采用跟消息队列类似的定位方式,因为内存是共享的,不存在任何单向的限制,最大的问题就是需要应用程序自己做互斥,有如下几种方案

1 只适用两个进程共享,在内存中放一个标志位,一定要声明为volatile,大家基于标志位来互斥,例如为0时第一个可以写,第二个就等待,为1时第一个等待,第二个可以写/读

2 也只适用两个进程,是用信号,大家等待不同的信号,第一个写完了发送信号2,等待信号1,第二个等待信号2,收到后读取/写入完,发送信号1,它不是用更多进程是因为虽然父进程可以向不同子进程分别发送信号,但是子进程收到信号会同时访问共享内存,产生不同子进程间的竞态条件,如果用多块共享内存,又存在子进程发送结果通知信号时,父进程收到信号后,不知道是谁发送,也意味着不知道该访问哪块共享内存,即使子进程发送不同的结果通知信号,因为等待信号的一定是阻塞的,如果某个子进程意外终止,父进程将永远阻塞下去,而不能超时处理

3 采用信号量或者msgctl自己的加锁、解锁功能,不过后者只适用于linux

------总结

管道是最弱的,只适合有限场景;

消息队列能适合大部分场景,缺点是默认缓冲也比较小,不过这个可以调整,前提是你有管理员权限;

共享内存是最强大的,只是要做互斥

linux管道和共享内存的区别,linux 管道、消息队列、共享内存的对比相关推荐

  1. linux学习---基于内存的IPC(共享内存,信号量数组,消息队列)

    常用的IPC分为两个类别,一是基于文件,而是基于内存 基于文件的分别有匿名管道,有名管道,普通的文件共享,socket文件 如果要看基于文件的IPC,请参考:http://blog.csdn.net/ ...

  2. linux的wq 与wq的区别,Linux ESC :wq 和:wq!的区别

    Linux ESC :wq 和:wq!的区别 Linux ESC:wq 和:wq!的区别 发布者:IT人在线 | 发表时间:2018-12-4 17:20:43 Linux ESC :wq esc(键 ...

  3. 【Linux】进程间通信 —— 匿名管道 | 命名管道 | System V | 消息队列 | 共享内存

    进程间通信 0. 进程间通信 1. 管道 1.1 匿名管道 1.1.1 匿名管道原理 1.1.2 创建匿名管道pipe 1.1.3 基于匿名管道通信的4种情况5个特点 1.2 命名管道 1.2.1 创 ...

  4. linux中fopen和open的区别,Linux下open与fopen的区别

    int open(const char *path, int access,int mode) path 要打开的文件路径和名称 access 访问模式,宏定义和含义如下: O_RDONLY      ...

  5. java 后台和前端的消息提醒_滴滴Java后台3面题目:网络+内存溢出+各种锁+高性能+消息队列...

    一面 自我介绍 项目介绍 JVM类加载机制 java的垃圾回收器都有哪些,说下g1的应用场景,平时你是如何搭配使用垃圾回收器的. 红黑树的设计 经常使用的设计模式?以及UML设计? hashmap实现 ...

  6. linux中s权限大小写的区别,Linux中的权限

    1.文件与目录权限 1)UID与GID ØUID UID是一个数值,是Linux系统中唯一的用户标识,用于区别不同的用户.在系统内部管理进程和文件保护时使用UID字段.在Linux系统中,注册名和UI ...

  7. linux下q和q 的区别,linux命令中q、wq、q!的区别

    Linux中没这个命令: 只是在vi中有这个指令: q表示退出: w表示保存退出: q!表示强制退出. linux命令是对Linux系统进行管理的命令, 对于Linux系统来说,无论是中央处理器.内存 ...

  8. Linux中head和tail的区别,linux head和tail命令详解

    1.head命令 回到顶部 head命令显示文件的开头几行,常用命令格式如下: [root@initroot ~]# head [-n number] 文件 head命令默认显示文件的前十行,-n选项 ...

  9. linux下cron和cron的区别,Linux环境下` `与$()用法的区别eval和crontab的意义

    命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置.shell中有两种方法作命令替换:把shell命令用反引号或者$(...)结构括起来,其中,$(...)格式受到POSIX标准支 ...

最新文章

  1. android 程序 读logo,Android端APP更换logo和名称后都需要些测试哪些内容呢?
  2. 200万注册开发者,13亿全景图片,90%数据生产AI化,百度地图如何造生态?
  3. python3下载教程-Python3 教程
  4. v-show与v-if的区别
  5. c++ 交换变量实践
  6. 鸿蒙处理器的手机有什么,华为重拳出击!首款鸿蒙手机已确认,网友:还买什么iPhone11?...
  7. controller调用controller的方法_SpringBoot 优雅停止服务的几种方法
  8. 收藏!最强行人检测算法思维导图
  9. .NET开发Silverlight程序:界面和对象模型
  10. Java教程:Java是什么?Java的特点有哪些?
  11. android端与windows端通信中文乱码问题
  12. Linux安装redis(6.0.9)环境
  13. matlab altera视频,Altera 官网中文视频教程 下载地址
  14. 教新手小白如何通过五分钟学会用Python爬取女神照片!
  15. 中间件学习——J2EE中间件四步曲
  16. BT软件系统包含哪些部分?BT技术如何突破运营商的封锁?
  17. 九九乘法c语言的编程,C语言九九乘法表
  18. ERROR: Could not build wheels for numpy which use PEP 517 and cannot be installed directly
  19. 王慧文清华产品课(一)
  20. A005-AS项目结构解析

热门文章

  1. java计算机毕业设计汽车金融人事管理源码+程序+lw文档+mysql数据库
  2. 罗技键盘+android风格,Android用户的福音!罗技平板电脑键盘赏析
  3. java while语句打印三角形_【连载】(循环执行语句while和if)乐创DIY C语言讲义——3.8节(3)...
  4. select2插件设置选中值
  5. 《Haskell函数式编程入门》—— 第1章,第1.3节GHCi的使用
  6. MySQL的学习入门五
  7. Linux内核二进制hook的手艺-总结
  8. Jenkins 日程表配置
  9. hive配置MySQL初始化问题
  10. 浅谈JS的三个特性:封装、继承、多态