任务间通信 | 邮箱、消息队列
本文分享自中移OneOS公众号《任务间通信》。
上篇讲解了任务间同步,在本篇中主要讲解任务间通信机制,并对邮箱及消息队列进行详细介绍。通过对其概念、详细设计、接口设计等的讲解帮助开发者更好的理解其在操作系统中的应用。
任务间通信是指在不同任务之间传播或交换信息,操作系统实现的通信机制包含邮箱和消息队列。
邮箱
邮箱机制规定,一封邮件是固定的4字节大小,比较适合交换占用较小空间的信息,或者交换指针信息。
发送邮件实际是将发送缓存的4字节内容拷贝到邮箱,接收邮件是将邮箱中的4字节内容拷贝到接收缓存,如下图。
<邮箱通信示意图>
邮箱包含阻塞和非阻塞两种方式,其中,
阻塞方式:
1)如果邮箱为空时选择接收邮件,任务会被挂起,直到有新的邮件进入邮箱,挂起任务被唤醒接收邮件,或者设置的超时时间到达返回错误;
2)如果邮箱已满时选择发送邮件,任务也会被挂起,直到有其他任务接收邮件,邮箱有空间后挂起任务重新进入就绪态发送,或者设置的超时时间到达返回错误。
非阻塞方式:
1)如果邮箱为空时选择接收邮件,或者邮箱已满时选择发送邮件,都是直接返回错误。该方式适用于中断服务、定时器等不能阻塞的场景。
邮箱控制块结构的详细定义如下:
struct os_mailbox
{os_ipc_object_t parent; os_uint32_t *msg_pool; /* 邮箱缓冲区的开始地址*/ os_uint16_t size;
任务间通信 | 邮箱、消息队列相关推荐
- C++ 九阴真经之线程间通信(消息队列)
消息队列是线程间通信比较常用得方式,常用于解决经典模型生产者--消费者模型线程间得通信. 本文将结束基于C++标准库实现得消息队列,可以支持任意参数类型,任务参数数量. 为了方便后续线程池.异步队列得 ...
- Linux C 进程间的IPC通信 之 消息队列(2)
Linux C 进程间的IPC通信 之 消息队列 双向通信 代码:(进程1) 1 #include <stdio.h>2 #include <sys/msg.h>3 #incl ...
- python笔记 7-8 进程池 进程通信 迭代器 消息队列 Queue 协程 和正则表达式
day7 进程 进程池 进程通信 迭代器 消息队列 Queue 作用 用于多个进程间的通信 操作put放入消息(值) put_nowait() 放入值,不等待 如果队满,则报错 get获取消息(值) ...
- IPC通信:Posix消息队列的属性设置
IPC通信:Posix消息队列的属性设置 Posix消息队列的属性使用如下结构存放: struct mq_attr { long mq_flags; /*阻塞标志位,0为非阻塞(O_NONBLOCK) ...
- python多进程之间的通信:消息队列Queue
python中进程的通信:消息队列. 我们知道进程是互相独立的,各自运行在自己独立的内存空间. 所以进程之间不共享任何变量. 我们要想进程之间互相通信,传送一些东西怎么办? 需要用到消息队列!! 进程 ...
- Linux C 进程间的IPC通信 之 消息队列(1)
1.消息队列 与 共享内存 1-1 消息队列 和 管道 都属于 队列结构,读完了 就被删除 不存在,但 管道 是 顺序队列 ,而 消息队列 是 链式队列 1-2 消息队列 的读和写 可设为 阻塞模 ...
- Linux进程间通讯之消息队列
首先有个大体的概念:http://www.xefan.com/archives/83703.html 头文件: #include <sys/ipc.h> #include <sys/ ...
- (uC/OS-II学习笔记) 消息邮箱消息队列
原文出处: http://www.cnblogs.com/hebaichuanyeah 与信号量一样,消息邮箱与消息列队都是一种事件块. 消息邮箱可以在任务间实现信息传递. 比如,在任务1中发送一条消 ...
- RTX线程通信之——消息队列
文章目录 Message Queue 消息队列 RTX 消息队列 API 使用案例 小结 参考资料 Message Queue 我们知道,Thread and Event Flags.Semaphor ...
- 【Android】线程间通信——Handler消息机制
文章目录 引言 Java层 永动机跑起来 示例 Looper Handler MessageQueue 永动机停下 Native层 nativeInit() nativePollOnce() nati ...
最新文章
- 【算法笔记】莫比乌斯反演(包含定理,两种形式的证明及入门经典模板)
- 替换Android系统镜像system.img的方法
- 3d触控怎么测试软件,如何检测iPhone 8的3D Touch灵敏度
- WindowsServer和普通WIN操作系统有什么不同?
- css撑起父元素清除浮动的问题
- ubuntu 升级nodejs 和 npm
- MySQL使用时遇到的问题
- mongodb常用操作命令(待续)
- matlab怎么表示对角阵,matlab – 如何基于每一行将矩阵转换为一堆对角矩阵?
- cwRsync的安装与配置用法
- 也谈谈印度人的职场话题
- win7家庭版升级win7旗舰版
- 讲师靓照大集合,为最喜爱的讲师投票吧!iOS DevCamp Android DevCamp
- openslide read region 出现黑块 解决办法
- Python 分析近2000条“数据分析”相关岗位招聘信息
- 算法系列之1:计算中国农历(一) .
- java计算机毕业设计教务管理系统源程序+mysql+系统+lw文档+远程调试
- RFID中的s50卡
- 【Android】Android JNI
- boj489. 小妹妹去划船
热门文章
- Python爬虫:豆瓣电影 TOP 250
- 【Matlab电池健康状态预测】BP神经网络锂电池健康状态预测【含源码 688期】
- 小学计算机学情分析怎么写,小学英语学情分析范文
- python 取出中间字符串
- 20200416 T3 寻找天哥【组合向量的模长的幂的期望】
- no ST-LINK detected解决方案(ST-LINK驱动安装教程)
- 计算机辅助管理试卷和答案,专科《计算机辅助管理》-试卷-答案.doc
- android 编译 电脑卡,Android Studio 编译卡慢、卡顿的几种解决方案
- Spring Boot 底层自动配置的步骤
- 功率放大器在新型全向高阶SH导波压电换能器测试中的应用