进程间通信

2023-05-16

现在的嵌入式系统往往有并发的特征,就像多任务操作系统的多进程一样,其内核会提供几种机制处理任务间通信,本文对四种常见通信模式进行了分析,并对其各自的优劣作较细致的比较。

 

目前,越来越多的工业产品、军用品、医疗产品和消费品都在使用微机,单片机这些并发产品或是使用并发软件系统来控制,或是在其中加入了关键的并发软件组件。

在这些软件系统中,多个任务经常以异步方式执行,有时各个任务之间需要进行通信,来同步它们之间的运行或从一个任务来控制另一个任务的运行。

而常见的并发任务进程间通信具有4种机制,它们分别是管道机制、消息队列机制、远程调用机制以及共享内存机制。

三种机制应用较多

一个管道(有时也称管线)是一个能够用来从一个任务传送数据到另一个任务的简单信息通道。该通道用软件实现并由操作系统管理。在应用程序看来,管道类似于一个数据文件,管道可以用标准的C库的I/O函数来打开、关闭、写入、读出。不过和文件不同的是管道是单向的,它有一个源端和一个目的端,有时也称为汇集端。在源端的任务只能向管道写,在目的端的任务只能从管道读。

管道传输流数据,即连续的字节或流。因此访问一个管道可以比作是访问一个顺序文件。在源端的任务用写入字节到一个文件时所用的同样的系统调用来向管道写数据;在目的端,接受任务读取数据,同样是采用读取一个文件时所用的相同系统调用。一个管道的每个端只能被一个任务使用。

一个管道也像一个队列。源端处的任务根据管道的长度(可以解释为在被一个读操作清空前它能容纳的字节多少)可连续地向管道写入数据,直到管道充满为止。当目的端的任务也按开始到最终进入的顺序从管道读取数据,数据将按其进的顺序被递送出去。

一个管道允许从一个任务到另一个任务的流数据传送,而一个消息队列却能允许任务间的任意结构的消息传送。而且,消息队列不是单向的,在一个任务生成了一个消息(或获得对一个消息的访问权)时,该任务就可发送或接收队列中的消息。

与通过管道读写的机制相比,消息队列I/O操作采用特殊的消息发送和消息接收调用,这些调用函数是被特地设计来处理有任意大小的数据结构的传输的。

有些消息队列的实现方案支持消息类别标识。当一个任务将一个消息放到队列中时,它可将一个类别标识,这个标识可以是一个整数或是其他类型的ID,同该消息关联起来。接收消息的任务就能通过检查这个标识域而无须查看消息内部来确定消息的内容和性质。任务可以采用它们自己的消息内容的标识方法。但由消息队列服务规定一个标准的标识方法会简化标识,并提高可靠性。

而共享内存机制是一块由多个进程共享的内存区域,每个访问共享内存的进程都把这块内存看成是该进程私有的内存空间。共享内存是为进程(而不是为线程)间的通信而配备的,一个进程中的线程其实已经在共享它们所有的全局数据。

共享内存的工作机理首先是一个进程必须建立一个共享内存区。其方法是调用一个操作系统功能,指定区域的大小和命名符号。操作系统创建这个区域,把它映射到进程的数据区,并返回一个指向该共享内存起始地址的指针。该进程可用这个指针来读写这个共享内存。

其他任何要访问该共享内存的进程必须通过操作系统调用将此共享内存连接到它的地址空间上。对此连接子程序的调用必须包括命名符号,这样操作系统才能找到所要的共享内存区,因为在一个给定的时间内可能有多个活动的共享内存区。操作系统将此共享内存映射到这些进程的数据区,并返回一个含有该内存起始地址的指针。

要使用共享内存的编程人员必须选择命名符号并在创建和连接共享内存的调用中使用它。编程人员还要负责设定有多少进程会把共享内存连于它们的地址空间。

共享内存是所有IPC机制中最快、同时也是最危险的,快是因为传输以内存的存取速度进行;危险是因为它存在与多线程全局变量访问中一样的问题。也就是说,对共享内存管理不当会导致竞赛局面,因此进程应使用一个同步对象来控制共享内存的访问。

远程调用尚未广泛应用

远程调用机制(RPC)是仅就进程间通信,而不是线程间(线程共享一个进程内的所有代码)提供的另一种机制。顾名思义,一个远程调用允许一个进程中的一个程序直接调用另一个进程中的一个程序。这两个进程可能运行在同一台计算机上,也可能运行在两个由网络连接的不同的计算机上。

一个RPC的目的就是要使调用另一个进程中的一个程序变得如同调用一个本地进程中的程序一样容易。在实践中,这个目的很难达到。一般来说,RPC需要定义所有能被远程调用的程序,即要使用一种元语言来定义程序名、数据类型以及数据向哪个方向传递(是传给被调用程序,或返回给调用程序,还是两者都有)。一个RPC生成程序将这些程序的定义编译到占位程序中,这些占位程序将程序参数用一种独立于机器的格式封装,然后利用操作系统提供的RPC服务来启动一个远程程序。当调用一个远程程序时,编译器产生一个对RPC生成器所创建的一个占位函数的调用。虽然源代码中的实际程序调用编写起来就像本地程序调用一样容易,但还必须做好很多的工作,比如先规定好所有远程程序的接口等。

RPC机制功能强大但相当复杂,因此它也是嵌入式系统以及一般系统中通信研究的难点。由于其复杂性,远程调用至今还处在研究中,尚未能在嵌入系统中广泛使用。

RPC是基于客户/服务器模式的,因此一般被划分为客户端和服务器端两部分。客户部分主要负责把应用程序的调用信息按一定的格式传送到服务器,并把服务器发回的响应按调用方式返回应用程序,服务器部分主要接收客户发来的调用请求并完成相应调用。

RPC的服务器端结构如表左侧所示。基础通信层为RPC的通信处理层提供基本的通信接口,由操作系统实现。通信处理层利用基础通信层的功能给上层提供更合理的接口,其功能包括发送指定消息、接收指定消息、处理消息结构、处理通信错误等。

请求和服务管理是RPC服务器的主要部分。它除完成对服务的管理,如启动服务、结束服务、服务登记等外,也完成客户请求的处理。认证系统是独立的部分,它完成RPC认证处理,RPC支持多种认证方式。外部数据表示模块解决异种机间数据表示差异问题。它将本机的数据格式转换为统一的外部数据表示格式,把接收到的用外部数据表示格式的数据转换为本机数据格式。端口绑定部分解决服务器的通信端口发现问题。统计模块用于统计调用信息,如函数被调用次数,出错次数等。应用层不属于RPC范畴,它是RPC的使用者(如NFS)。

RPC客户端的层次结构如表右侧所示。同服务端一样,RPC是构筑在基础通信层上的,基础通信层为RPC提供了基本的通信能力。RPC在此基础上增加通信处理层,提供数据发送、接收函数和超时处理机制,最重要的是采用了滑动窗口方式来进行调用数量控制。在通信处理层上,RPC完成调用进程的实现和任务管理。RPC将每个调用作为一个任务,同时因为可能有多个任务运行,引进了任务管理,使得调用的进程可以采用状态机方式实现。

通过实例对比

下面通过一个简单的图例来进一步说明管道机制、消息队列机制和共享内存机制间的原理差别。首先采用消息队列或管道来实现客户/服务器进程间文件拷贝的通常步骤是:

1. 服务器进程从输入文件读取。该文件的数据由内核读入自己的内存空间,然后从内核拷贝到服务器进程。

2. 服务器进程向一个管道或消息队列写入数据。这通常需要把数据从进程拷贝到内核。

3. 客户进程再从该IPC通道读出这些数据,通常需要把这些数据从内核拷贝到进程。

4. 最后这些数据由客户进程缓冲区拷贝到输出文件。

以上过程共需要4次数据拷贝,而且这4次拷贝都是在内核和某个进程间进行的,处理器资源和I/O资源开销比较大,如图1所示。

而如果让交换数据的两个进程共享一个缓冲区,则可解决交换数据在内核和进程间多次传递的问题,节省资源。交换数据的进程间必须能够协调访问内存区。如图2所示,采用共享内存机制实现客户/服务器进程间文件拷贝的过程也包括4个步骤:

1. 服务器进程使用信号灯取得访问共享内存区的权利。

2. 服务器进程从输入文件读数据到共享缓冲区。

3. 服务器进程读入数据完毕,使用信号灯通知客户。

4. 客户进程从该共享内存区写数据到输出文件。

使用共享内存的方法只拷贝两次,即从输入文件到共享内存区,从共享内存区到输出文件。从两个图例可以看出共享内存比管道或消息队列的方法节约资源并且速度更快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程间通信 的相关文章

  • 【C++服务器入门基础------4.IPC进程间通信--管道】

    大学生寒假在家过于无聊 xff0c 整理一下以前学过的知识 xff0c 顺便复习一下 xff0c 水平较低 xff0c 专业性差 xff0c 仅供参考 xff0c 不喜勿喷 xff08 反正也没人看 xff09 连续一周多出去泡妞了 xff
  • 进程间通信

    原作者地址不详 摘 要 随着人们对应用程序的要求越来越高 xff0c 单进程应用在许多场合已不能满足人们的要求 编写多进程 多线程程序成为现代程序设计的一个重要特点 xff0c 在多进程程序设计中 xff0c 进程间的通信是不可避免的 Mi
  • c++进程间通信

    C 语言中的进程间通信方式有多种 xff0c 包括共享内存 消息队列 信号量 套接字等 共享内存是指多个进程可以访问同一块内存 xff0c 从而实现进程间的通信 共享内存的优点是速度快 xff0c 但实现较为复杂 xff0c 需要自己维护同
  • C++ 进程间通信

    一 xff0c C 43 43 常用进程间通信 管道 Pipe xff1a 管道可用于具有亲缘关系进程间的通信 xff0c 允许一个进程和另一个与它有共同祖先的进程之间进行通信 命名管道 named pipe xff1a 命名管道克服了管道
  • 【进程间通信】——认识同步与互斥,了解生产者消费者原理。

    临界资源 在操作系统中 xff0c 进程是占有资源的最小单位 xff08 线程可以访问其所在进程内的所有资源 xff0c 但线程本身并不占有资源或仅仅占有一点必须资源 xff09 但对于某些资源来说 xff0c 其在同一时间只能被一个进程所
  • Orange's 进程间通信

    新增一个系统进程 xff0c 和TESTA进行通信 xff0c 通信的流程是这样的 xff0c 如果首先执行到系统进程 xff0c 发送消息 xff0c 那么会触发内中断到ring0级 xff0c 完成发送所需要的动作 xff0c 之后回到
  • linux消息队列服务,Linux进程间通信-消息队列(mqueue)深入理解

    前面两篇文章分解介绍了匿名管道和命名管道方式的进程间通信 xff0c 本文将介绍Linux消息队列 posix 的通信机制和特点 1 消息队列 消息队列的实现分为两种 xff0c 一种为System V的消息队列 xff0c 一种是Posi
  • 第3讲 进程间通信

    文章目录 3 1 简介3 2 互联网协议的API3 3 外部数据表示和编码3 4 组播通信3 5 网络虚拟化 xff1a 覆盖网络 3 1 简介 UDP的应用程序接口提供了消息传递 xff08 Message Passing xff09 抽
  • Linux进程间通信

    1 unix域套接字 域套接字 xff1a 1 只能用于同一设备上不同进程之间的通信 xff1b 2 效率高于网络套接字 域套接字仅仅是复制数据 xff0c 并不走协议栈 xff1b 3 可靠 xff0c 全双工 xff1b 2 IP套接字
  • 进程间通信

    原作者地址不详 摘 要 随着人们对应用程序的要求越来越高 xff0c 单进程应用在许多场合已不能满足人们的要求 编写多进程 多线程程序成为现代程序设计的一个重要特点 xff0c 在多进程程序设计中 xff0c 进程间的通信是不可避免的 Mi
  • FreeRTOS进程间通信-消息队列

    消息队列是进程间的一种通信机制 xff0c 实际项目运用很多 1 什么是消息队列 xff1f 2 消息队列API函数 3 在进程间通信使用消息队列 4 在中断中使用消息队列 1 1 消息队列是什么 xff1f 消息队列是realtime o
  • Orange's 进程间通信

    新增一个系统进程 xff0c 和TESTA进行通信 xff0c 通信的流程是这样的 xff0c 如果首先执行到系统进程 xff0c 发送消息 xff0c 那么会触发内中断到ring0级 xff0c 完成发送所需要的动作 xff0c 之后回到
  • linux---进程间通信(ipc)之管道

    进程间通信方式 管道共享内存消息队列信号量本地套接字等等都能作为我们进程间通信的方法 操作系统提供进程间通信方式的原因 因为对于我们进程来说 xff0c 每一个进程都是相互独立的 xff0c 具有独立性 xff0c 如果我们需要两个不同的进
  • linux---进程间通信(ipc)之共享内存

    前面我们讲解了进程间通信之管道 xff0c 这段我们讲解我们的共享内存 共享内存是所有进程间通信方式最快的一种 内存共享模型就像下面的图一样 xff0c 就是将物理内存映射到我们进程的虚拟地址上 xff0c 我们就可以直接操作我们虚拟地址空
  • 【进程间通信 之 通信的建立】

    目录 前言 进程间通信的目的 进程间通信的方式 管道 1 匿名管道 简单示例1 消息传输 五个特性 四种场景 简单示例2 进程控制 对管道的深入理解 2 命名管道 简单示例3 不相关进程间通信 system V 共享内存 简单示例4 通知事
  • 【iOS】UserDefaults使用的一些“坑”

    UserDefaults使用的一些 坑 项目场景 问题1 初始化程序组对应UserDefaults失败 原因分析 问题2 没有记录数据的时候 读取值为0 or false 导致配置使用时错误 原因分析 问题3 extension进程中监听需
  • 什么事IPC(Inter-Process Communication,进程间通信)

    进程间通信IPC 也就是Inter Process Communication的缩写 首先我们明白一个进程其实就是一个狭义上的程序 一个服务器也就是一个进程 比如客户端和服务器的连接就是两个进程在通信 只是这两个进程并不在同一台计算机上 它
  • 面试了这么多场,“ 进程间的通信 ” 真是从不缺席,小伙伴们赶快重视起来!!

    进程间通信 1 管道 2 消息队列 3 共享内存 4 信号量 5 信号 6 Socket 套接字 每个进程的用户地址空间都是独立的 一般而言是不能互相访问的 但内核空间是每个进程都共享的 所以进程之间要通信必须通过内核 在内核中开辟一块缓冲
  • qt子进程和父进程读写数据通信

    进程A 例如主程序 创建了一个进程 B 这个B就称为A的子进程 而A称为B的父进程 这也称为进程间通信 有多种方式 TCP IP Local Server Socket 共享内存 D Bus Unix库 QProcess 会话管理 这里 因
  • 进程间通讯的7种方式

    1 常见的通信方式 管道pipe 管道是一种半双工的通信方式 数据只能单向流动 而且只能在具有亲缘关系的进程间使用 进程的亲缘关系通常是指父子进程关系 命名管道FIFO 有名管道也是半双工的通信方式 但是它允许无亲缘关系进程间的通信 消息队

随机推荐

  • SylixOS信号量(二进制信号量、 计数型信号量、 互斥信号量(简称互斥量)、 读写信号量)

    目录 二进制信号量 互斥信号量 计数器信号量 读写信号量 SylixOS 信号量 多个线程在读写某个共享数据 xff08 全局变量等 xff09 时必须通过某种方法实现共享数据的互斥访问或者同步访问 xff08 例如线程 B 等待线程 A
  • 什么是优先级反转及解决方法

    什么是优先级反转 优先级反转 xff0c 是指在使用信号量时 xff0c 可能会出现的这样一种不合理的现象 xff0c 即 xff1a 高优先级任务被低优先级任务阻塞 xff0c 导致高优先级任务迟迟得不到调度 但其他中等优先级的任务却能抢
  • STM32CubeMX在F103上的ADC注入通道配置异常问题

    前言 最近业余时间在搞无刷电机FOC的控制 xff0c 其中有一部分是关于流过电机三相绕组电流采集的 xff0c 需要用到STM32内置的ADC xff0c 核心是需要使用注入通道以确保ADC数据采集的实时性 xff0c 但是我在STM32
  • C++ static静态成员变量用法

    C 43 43 static静态成员变量用法 参考网址 xff1a 1 http c biancheng net cpp biancheng view 209 html 2 https www runoob com cplusplus cp
  • 解决AndroidStudio 控制台编译输出中文乱码,黑方块+问号之类的

    100 有效 解决AndroidStudio 控制台编译输出中文乱码 xff08 黑色方框问号 xff09 xff0c 亲测解决 xff01 xff08 转载 xff09 Pdx 666的博客 CSDN博客 背景在AndroidStudio
  • sphinx安装及简单使用

    sphinx安装及简单使用 如果你要编写技术文档 可以用 reStructuredText 或 Markdown 格式编辑文件 xff0c 然后使用 Sphinx 工具转换成 html PDF ePub等格式 xff0c 或者托管到 git
  • cmake之CMakelist.txt的使用

    文章目录 常用命令1 指定 cmake 的最小版本2 打印信息2 1 打印普通信息2 2 打印告警2 3 打印错误 3 项目名称4 设置变量5 查找指定的库文件6 设置包含的目录7 设置链接库搜索目录8 指定编译包含的源文件8 1 明确指定
  • python爬虫 记录一次爬取淘宝的过程

    淘宝可以说是一个检验爬虫技术是否过关的最强关卡了 xff0c 下面来打破它吧 淘宝的所有操作差不多都是在登录的状态下进行的 xff0c 这时候想要对淘宝进行请求获取信息就必须在登录的状态下进行了 方式一 xff1a xff08 seleni
  • 问题tensorflow.python.framework.errors_impl.ResourceExhaustedError:OOM

    tensorflow python framework errors impl ResourceExhaustedError 2 root error s found 0 Resource exhausted OOM when alloca
  • ROS安装超详细保姆级教程

    1 版本选择 ROS与Ubuntu版本是有着对应关系的 xff0c 其中Ubuntu1604 43 ROS Kinetic xff1b Ubuntu1804 43 ROS Melodic xff1b Ubuntu2004 43 ROS No
  • 2021年9月22号,实战烧写树莓派sd卡的系统

    1 下载格式化u盘的软件 xff0c 软件地址 xff0c 阿里云盘地址 xff1a https www aliyundrive com s ux2re9FFxd2 2 将有sd卡的读写盘插入电脑接口 3 打开软件 xff0c 点击格式化即
  • 工作流与BPM的区别

    一 工作流是什么 xff1f 根据国际工作流管理联盟 Workflow Management Coalition xff0c WFMC 的定义 xff0c 工作流就是 一类能够完全或者部分自动执行的经营过程 xff0c 它根据一系列过程规则
  • 被遗忘的软件产品形态

    从2010年以后 xff0c 很多公司开发的软件产品 xff0c 很少有客户端了 xff0c web2 0之后 xff0c 主流的业务系统基本上都是基于Web去构建业务系统 这几年见到的业务应用系统都是基于Web的构建的 而在To C市场
  • C端产品工作流程

    文章目录 发现需求需求分析用户需求定义产品需求定义构建产品方案收集需求确定产品功能 产品需求分类产品目标分解产品版本规划需求评审产品功能设计需求评审确定执行计划测试验收发布上线 发现需求 通过自身的体验发现需求 通过间接的体验发现需求 1
  • STM32cubeMX将STM32F767+LAN8720+LwIP+FreeRTOS的以太网实现

    通过STM32cubeMX将STM32F767 43 LAN8720 43 LwIP 43 FreeRTOS的以太网实现 本文使用了正点原子的阿波罗开发板 xff0c 接下来我将粗略的对STM32F767通过STM32cubeMX进行以太网
  • 数据产品经理有哪些

    文章目录 数据分析产品经理数据挖掘产品经理策略产品经理数据工程类产品 首先希望大家能重新认识经理这份工作 xff1a 大数据产品经理并不一定要数学能力强或者编程能力强 xff0c 只要你有用数据思考的方式 xff0c 有相信数据的信念 xf
  • 产品经理必备的20个常用工具

    原型设计工具 xff1a Axure 墨刀 思维导图工具 xff1a Xmind MindManager 流程图绘制工具 xff1a Viso ProcessOn 数据处理与分析工具 xff1a Excel Tableau 问卷调研工具 x
  • Hibernate根据实体类自动生成表的方法

    文章目录 第一种方法第二种方法参考 第一种方法 这种方法需要配置 hibernate cfg xml 的属性 hibernate hbm2ddl auto xff0c 该属性值的具体说明如下 xff1a 值说明update实体对应的表如果不
  • 微信账户如何解除对第三方应用的授权

    参考文章 xff1a https baijiahao baidu com s id 61 1754354599985802723 amp wfr 61 spider amp for 61 pc amp searchword 61 E5 B0
  • 进程间通信

    现在的嵌入式系统往往有并发的特征 xff0c 就像多任务操作系统的多进程一样 xff0c 其内核会提供几种机制处理任务间通信 xff0c 本文对四种常见通信模式进行了分析 xff0c 并对其各自的优劣作较细致的比较 目前 xff0c 越来越