0

我有以下问题:

我创建了一个队列。添加元素(malloc)由 main() 函数完成,我创建了一个线程,它将处理元素/数据并释放它们。这是一个持续的过程,它将一直持续到我终止该过程为止。

现在,如果我终止进程,队列中的数据将会丢失,所以我正在考虑在其上实现 mmap()。这样队列也存储在常规文件中,当我重新启动进程时,数据将重新加载到内存中以供线程进一步处理......

由于我正在 malloc'ing 和 free'ing 内存,我想 mmapped 文件大小会不断增加或减少。

现在这可以实施还是我应该考虑其他选择???

谢谢。

EDIT1:我可以使用 lseek 或 ftruncate() 来调整文件大小吗?

4

1 回答 1

0

您当然可以将队列(或任何其他数据结构)放入mmap()ed 内存而不是堆内存,但您会遇到几个必须克服的问题:

  • mmap()您将必须自己在与 ed 文件对应的内存块中进行所有内存管理。除非您的队列数据结构是一个单一的内存块,否则它可能具有可以创建、删除和重定位的节点和指针。使用堆内存,您可以将分配和释放小块内存的任务委托给malloc()free(),包括重用已释放的内存以供数据结构中的新节点使用。在您的mmap()ed 文件中,您必须自己完成所有这些操作。

  • 您将无法在mmap()ed 内存块中使用指针,只能从块的开头偏移。这是因为如果块在另一个进程中被分离并重新附加,它可能不会位于相同的内存地址。由于数据结构访问是使用指针完成的,因此您将通过添加或减去mmap()块的基地址来不断地将偏移量转换为指针并返回。

  • 如果您希望能够在第一个进程被杀死后通过在另一个进程中重新附加块来恢复,您必须为第一个进程在关键部分中间被杀死而一个或多个不变量的情况做好准备暂时违反了数据结构。换句话说,您可能正在重新附加损坏的不一致数据结构。为了完全正确地支持这一点,您必须非常小心在数据结构上执行的各种突变。

总而言之,我给你的建议是不值得。您应该使用基于堆内存的快速、高效且易于使用的数据结构,并偶尔将序列化的快照保存到常规文件中。如果您必须接收,请从上次已知的良好快照中恢复。

于 2013-02-26T15:59:37.140 回答