banner
NEWS LETTER

嵌入式 Linux 系列 17:进程模型、线程和 IPC 选择

Scroll down

嵌入式设备上的业务并不一定要写成一个大进程。网络、配置、外设、升级、日志、看门狗可以拆分,也可以合并。关键是理解进程、线程和 IPC 的取舍。

一、单进程还是多进程

单进程优点:

  • 部署简单。
  • 数据共享容易。
  • 调试入口少。

缺点:

  • 一个模块崩溃影响全局。
  • 代码容易耦合。
  • 热更新困难。

多进程优点:

  • 隔离性更好。
  • 可以单独重启。
  • 权限可以拆分。

缺点:

  • IPC 复杂。
  • 部署和监控更复杂。
  • 状态一致性要设计。

小设备可以先单进程,复杂产品再拆。

二、线程模型

常见线程:

1
2
3
4
5
6
main thread
mqtt thread
config thread
device io thread
log thread
watchdog thread

线程之间要避免:

  • 长时间持锁。
  • 回调里阻塞。
  • 日志线程阻塞业务线程。
  • 配置更新和业务读取没有同步。

线程问题很容易变成偶现问题,要尽早建立清晰模型。

三、IPC 方式

常见选择:

  • Unix domain socket。
  • FIFO。
  • message queue。
  • shared memory。
  • dbus。
  • 本地 HTTP。
  • 文件状态。

精简系统里,Unix domain socket 很实用:

  • 不依赖网络。
  • 支持请求响应。
  • 权限可以通过文件路径控制。
  • 适合本机服务通信。

四、配置通知示例

MQTT 服务收到配置后:

1
2
3
4
5
mqtt_agent
-> 写 /data/config/device.json
-> 通过 unix socket 通知 app reload
-> app reload 成功后返回
-> mqtt_agent 发布 ack

这样 ack 代表真正生效,而不是只代表“收到命令”。

五、何时拆进程

可以考虑拆进程的情况:

  • 模块崩溃风险高。
  • 权限需要隔离。
  • 升级频率不同。
  • 外设操作可能阻塞。
  • 第三方库不稳定。

不建议为了架构好看过早拆分。嵌入式设备资源有限,进程越多,监控和恢复成本越高。

六、验收清单

检查:

  • 每个线程职责是否清楚。
  • 退出流程是否清楚。
  • 配置更新是否线程安全。
  • IPC 是否有超时。
  • 对端进程崩溃后能否恢复。
  • supervisor 是否能重启关键进程。

进程模型不是代码组织问题,而是稳定性设计问题。

其他文章
目录导航 置顶
  1. 1. 一、单进程还是多进程
  2. 2. 二、线程模型
  3. 3. 三、IPC 方式
  4. 4. 四、配置通知示例
  5. 5. 五、何时拆进程
  6. 6. 六、验收清单
请输入关键词进行搜索