首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大规模仿真软件体系结构

大规模仿真软件体系结构
EN

Software Engineering用户
提问于 2018-02-07 16:53:46
回答 1查看 316关注 0票数 4

我期待着在一个复杂的模拟系统上进行一次大规模的大修,该系统模拟了课堂培训环境中几种汽车模型的几个实例。例如,24名学生可能在三种不同的车辆上运行模拟以进行维修和操作。教官将被要求拥有可以连接到24种活动模拟中的任何一种的平板电脑来控制训练场景。

主系统将在Linux上运行,但是没有对操作系统的其他要求,可以根据需要构建机器规范。每个模拟传球的性能必须能够在+-2ms公差的情况下,以大约10 2ms的间隔持续运行。

一个主要的目标是使这个系统非常模块化,以便它可以扩展和重复使用的其他培训设施与独特的车辆和需要。

我的想法是使用分层架构(系统、业务、UI)。每个车辆模型的定义可以存储在数据库中,因此由超级用户独立编辑(车辆的模块化/可扩展性)。每个层可能必须读取此数据库才能动态分配特定层所需的资源。

最初,我计划对系统层使用共享内存,为任何试图登录的业务层设置权限和身份验证。然后,主模拟业务逻辑将根据活动数据不断更新车辆详细信息。指导员接口将有一个业务层服务器,该服务器连接到所有24个客户端,并登录到系统层以修改模拟参数。来自学生和视觉输出的所有输入都有一个业务层,可以登录到共享内存系统层。所有这些都充当单独的应用程序,以便可以根据需要删除/添加/扩展它们。

当我意识到类在共享内存中不能很好地工作时,问题就出现了。我需要将共享内存的每个get/集合序列化为一个平面内存结构。以前没有使用过这个架构,我不确定这个计划是否会带来很大的性能冲击。从技术上讲,我可以将一些核心用于执行模拟的主要业务层逻辑。

将共享内存与一组应用程序一起使用是否是解决此系统的适当方法?另一种跨进程通信类型(如管道)是否比共享内存更可取?是否最好将系统和业务逻辑保存到一个应用程序中,只使用互斥和交叉线程来确保性能?我是不是搞错了?

EN

回答 1

Software Engineering用户

发布于 2018-02-07 18:09:30

我只做过一个模拟应用程序,需求更宽松(也就是说,我们必须让所有的东西更新1/s)。可以随意地用一大粒盐来吃,但这是个开始的地方。我认为你很难用股票操作系统实现你的计时目标。我只能强调一些经验教训:

  • 有时,需求被夸大了。
    • 示例:在+/- 2ms内完成活动的间隔为10 2ms,总体速率可能足够好,但真正的版本更像是在+/- 20 2ms内完成的活动。同样的比率,但设计起来更合理。
    • 例如:您的外部客户端可能没有您的应用程序具有相同的近乎实时的需求。

  • 您需要能够提前停止处理,如果接近窗口的末尾,则停止从队列中提取,或者实际取消现有的工作。
  • 根据所模拟的内容,演员模型或一些类似的方法可能是您的总体设计的最佳选择。

在我所做的类比中,我们模拟了与信号设备和塔的通信,以及设备在接近实时的情况下移动的效果。考虑到我们需要模拟的设备数量,我们不能将一个完整的线程分配给每个参与者(设备和塔),但是我们可以让有限数量的线程与语料库一起工作,以处理到当前模拟时间戳为止的消息。

我建议的唯一一件事是从一个稳定的基础开始,并对你的模拟进行压力测试。正是这些压力测试会迫使你做出艰难的决定,在什么地方你可以用同样的整体效果来换取绝对的忠诚。我向你保证,没有人会注意到10毫秒和100毫秒之间的区别。

任何模拟都是在工作模型的保真度和近似模型之间的权衡。

另外,不要在共享内存和管道或套接字上做出决定。关注核心行为。

我在一些新的尝试中学到的一点是,有时共享的nothing方法提供了最好的总体可伸缩性。为了从微服务方法中获得一个想法,您将拥有一个架构,其中一个模拟服务为高精度的定时事件提供了整个环境。诀窍是将整个环境安全地划分为较小的环境。每辆车或每个空域都能做到。

我们知道以下情况:

  • 您的关键代码符合要求。
  • 并不是每件事都有严格的时间要求(根据你上面和下面的评论)
  • 套接字通信非常慢,即使在同一台机器上也是如此。
  • 共享内存可能很棘手,而且仍然需要序列化,但只能使用一台计算机。

本质上,要让多个模拟节点协同工作,您需要定期将状态打包并传输到受影响的节点。你需要这种传输速度快,密度高。备选方案有:

  • 命名管道,相当高的速度,高可靠性
  • UDP数据包,相当高速,数据包可以被路由器分割,最大安全大小约为1134字节有效载荷。
  • TCP数据包,速度慢,但可靠性高得多。

通信可以在接收节点中异步调用事件。在我的例子中,我们选择了UDP数据包,因为整个系统打算在一个子网中运行。我们还使用了二进制传输格式,如Google协议缓冲区,以最大化每个字节的信息。

在我的项目中,大多数模拟可以在一台机器上运行,但是传感器可视化软件通常是远程运行的。

在这种情况下,这是我们更新外部系统的频率和数据量的权衡。每个节点都有一对打开的套接字,一个用于发送,一个用于接收。

在大多数情况下,我们可以精确地预测我们的运动,这样我们收到的航向修正就不会被注意到,而且模拟仍然有效。

但是,像这样的方法必须根据已知的系统标准进行测试。

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/365529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档