共享内存对象(使用 shm_open 创建)和共享内存段(shmget)有什么区别?
它们是否有任何无法调整的限制,例如共享内存 shmmax 和 shmall?
这两者之间是否存在任何性能差异,应该在哪些 IPC 场景中使用它们?
共享内存对象(使用 shm_open 创建)和共享内存段(shmget)有什么区别?
它们是否有任何无法调整的限制,例如共享内存 shmmax 和 shmall?
这两者之间是否存在任何性能差异,应该在哪些 IPC 场景中使用它们?
我在测试中发现通过访问shm_open
的内存比通过访问的内存要快shmget
。除此之外,它们在功能方面非常相似。两者之间肯定存在一些细微的缓存或 TLB 差异,但我不熟悉引擎盖下的细节。
注意我必须使用 POPULATE 选项shm_open
来提高性能。
“shmget”是一种在 Linux 内核中实现的分配共享内存的特定于 Linux 的方法。
“shm_open”是一个库函数,它通过使用 mmap 映射文件来模拟共享内存。因为文件是使用“共享”标志映射的,所以内存在进程之间共享。
在 Linux 1.x 中,“/dev/shm”目录(包含文件)只是一个常规目录,因此使用“shm_open”的共享内存实际上是磁盘文件。在 Linux 3.x 中,“/dev/shm”是一个特殊的目录,以避免共享内存真的必须写入磁盘。
我认为这两种方法都可以用另一种方法代替。只是因为历史原因,才有两种不同的方法来创建共享内存。