谈谈嵌入式系统中多进程设计与进程通信

这里说的嵌入式系统,是嵌入式linux系统,嵌入式linux系统其实和电脑端的linux系统一样,作为一个系统,就不可能就跑一个程序或者任务,大多都会有好几个进程,这样的话就会用到进程间的通信功能;常用的进程间通信主要有以下几种方式:

1. 消息队列;

2. socket(本地socket和INET socket)

3.管道(有名管道和无名管道)

4.信号

5.共享内存


以上5中方式,其中信号、共享内存其实不是严格意义上的进程间通信,信号一般用于通知,并没有携带数据;共享内存,一般是用于共享大块数据(比如视频数据等),这个也不是单独使用的,一般需要结合其他的方式,进行标志同步(数据准备好了,告你来取吧~);那么剩下的三种方式,我们来分析一下其优劣。

消息队列:消息队列属于比较轻量级的通讯,消息属于一对一交互,数据量一般不会太大,消息接收可以设置阻塞或者非阻塞;使用消息队列通讯时,不能用select做IO复用;如果系统下的多个程序的框架有一对多的情况,那么就不适合用消息队列了。

管道:管道分为有名管道和无名管道,无名管道一般是用于父子进程间通讯用,不能在两个独立启动的可执行程序中使用;有名字管道,从其名字上就可以看出,创建时,会指定一个名字,然后创建后,会在指定的路径下生成一个管道文件,两个程序可以使用其进行通讯,管道是可以使用select监听,实现IO复用的。但是管道只能一对一的通信,不适用于多个进程间的通信;

socket:socket放在最后,是想让socket作为压轴的,socket的具体使用,又可以分为下面四种方式:

1>本地 socket 数据包式通信(基于本地socket文件的UDP的方式)

2>本地 socket 数据流式通信 (基于本地socket文件的TCP的方式)

3>INET socket 数据包式通信 (基于IP、PORT的UDP)

4>INET socket 数据流式通信 (基于IP、PORT的UDP)

其中,本地socket,也是会在系统下指定的路径建一个socket的文件,基于此进行通信,其实本地socket就是基于数据队列的通信(通过查看源代码可以找到这部分),本地socket和互联网的socket通信使用是一样的,可以是面向连接的数据流通信,也可以是面向无连接的数据包方式;

后面的INET的socket通信就是大家熟悉的网络通信,如果使用这两种方式,那么你的程序不仅可以实现进程间的数据交互,还可以跨设备通信!

通信方式以及特点的分析完了,今天要谈的主要是网络编程的应用,也就是socket,其他的进程间通信方式就不多说了,主要说是socket,怎么用?什么时候用哪一个方式?主要聊聊这些。

既然用了嵌入式linux系统,那么我建议尽量不要把什么功能都放在一起,一个程序里完成,这个不利于程序的维护和扩展,尽量按照功能或者业务去分开实现,比如说设备里用到了数据采集、4G模块、平台交互等等,这就可以把数据采集单独放在一个程序里去处理,4G模块的上网、断网重连维护、通话、短信等放在一个程序里,平台交互一般是和服务器通信,涉及到协议的打包与解包,也单独一个程序处理;这样互相独立,很方便扩展,也便于查找问题。下面接着说socket,既然系统间分了几个程序,那么他们之间是需要通信的,通信方式有以下三个方式:

1.点对点,每个,模块间都相互建立通讯,很显然,这种方式不利于功能扩展,通信太多;

谈谈嵌入式系统中多进程设计与进程通信_第1张图片

 

2.类似于C/S模型,这种扩展是没问题,但是不同“客户端”之间通信就比较麻烦了,每次都需要“服务端”去转发数据。

谈谈嵌入式系统中多进程设计与进程通信_第2张图片

3.星形架构,这种还是比较合理的,既满足了扩展性,也满足了不同模块间的数据通信;

谈谈嵌入式系统中多进程设计与进程通信_第3张图片

 接下来,就基于这第三种架构来讲讲socket在这里的应用这里面的消息中心,是作为一个服务端, 外围模块作为客户端,注册到消息中心上面,然后这个链接方式,可以是socket的四种方式都可以,一般是用流式域套接字,内部通信,使用流式面向连接,便于模块管理,这里特别想说的是数据包式的UPD方式通信,结合其特点:面向无连接,可以用于做调试接口。这个调试接口的意思是在消息中心里,启动一个UDP的端口服务器监听,然后我们可以在做一个调试命令,一个udp客户端的小程序,在这个小程序里面,我们可以把调试相关的命令、数据获取、日志级别修改操作加进去,这样这个调试命令就可以不建连接,直接给框架里的任意一个模块发送数据,或者获取数据。还可以发送模拟数据,比如采集模块未启动,用调试命令模拟一条采集模块的数据,发送给平台交互模块,也可以透传数据给任意一个注册到消息中心的模块。

另外就是,可以在消息中心里加上INET的UDP或者TCP端口监听,这样可以在电脑上用网络调试助手连接到设备系统内部,这样很方便调试,发送调试数据。

大家可以看下 openwrt里的ubus,这里介绍的星形架构的方式,和ubus很像,这种方式很不错的。

已经是深夜了,就到这里吧,文笔不好望大家谅解,以后慢慢学习提高~

 

微信订阅号:

谈谈嵌入式系统中多进程设计与进程通信_第4张图片

 

你可能感兴趣的:(嵌入式linux笔记)