有人知道以下三个在速度方面的比较:
共享内存
tmpfs (/dev/shm)
映射 (/dev/shm)
谢谢!
tmpfs
在这里阅读。以下内容是从那篇文章中复制而来,特别解释了共享内存之间的关系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
#
“这取决于。” 一般来说,它们都在内存中,并且依赖于系统实现,因此对于大多数用途而言,性能可以忽略不计并且特定于平台。如果您真的关心性能,您应该分析并确定您的要求。用另一种方法替换这些方法中的任何一种都非常简单。
也就是说,共享内存是最不密集的,因为不涉及文件操作(但同样,非常依赖于实现)。如果您需要多次打开和关闭(映射/取消映射),那么这可能会产生很大的开销。
干杯!
肖恩
“共享内存”是指 System V 共享内存,对吗?
我认为当你使用它时 Linux mmap 是一个隐藏的 tmpfs,所以它实际上与 mmaping 一个 tmpfs 相同。
在 tmpfs 上执行文件 I/O 会受到惩罚……主要是(在某些特殊情况下它可能有意义,例如在 32 位进程中 >4G)
tmpfs 是最慢的。共享内存和 mmap 的速度是一样的。