维基百科上的内存映射循环缓冲区有多好?

时间:2010-05-27 11:06:14

标签: c data-structures posix circular-buffer

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

但是,我对使用它有点不确定,因为我对内存映射或虚拟内存没有多少经验,我不确定我是否完全理解它正在做什么。

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

如果有更多POSIX内存映射经验的人可以快速查看代码并告诉我使用的底层机制是否真的那么高效,那真是太棒了。我是否正确地想到例如用于共享内存的/ dev / shm中的文件总是保留在RAM中,还是可以在某些时候写入硬盘驱动器(性能命中)?我应该注意哪些问题?

按照目前的情况,我可能会为我当前的项目使用一种更简单的方法,但是理解这一点很好,将它放在我的工具箱中以备将来使用。

提前感谢您的时间。

1 个答案:

答案 0 :(得分:4)

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

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

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