mmap local v/s nfs file:当底层文件在磁盘上被替换时会发生啥?

Posted

技术标签:

【中文标题】mmap local v/s nfs file:当底层文件在磁盘上被替换时会发生啥?【英文标题】:mmap local v/s nfs file: what happens when the underlying file is replaced on disk?mmap local v/s nfs file:当底层文件在磁盘上被替换时会发生什么? 【发布时间】:2013-01-31 12:48:16 【问题描述】:

假设文件被大量替换(同名)而不是就地修改(即创建一个临时文件,然后重命名为文件名)。

我想更改不会影响本地 mmap,因为内核仍然拥有磁盘上旧文件(inode)的句柄。

但是,由于 NFS 是无状态的,在 mmap 的(长)生命周期内,mmap 是否会混淆并混淆旧/新文件内容?

在我看来 read/readv 是处理 NFS 挂载文件的唯一安全方法。

【问题讨论】:

【参考方案1】:

如果您对某个文件有一个开放引用,则该引用将继续引用同一个文件,只要该引用存在,即使该文件本身已被删除或重命名,即使其名称被某个品牌重复使用删除后的新文件。引用可以是文件描述符或内存映射。这是 POSIX 的一部分,无论使用什么类型的文件系统,它都是正确的(或者应该是!)。

换句话说:如果您在 NFS 文件系统上打开一个文件并将其映射到内存中,只要您不取消映射,您就可以继续使用该内存映射,即使其他进程(或相同process) 删除文件并将其替换为具有相同名称的新文件。

NFS 协议确实是无状态的,因此实现必须采取特殊步骤来确保正确处理这种情况。自从我查看它是如何完成的已经很长时间了,但是我最后一次(在 Solaris 上)是通过将文件重命名为特殊的隐藏名称(.nfsXXXXX)而不是在链接计数减少时删除它们来完成的到零,而仍然有对它们的公开引用。无论如何,无论实现使用什么技巧,您作为文件系统的用户都不应该担心它。

【讨论】:

以上是关于mmap local v/s nfs file:当底层文件在磁盘上被替换时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

将字符串存储在 mmap 共享数组中? (C)

JDK核心JAVA源码解析 - JAVA File MMAP原理解析

NFS

nfs 共享存储

当用户单击 mMap.setOnMarkerClickListener 时如何发送值?

当整个文件太大时如何在python中使用mmap