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:当底层文件在磁盘上被替换时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
JDK核心JAVA源码解析 - JAVA File MMAP原理解析