如何mmap()队列



我有以下问题:

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

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

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

现在,这是可能实现的,还是我应该考虑其他选择???

谢谢。

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新