3

我正在尝试在 C 中实现一个循环缓冲区,并且在 Wikipedia 上遇到了这个示例(2014 年 7 月删除)。看起来它会为从缓冲区读取的任何人提供一个非常好的接口,因为从缓冲区的末尾到开头的读取是自动处理的。所以所有的读取都是连续的。

但是,我有点不确定是否立即使用它,因为我在内存映射或虚拟内存方面并没有太多经验,而且我不确定我是否完全理解它在做什么。

我想我理解的是,它将缓冲区大小的共享内存文件映射到内存中两次。然后,每当数据写入缓冲区时,它会同时出现在内存中的两个位置。这允许所有读取是连续的。

如果有更多 POSIX 内存映射经验的人可以快速查看代码并告诉我使用的底层机制是否真的那么高效,那将是非常棒的。例如,我是否正确地认为 /dev/shm 中用于共享内存的文件始终保留在 RAM 中,或者它是否可以在某个时候被写入硬盘驱动器(性能下降)?有什么我应该注意的问题吗?

就目前而言,我可能会为我当前的项目使用一种更简单的方法,但最好理解这一点,以便将来在我的工具箱中使用它。

在此先感谢您的时间。

4

1 回答 1

4

我认为首先匿名mmap只是为了在未使用的内存中选择一些地址区域来保存两个映射。
“/dev/shm”通常与文件系统“tmpfs”一起挂载,该文件系统将所有数据存储在交换/内存中。所以实际上它可能会导致写入硬盘,但你的malloc-ed 内存有同样的机会。

即使我的“/etc/fstab”说“glibc 2.2 及更高版本希望 tmpfs 安装在 /dev/shm 以用于 POSIX 共享内存(shm_open,shm_unlink)。” 有些系统可能不会遵循这一点。但我希望内存映射文件几乎像交换一样工作,但它们会尽快将数据同步到磁盘。

正如状态 - glibc 2.06 及更早版本创建具有权限 0666 的文件,如果有人会在和man mkstemp之间捕获您的文件,这可能会导致安全漏洞。mkstempunlink

于 2010-05-27T18:32:50.320 回答