Tre*_*or 18 c linux buffer mmap shared-memory
做的有什么好处:shm_open
跟着一个mmap
?
为什么不创建一个常规文件,然后将其传递fd
给mmap
?
我看不到它的优点shm_open
- 这些只是参考,不是吗?
我读过全家人.在我看来,"秘密"在于mmaping动作 - 文件"类型"似乎毫无意义.
任何指针都会很好,尤其是性能帐户.
我的上下文是一个(循环可写的)缓冲区(比如128MB),它将被不断地写成一个进程,并且不断地从另一个进程转发.
举个例子:这个 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);
Run Code Online (Sandbox Code Playgroud)
与
fd = shm_open("/myshm.file", O_RDWR|O_CREATE, S_IRUSR | S_IWUSR);
mem = mmap(...same as before...);
Run Code Online (Sandbox Code Playgroud)
当我在fs open
下创建一个带有常规文件的文件/dev/shm
,并向其转储了一堆垃圾时,我的可用内存下降了1G,我的可用磁盘空间保持不变.
这两种方法有什么区别?
nos*_*nos 19
如果打开和mmap()一个常规文件,数据将最终在该文件中.
如果您只需要共享一个内存区域,而不需要保留数据(这会产生额外的I/O开销),请使用shm_open().
这样的内存区域还允许您存储其他类型的对象,例如互斥锁或信号量,这些对象在大多数系统上都不能存储在mmap()的常规文件中.
阅读了 的源码后shm_open
,我可以说这两种方法几乎是相同的。
链接:https ://code.woboq.org/userspace/glibc/sysdeps/posix/shm_open.c.html
shm_open 只是添加 shm_dir 前缀,然后调用正常的open
系统调用,没有什么特别的。