gpt4 book ai didi

c++ - 是否可以卡住和转储程序状态?

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

考虑这样的情况:有一个简单的程序:

int main()

{
for (int i = 0; i < 100; i++) {
if (i == 50){
// ... dump state of program somewhere
}
cout << i << " ";
}
return 0;
}

是否可以通过将程序状态存储到磁盘上的文件来“保存”程序状态?例如,几周后我想从文件中加载这个状态,它会从最后停止的地方继续工作(它会打印 50 51 ...)。

最佳答案

你想做的叫做application checkpointing .另请阅读 persistence , call stack , dynamic software updating , continuation (& CPS ), database , ASLR , Garbage Collection (因为复制 GC 使用的算法非常接近检查点所需的算法),serialization , process migration维基页面,因为它们都是相关的。

当然,在有限的情况下,您可以转储 core dump并重新启动它(正如大多数其他答案所建议的那样)。但这可能行不通:

  • 如果您的(检查点)进程有到其他服务器的网络连接(例如正在使用 libcurl 访问远程网页或内容)。

  • 如果您的进程已经启动了其他进程并且正在通过管道或 fifos 与它们通信

  • 如果您的流程依赖于外部服务,例如数据库服务器。

  • 如果您的进程有一个 Graphical User Interface (它正在与 X11 或 Wayland 服务器通信)。

  • 如果你想在几周后重启你的进程,并且你稍微改进并重新编译了它的代码(甚至在一些与计算无关的地方),或者可能只是升级了外部库,C++ 编译器,或者更改了编译(例如优化)标志。

  • 对于多线程应用程序,您会遇到很多额外的问题(例如,如何从检查点状态重新启动它们等...)

某些情况下,您可以为此使用一些检查点库。查看BLCR

在其他情况下,它高于最先进水平并且仍然是一个活跃的研究课题。你可以在这方面工作大约十年并获得博士学位。

在实践中,检查点非常重要,您应该在开始编写第一行 C++ 代码之前考虑一下。它对您的软件架构设计有着深远的影响。

在某些情况下,甚至值得花几周的时间来开发专门的 C++ 代码生成器(以生成用于持久性和检查点的代码)。

在某些领域,特别是 HPC 和关于 supercomputers 的许多科学计算,检查点是必不可少的;例如,模拟两个星系的碰撞可能需要在一台非常昂贵的 super 计算机上进行数月的计算(它可能会在如此巨大的模拟结束之前重新启动),当然你需要在编写第一行代码之前考虑检查点.如果代码本质上是非常迭代的,它实际上可能很简单(原则上),因为您“只”需要保存在某个高级循环中计算的数据。在实践中,它是复杂的,细节决定成败。

一些语言实现对检查点的支持有限。例如(在 Common Lisp 中)SBCL提供其 save-lisp-and-die原始。 GNU emacs 有 unexec (但也要看 here ,因为它可能会过时)。

应用持久化和数据是一个非常重要的课题。在许多情况下,数据比应用程序本身更有值(value)(那么,您应该对数据库感兴趣,从 SqlitePostGreSQL & MongoDB )。

附言。非常不幸的是,您的问题没有提供更多的背景和动机。你确定它不是XY problem吗? ?

关于c++ - 是否可以卡住和转储程序状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40268056/

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