如何实现动态共享内存大小调整?

use*_*306 5 c memory-management resize mmap shared-memory

当前,我想使用shm_open来获取文件描述符,然后在想向共享内存中添加新缓冲区时使用ftruncate和mmap。每个缓冲区分别用于其自身目的。

现在,我需要做的是任意调整缓冲区大小。munmap缓冲区也将在以后再次使用可用空间。

对于第一个问题,我只能提出的唯一解决方案是:ftuncate(file_size + old_buffer_size + extra_size),mmap,将整个数据复制到新缓冲区中,然后对原始数据进行映射。这对我来说看起来非常昂贵,并且可能有更好的方法。它还需要每次删除原始缓冲区。

对于第二个问题,我什至没有一个不好的解决方案,每次清除缓冲区时,我显然都无法移动内存。而且,如果我跟踪空闲内存并在任何可能的地方使用它,将会减慢分配过程的速度,并留给我剩余的零碎内存。

我希望这不要太令人困惑。谢谢

Dan*_*vid 4

据我了解,您需要增加(或缩小)现有的内存映射。在Linux下共享内存实现为文件,位于/dev/shm内存文件系统中。该文件中的所有操作与常规文件(和文件描述符)上的操作相同。

如果您想扩大现有映射,请首先使用 ftruncate 扩大文件大小(如您所写),然后使用将mremap映射扩大到请求的大小。

如果您存储指向该区域的指针,您可能必须更新这些指针,但首先尝试使用 0 标志进行调用。在这种情况下,系统尝试将现有映射增长到请求的大小(如果与其他保留的内存区域没有冲突)并且指针保持有效。

如果先前的选项不可用,请使用 MREMAP_MAYMOVE 标志。在这种情况下,系统会重新映射到另一个位置,但大多数情况下都是有效完成的(系统没有应用副本。),然后更新指针。

收缩是相同的,但顺序相反。