浅谈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) 的相关文章

  • 黑莓 - “您目前没有新通知”

    我正在使用下面的代码 特别是pushMessage方法 向用户显示一些通知 public final class MyApplicationMessageFolder public static final long MyFolderId
  • BlackBerry 是否支持其应用程序开发人员的演示/测试版?

    我有兴趣为 BlackBerry 设备开发应用程序 想知道他们是否支持应用程序开发人员的演示版或测试版概念 我的意思是能够将我的应用程序的测试版或演示版部署给有限 受限的受众 例如业务合作伙伴 客户 外部测试人员等 他们中没有任何内容测试和
  • 使用 Java SE 功能的 BlackBerry 问题

    我已将 net rim api jar 导入到我的项目中 我还想使用标准 rt jar 中的 StringTokenizer 和 PrintWriter 等非 j2me 类 但是当我运行该应用程序时 它给出了错误 java io UTFDa
  • 如何动态更改黑莓标签字段的字体颜色?

    我有一个标签字段和三个按钮 名称分别为红色 黄色 蓝色 如果我单击红色按钮 则标签字段字体颜色应更改为红色 同样 如果我单击黄色按钮 则字体颜色应更改为黄色 同样 根据按钮颜色 标签字段中的字体颜色应发生变化 谁能告诉我该怎么做 Label
  • 黑莓开发上的脚本语言?

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

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在黑莓java开发中开发一个应用
  • 黑莓 Twitter 集成以发布照片

    我正在开发一个应用程序 用户可以在运行 OS 5 0 的 BlackBerry Storm 和 Torch 系列手机上将照片分享到 Facebook 和 Twitter 对于 Facebook 我使用了草莓项目 但对于 Twitter 我找
  • 我可以将 std:fixed 或 std::set precision() 与 >> 运算符一起使用吗?

    std istringstream将字符串转换为 long double 时会丢失精度 我可以使用类似的东西吗std fixed or std setprecision 我正在使用 c 11 并针对 QNX 平台 include
  • 如何在黑莓手机中制作状态栏?

    我想在屏幕底部设置状态栏 它应该在左侧和右侧显示一个按钮 你可以在下面看到我的屏幕 我的代码是这样的 private void BottomLayout Bitmap topBg Bitmap getBitmapResource Image
  • 在 BlackBerry 中单击事件期间更改 ButtonField 背景

    在 BlackBerry 中 如何更改ButtonField点击事件期间的背景颜色 例如 对于长按 背景颜色需要改变 对我来说 它采用默认颜色蓝色 如何改变呢 这是我们的自定义按钮字段 但它显示按钮单击事件的默认蓝色 public clas
  • 未指定 APN?

    我正在创建 httpConnection 但运行应用程序时会出现以下异常 java io IOException 未指定 APN 我认为查看开发人员知识库文章 链接可以解决您的问题 另请参阅此示例代码 private static Stri
  • 如何在黑莓中创建选项卡栏应用程序用户界面...?

    如何在 BB 中制作选项卡栏基础应用程序 应用程序的每个屏幕都将有此选项卡 并且每个选项卡将有单独的导航控制器堆栈 以便我们可以轻松地推送屏幕 您必须使用水平字段管理器创建选项卡栏 然后将字段添加到水平字段管理器 然后将管理器设置为屏幕的标
  • 如何使用Adobe Reader Mobile SDK 9开发pdf/epub阅读器?

    如何使用 Adob e Reader Mobile SDK 9 为黑莓设备开发 pdf epub 阅读器 如果您对 Adob e Reader 移动 SDK 有任何了解 请帮助我 Thanks 不可以 除非可以使用 JNI 否则 RMSDK
  • 如何将 SqLite 与 BlackBerry OS 4.5 一起使用?

    我目前在 BlackBerry 中使用持久存储 我想在 BlackBerry OS 4 5 中使用 SqLite 数据库 但我找不到任何相关教程 我可以在 BlackBerry OS 4 5 中使用 SqLite 还是需要其他版本的 Bla
  • J2ME - 使用 javax.microedition.amms.control.camera.CameraControl;是否可以禁用快门声音?

    在我的黑莓应用程序中 我已经实现了相机 并希望用我自己的声音替换默认的快门声音 我想我可以通过使用方法enableShutterFeedback false 来静音默认相机声音 然后播放我自己的声音 或者在相机激活之前立即播放我的声音来做到
  • Blackberry Java 中的类之间调用

    当屏幕上 单击 位图时 我试图推送一个新屏幕 为此 我从这篇文章中创建了一个类 黑莓可点击位图字段 https stackoverflow com questions 5722875 blackberry clickable bitmapf
  • 黑莓中的队列线程

    我查看了 BB API 5 0 但找不到任何串行执行一批线程的方法 我知道 BB 对启动的线程数量有限制 所以如果用户点击速度足够快但我找不到像线程池这样的东西 我不想启动 7 是否有一个简单的解决方案 或者我是否必须创建一个数据结构 如果
  • 适用于 BlackBerry 应用程序的 OAuth 库(适用于 Twitter 客户端)

    是否有可用于与 BlackBerry 应用程序集成的 OAuth 库 我想从我的应用程序发布一条推文 但找不到任何有助于登录的内容 找到了吗this URL http developerlife com tutorials p 648但无法
  • BlackBerry - 与 FieldManager 一起享受乐趣

    我正在尝试创建一个 View 类 根据它的创建方式提供水平或垂直布局 我正在使用委托来实现此目的 class View extends Manager private Manager mDelegate public View Manage
  • BlackBerry - App World 中应用程序的 html 链接

    我在应用程序商店中有一个黑莓应用程序 我想从网页链接到此应用程序 因此如果用户在浏览器上转到该页面并单击链接 则将启动 BlackBerry AppWorld 应用程序 并且用户将能够轻松下载本机 应用程序 可以通过这样的链接在 iPhon

随机推荐

  • 数据结构视频教程 -《(东南大学 王茜)数据结构 (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