Android跨进程通信-消息队列

消息队列的使用和原理

消息队列的创建及其如何使用

#include <sys/ipc.h>
#include <sys/msg.h>
​
int msgget(key_t, key, int msgflg); //创建和访问消息队列
int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);  //发送消息
int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long int msgtype, int msgflg); //获取消息

我们可以通过msgget()函数来创建消息队列,它会在内核空间创建一个消息链表,msgsend()函数往消息队列发送消息,msgrcv()函数获取消息队列里的数据。

通过消息发送和接收函数可以看到,消息队列的每个消息消息都有msgid,msgtype,msgflg字段。
msgid是消息的队列标识符,msgtype是消息的类型,发送函数中放在msg_ptr这个结构体里,msgflg用来控制读取消息时队列已满或者队列为空时的操作。

消息队列的数据结构,它是一个消息的链表,存放在内核中并由消息队列标识符标识,也就是上面提到的msgid,标识符标识用大于0的整数表示,并且每中标识符的消息队列都有自己的链表。它的表现结构如下图:

消息队列有哪些优点呢?它克服了Linux早期IPC机制的很多缺点,比如消息队列具有异步能力,又克服了具有同样能力的信号承载信息量少的问题;具有数据传输能力,又克服了管道只能承载无格式字节流以及缓冲区大小受限的问题。
但是缺点是消息队列比信号和管道都要更加重量,在内核中会使用更多内存,并且消息队列能传输的数据也有限制,一般上限都是16kb。

消息队列在Android中的使用场景

受限于性能,数据量等问题的限制,Android系统没有直接使用Linux消息队列来进行IPC的场景,但是有大量的场景都利用了消息队列的特性来设计通信方案,比如我们最频繁使用的Handler,就是一个消息队列,由于Handler只是进程内的通信方式,所以它的实现不在这儿讨论,消息队列的架构模型被非常多的场景使用,主要有下面几个有点原因。

  • 解耦:消息队列可以实现两个模块之间的解耦,两个需要通信的模块不需要之间对接,发送方只需要将消息丢到队列,接收方只需要从队列里面取消息。
  • 异步:我们可以将多条消息并行的发送给消息队列,然后不同的模块去并行的处理,在这种方案下,我们不需要串行的处理任务。
  • 缓冲:消息队列的数据结构就是一个缓冲池,可以帮助我们减轻流量过大的压力。

5.1 消息队列也称为报文队列

  • 消息队列也成为报文队列,消息队列是随内核持续的,只有在内核重启或者显示删除一个消息队列时,该消息队列才会真正删除。
  • 系统中记录消息队列的数据结构体 struct ipc_ids_msg_ids位于内核中,系统中所有消息队列都可以在结构msg_ids中找到访问入口。

5.2 消息队列的原理及注意事项

  • 消息队列其实就是一个消息的链表
  • 每个消息都有一个队列头,称为struct_msg_queue,这个队列头描述了消息队列的key值,用户ID,组ID等信息,但它存于内核中
  • 结构体struct msqid_ds能够返回或设置消息队列的信息,这个结构体位于用户空间中,与msg_queue结构相似的消息队列允许一个或多个进程向它写入或读取消息,消息队列是消息的链表。
  • 消息是按消息类型访问,进程必须指定消息类型来读取消息,同样,当向消息队列中写入消息事业必须给出消息的类型,如果读队列使用消息的类型为0,则读取队列中的第一条消息。
  • 内核空间的结构体msg_queue描述了对应key值消息队列的情况,而对应用户空间的msqid_ds这个结构体,因此,可以操作msgid_ds这个结构体来操作消息队列。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容