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

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

这里说的嵌入式系统,是嵌入式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.点对点,每个,模块间都相互建立通讯,很显然,这种方式不利于功能扩展,通信太多;

 

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

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

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


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


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


目录
相关文章
|
3月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
336 2
|
18天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
83 13
|
2月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
162 1
|
2月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
2月前
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
2月前
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
4月前
|
监控
MASM32写的免费软件“ProcView/系统进程监控” V1.4.4003 说明和下载
MASM32写的免费软件“ProcView/系统进程监控” V1.4.4003 说明和下载
|
3月前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
35 0
|
3月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第5天】麒麟系统mate-indicators进程占用内存过高问题解决
212 0
|
4月前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
57 1