gpt4 book ai didi

multithreading - "Multi-process"与 "single-process multi-threading"用于软件模块通过消息进行通信

转载 作者:行者123 更新时间:2023-12-04 04:34:21 28 4
gpt4 key购买 nike

我们需要构建一个软件框架(或中间件),以便在一台机器上运行的不同软件组件(或模块)之间实现消息传递。该框架将提供以下功能:

  • 模块之间的通信是通过“消息传递”。
  • 每个模块都有自己的消息队列和消息处理线程,它们将同步处理每个传入的消息。

  • 根据上述要求,以下哪种方法是正确的(及其推理)?:
  • 将模块实现为进程,并通过共享内存发送消息
  • 将模块实现为单个进程中的线程,并通过将消息对象推送到目标模块的消息队列来进行消息传递。

  • 当然,有一些明显的利弊:
  • 在 Option-2 中,如果一个模块导致段错误,则该进程(从而整个应用程序)将崩溃。并且一个模块可以直接访问/改变另一个模块的内存,这可能导致难以调试的运行时错误。
  • 但是使用 Option-1,您需要处理您需要通信的模块刚刚崩溃的状态。如果软件中有 N 个模块,则系统可能有 2^N 多个存活/崩溃状态,这些状态会影响模块上运行的算法。
  • 同样在 Option-1 中,发送者不能假设接收者已经收到了消息,因为它可能在那个时候崩溃了。 (但系统可以提醒所有模块某个特定模块已崩溃;这样,发送方可以断定接收方将无法处理该消息,即使它已成功接收)

  • 我赞成选项 2,但我不确定我的论点是否足够可靠。你有什么意见?

    编辑:根据要求澄清,这里有更多的规范细节:
  • 这是一个将在 Linux 操作系统上运行的嵌入式应用程序。
  • 不幸的是,我不能告诉你项目本身,但我可以说项目有多个组件,每个组件将由自己的团队(3-4人)开发,并决定这些之间的沟通组件/模块是通过某种消息传递框架。
  • C/C++ 将用作编程语言。
  • 'Module Interface API' 将自动提供给模块的开发人员的是:(1)一个消息/事件处理线程循环,(2)一个同步消息队列,(3)一个函数指针成员变量,您可以在其中设置您的消息处理函数。
  • 最佳答案

    这是我能想到的:

    多进程 (1) 与单进程、多线程 (2):

  • 段错误的影响: (2) ,如果一个模块导致段错误,整个应用程序崩溃。在 (1) ,模块具有不同的内存区域,因此只有导致段错误的模块才会崩溃。
  • 消息传递保证: (2) ,您可以假设消息传递是有保证的。在 (1) 接收模块可能在接收之前或处理消息期间崩溃。
  • 模块间共享内存 : 在 (2) ,整个内存由所有模块共享,因此可以直接发送消息对象。在 (1) ,您需要在模块之间使用“共享内存”。
  • 消息实现: (2) ,您可以在模块之间发送消息对象,在 (1) 您需要使用存储在共享内存中的网络套接字、unix 套接字、管道或消息对象。为了效率,将消息对象存储在共享内存中似乎是最佳选择。
  • 模块之间的指针使用 : 在 (2) ,您可以在消息对象中使用指针。堆对象的所有权(通过消息中的指针访问)可以转移到接收模块。在 (1) ,您需要手动管理“共享内存”区域中的内存(使用自定义 malloc/free 函数)。
  • 模块管理 : 在 (2) ,您只管理一个进程。在 (1) ,您需要管理一个进程池,每个进程代表一个模块。
  • 关于multithreading - "Multi-process"与 "single-process multi-threading"用于软件模块通过消息进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19156924/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com