做法有什么好处: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,我的可用磁盘空间保持不变。
这两种方法有什么区别?
答案 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
系统调用,没什么特别的。