为什么应使用shm_open?

问题描述 投票:17回答:2

什么是做的好处是:shm_open遵循mmap? 为什么不创建一个普通的文件,然后传递到fd mmap? 我看不到shm_open的优势 - 这些只是参考,不是吗?

我读过整个家庭的男人。在我看来,该“秘密”是在mmaping行动 - 文件“类型”似乎是毫无意义的。

任何指针将是不错的,尤其是与性能帐户。 我的背景是(环比写的)缓冲区(128MB说),将被不断写入是一个过程,从另一个不断倾倒。

举个例子:有什么不对this开/ mmap的方法。

编辑 准确地说,是下列之一优于其他:

fd = open("/dev/shm/myshm.file", O_CREAT|O_RDWR, S_IRUSR | S_IWUSR);
mem = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

fd = shm_open("/myshm.file", O_RDWR|O_CREATE, S_IRUSR | S_IWUSR);
mem = mmap(...same as before...);

当我创建了定期open文件下/dev/shm FS和倾倒垃圾的演出吧,我的可用内存下降了1G,我的缴费磁盘空间保持不变。 什么是两种方法之间的区别?

c linux buffer shared-memory mmap
2个回答
19
投票

如果打开并mmap()的常规文件,数据将在该文件中结束。

如果你只需要共享内存区域,而不需要持久化数据,这将产生额外的I / O开销,应使用shm_open()。

这样的存储区域也将允许你存储其他类型的对象,如互斥体或信号灯,你不能在一个MMAP存储在大多数系统()'编常规文件。


2
投票

这两个电话是现代的Linux实质上等同 - 第一方法可用于从喜欢去的语言(见https://github.com/fabiokung/shm/blob/master/shm_linux.go),其中POSIX共享内存本身不提供访问POSIX共享内存 - 它可能是其他的OS /版本,其中第一个呼叫会导致不同一些文件创建或/ dev / shm的只是不可用和/或性能可能较慢。路汇合的规则也可能从版本演进到librt的版本

第一个方法叫做内存映射文件API(性病库支持)

第二个叫做POSIX共享内存的API(需要librt又名libposix对Linux作为依赖它在内部构造路径,并调用open)

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