嵌入式设备上的业务并不一定要写成一个大进程。网络、配置、外设、升级、日志、看门狗可以拆分,也可以合并。关键是理解进程、线程和 IPC 的取舍。
一、单进程还是多进程
单进程优点:
- 部署简单。
- 数据共享容易。
- 调试入口少。
缺点:
- 一个模块崩溃影响全局。
- 代码容易耦合。
- 热更新困难。
多进程优点:
- 隔离性更好。
- 可以单独重启。
- 权限可以拆分。
缺点:
- IPC 复杂。
- 部署和监控更复杂。
- 状态一致性要设计。
小设备可以先单进程,复杂产品再拆。
二、线程模型
常见线程:
1 | main thread |
线程之间要避免:
- 长时间持锁。
- 回调里阻塞。
- 日志线程阻塞业务线程。
- 配置更新和业务读取没有同步。
线程问题很容易变成偶现问题,要尽早建立清晰模型。
三、IPC 方式
常见选择:
- Unix domain socket。
- FIFO。
- message queue。
- shared memory。
- dbus。
- 本地 HTTP。
- 文件状态。
精简系统里,Unix domain socket 很实用:
- 不依赖网络。
- 支持请求响应。
- 权限可以通过文件路径控制。
- 适合本机服务通信。
四、配置通知示例
MQTT 服务收到配置后:
1 | mqtt_agent |
这样 ack 代表真正生效,而不是只代表“收到命令”。
五、何时拆进程
可以考虑拆进程的情况:
- 模块崩溃风险高。
- 权限需要隔离。
- 升级频率不同。
- 外设操作可能阻塞。
- 第三方库不稳定。
不建议为了架构好看过早拆分。嵌入式设备资源有限,进程越多,监控和恢复成本越高。
六、验收清单
检查:
- 每个线程职责是否清楚。
- 退出流程是否清楚。
- 配置更新是否线程安全。
- IPC 是否有超时。
- 对端进程崩溃后能否恢复。
- supervisor 是否能重启关键进程。
进程模型不是代码组织问题,而是稳定性设计问题。
- 本文链接: https://blog.hansong.icu/2026/06/26/Embedded_Linux_Series_17_Process_IPC/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。