【问题标题】:mmap() and munmap()mmap() 和 munmap()
【发布时间】:2017-10-11 18:09:53
【问题描述】:

mmap() 在调用进程的虚拟地址空间中创建一个新映射,从addrlen 字节开始,munmap() 删除包含进程地址空间任何部分的整个页面的任何映射从addr 开始并继续len 字节。

我想问一下修改过的mmap文件是在释放内存之前被munmap写入磁盘还是我们必须调用不同的函数来同步修改。

【问题讨论】:

  • 在什么操作系统上?你将什么标志传递给mmap? “mmap 文件”和“munmap 文件”是什么意思?
  • Unix 操作系统。 mmap 文件是指写入映射内存的数据。如果数据被加载到内存映射中,然后对其进行一些修改。提供的参数是 mmap(NULL, size, readOnly ? PROT_READ : PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)。
  • 你的问题的问题是 mmap 是一个万能的功能。行为取决于你实际上是如何做到的。您应该更具体地说明您在通话中使用的设置。

标签: unix memory-management shared-memory virtual-memory


【解决方案1】:

如果您调用带有MAP_PRIVATE 标志的mmap(),您的更改将永远不会被保存。如果您使用MAP_SHARED 标志,您的更改将在某个不确定的时间但在munmap() 返回之前保存而无需额外调用。您可以使用msync() 调用强制将更改写入文件。

the POSIX standard for mmap():

描述

...

MAP_SHARED 和 MAP_PRIVATE 描述 write 的配置 对内存对象的引用。如果指定了 MAP_SHARED,则写入 引用应更改基础对象。如果 MAP_PRIVATE 是 指定,调用进程对映射数据的修改 应仅对调用进程可见,并且不应更改 底层对象。 ...

...

映射文件的最后一次数据访问时间戳可能被标记为 在mmap() 调用和相应的调用之间随时更新 munmap() 打电话。对映射区域的初始读取或写入引用 将导致文件的最后数据访问时间戳被标记为 如果尚未标记为更新,则更新。

a 的最后一次数据修改和最后一次文件状态更改时间戳 使用 MAP_SHARED 和 PROT_WRITE 映射的文件应标记为 在写引用到 映射区域和下一次使用 MS_ASYNC 或 MS_SYNC 调用 msync() 对于任何进程的文件的该部分。如果没有这样的电话 并且如果底层文件由于写入而被修改 参考,那么这些时间戳应标记为在某些更新 写参考之后的时间。

根据the munmap() documentation

描述

...

如果要删除的映射是私有的,则在此进行的任何修改 地址范围应被丢弃。

【讨论】:

  • 对不起 Andrew,但我在这里没有看到任何短语可以证实您的声明“您的更改将在某个不确定的时间但在 munmap() 返回之前保存而无需额外调用”。请您指点一下好吗?
猜你喜欢
  • 2014-11-23
  • 2017-05-19
  • 2012-01-18
  • 2011-03-02
  • 2018-07-11
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
相关资源
最近更新 更多