【发布时间】:2015-08-18 06:01:08
【问题描述】:
目前我使用 shm_open 来获取文件描述符,然后每当我想向共享内存添加新缓冲区时使用 ftruncate 和 mmap。每个缓冲区都单独用于自己的目的。
现在我需要做的是任意调整缓冲区大小。 并且 munmap 缓冲并稍后再次重用可用空间。
对于第一个问题,我能想出的唯一解决方案是:ftuncate(file_size + old_buffer_size + extra_size),mmap,将数据复制到新缓冲区,然后对原始数据进行 munmap。这对我来说看起来非常昂贵,可能有更好的方法。它还需要每次都删除原始缓冲区。
对于第二个问题,我什至没有糟糕的解决方案,我显然无法在每次删除缓冲区时移动内存。如果我跟踪空闲内存并尽可能使用它,它会减慢分配过程,并让我留下一些未使用的零碎。
我希望这不会太令人困惑。 谢谢
【问题讨论】:
-
问题:您知道需要多少个缓冲区以及每个缓冲区的最大大小吗?我正在考虑具有预定义数量的缓冲区的预定义大小。您将如何管理这些“单独用于其自身目的的缓冲区”?预定义的缓冲区大小毕竟意味着没有碎片......
-
缓冲区的数量和大小来自程序外部,所以我无法预测它们会是什么。
-
听起来像是一个初始化的事情...延迟到您知道为止,这样可以省去很多麻烦。
-
不,缓冲区在整个运行时被添加/删除和调整大小任意次数。
-
你不知道最坏的情况吗?如果你这样做了,你应该为此而构建。
标签: c memory-management resize shared-memory mmap