1.pidin用于查看进程,线程,状态
2.多线程+消息传递模型(并行/并发)
2.1服务器/子服务器模型(应答驱动的消息传递)
一个工作进程首先向服务器发送一条消息表示可以开始工作了,服务器不马上应答,仅仅是记住该进程已经注册。该进程进入REPLY阻塞状态。在后来某个时刻当服务器需要某项结果的时候,就可以向工作进程发送回答消息,然后,该工作进程执行指定的动作,并向服务器发送一个消息提交结果
2.2发送驱动的消息传递
服务器不断把自己处于RECEIVE阻塞状态中,以便等待客户端的请求,在这期间,客户进程发送的消息将启动服务器进程的一个动作的执行,服务器完成操作并向客户进程发送回答消息。
2.3消息处理过程中的小技巧
因为主线程给工作线程派发任务,那么主线程不能出现阻塞的情况。在传统的发送驱动的消息传递的方式中,我们常常让主线程创建工作线程然后发送消息给它,这样会导致一个问题就是,这期间主线程不能给其他工作线程发送消息,这大大降低了多个工作节点的优势。
解决这个问题的办法是从工作线程主动发起请求,等待服务器派发任务,当有其他线程告诉服务器该去做什么任务,服务器再把任务派发给已经在等待的工作线程。这样就使得工作线程应对具体业务,而主线程等待客户请求,主线程不用再被任何一个工作线程阻塞。
2.4多线程服务器模型
3.使用QNX基本消息
3.1消息传递API
ChannelCreate(), ChannelDestroy() ConnectAttach(), ConnectDetach() MsgDeliverEvent() MsgError() MsgRead(), MsgReadv() MsgReceive(), MsgReceivePulse(), MsgReceivev() MsgReply(), MsgReplyv() MsgSend(), MsgSendnc(), MsgSendsv(), MsgSendsvnc(), MsgSendv(), MsgSendvnc(), MsgSendvs(), MsgSendvsnc() MsgWrite(), MsgWritev() |
最常用的函数:
ChannelCreate(), ConnectAttach(), MsgReply(), MsgSend(), and MsgReceive().
3.2客户端消息传递
3.2.1建立消息发送通道
int coid = ConnectAttach (int nd, pid_t pid, int chid, unsigned index, int flags); |
"ND/PID/CHID,"网络节点描述符号(哪一台计算机,0表示本机)/进程ID/频道ID。
断开链接:ConnectDetach (coid);
3.2.2发送消息
int MsgSend (int coid, const void *smsg, int sbytes, void *rmsg, int rbytes); |