为什么要使用shm_open?

时间:2014-07-21 21:36:54

标签: c linux buffer shared-memory mmap

做法有什么好处:shm_open跟随mmap
为什么不创建常规文件,然后将fd传递给mmap
我看不出shm_open的优势 - 这些只是参考,不是吗?

我读过全家人。在我看来,“秘密”在于mmaping动作 - 文件“类型”似乎毫无意义。

任何指针都会很好,尤其是性能帐户 我的上下文是一个(循环可写的)缓冲区(比如128MB),它将被不断地写成一个进程,并且不断地被另一个进程转储。

举个例子:this open / 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);

VS。

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

当我在open fs下创建一个常规/dev/shm的文件,并向其倾倒了一堆垃圾时,我的可用内存下降了1G,我的可用磁盘空间保持不变。
这两种方法有什么区别?

3 个答案:

答案 0 :(得分:18)

如果打开并使用mmap()常规文件,数据将以该文件结束。

如果您只需要共享一个内存区域,而不需要保留数据(这会产生额外的I / O开销),请使用shm_open()。

这样的内存区域还允许您存储其他类型的对象,例如互斥锁或信号量,这些对象在大多数系统上都不能存储在mmap()的常规文件中。

答案 1 :(得分:2)

这两个调用在现代Linux上基本相同   - 第一种方法可用于从go(参见https://github.com/fabiokung/shm/blob/master/shm_linux.go)等语言访问POSIX共享内存,其中POSIX共享内存本身不可用 - 对于第一次调用会导致某些文件创建的其他OS /版本可能不同/ dev / shm只是不可用和/或可能性能较慢。路径合并规则也可能从librt的版本发展到版本

第一种方法称为内存映射文件API(在std libs中支持)

第二个调用POSIX共享内存API(在Linux上需要librt aka libposix作为依赖它在内部构造路径并调用open)

答案 2 :(得分:0)

在阅读void bfs( ... ) { ... distance[startVertex] = 0; while (!isEmpty(q)) { int currentVertex = dequeue(q); .... while (temp) { .... if (graph->visited[adjVertex] == 0) { graph->visited[adjVertex] = 1; enqueue(q, adjVertex); distance[adjVertex] = distance[currentVertex] + 1; } } } } 的来源之后,我可以说这两种方法几乎相同。

链接:https://code.woboq.org/userspace/glibc/sysdeps/posix/shm_open.c.html

shm_open仅添加了shm_dir前缀,然后调用普通的shm_open系统调用,没什么特别的。