在开始阅读之前,如果你对已介绍的内容还不了解的话,可以先阅读以下文章快速熟悉一下~,最后也感谢知乎@ 强大的宇宙的分享。
5分钟,带你了解汽车操作系统
漫谈QNX(1)–架构
漫谈QNX(2)–进程,线程,同步
既然有了进程process,那么不同进程间通信就很有必要了。两个进程之间要交换数据,控制,以及事件通知。
Message passing —比较传统的IPC方式是基于主从式构架(client-server),并且是双向通信。
再仔细来看的话,就是每一个process里面都有一个thread来负责通信。当一个线程在等待回信的时候,就会傻傻的等待,什么都不做了。直到收到回复信息。
Servers收到信息在通道上,Clients通过connection连接上channel,来发送信息。
一个进程可以有多个connections连接到另一个进程的channel上,是个多对一的关系。
Server创建Channel:
chid = ChannelCreate (flags);
Client连接上Server的channel:
coid = ConnectAttach(nd, pid, chid, _NTO_SIDE_CHANNEL, flags);
信息的发送:
status = MsgSend (coid, smsg, sbytes, rmsg, rbytes);
信息的接收:
rcvid = MsgReceive (chid, rmsg, rbytes, info);
接下来来点干货,看一个demo代码:
Massage之间的通信数据总是通过拷贝,而不是指针的传递。
那么如何设计消息传递策略呢?一个例子看一下:
Pulses脉冲
脉冲的通信方式很特别,就像喊命令,不需要回应,执行就好了。便宜还快速,也不会发生blocking的现象。
一个例子:
Event Delivery
Event是一种notification。可是从thread到thread,也可以从kernel到thread。比如硬件打断kernel的通知,或者timer到期的通知。
Shared Memory
如果通过设置shared memory, 同样的物理内存可以被多个进程访问。
preocess进程间通过shared memory通信同步策略:
IPC for synchronization
Client先准备好共享内存的内容,然后告诉Server一切准备好了。接着Server读取共享内存内容,并做处理。最后Server回复Client说搞定了。这样Client就可以继续准备下一个任务了。
IPC想想也是很重要的,如果你设计的系统功能需要几个process的相互协作,你就绕不开IPC这个概念,下次准备有机会在一个实际的例子里看看IPC到底有什么用,怎么用。
原文始发于微信公众号(Vehicle攻城狮):漫谈QNX(3)–进程间通信IPC