- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个实时系统,并且正在讨论类的设计。
具体来说,我无法决定是否通过使用两阶段构造来构建“重载”类。
一方面,在运行时调用“重载”类的构造函数可能会成为主要瓶颈,这使我免于创建类和分配用户可能不会使用的功能的内存。
另一方面,考虑到当我们尝试访问一个功能的情况时,两阶段构造可能会在执行过程中产生意外,但由于它没有初始化,所以我们不能这样做,突然之间我们需要在使用之前完全构造它。
我的倾向是采用两阶段构造方法。我想听到的是在实时系统上进行两阶段构建的利弊。如果有更好的方法可以解决这一问题。
这里是重类的代码示例的示例(我的类肯定不会那样,但是它展示了我的想法):
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/
这是贪吃蛇游戏的部分代码。我想做的是制作关卡(大约3个),如果分数达到一定的分数(100或200),关卡就会改变。 在这段代码中,我尝试让分数达到 100 时进入第 2 阶段。但正如我编码的那样,它只
我是移相器新手。我开始看 youtube 系列,我首先有问题。我的背景图片无法加载。我有这个js代码 /* global Phaser */ var game = new Phaser.Game(12
我有一个包含 2 个阶段的应用程序,我不希望用户关闭第二个阶段,只需将其图标化即可。 目前我正在使用 oncloseRequest 处理程序来最小化窗口 - secondaryStage.setOnC
现在,我有一台运行服务器的基本LAMP配置。生产服务器是slicehost。但是我想知道将代码/数据库实例推送到阶段dev> stage> production的最佳方法是什么。它与您创建阶段的方式有
我在舞台上有一个场景。场景的宽度为 337.0 像素。但是,当我将它添加到舞台时,舞台的大小为 337.6 像素,由于 0.6 像素的差异,在屏幕的右边缘留下了一个白色间隙。 我尝试使用 stage.
我有这个未修饰的窗口: public static void initStartPage(final Stage primaryStage) { final Stage startPa
有什么方法可以在 Maven 构建中执行特定阶段。例如,如果我只想运行那些在预集成阶段执行的插件,Maven 是否提供了一种方法来做到这一点? e.g. mvn pre-integration-pha
仅在构建特定分支时如何运行构建步骤/阶段? 例如,仅当分支名为 deployment 时才运行部署步骤,其他所有内容保持不变。 最佳答案 在声明性管道语法中执行相同的操作,下面是一些示例: stage
我有一个简单的查询,试图在Hive 0.14中运行: select sum(tb.field1), sum(tb.field2), tb.month from dbwork.mytable tb gr
在 Mercurial 中,我经常使用 secret 变更集来跟踪我对尚未准备好推送的内容的工作。然后,如果我需要对某些文件进行紧急更改,我可以更新到公共(public)修订版,进行更改并推送它,而不
我一直在为 Heroku 的新附加组件工作,目前它是 alpha 阶段。因此,目前,我无法在我创建的应用程序上添加该附加组件,因为没有按钮可供我添加它。有人可以向我指出一些可以帮助我解决问题的资源吗?
我有 2 个线程正在运行,一个正在监听 soket 等待命令,另一个启动 javafx 应用程序 public class GraphicInterface extends Application i
在我的 Java Fx 应用程序中,我创建了两个阶段。第一阶段是主 Controller 类 HomeController 中的默认阶段。第二个 AddNewEmailController 是通过调用
我正在编写一个简单的 JavaFX 应用程序,它具有三个阶段:登录、注册 (Anmeldung) 和欢迎 (Anwendung)。 抱歉采用德语命名! 我已经在 App 类中创建了每个舞台及其场景,在
问题是我正在使用 jQuery("form")[0].reset(); 在需要时重置表单。此方法正在将形式重置到初始阶段。这里初始阶段的意思是“表单第一次加载到页面时带有一些值的阶段”。 但我需要的是
我有一个带有 pre-integration-test 和 post-integration-test 阶段的 Maven POM,如下所示。 start-server pre-in
我遇到一个错误,我已经为网络制作了一个 UIPageController,但我似乎无法找到它的问题,只有一个错误,请帮忙。代码如下 - 更多代码点播。 @interface ContentViewCo
考虑在其中放置一些文本的大型 (2000x1000) 舞台。舞台缩小到 1000x500,使文本不可读。然后我们尝试通过放大来放大文本。 预期:文本应该在某个时候再次变得可读。 实际:无论我们放大多少
试图在网页中居中 KineticJS 阶段。 尝试过: 但它集中在舞台的左侧,而不是舞台的中间。我错过了什么? 最佳答案 margin:auto 可以对齐这个div中心 关于htm
我正在 jboss 中部署一个简单的 Web 应用程序,其中包含一个 servlet、一个 jsp 文件和一个 easy EJB。这是 servlet 的代码: package webejb; imp
我是一名优秀的程序员,十分优秀!