1

例如,我使用 mmap 以只读共享模式将文件映射到内存中。我根据它们在内存中的地址读取了文件上的一些数据。如果在那之后我调用 write 和 fsync 来更新或更改底层文件怎么办?内存中的数据也会改变吗?或者我需要调用其他一些系统调用来同步映射内存?我在阅读 BoltDB 的源代码时发现了这个问题。

4

1 回答 1

0

当我在阅读boltdb的源代码时,同样的问题困扰着我。我在 Google 上搜索/查看了很多文章,但仍然没有得到答案。

我知道 linux 有一个dnotify/ inodtify系统来监视文件更改,因此可以确定内核知道对文件所做的更改。

mmap的手册页没有描述这里提到的饱腹感,但是 MAP_SHARED 的描述确实提到了

映射的更新对于映射同一区域的其他进程是可见的,并且(在文件支持的映射的情况下)被传递到底层文件。

我认为 MAP_SHARED 保证对底层文件所做的更改对所有映射的内存区域都可见是一个合理的猜测。希望有一天Linux内核专家可以提供一些细节。

于 2020-04-08T10:07:37.060 回答