gpt4 book ai didi

c++ - 想要创建一个在内存中存储数据的应用程序。但即使我的应用程序崩溃,我也不希望数据丢失

转载 作者:太空宇宙 更新时间:2023-11-04 05:57:30 25 4
gpt4 key购买 nike

想要创建一个在内存中存储数据的应用程序。但即使我的应用程序崩溃,我也不希望数据丢失。我应该使用什么概念?我应该使用共享内存,还是有其他更适合我的要求的概念。

最佳答案

您要求 persistence (甚至正交持久性)和/或 application checkpointing

在一般情况下,对于某些任意现有的 C++ 代码,这是不可能的(至少通过可移植的 C++ 代码),例如因为 ASLR ,因为本地 call stack 上或指向本地 threading 的指针,因为多 continuation ,并且因为外部资源(套接字、打开的文件……),因为当前的 garbage collection 无法在标准 C++ 中访问、恢复和处理。

但是,您在设计应用程序时可能会牢记持久性。这是一个很强的架构要求。例如,您可以让每个类都包含一些转储方法及其加载工厂函数。请注意共享指针,并考虑到可能存在循环引用。研究 Gc HandBook 算法(例如在 serialization 中),它与持久性所需的算法类似(复制 GC 与检查点算法非常相似)。

还可以查看 libs11n 库(如 JSON )。您还可以考虑保留为文本格式(例如 Sqlite ),也许在某些 PostGreSQL 数据库中(或一些真实的数据库,如 MongoDbmonimelt ....)。我正在我的 BLCR 软件中执行此操作(用 C 语言)。

您还可以考虑像 bytecode 这样的检查点库

重要的是在设计时尽早考虑持久性和检查点。将您的应用程序视为某种专门的 SBCL 解释器或 VM 可能会有所帮助(特别是如果您想保留延续或某种形式的“调用堆栈”)。

您可以在持久化之前 fork 您的进程(假设您使用的是 Linux 或 Posix)。因此,坚持时间并不那么重要(例如,如果您每小时或每十分钟坚持一次)。

某些语言实现能够保留其整个状态(特别是堆),例如save-lisp-and-die (一个很好的 Common Lisp 实现)及其 Poly/ML ,或 SaveState - 一种 ML 方言 - 及其 Squeak ,或 Smalltalk (一个 this answer 实现)。

另请参阅 that oneCAIA as a sleeping beauty 。 J.Pitrat 的博客有一个相关条目:vtables

数据与代码的持久性(例如对象的 dladdr(3)、函数指针)在技术上可能很困难。 getcontext(3) -with dlsym- 可能会有所帮助(并且,如果您能够编写特定于机器的东西,请考虑旧的 name mangling ,但我不建议这样做)。通过声明 extern "C" 所有与持久性相关的代码来避免 event loop(对于 dlsym)。如果您想保留一些数据并能够通过稍微修改的程序(例如小错误修复)重新启动,事情就会复杂得多。

更务实的是,您可以有一个代表整个可持久状态的类,并实现持久化(并重新加载它)的方法。然后,您将仅坚持算法的某些步骤(例如,如果您有主循环或 transaction log ,则在该循环开始时)。您可能不想太频繁地保留(例如,由于保留所需的时间和磁盘空间),例如也许每十分钟一次。如果 ojit_a 适合您应用程序的整体情况,您也许可以考虑使用它。

关于c++ - 想要创建一个在内存中存储数据的应用程序。但即使我的应用程序崩溃,我也不希望数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26881678/

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