Nucleus进程间通信(IPC)方式
版权声明:本文为博主原创文章,未经博主同意不得转载--“http://blog.csdn.net/suipingsp”。
https://blog.csdn.net/suipingsp/article/details/31750393
实时操作系统Nucleus Plus提供了6种进程间通信方式。分别为:邮箱(mailboxes)、消息队列(queues)和管道(pipes)、信号量(semaphores)、事件集(event groups)和消息(signals)。前三者用于进程间通信,后三者用于进程同步。本文总结了Nucleus Plus进程间通信方式。
i,首先说明Nucleus进程间通信的两个基本概念。
消息(message):由一个或多个字节(byte)或者字(32-bit word,4bytes)组成的信息单元,可在不同进程间传递少量的信息。邮箱(mailboxes)、消息队列(queues)和管道(pipes)通信的构成单元是message。
事件(event)或者信号(signal):一个32-bit word中的每一位bit代表一个信号或者事件,仅仅能用于不同进程间通知某情况出现,不能携带额外的信息。
当中一个32-bit word称为一个事件组。这是事件集(event groups)和消息(signals)的构成单元。
ii,邮箱(mailboxes)、消息队列(queues)和管道(pipes)
|
邮箱(mailboxes) |
消息队列(queues) |
管道(pipes) |
消息构成 |
4个32位字 单一消息 |
一个或多个32位字 多个消息 |
一个或多个字节 多个消息 |
任务挂起/唤醒 |
FIFO/进程优先级 |
FIFO/进程优先级 |
FIFO/进程优先级 |
广播/多任务支持 |
支持 |
支持 |
支持 |
动态创建 |
是 |
是 |
是 |
数量限制 |
无 |
无 |
无 |
Note:
1,数量限制指的是一个任务所使用的邮箱、消息队列或者管道的数量是否受限。
2,FIFO挂起/唤醒:当能够满足任务要求时,任务唤醒的顺序依照先进先出进行。
3,任务优先级挂起/唤醒:依照被挂起任务的优先级顺序进行唤醒,高优先级优先唤醒。
4,任务挂起/唤醒模式在邮箱、消息队列或者管道被创建时确定。
iii,事件集(event groups)和消息(signals)
信号和事件以及后面介绍的信号量用来解决任务间的同步问题。
信号signal:
异步方式执行,任务提前指定信号处理子程序,每一个任务能够处理32个信号。每一个信号对应32-bit字的一个位。
任务创建时默认信号是disable的,可通过设置信号屏障字的对应位来决定某信号是否使能。屏障字某位设为1表示使能该信号。信号仅仅能是一个进程去通知还有一个进程,即不支持广播。
当信号出现。任务中断而且调用信号处理程序,信号被处理后自己主动清除。
信号处理子程序不能被新信号中断。不论什么新信号的处理在当前信号处理完毕后进行。在第一个信号被验证之前再次发送的相同的信号将被丢弃弃。
project开发中常结合信号和内存队列来实现进程间的数据通信。一个简单的样例,进程A将数据写入一段内存、产生一个对应的全局变量控制结构体。而后通过signal通知进程B去读取;进程B收到signal后依据全局变量控制结构体到对应的内存中将该数据读取处理。
事件event:
同步方式执行,是用于警告某一特定的系统事件已经发生的机制。每一个32-bit字成为一个事件集,当中的每一位称作事件标志event flag。event flags的设置set和清除clear以及读取receive能够通过逻辑与/或进行。
另外。event flag被读取received后可自己主动重置。
应用程序可能拥有的事件集没有预先的设定。除非主动通过特定的服务申请。任务并不能知道某事件是否已经发生了。(The task does
not recognize event flags are present until the specific service request is made.)
比如。一个事件组的32位event flag分配为:5位用于消息队列事件、24位用于标示信号事件。其余3位用于识别事件类型(是消息队列、信号还是超时)。演示样例代码例如以下(NU_EventWait函数封装了Nucleus PLUS 事件组函数):
iv,最后是一种特殊的任务间同步手段--信号量(semaphores)
信号量(semaphore):是一种数据操作锁。它本身不具有数据交换的功能,而是通过控制其它的通信资源(文件,外部设备)来实现进程间通信,它本身仅仅是一种外部资源的标识。当进程不再使用一个信号量控制的共享资源时,信号量的值+1,对信号量的值进行的增减操作均为原子操作,这是因为信号量基本的作用是维护资源的相互排斥或多进程的同步訪问。
Nucleus进程间通信(IPC)方式的更多相关文章
- 共享内存是最快的一种IPC方式
在linux进程间通信的方式中,共享内存是一种最快的IPC方式.因此,共享内存用于实现进程间大量的数据传输,共享内存的话,会在内存中单独开辟一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限 ...
- 进程间通信IPC之--共享内存
每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲 ...
- Android进阶笔记18:选用合适的IPC方式
1. 相信大家都知道Android进程间通信方式很多,比如AIDL.Messenger等等,接下来我就总结一下这些IPC方式优缺点. 2. IPC方式的优缺点和适用场景 3. 附加:使用Intent实 ...
- Android进程间通信IPC
一.IPC的说明 IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程. IPC不是Android独有的,任何一个操作 ...
- 进程间通信IPC -- 管道, 队列
进程间通信--IPC(Inter-Process Communication) 管道 from multiprocessing import Pipecon1,con2 = Pipe()管道是不安全的 ...
- [原创]chromium源码阅读-进程间通信IPC.消息的接收与应答
chromium源码阅读-进程间通信IPC.消息的接收与应答 chromium源码阅读-进程间通信IPC.消息的接收与应答 介绍 chromium进程间通信在win32下是通过命名管道的方式实现的 ...
- 进程间通信IPC之--无名管道(pipe)和有名管道(fifo)(转)
进程间通信IPC之--无名管道(pipe)和有名管道(fifo) 2012-01-17 22:41:20 分类: C/C++ 每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中 ...
- Android进阶笔记15:选用合适的IPC方式
1. 相信大家都知道Android进程间通信方式很多,比如AIDL.Messenger等等,接下来我就总结一下这些IPC方式优缺点. 2. IPC方式的优缺点和适用场景 3. 附加:使用Intent实 ...
- 进程间的八种通信方式----共享内存是最快的 IPC 方式
1.无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 2.高级管道(popen):将另一个程序当做一个新 ...
随机推荐
- Android OpenGL教程-第五课【转】
第五课 3D空间: 我们使用多边形和四边形创建3D物体,在这一课里,我们把三角形变为立体的金子塔形状,把四边形变为立方体. 先看看三角形的顶点变成啥了 private float[] mTriangl ...
- 如何移除git不需要提交的文件
在大公司提交代码都需要经历cr(code review)过程,在用python脚本将代码上传至cr(代码对比工具)服务器时会产生一个issue.info文件,这个文件的内容就是一个issue号,此文件 ...
- [Erlang]各种系统限制总结
Erlang本身对进程数,原子长度等没有限制,但为了提高性能和节省内存,总会在实际实现中和运行环境中作出一些限制. 1.进程数量 缺省情况下同时存在的最大Erlang进程数量不超过2^18=26214 ...
- 关于利用MQ实现分布式事务的想法【转】
转自:https://www.jianshu.com/p/bafb09954f18 假设:消息服务不丢消息 场景 服务A 服务B 服务C 消息服务Q 伪代码 服务A中 transaction{ A本地 ...
- JAVA SwingWorkder的使用例
最近在学习Swing,我们都知道在UI表现线程里面长时间执行操作时,画面会假死,为了能够让费时操作不影响画面表现,就需要用多线程了.首先考虑的就是Swing内部的 SwingWorkder对象,但是网 ...
- webpack-loader原理
loader loader 是导出为一个函数的 node 模块.该函数在 loader 转换资源的时候调用.给定的函数将调用 loader API,并通过 this 上下文访问. loader配置 { ...
- laravel JWT Auth - JSON Web令牌认证API
https://github.com/tymondesigns/jwt-auth/wiki
- 记录开发Nodejs c++ addon的一些经验(三、关于node-gyp)
关于node-gyp如何进行编译,我想它的官网已经说的很详细了: https://github.com/nodejs/node-gyp 但是我感觉关于binding.gyp文件的语法规则还是说的不明确 ...
- Visual Studio扩展与更新中插件被禁用,安装后无法使用
在Visual Studio中的扩展与更新中安装插件后,显示[禁用],重新安装后仍然不能使用,但是VS默认安装的扩展却可以正常使用. 这里需要注意下方显示“当前不允许加载每用户扩展”,点击“启用每用户 ...
- 24_BlockingQueue接口
[BlockingQueue常见] [ ArrayBlockingQueue ] 基于数组的阻塞队列的实现,在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象,其 ...