浅谈QNX进程间通信(IPC)

2023-11-07


锋影

e-mail 174176320@qq.com

在QNX Neutrino中消息传递(Message passing)是IPC的主要形式,其他的姓氏也是基于消息传递实现的。QNX中提供的IPC形式如何下图所示:

一、Synchronous message passing 同步消息传递
如果一个线程执行了MegSend()方法向另一个线程(可以是不同的进程)发送消息,它会被阻塞,知道目标线程执行了MsgReceive(),并处理消息,然后执行MsgReply()。如果一个线程在其他线程执行了MsgReceive(),它会被阻塞到另一个线程执行MsgSend()。消息查undishi通过直接你存copy来实现的。如果需要大的消息传递时建议通过共享内存或其他方式实现。
1、消息传递中的状态迁移
客户程序的状态迁移

SEND blocked:调用MsgSend()后,服务程序没有调用MsgReceive()的状态。
REPLY blocked:调用MsgSend()后,并且服务程序调用了MsgRecive(),但是没有调用MsgReply()/MsgError()的状态。当服务程序已经调用了MsgReceive(),客户程序一旦调用MsgSend()就直接迁移到此状态。
READY:调用MsgSend()后,并且服务程序地调用了MsgReceive()和MsgReply()的状态。
服务器状态迁移:

RECEIVE blocked:调用MsgRecevie()后,客户程序没有调用MsgSend()时的状态
READY:消息处理时的状态。MsgReply()调用后不会阻塞。当服务器MsgSend()会返回一个错误,不会被阻塞。
2、Channels and connections 通道与连接
在QNX Neutrino 中消息传递时通过Channels和Connections的,而不是直接在线程之间传递。一个要接受消息的线程必须先生成一个通道,而一个要发送消息的线程必须依附通道生成一个连接。一个进程中的多个客户线程可以同时依附一个通道上,这时所有连接实际都会映射到同内核对象。
客户连接直接映射到文件描述符。这样客户线程不需要了解什么地方发送消息,而仅仅需要考虑向文件描述符中发送消息。

一个Channel中包含以下三种列表:
Receive:一个用来保存等待罅隙的线程的后进先出队列(LIFO)
Send:一个用来保存发送但是未被接受的优先级先进先出队列
Reply:一个用来保存已被接受但是还没有返回的不排序列表
所有这些队列中等待的线程都是被阻塞的线程,多个服务线程和多个客户线程可以等待在一个Channel上。
3、Pulses 脉冲
QNX Neutrino同样提供了一个被称为Pulses的非同步的消息机制。Pulses通常用于中断线程的通知机制,或者通过服务线程来唤醒客户而不被阻塞。
Pulses包是相当于最小负载单位,有8 bits的代码和32 bits的数据。
4、Priority inheritance and messages
当服务线程接受消息时会将服务线程的优先级调整为发送者线程中的最高优先级。如果有一下三个线程,服务线程的优先级为22,客户线程1的优先级为13,客户线程2的优先级为10。客户线程2发送一条消息的话,服务线程在接受时会将自身的优先级调整为10。如果此时客户线程1也发送了一条消息的话,服务线程的优先级就会调整为13。
这种优先级继承机制的目的是为了防止一下两种优先级逆转:
当服务线程的优先级较高时,不会因为低优先级的客户线程的消息而抢占比起高优先级线程
当服务线程的优先级较低时,一个较高优先级的线程的消息不会被一个较低优先级线程锁抢占

当然也可以关闭优先级继承功能,在ChannelCreate()是关闭此标志: _NTO_CHF_FIXED_PRIORITY 
5、Robust implementations with Send/Receive/Reply
通过Send/Receive/Reply实现的程序能够通过一下两点避免死锁
永远不要有两个线程相互发送消息
将线程组织为等级结构,并且只向上发送消息
二、其他IPC机制
1、Events 事件
QNX Neutrino提供的一种非同步事件发送机制。一下三种情况会发送Events
MsgDeliverEvent()被调用
中断处理
计时器到期

2、I/O notification
最有代表性的就是select()函数,主要当下面条件成立时发送此事件:

3、Signals 信号
信号处理类似于硬件中断,他会使一个进程从当前的执行控制流程跳出,以实现特定的行为,待特定处理完成后,再恢复到中断点继续执行。QNX Neutrino 中的信号时通过Events机制实现的,应该注意,虽然QNX遵循POSIX,但是使用信号的函数有点细微的变化;QNX Neutrino系统中提供了如下64个Signals:
当一个服务线程希望通知一个客户线程一些信息时,可以使用两种手段:

Pulses:客户线程需要生产一个Channel,并调用MsgReceive()
Signals:只需要调用sigwaitinfo(),而不需要生产Channel。
4、POSIX message queues
POSIX通过message queues定义一组非阻塞的消息传递机制。QNX Neutrino的系统核心不支持Message queues,如果想使用它就必须启动对应的服务。QNX Neutrino提供了两种Message queues的实现:
  ・mqueue:一个传统的使用mqueue资源管理的实现
  ・mq:一个使用mq服务和非同步消息的替代实现
  QNX的Message机制与POSIX的Message queues有一个根本性的区别,QNX的消息机制通过内存拷贝来实现消息的传递,而POSIX的消息队列通过将消息队列的存取来实现消息的传递,POSIX可以维护多了消息队列。QNX的消息机制比POSIX的消息队列更有效率,但是有时为了POSIX的灵活性,这点性能消耗也是值得的。
消息队列的功能有:

5、Shared memory 共享内存
由于Share memory 不支持同步处理,所以通常和Semaphores或Mutexes一起使用。一般来说信号量用于进程同步,而互斥量用于线程同步。QNX 的互斥量也支持进程的同步,相对而言互斥效率更高一些。
使用Share memory时,要创建一个Share memory对象,在使用内存共享时要用到的函数有:

QNX中的消息传递时通过消息的直接拷贝来完成的,当消息较大时可以通过内存共享来提升消息,发送消息时,不是发送整个消息,而是将消息保存于Share memory中,并将地址发送过去,而接受消息时通过Share memory的地址来读取消息。
The mmap() function is defined as follows:

void * mmap( void *where_i_want_it,
             size_t length,
             int memory_protections,
             int mapping_flags,
             int fd,
             off_t offset_within_shared_memory );

6、Typed memory 类型化内存
POSIX也已经定义,主要是针对实行性的,在这里用到了池(pool)的概念,想使用此功能要包含的头文件是 <sys/mman.h>
Typed memory 增加的功能在 C库里:
posix_typed_mem_open():打开一个Typed memory对象,返回的是文件描述符,可通过mmap()来创建此对象
posix_typed_mem_get_info():得到该对象的信息
实际例子:
int fd = posix_typed_mem_open( "/memory/ram/sysram", O_RDWR,
            POSIX_TYPED_MEM_ALLOCATE_CONTIG);

unsigned vaddr = mmap( NULL, size, PROT_READ | PROT_WRITE,
                       MAP_PRIVATE, fd, 0);
7、Pipes and FIFOs
Pipes
Pipes是两个活着多个协作进程间未命名的IO通道。Pipes通常用于两个平行进程间的单向通信,如果想双向就应该使用消息。

FIFOsFIFOs是文件系统中一个已经命名的永久文件,实现功能与管道出不多

锋影

e-mail 174176320@qq.com

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

浅谈QNX进程间通信(IPC) 的相关文章

  • Blackberry BrowserField白色空页问题

    你好 我想在 BrowserField 中显示 html 内容 我使用代码 blove 来执行此操作 但我只看到白色的空白页面 BrowserField demo new BrowserField String res p demo p d
  • 如何在 Blackberry BrowserField 中缓存

    我正在创建一个 Blackberry 应用程序来显示某个站点的全屏 Web 视图 我有一个可以正常显示的工作浏览器字段 但从页面到页面的导航速度比本机浏览器慢 浏览器字段似乎没有内置缓存 导致加载时间很慢 当我添加以下代码来管理缓存时 该站
  • 黑莓 - 如何创建子菜单?

    我想为 BB 应用程序创建子菜单 当我点击菜单项时它显示 Option 1 Option 2 Option 3 当我点击选项 3 时 它应该显示 1 2 3 作为子菜单项 使用j2me eclipse 一直想做这个 替代文本 http im
  • BlackBerry 线程模型

    我读过很多评论 其中提到 BlackBerry 线程模型偏离了 Java 标准 可能会导致问题 但无论进行多少次谷歌搜索都没有让我明白这到底意味着什么 我一直在为 BlackBerry 开发一个相当大的业务应用程序 尽管我以前没有任何 Ja
  • BlackBerry SQLite 数据库创建:“文件系统未就绪”

    我的应用程序从服务器获取数据并将其保存到 SQLite 数据库中 这在 9550 中工作得很好 黑莓风暴2 http en wikipedia org wiki BlackBerry Storm 2 模拟器 但是当我在任何其他模拟器中运行它
  • 无法在 eclipse 中安装 blackberry webworks 插件

    using http www blackberry com go eclipseUpdate 3 6 java http www blackberry com go eclipseUpdate 3 6 java 我安装了Blackberry
  • 黑莓开发上的脚本语言?

    据我所知 开发 Blackberry 应用程序的首选方法是 Java 这是吗only way 我梦想有一个快速的应用程序环境 您可以在其中创建 GUI 使用 Blackberry UI 组件 类似于 Blackberry 上的 Tcl Tk
  • 黑莓 - 等待屏幕[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在黑莓java开发中开发一个应用
  • 我可以将 std:fixed 或 std::set precision() 与 >> 运算符一起使用吗?

    std istringstream将字符串转换为 long double 时会丢失精度 我可以使用类似的东西吗std fixed or std setprecision 我正在使用 c 11 并针对 QNX 平台 include
  • 通过 BlackBerry 发送 POST 数据后获取 HTML 响应

    我需要在发送 POST 数据后从 URL 读取 HTML 响应 我已经有以下两个函数 但我不知道如何组合它们 以便我可以发送 POST 数据并获取响应 此函数获取标准 HTML 响应 public static String getData
  • 如何在黑莓 7 中捕获列表字段滚动到底部

    我有一个包含许多数据的列表字段 首先我从服务器加载 10 条记录 我想在滚动移动到底部时捕获事件 以便我可以从服务器加载更多记录 我实现了 ScrollChangeListener public class DataListScreen e
  • 如何使用 Bitmap.getBitmapResource() 访问存储在 Blackberry 中的图像?

    我想访问存储在黑莓中的图像 例如位置 store home user image png 现在我可以访问这个图像 String filePath file store home user image png Bitmap image Bit
  • Blackberry Java 中的类之间调用

    当屏幕上 单击 位图时 我试图推送一个新屏幕 为此 我从这篇文章中创建了一个类 黑莓可点击位图字段 https stackoverflow com questions 5722875 blackberry clickable bitmapf
  • 运行为黑莓设备创建的黑莓应用程序需要哪些步骤?

    我使用 java me 和 BlackBerry 特定 API 创建了一个 BlackBerry 应用程序 它在黑莓模拟器上运行良好 我想知道如何将此应用程序部署到 BlackBerry 设备 从文档中我发现 在设备上运行 BlackBer
  • 适用于 BlackBerry 应用程序的 OAuth 库(适用于 Twitter 客户端)

    是否有可用于与 BlackBerry 应用程序集成的 OAuth 库 我想从我的应用程序发布一条推文 但找不到任何有助于登录的内容 找到了吗this URL http developerlife com tutorials p 648但无法
  • 从黑莓中的url获取数据

    我有一个文件的网址 http www example com 123 aes 它包含超过2MB的mp3文件的数据 现在我想从这个网址获取数据 当我尝试 http 连接来获取数据时 它显示错误 请求的实体太大 如何解决这个问题呢 我的代码如下
  • Blackberry - 使用 Web 服务发送/接收 XML 数据

    用于创建 XML 并将 XML 数据发送到 Web 服务并从黑莓中的 Web 服务器返回 XML 响应的示例程序 kXML J2ME 设备的 XML 库 http kxml sourceforge net 在 Blackberry 上设置
  • 在 OS 5 模拟器上安装 OTA 黑莓应用程序时遇到问题

    我正在尝试在 eclipse helios 中使用 apache tomcat 5 5 测试我的 bb 应用程序的 OTA 部署 我尝试从黑莓 OS 5 OS 6 和 OS 7 模拟器进行 OTA 安装 这些应用程序已下载并安装在 OS 6
  • 黑莓 - 带动画的加载/等待屏幕

    有没有办法显示 加载 屏幕带动画在黑莓手机上 选项 PME动画内容 多线程 图像集 定时器 计数器 标准轮辋 API 其他方式 有这个吗 Thanks 费明 安东尼 1 谢谢大家 你们给了我部分答案 我的最终解决方案 1 创建或生成 免费
  • 有人尝试过用 C 或 C++ 为 Blackberry 平台进行开发吗?

    根据我在嵌入式计算方面的经验 我得到的每一个迹象都是 做这样的事情需要昂贵的设备才能访问平台 ICE 调试器 JTAG 探针 I2C 编程器等 但我一直想知道是否一些雄心勃勃的黑客已经找到了一种在黑莓设备上加载本机代码的方法 任何人 编辑

随机推荐

  • 数据结构视频教程 -《(东南大学 王茜)数据结构 (64讲)》

    整个视频打包下载地址 史上最全的数据结构视频教程系列分享之 东南大学 王茜 数据结构 64讲 转载请保留出处和链接 更多优秀资源请访问 我是码农 数据结构对于从事计算机系统软件和应用软件设计与开发人员非常重要 程序设计语言为数据结构的描述提
  • 基于Spring Boot开发的社区物业管理系统

    文章目录 项目介绍 主要功能截图 登录 车位收费管理 物业收费管理 投诉信息管理 车位管理 保修统计分析 部分代码展示 设计总结 项目获取方式 作者主页 Java韩立 简介 Java领域优质创作者 简历模板 学习资料 面试题库 关注我 都给
  • 【python教程入门学习】学习Python爬虫前的准备工作

    在使用 Python 编写爬虫程序之前 您需要提前做一些准备工作 这样在后续学习过程中才会得心应手 知识准备 1 Python语言 Python 爬虫作为 Python 编程的进阶知识 要求学习者具备较好的 Python 编程基础 对于没有
  • 浏览器输入url后发生了什么?

    在浏览器输入url后会发生的过程 1 DNS对域名进行解析 2 建立TCP连接 三次握手 3 发送HTTP请求 4 服务器处理请求 5 返回响应结果 6 关闭TCP连接 四次挥手 7 浏览器解析HTML 8 浏览器布局渲染 1 浏览器对输入
  • Flink流和表的转换

    流 表的转换 1 这种方式后续要进行tableSql的操作 推荐 tableEnv createTemporaryView tableName dataStream 2 这种方式后续要进行tableApi的操作不常用 Table table
  • Linux文件权限管理 chmod 读、写、可执行

    使用 ls l 查看文件权限 左侧第一列 rw r r 这些就是文件的权限信息 文件的权限分为三种 三种权限可相互叠加 最高权限为7 权限 字母 对应的二进制 对应的八进制 读 r 100 4 写 w 010 2 可执行 x 001 1 嗯
  • ajax传参数json对象到后台获取

    var data data name pxxx paramData dataSource a1 table t1 field f1 r name1 01 p name2 02 p 10 100 name2 01 p dataSource a
  • 输入若干个整数,当输入0时表示结束,统计每个输入整数的出现次数。

    描述 输入若干个整数 当输入0时表示结束 统计每个输入整数的出现次数 输入 输入若干个整数 整数之间以空格间隔 当输入0时表示结束 输出 分行输出每个整数出现的次数 行末不能有多余空格 输入示例 11 22 35 68 97 63 22 6
  • 内存分页、进程分页、页表长度

    内存分页 进程分页 页表长度 内存分页 内存空间分成一个个大小相等的分区 页框号或物理块号从0开始 每一个分区称作页框 一般大小为 4KB 进程分页 将用户进程的地址空间分为与页框大小相等的一个个区域 页号一般从0开始 每一个分区称作页 一
  • 设计模式:装饰者模式

    定义 动态给一个对象添加一些额外的职责 就象在墙上刷油漆 使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活 设计初衷 通常可以使用继承来实现功能的拓展 如果这些需要拓展的功能的种类很繁多 那么势必生成很多子类 增加系统
  • Latex写文章时插入单栏图片和双栏图片方法

    环境 WinEdt7 0 前言 使用latex写文章 经常需要插入图片 有时插入的图片需要单栏排版 有时插入的图片需要双栏排版 下面汇总单双栏图片插入方法 1 单栏图片 插入单栏图片很简单 许多文章的latex模板里面都有例子 即以下代码
  • 【09】Nginx之缓存集成

    Nginx缓存集成 缓存的概念 缓存就是数据交换的缓冲区 称作 Cache 当用户要获取数据的时候 会先从缓存中去查询获取数据 如果缓存中有就会直接返回给用户 如果缓存中没有 则会发请求从服务器重新查询数据 将数据返回给用户的同时将数据放入
  • html5 try upgrading your browser,用html5做flex的离线应用程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 HTML5 草案的前身名为 Web Application 1 0 HTML5 的目标是保持和当前 HTML 标准 HTM L4 01 以及 HTML 的 XML 版本 XHMTL1 0 向后兼
  • Javase学习必备工具,超详细的OneNote安装使用教程

    为什么要记笔记 方便回顾复习 Java的技术体系庞大 并且每天都有新内容 为了防止遗忘 建议制定有规律的复习计划 笔记是回顾复习的依据 课下自己写的练习代码应该是尝试推翻这些课堂上记录的重点结论 笔记是重要结论的集中地 记笔记在学习中起到很
  • flutter入门自定义实现PopupWindow功能

    https blog csdn net email jade article details 87922051 其实就是自定义一个weight 实现 poproute 构建一个子布局传入即可 1功能显示和隐藏 用自定义的view 2 具体操
  • Qt 5.9.6 下载及安装

    1 下载并安装 Qt 5 9 6 官网下载地址 http download qt io archive qt 5 9 5 9 6 qt opensource windows x86 5 9 6 exe 下载后安装 安装路径不能有中文字符及空
  • node读取文件转换json文件

    323 text h323 3gp video 3gpp aab application x authoware bin aam application x authoware map aas application x authoware
  • 记一次在OrangePiZero2(香橙派zero 2)上部署Redroid(云手机)的过程

    一句废话 这次换一种写作风格 尝试一下轻松的行文方式 起因 很久以前看见有群友讨论关于docker部署Redroid 拿来挂机玩游戏一类的 当时听了感觉很有意思 后面粗浅地在zero2上部署了一下 容器虽然是跑起来了 但是scrcpy连接总
  • istio流量管理

    istio 官方示例 bookinfo 配置sidecar注入 istioctl kube inject debug f samples bookinfo kube bookinfo yaml gt bookinfo2 yaml 使用kub
  • 浅谈QNX进程间通信(IPC)

    锋影 e mail 174176320 qq com 在QNX Neutrino中消息传递 Message passing 是IPC的主要形式 其他的姓氏也是基于消息传递实现的 QNX中提供的IPC形式如何下图所示 一 Synchronou