Shmem vs tmpfs vs mmap

时间:2009-05-24 20:30:47

标签: c++ linux mmap

有人知道以下3个在速度方面的比较:

  • 共享内存

  • tmpfs(/ dev / shm)

  • mmap(/ dev / shm)

谢谢!

4 个答案:

答案 0 :(得分:8)

了解tmpfs here。从该文章中复制了以下内容,特别解释了共享内存与tmpfs之间的关系。

1) There is always a kernel internal mount which you will not see at
   all. This is used for shared anonymous mappings and SYSV shared
   memory. 

   This mount does not depend on CONFIG_TMPFS. If CONFIG_TMPFS is not
   set the user visible part of tmpfs is not build, but the internal
   mechanisms are always present.

2) glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for
   POSIX shared memory (shm_open, shm_unlink). Adding the following
   line to /etc/fstab should take care of this:

    tmpfs   /dev/shm    tmpfs   defaults    0 0

   Remember to create the directory that you intend to mount tmpfs on
   if necessary (/dev/shm is automagically created if you use devfs).

   This mount is _not_ needed for SYSV shared memory. The internal
   mount is used for that. (In the 2.3 kernel versions it was
   necessary to mount the predecessor of tmpfs (shm fs) to use SYSV
   shared memory)

因此,当您实际使用POSIX共享内存(我之前使用过)时,glibc将在/dev/shm创建一个文件,用于在应用程序之间共享数据。它返回的文件描述符将引用该文件,您可以将该文件传递给mmap以告诉它将该文件映射到内存中,就像它可以处理任何“真实”文件一样。您列出的技术因此是互补的。他们没有竞争。 Tmpfs只是提供内存中文件作为glibc的实现技术的文件系统。

例如,我的盒子上正在运行一个进程,当前已经注册了这样一个共享内存对象:

# pwd
/dev/shm
# ls -lh
insgesamt 76K
-r-------- 1 js js 65M 24. Mai 16:37 pulse-shm-1802989683
#

答案 1 :(得分:2)

“这取决于。”通常,它们都在内存中并依赖于系统实现,因此对于大多数用途而言,性能可以忽略不计并且特定于平台。如果您真的关心性能,则应分析并确定您的要求。用另一种方法替换其中任何一种方法都是微不足道的。

也就是说,共享内存是最不密集的,因为没有涉及文件操作(但同样,非常依赖于实现)。如果你需要反复打开和关闭(map / unmap),很多次,那么它可能是一个很大的开销。

干杯!
肖恩

答案 2 :(得分:1)

“共享内存”是指System V共享内存,对吗?

我认为Linux mmap是一个隐藏的tmpf,当你使用它时,它实际上和mmpping一个tmpfs一样。

在tmpfs上执行文件I / O会受到惩罚......大多数情况下(有一些特殊情况可能有意义,例如在32位进程中使用> 4G)

答案 3 :(得分:-1)

tmpfs是最慢的。共享内存和mmap速度相同。