情景A :
要在同一主机上运行的两个进程之间共享一个读/写内存块,Joe会从两个进程中映射相同的本地文件。
情景B :
要在两个不同主机上运行的两个进程之间共享一个读/写内存块,Joe在主机之间通过nfs共享一个文件,然后从两个进程中共享mmaps共享文件。
有没有人尝过场景B?场景B中出现的哪些额外问题不适用于场景A?
答案 0 :(得分:5)
如果没有其他一些操作,Mmap将不会共享数据。
如果更改文件的mmaped部分中的数据,则更改将仅存储在内存中。它们不会被刷新到文件系统(本地或远程),直到msync
或munmap或关闭甚至决定OS内核及其FS。
使用NFS时,锁定和存储数据的速度比使用本地FS要慢。刷新超时和文件操作时间也会有所不同。
On the sister site人们说NFS可能具有较差的缓存策略,因此会有更多的I / O请求到NFS服务器,将I / O请求数与本地FS进行比较。
答案 1 :(得分:3)
您需要使用字节范围锁定才能获得正确的行为。它们在NFS> = v4.0中可用。
答案 2 :(得分:0)
我认为方案B存在各种问题(假设它按照评论中的建议运行)。最明显的是标准并发问题 - 2个进程共享1个资源而没有任何形式的锁定等。这可能会导致问题......不确定NFS在这方面是否有其特有的怪癖。
假设您可以以某种方式解决并发问题,那么您现在依赖于维护稳定(且快速)的网络连接。显然,如果网络退出,您可能会错过一些更改。这是否重要取决于您的架构。
我的想法是,这听起来像是在不同的机器上共享一块内存的简单方法,但我不能说我听说它已经完成,这让我觉得它不太好。当我认为在procs之间共享数据时,我认为数据库,消息传递或专用服务器。在这种情况下,如果你使一个proc成为master(处理并发并拥有概念-e.e.无论这个人说的是数据的最佳副本)它可能有用......