共享内存段与共享内存对象
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 版本,情况绝对如此。以上是关于共享内存段与共享内存对象的主要内容,如果未能解决你的问题,请参考以下文章