咨询 MAP_PRIVATE 模式下,非匿名 mmap(2) 的行为

2023-11-08 14:53:18 +08:00
 dacapoday

前提:不考虑多进程,仅关心单进程内的 多线程 与 flag 设为MAP_PRIVATE,权限设为PROT_READPROT_WRITE 的 映射到磁盘上具体文件 的 mmap 区域进行交互。

  1. 任意线程修改映射区数据后,其他线程能立刻看到修改的结果吗?

  2. 相比于 “在堆上分配的内存中 存储新值,并利用 fwrite 写入磁盘,再用 设为 MAP_SHARED 的 mmap 查看修改结果的方式。”, 在设为 MAP_PRIVATE 的 mmap 区域上修改内容,再利用 fwrite 写入磁盘的方式 会否更有效率,或更差?

  3. 虽然 man 文档中,对于 MAP_PRIVATE 有如下描述 “It is unspecified whether changes made to the file after the mmap() call are visible in the mapped region.”, 但如果采用 问题 2 的方式修改磁盘文件,即使对被修改的区域调用 madvise(MADV_DONTNEED),是否也能保证访问到的是修改后的内容?

615 次点击
所在节点    Linux
3 条回复
ty359
2023-11-08 15:57:50 +08:00
能说下你这是在什么场景下要这么使用么?完全没 get 到你想做啥,同一进程为啥要用 mmap 和磁盘文件传递数据。
dacapoday
2023-11-08 16:09:31 +08:00
@ty359 面向数据库的场景,类似 LMDB 所适用的场景。
dacapoday
2023-11-08 16:19:11 +08:00
@ty359 有一个不成熟的想法,内存上的 private 区域以大页的形式映射,但落盘时,仍使用常规系统页面。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/989877

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX