V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
dacapoday
V2EX  ›  Linux

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

  •  
  •   dacapoday ·
    dacapoday · 2023-11-08 14:53:18 +08:00 · 611 次点击
    这是一个创建于 381 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前提:不考虑多进程,仅关心单进程内的 多线程 与 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),是否也能保证访问到的是修改后的内容?

    3 条回复    2023-11-08 16:19:11 +08:00
    ty359
        1
    ty359  
       2023-11-08 15:57:50 +08:00
    能说下你这是在什么场景下要这么使用么?完全没 get 到你想做啥,同一进程为啥要用 mmap 和磁盘文件传递数据。
    dacapoday
        2
    dacapoday  
    OP
       2023-11-08 16:09:31 +08:00
    @ty359 面向数据库的场景,类似 LMDB 所适用的场景。
    dacapoday
        3
    dacapoday  
    OP
       2023-11-08 16:19:11 +08:00
    @ty359 有一个不成熟的想法,内存上的 private 区域以大页的形式映射,但落盘时,仍使用常规系统页面。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2167 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:23 · PVG 09:23 · LAX 17:23 · JFK 20:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.