什么是做的好处是: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,我的缴费磁盘空间保持不变。
什么是两种方法之间的区别?
如果打开并mmap()的常规文件,数据将在该文件中结束。
如果你只需要共享内存区域,而不需要持久化数据,这将产生额外的I / O开销,应使用shm_open()。
这样的存储区域也将允许你存储其他类型的对象,如互斥体或信号灯,你不能在一个MMAP存储在大多数系统()'编常规文件。
这两个电话是现代的Linux实质上等同 - 第一方法可用于从喜欢去的语言(见https://github.com/fabiokung/shm/blob/master/shm_linux.go),其中POSIX共享内存本身不提供访问POSIX共享内存 - 它可能是其他的OS /版本,其中第一个呼叫会导致不同一些文件创建或/ dev / shm的只是不可用和/或性能可能较慢。路汇合的规则也可能从版本演进到librt的版本
第一个方法叫做内存映射文件API(性病库支持)
第二个叫做POSIX共享内存的API(需要librt又名libposix对Linux作为依赖它在内部构造路径,并调用open)