作者:Vamei

出处:http://www.cnblogs.com/vamei

我们在Linux信号基础中已经说明,信号可以看作一种粗糙的进程间通信(IPC, interprocess communication)的方式,用以向进程封闭的内存空间传递信息。为了让进程间传递更多的信息量,我们需要其他的进程间通信方式。这些进程间通信方式可以分为两种:

管道机制:可以使用管道将一个进程的输出和另一个进程的输入连接起来,从而利用文件操作API来管理进程间通信。在shell中,我们经常利用管道将多个进程连接在一起,从而让各个进程协作,实现复杂的功能。

传统IPC:主要是指消息队列(message queue),信号量(semaphore),共享内存(shared memory)。这些IPC的特点是允许多进程之间共享资源,这与多线程共享heap和global data相类似。由于多进程任务具有并发性 (每个进程包含一个进程,多个进程的话就有多个线程),所以在共享资源的时候也必须解决同步的问题 (参考Linux多线程与同步)。

管道与FIFO文件一个原始的IPC方式是所有的进程通过一个文件交流。比如我在纸(文件)上写下我的名字和年纪。另一个人读这张纸,会知道我的名字和年纪。他也可以在同一张纸上写下他的信息,而当我读这张纸的话,同样也可以知道别人的信息。但是,由于硬盘读写比较慢,所以这个方式效率很低。那么,我们是否可以将这张纸放入内存中以提高读写速度呢?

在Linux文本流中,我们已经讲解了如何在shell中使用管道连接多个进程。同样,许多编程语言中,也有一些命令用以实现类似的机制,比如在Python子进程中使用Popen和PIPE,在C语言中也有popen库函数来实现管道 (shell中的管道就是根据此编写的)。

管道是由内核管理的一个缓冲区(buffer),相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环利用。

当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。

从原理上,管道利用fork机制建立(参考Linux进程基础和Linux从程序到进程),从而让两个进程可以连接到同一个PIPE上。最开始的时候,上面的两个箭头都连接在同一个进程Process 1上(连接在Process 1上的两个箭头)。当fork复制进程的时候,会将这两个连接也复制到新的进程(Process 2)。随后,每个进程关闭自己不需要的一个连接 (两个黑色的箭头被关闭; Process 1关闭从PIPE来的输入连接,Process 2关闭输出到PIPE的连接),这样,剩下的红色连接就构成了如上图的PIPE。

由于基于fork机制,所以管道只能用于父进程和子进程之间,或者拥有相同祖先的两个子进程之间 (有亲缘关系的进程之间)。为了解决这一问题,Linux提供了FIFO方式连接进程。FIFO又叫做命名管道(named PIPE)。

FIFO (First in, First out)为一种特殊的文件类型,它在文件系统中有对应的路径。当一个进程以读(r)的方式打开该文件,而另一个进程以写(w)的方式打开该文件,那么内核就会在这两个进程之间建立管道,所以FIFO实际上也由内核管理,不与硬盘打交道。之所以叫FIFO,是因为管道本质上是一个先进先出的队列数据结构,最早放入的数据被最先读出来(好像是传送带,一头放货,一头取货),从而保证信息交流的顺序。FIFO只是借用了文件系统(file system, 参考Linux文件管理背景知识)来为管道命名。写模式的进程向FIFO文件中写入,而读模式的进程从FIFO文件中读出。当删除FIFO文件时,管道连接也随之消失。FIFO的好处在于我们可以通过文件的路径来识别管道,从而让没有亲缘关系的进程之间建立连接。传统IPC这几种传统IPC实际上有很悠久的历史,所以其实现方式也并不完善 (比如说我们需要某个进程负责删除建立的IPC)。一个共同的特征是它们并不使用文件操作的API。对于任何一种IPC来说,你都可以建立多个连接,并使用键值(key)作为识别的方式。我们可以在一个进程中中通过键值来使用的想要那一个连接 (比如多个消息队列,而我们选择使用其中的一个)。键值可以通过某种IPC方式在进程间传递(比如说我们上面说的PIPE,FIFO或者写入文件),也可以在编程的时候内置于程序中。在几个进程共享键值的情况下,这些传统IPC非常类似于多线程共享资源的方式(参看Linux多线程与同步):

#:semaphore与mutex类似,用于处理同步问题。我们说mutex像是一个只能容纳一个人的洗手间,那么semaphore就像是一个能容纳N个人的洗手间。其实从意义上来说,semaphore就是一个计数锁,它允许被N个进程获得。当有更多的进程尝试获得semaphore的时候,就必须等待有前面的进程释放锁。当N等于1的时候,semaphore与mutex实现的功能就完全相同,一个semaphore会一直存在在内核中,直到某个进程删除它。

#:共享内存与多线程共享global data和heap类似。一个进程可以将自己内存空间中的一部分拿出来,允许其它进程读写。当使用共享内存的时候,我们要注意同步的问题。我们可以使用semaphore同步,也可以在共享内存中建立mutex或其它的线程同步变量来同步。由于共享内存允许多个进程直接对同一个内存区域直接操作,所以它是效率最高的IPC方式。

消息队列(message queue)与PIPE相类似。它也是建立一个队列,先放入队列的消息被最先取出。不同的是,消息队列允许多个进程放入消息,也允许多个进程取出消息。每个消息可以带有一个整数识别符(message_type)。你可以通过识别符对消息分类 (极端的情况是将每个消息设置一个不同的识别符)。

某个进程从队列中取出消息的时候,可以按照先进先出的顺序取出,也可以只取出符合某个识别符的消息(有多个这样的消息时,同样按照先进先出的顺序取出)。消息队列与PIPE的另一个不同在于它并不使用文件API。最后,一个队列不会自动消失,它会一直存在于内核中,直到某个进程删除该队列。

多进程协作可以帮助我们充分利用多核和网络时代带来的优势。多进程可以有效解决计算瓶颈的问题。互联网通信实际上也是一个进程间通信的问题,只不过这多个进程分布于不同的电脑上。网络连接是通过socket实现的。由于socket内容庞大,所以我们不在这里深入。一个小小的注解是,socket也可以用于计算机内部进程间的通信。

使用系统调用pipe建立一条管道线_【Linux系统】Linux进程间通信相关推荐

  1. 使用系统调用pipe建立一条管道线_使用Unixbench对服务器综合性能打分及测试结果...

    Unixbench是一个类unix系统(Unix,BSD,Linux)下的性能测试工具,一个开源工具,被广泛用与测试linux系统主机的性能,简称UB.Unixbench的主要测试项目有:系统调用.读 ...

  2. 1、编制实现管道通信的程序。使用系统调用 pipe()函数建立一条管道线,两个子进程分别向管道各写一句话。Child process 1 is sending a message

    管道创建函数 创建管道可以通过调用 pipe()来实现,表1列出了pipe()函数的语法要点. 表1 pipe()函数语法要点 所需头文件 #include <unistd.h> 函数原型 ...

  3. 苹果x屏幕出现一条绿线_苹果屏幕出现条纹换屏幕有用吗?检测过后才恍然大悟!_...

    2020年11月05日 17:25作者:黄页编辑:黄页 苹果屏幕出现条纹换屏幕有用吗?生活中很多常见的关于苹果屏幕损坏的例子,如摔碎.进水.触摸不灵等等.但是小编今天要说的是不太常见的如苹果屏幕出现条 ...

  4. 苹果x屏幕出现一条绿线_部分用户反映苹果 iPhone 12 屏幕出现划痕 - iPhone 12

    IT之家 10 月 27 日消息 据外媒 CultofMac 报道,苹果公司表示,iPhone 12 的超瓷晶显示屏拥有 4 倍抗跌落能力.但是,在首批 iPhone 12 和 12 Pro 手机到货 ...

  5. iphonex屏幕出现一条绿线_关于对 iPhone 11、iPhone X? 采用的 Liquid 视网膜显示屏的误区,在此说明。...

    Liquid 视网膜显示屏是 Apple 于 2018 年推出并应用于 iPhone Xʀ 上的新一代视网膜高清显示屏,此屏幕也被沿用于 2019 年推出的 iPhone 11 上. 目前此屏幕已知参 ...

  6. 苹果x屏幕出现一条绿线_苹果iPad换屏幕出现售后问题解答

    每次有手机维修店说一些事在网上讨论,总有人在下面说维修店太坑了,还是去正规售后比较保险,这里面肯定有人受过伤,所以才不推荐去售后,那也有人推荐去正规售后维修,难道这些人是托?事实究竟怎么回事,这次咱们 ...

  7. 苹果x屏幕出现一条绿线_部分用户反映苹果 iPhone 12 屏幕出现划痕 抗划痕能力到底如何? - 手机 - IT商业网...

    据外媒 CultofMac 报道,苹果公司表示,iPhone 12 的超瓷晶显示屏拥有 4 倍抗跌落能力.但是,在首批 iPhone 12 和 12 Pro 手机到货的几天内,一些用户就抱怨屏幕上有划 ...

  8. 苹果x屏幕出现一条绿线_部分用户反映苹果 iPhone 12 屏幕出现划痕

    果粉控10月27日消息据外媒CultofMac报道,苹果公司表示,iPhone12的超瓷晶显示屏拥有4倍抗跌落能力.但是,在首批iPhone12和12Pro手机到货的 果粉控 10 月 27 日消息 ...

  9. 苹果x屏幕出现一条绿线_部分用户反映苹果iPhone 12屏幕出现划痕|显示器|手机|显示屏...

    IT之家 10 月 27 日消息 据外媒 CultofMac 报道,苹果公司表示,iPhone 12 的超瓷晶显示屏拥有 4 倍抗跌落能力.但是,在首批 iPhone 12 和 12 Pro 手机到货 ...

最新文章

  1. 项目源码分享之[条码扫描后台监控程序]
  2. 【渝粤教育】国家开放大学2018年春季 0007-22T文书档案管理 参考试题
  3. Java高级面试题!java编程思想怎么学
  4. OpenXLSX 中文字段读取问题
  5. Linux 添加环境变量
  6. mock介绍及moco框架搭建使用
  7. 【软件分析与挖掘】An Empirical Study of Bugs in Build Process
  8. P2P终结者的工作原理
  9. java小程序商城源码
  10. 单片机C语言,从小白到菜鸟进阶教程(超详细代码解读)
  11. LM75AD温度传感器读写
  12. delphi mysql 加密_Delphi纯代码连SQLite数据库,同时支持数据库的加密解密
  13. OpenGL导入3DS专题
  14. Oracle 语法中的 INSERT INTO
  15. MII、RMII、SMII、GMII接口简介
  16. Android照片墙加强版,使用ViewPager实现画廊效果
  17. 2015上半年手机GPU排行榜
  18. python实现繁简体自动转换小工具
  19. python 爬虫如何使用代理IP
  20. 真实生活的记录:我三年的外企生涯(4) 出处:天涯虚拟社区

热门文章

  1. How is parsed BeanDefinition registered
  2. 如何处理SAP Fiori Launchpad错误消息:Could not start the app due to a configuration problem
  3. Trial SCN WebIDE版本下载
  4. SAP CRM里business partner在订单处理中的determination流程
  5. 一些SAP Partners能够通过二次开发实现打通 SAP C/4HANA和S/4HANA 的场景分享
  6. SAP CRM Product UI是如何判断当前会话发生了数据写操作的
  7. VirtualBox Network设置的NAT和Bridged Adapter模式区别
  8. python文件之间的相互调用_用Python创建功能模块——截取字符串模块
  9. 关于python语言数值操作符、以下选项错误的是 答案是_关于Python注释,以下选项中描述错误的是...
  10. 索引超出矩阵维度_搜索引擎技术之倒排索引原理详解,及案例分析