共享内存段与共享内存对象

问题描述 投票:0回答:3

共享内存对象(使用shm_open创建)和共享内存段(shmget)有什么区别?

它们是否有任何无法像共享内存 shmmax 和 shmall 那样进行调整的限制?

这两者之间有性能差异吗?应该在哪些 IPC 场景中使用它们?

linux kernel ipc shared-memory
3个回答
1
投票

我在测试中发现通过

shm_open
访问内存比通过
shmget
访问内存更快。除此之外,它们在功能方面非常相似。两者之间肯定存在一些微妙的缓存或 TLB 差异,但我不熟悉幕后细节。

注意,我必须使用 POPULATE 选项来实现性能提升。

    


0
投票
shm_open

是“System V Shared Memory API”的一部分,

shmget
是“POSIX共享内存API”的一部分。
最大的区别是

shm_open

返回一个“与参数键的值关联的共享内存段的标识符”,并且它只能真正被与同一API相关的其他函数使用(例如与SysV ShMem的访问同步)通常使用信号量独立完成),而

shmget
返回正确的文件描述符,例如,您可以使用更简洁方便的
shm_open
函数系列进行同步或
flock
读取属性等。
基本上它们都提供大致相似的功能,但 

fstat

是稍微更现代、更强大的 API 的一部分,因此每当我需要通用共享内存时,我总是只使用

shm_open
,而忽略新项目的旧选项。

shm_open

/

mmap
之后发生的情况而言 - 几年前我在 Linux 上尝试过它们,除了有时无法正常工作之外,我没有发现功能或性能方面有任何显着差异一些配置不当的系统缺少
shmat
挂载点或完全缺少
/dev/shm
,因此我必须在单独的 tmpfs 中创建一个单独的文件并 mmap 它,这与
librt
的作用非常接近。此外,只要有可能,我都会使用原子读/写操作进行同步,并使用共享内存本身内部的滚动整数字段作为更新标记,并且看起来在这两种情况下都以类似的方式管理内存,因此不会对性能产生影响,但我只在 Linux 中工作,所以我不能保证它在 FreeBSD 中是完全相同的。
对于共享内存的典型用例场景 - 有多种不同的场景。例如,

shm_open

+

shm_open
+ 原子读取/读取+修改操作 + 滚动数据更新字段是我在嵌入式系统上本地 1 到多个子系统状态数据分发案例的首选解决方案。我通常有一个单独的程序来处理特定的硬件或特定的子系统,其他程序只是监视其操作,主 GUI 处理程序可以通过这种方式更改其一些参数。只要您现在只关心数据值是什么并且不需要将数据流分成单独的消息,共享内存就是一个理想的解决方案。这样不仅性能好,而且 C 代码看起来更加整洁。
    


-2
投票

“shm_open”是一个库函数,通过使用 mmap 映射文件来模拟共享内存。由于文件是使用“共享”标志映射的,因此内存在进程之间共享。

在 Linux 1.x 中,“/dev/shm”目录(包含文件)只是一个常规目录,因此使用“shm_open”的共享内存实际上是磁盘文件。在 Linux 3.x 中,“/dev/shm”是一个特殊目录,以避免共享内存确实必须写入磁盘。

我认为这两种方法都可以用另一种方法代替。只是因为历史原因,才会有两种不同的创建共享内存的方法。

© www.soinside.com 2019 - 2024. All rights reserved.