gpt4 book ai didi

c++ - 实时系统的两阶段构建

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:22 25 4
gpt4 key购买 nike

我正在开发一个实时系统,并且正在讨论类的设计。
具体来说,我无法决定是否通过使用两阶段构造来构建“重载”类。

一方面,在运行时调用“重载”类的构造函数可能会成为主要瓶颈,这使我免于创建类和分配用户可能不会使用的功能的内存。

另一方面,考虑到当我们尝试访问一个功能的情况时,两阶段构造可能会在执行过程中产生意外,但由于它没有初始化,所以我们不能这样做,突然之间我们需要在使用之前完全构造它。

我的倾向是采用两阶段构造方法。我想听到的是在实时系统上进行两阶段构建的利弊。如果有更好的方法可以解决这一问题。

这里是重类的代码示例的示例(我的类肯定不会那样,但是它展示了我的想法):

 class VeryHeavy {

private:

HeavyClass1* p1;
HeavyClass2* p2;
HeavyClass3* p3;
HeavyClass4* p4;
HeavyClass5* p5;

int* hugeArray [100000];

//...//

};

最佳答案

这是AGC,即Apollo制导计算机,在Apollo命令模块和月球模块上均使用。以几乎使阿波罗11号飞机的着陆被擦洗而闻名。就在下降到月球表面的中间,这台计算机因实时错误而崩溃。几次。产生系统错误1201(执行溢出-没有空闲区域)和系统错误1202(执行溢出-没有核心设置)。阿姆斯特朗(Armstrong)和奥尔德林(Aldrin)只看到了数字,在照片右侧看到的UI设备太原始了,无法显示字符串。引导 Controller Steve Bales知道数字的含义(他们在训练时从未见过错误),并且知道系统可以从中恢复。并且通过给予GO来节省着陆,他为此获得了总统自由勋章。

尽管我们可以确定您没有在尝试着陆,但是这很可能是您的问题所要问的问题。术语“实时”曾经在软件工程中定义得很好,但是却被金融业弄糊涂了。在Apollo 11中,这意味着系统对外部事件的最大响应时间具有非常严格的上限。火箭需要一个这样的系统,有时在调整喷嘴时不会太迟,一旦迟到会产生十亿美元的火球。金融业劫持它的意思是一个任意快速的系统,尽管迟到有时不会使该机器蒸发,尽管它使交易损失的可能性更大。他们可能也认为这是一场灾难:)

您使用的内存分配器很重要,问题中也没有定义。我会假定您的程序正在按需分页的虚拟内存操作系统上运行。并不是实时系统的理想环境,而是普遍通用的真正实时操作系统的表现并不理想。

两阶段构造是用于处理初始化失败的技术,难以处理在构造函数中引发的异常,析构函数将无法运行,因此如果您在构造函数中进行分配而未使构造函数足够智能,则可能导致资源泄漏处理一个不幸的事。另一种选择是稍后在成员函数中执行此操作,并根据需要延迟分配。

因此,您担心的是惰性分配会阻碍系统的响应速度。产生系统错误1201。

实际上,这不是按需分页的虚拟内存操作系统(例如Linux或Windows)的主要关注点。这些操作系统上的内存分配器速度很快,它仅分配虚拟内存。这不花任何钱,它是虚拟的。当您真正开始使用分配的内存时,才需要支付实际费用。需求分页的“需求”发挥作用的地方。寻址数组元素将产生页面错误,从而迫使操作系统将寻址的虚拟内存页面映射到RAM中。如果机器没有受到其他压力,并且必须取消映射另一个进程正在使用的页面以获取RAM,则此类页面错误相对便宜,称为“软”页面错误。您希望操作系统能够仅抓取页面并映射它,开销以微秒为单位。

因此,实际上,如果您做对了,并且在分配它时不尝试初始化整个数组,那么您的程序将遭受成千上万的细微开销。每一个小到不会危及实时响应保证的程度。无论您是提前分配内存还是延迟分配内存,都会发生这种情况,因此,无论使用两阶段构造,都无关紧要。

如果您想保证这种情况不会发生,或者想对初始化整个数组时遇到的页面错误 Storm 有弹性,那么您将需要一种非常不同的方法,您需要对页面锁进行锁定。 RAM分配,以便操作系统无法取消映射页面。这总是需要修改OS设置,它通常不允许进程分页锁定大量内存。然后当然也要进行两阶段 build 。

请记住,程序很少知道如何处理分配失败。它们的行为几乎就像异步异常一样,随时可以在程序的几乎任何部分中随时发生。尤其难以与实时需求保持一致,因为由于内存不足而无法对实时事件做出响应的系统当然并不比最新的系统好。这仍然是一个火球;)因此,它本身应该已经是足够的理由,不用理会两阶段构造,只需在程序初始化时分配内存,然后再开始保证实时响应即可。它使程序的编写变得简单得多,失败的几率要低得多。

对于任何具有实时特征的软件,一个非常艰巨的要求是,它不必与其他进程抗衡即可获取操作系统资源。仅将整个机器专用于一个进程是预期的,就像AGC一样,您不再局限于rope memory的36864字和RAM的2048字了。如今,硬件便宜又足够,足以提供这样的保证。

关于c++ - 实时系统的两阶段构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17855859/

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