我们需要构建一个软件框架(或中间件),以便在一台机器上运行的不同软件组件(或模块)之间实现消息传递。该框架将提供以下功能:
- 模块之间的通信是通过“消息传递”。
- 每个模块都有自己的消息队列和消息处理线程,它们将同步处理每个传入的消息。
根据上述要求,以下哪种方法是正确的(及其推理)?:
- 将模块实现为进程,并通过共享内存进行消息传递
- 将模块实现为单个进程中的线程,并通过将消息对象推送到目标模块的消息队列来进行消息传递。
当然,有一些明显的利弊:
- 在 Option-2 中,如果一个模块导致分段错误,则该进程(从而整个应用程序)将崩溃。并且一个模块可以直接访问/改变另一个模块的内存,这可能导致难以调试的运行时错误。
- 但是使用 Option-1,您需要处理您需要通信的模块刚刚崩溃的状态。如果软件中有 N 个模块,则系统可能有 2^N 多个存活/崩溃状态,这些状态会影响模块上运行的算法。
- 同样在 Option-1 中,发送者不能假设接收者已经收到了消息,因为它可能在那个时候崩溃了。(但系统可以提醒所有模块某个特定模块已崩溃;这样,发送方可以断定接收方将无法处理该消息,即使它已成功接收该消息)
我赞成选项 2,但我不确定我的论点是否足够可靠。你有什么意见?
编辑:根据要求澄清,这里有更多的规范细节:
- 这是一个将在 Linux 操作系统上运行的嵌入式应用程序。
- 不幸的是,我不能告诉你项目本身,但我可以说项目有多个组件,每个组件将由自己的团队(3-4人)开发,并决定这些之间的沟通组件/模块是通过某种消息传递框架。
- C/C++ 将用作编程语言。
- 'Module Interface API' 将自动提供给模块开发人员的是:(1) 消息/事件处理程序线程循环,(2) 同步消息队列,(3) 函数指针成员变量,您可以在其中设置您的消息处理函数。