漫谈QNX(3)--进程间通信IPC

2022-04-19 17:07:03 浏览数 (1)

在开始阅读之前,如果你对已介绍的内容还不了解的话,可以先阅读以下文章快速熟悉一下~,

既然有了进程process,那么不同进程间通信就很有必要了。两个进程之间要交换数据,控制,以及事件通知。

Message passing ---比较传统的IPC方式是基于主从式构架(client-server),并且是双向通信。

再仔细来看的话,就是每一个process里面都有一个thread来负责通信。当一个线程在等待回信的时候,就会傻傻的等待,什么都不做了。直到收到回复信息。

傻等

Servers收到信息在通道上,Clients通过connection连接上channel,来发送信息。

一个进程可以有多个connections连接到另一个进程的channel上,是个多对一的关系。

多connections和多channels

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的现象。

Pulse命令

一个例子:

Event Delivery

Event是一种notification。可是从thread到thread,也可以从kernel到thread。比如硬件打断kernel的通知,或者timer到期的通知。

Shared Memory

如果通过设置shared memory, 同样的物理内存可以被多个进程访问。

After setting up a shared memory region, the samephysical memory is accessible to multipleprocesses:

preocess进程间通过shared memory通信同步策略:

IPC for synchronization

IPC for synchronization

Client先准备好共享内存的内容,然后告诉Server一切准备好了。接着Server读取共享内存内容,并做处理。最后Server回复Client说搞定了。这样Client就可以继续准备下一个任务了。

IPC想想也是很重要的,如果你设计的系统功能需要几个process的相互协作,你就绕不开IPC这个概念,下次准备有机会在一个实际的例子里看看IPC到底有什么用,怎么用。

0 人点赞