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

Posted

技术标签:

【中文标题】共享内存段与共享内存对象【英文标题】:shared memory segment vs shared memory object 【发布时间】:2013-10-02 16:26:12 【问题描述】:

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

它们有没有像共享内存 shmmax 和 shmall 一样无法调整的限制?

这两者之间是否存在任何性能差异,应在哪些 IPC 场景中使用它们?

【问题讨论】:

【参考方案1】:

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

请注意,我必须为 shm_open 使用 POPULATE 选项才能提高性能。

【讨论】:

【参考方案2】:

“shmget”是在 Linux 内核中实现的一种特定于 Linux 的分配共享内存的方法。

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

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

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

【讨论】:

我不认为“shmget”是一种“Linux-Specific”方法。 “库函数”相当模糊,它也适用于“shmget”,无论该术语是什么意思。 显然它不是特定于 Linux 的 - 在这一点上你是对的。术语“库函数”是指该函数不是在操作系统内核中实现的,而是在用户空间中实现的。对于 Linux 1.x 版本,情况绝对如此。

以上是关于共享内存段与共享内存对象的主要内容,如果未能解决你的问题,请参考以下文章

“共享内存模型”与“消息传递模型”

Linux共享内存

共享内存

System V 共享内存

linux共享内存的控制释放

已加载共享对象的内存使用情况