1

我正在开发一个在嵌入式 Linux 平台上运行的应用程序(C++ 与 Qt 相结合的图形部分)。我需要知道如何将应用程序划分为不同的“核心”,每个核心负责处理应用程序的不同部分,以提高应用程序本身的稳定性、效率和安全性。

我的疑问是:将功能划分为线程还是分叉不同的进程更方便?

让我提供一个应用程序的功能视图:每个用户界面都有不同的用户界面,允许用户或多或少地做相同的事情(不要介意数据一致性,我已经解决了这个问题)。这些接口中的每一个都必须作为独立的(就像同一系统的不同终端一样)。我希望他们所有人都从同一个“核心”发送和接收消息,该“核心”将负责更新应用程序数据或做其他适当的事情。

实现内部“核心”和用户界面之间划分的最佳方式是什么?

当然我错过了一些知识,但到目前为止我想出了两个选择:1 - 从父亲“核心”派生一个孩子,让孩子执行一个特定的 UI 程序(我没有这样做的实际经验,所以如何,在在这种情况下,我可以让父亲和孩子进行交流吗(记住孩子是一个新进程)?) 2 - 为每个核心和 UI 创建不同的线程。

我需要这个划分,因为要求应用程序尽可能稳定,并且能够在崩溃的情况下重新启动 UI。还要记住,整个应用程序不会有无限的内存和资源可用。

提前感谢您的帮助,问候。

4

2 回答 2

2

在嵌入式系统中采用单独的进程路线可能是一个不错的选择,原因有以下几个:

  • 组件的解耦:将组件作为单独的进程运行是最终的解耦。当项目变得非常大时通常很有用

  • 安全和权限管理:很可能在嵌入式系统中,某些组件需要提升权限才能控制设备,而其他组件则是潜在的安全隐患(例如面向网络的组件),您希望以尽可能少的权限运行。其他可能的场景是需要实时线程或能够mmap()使用大量系统内存的组件。任何一个的过度分配都会以无法恢复的方式锁定您的系统。

  • 可靠:如果系统的某些部分失败,您可能会重新生成系统的某些部分,让其余部分继续运行

建立这样的安排实际上比这里的其他人建议的要容易 - Qt 对dbus的支持非常好- 它很好地照顾了您的 IPC,并在 Linux 桌面中广泛用于系统管理功能。

至于您描述的场景,您可能希望守护应用程序的“核心”,然后允许来自 UI 组件的客户端通过 dbus 连接。

于 2012-10-31T23:12:21.907 回答
0

在不同的线程中运行 UI 不会给您带来太多额外的稳定性——其他线程可能会破坏您的引擎堆,即使您终止线程,它所拥有的任何资源也不会被回收。

您可以通过在引擎和 UI 之间设置一堵非常强大的抽象墙来稍微提高稳定性。所以这并不是完全徒劳的。

多个进程需要很多圈才能跳过——您需要一种 IPC(进程间通信)方法。

请注意,IPC 和在较小程度上的抽象墙会增加程序的开销。

要问的一个重要问题是“在 UI 和引擎之间必须传递多少数据?” -- 如果数据足够少(比如从 UI 到引擎的“启动任务”,从引擎到 UI 的“这个任务完成了 50%”),IPC 就不那么麻烦了。如果你是一个实时全屏更新图像的交互式绘画应用程序,IPC 更烦人,更不实用。

现在,一个关于 Qt 和 IPC 的快速 google 告诉我,有一个用于嵌入式 linux 的 Qt 扩展,它允许 Qt 信号和插槽在进程之间传递消息:Qt COMmunications Protocol (QCOP)。我遇到过这样的框架的一个问题是,与相对简单的协议相比,它很容易导致客户端和服务器状态之间的纠缠,从而损害通信管道另一端的稳定性。

于 2012-10-31T14:49:00.100 回答