我充满了与桌面应用程序挂起的情况有关的问题,可能会持续几分钟。
我用c++写了一个复杂的游戏引擎。在开发过程中,我在测试过程中意外地发现了一个无限循环,程序导致整个系统挂起,通常只有几分钟。我过去经常用物理按钮重新启动我的电脑,因为我没有意识到它是那么糟糕。我正在使用Linux (Ubuntu,Debian),它在Windows或Mac上更好吗?
如果用户在我的软件挂起时重启他们的计算机,而他们的操作系统变得不可用,那么我是否应该对用户的安装环境造成损害或者数据丢失负责呢?当然,我可以测试软件负载,并且很有信心它不会发生,但我不知道我是否可以100%确定。
总体来说,有什么聪明的方法可以阻止程序挂起并盗取所有的CPU吗?比如,把我的游戏优先级降低到内核?
如果游戏有一个用户创建和共享地图的功能,其中包括编写发送给引擎解释器的脚本,那么他们会有无数种方法来产生太多的实体,并启用他们的人工智能,我确信他们可以让程序挂起。我不确定我能不能对这种混乱采取任何对策,特别是从游戏的发布开始。如果有人做了破坏别人安装的地图,我要负责吗?
我真希望我想得太多了。有什么简单的方法来保护我的程序不被挂起吗?由visual-studio代码生成的进程是否存在更严重的问题?我的内核在停止挂起过程方面是不是神秘的不好?
我不需要帮助从我的代码中删除无限循环,担心的是,由于它的复杂性,我会错过一个循环。
发布于 2022-01-23 01:59:36
从理论上讲,操作系统有责任阻止任何单一的应用程序通过资源短缺影响系统的其他部分。然而,这是一个复杂的问题,正如您已经发现的,有许多失败案例。操作系统至少应该能够尽量减少任何永久性损坏的可能性。因此,一般用户上下文中最现代的OSes都遵循相互尊重的原则:应用程序尽最大努力不消耗过多的资源,而操作系统则尽力在应用程序之间共享可用的资源,以防止出现问题。
但是,OS不能做任何事情来防止进程内停滞,在逻辑结构上进程块中的任务会使您的应用程序感觉像是挂起的。例如,您的游戏循环没有交付新的帧。在这种情况下,操作系统所能做的就是提供允许用户在这种情况下退出应用程序的机制。在你的应用程序挂起的时候,你曾经尝试过alt+tab吗?
只要您控制代码的开发过程,并对您的系统设置合理的限制(例如,对自定义地图来说,限制一个映射中可以有多少实体),然后在这些限制下有效地测试系统,您就应该能够避免这些问题。(当功能更强大的计算机可用时,您可能希望提供使用适当警告的方法来覆盖这些限制)。
但是,如果您希望加载外部代码,那么它就进入了沙箱这个复杂的主题。这是一个广泛而复杂的话题,有许多微妙之处。最好从检查用户对代码的期望开始,而不是明确地将代码作为系统的一部分。在很多情况下(游戏mods),这完全是用户的责任。在其他情况下,如web浏览器,人们期望浏览器将提供重要的保护措施,因此,大多数现代浏览器运行在多个进程中,允许更细粒度地使用OS保护机制。
发布于 2022-01-23 06:30:22
也许程序可以挂起自己和/或系统的可能方式列表将有助于:
我肯定还有其他人我错过了。
如果应用程序本身正在锁定,则可能在应用程序中添加一个看门狗,以便尝试清理,或者在调试模式下完全中止。
应用程序中无限循环的另一个缓解措施是设计来检测它们或允许它们。要检测它们,在代码部分中可以有一个卡住的循环,留下一个钩子用于监视狗计时器或倒计时计时器,并在触发时中止循环。为了允许它们,要么将循环看作一个事件,然后在下一个迭代中,让它将自己添加回事件队列;或者在可能的无限循环中添加产量,以允许它被推迟或中止。
https://softwareengineering.stackexchange.com/questions/436184
复制相似问题