在不使用文件系统的情况下,Unix 上的 0 拷贝进程间通信
Posted
技术标签:
【中文标题】在不使用文件系统的情况下,Unix 上的 0 拷贝进程间通信【英文标题】:0-copy inter-process communication on Unix without using the filesystem 【发布时间】:2011-07-25 23:18:00 【问题描述】:如果我必须在两个进程之间移动适量的内存,我可以执行以下操作:
创建一个用于写入的文件 截断到所需大小 mmap 并取消链接 根据需要使用当另一个进程需要该数据时,它:
通过 unix 套接字连接到第一个进程 第一个进程通过unix socket消息发送文件的fd mmap fd 根据需要使用这允许我们在没有任何副本的情况下在进程之间移动内存 - 但创建的文件必须在内存挂载的文件系统上,否则我们可能会遇到磁盘命中,这会降低性能。有没有办法在不使用文件系统的情况下做这样的事情?一个类似 malloc 的函数会返回一个 fd 和一个指针。
[编辑] 拥有一个文件描述符还提供了一个由内核维护的引用计数机制。
【问题讨论】:
Shared memory? System V 共享内存不是已经过时了吗? 很少使用?最可能。过时的?我不这么认为,而且我不知道有任何证据。 @Penz:System V 共享内存比 POSIX 更 SUS(单一 Unix 规范),但在 POSIX 2008 站点上列出,没有任何“obs”标记。 【参考方案1】:System V 或POSIX 共享内存有什么问题吗(它们有些不同,但结果相同)?对于任何这样的系统,您必须担心进程在访问内存时之间的协调,但对于内存映射文件也是如此。
【讨论】:
shm_open 如果有办法创建匿名共享内存对象并只使用 fd. System V 也有这个问题,还有其他问题:持久性需要显式解除分配,当相同的数据被发送到多个问题时,这可能是一个问题。使用 fd,我们可以免费获得引用计数。以上是关于在不使用文件系统的情况下,Unix 上的 0 拷贝进程间通信的主要内容,如果未能解决你的问题,请参考以下文章
如何在不加载图像的情况下为文件系统上的现有图像写入或修改 EXIF 数据?
在不使用 SSMS 的情况下恢复 SQL Server 上的 .bak 数据库文件? [数据夹]
从 z/OS UNIX 系统服务 (USS) 文件系统下载二进制文件