【问题标题】:How does the kernel handle concurrent access to shared mappings?内核如何处理对共享映射的并发访问?
【发布时间】:2019-12-22 11:11:12
【问题描述】:

我很想知道内核如何处理并发写入/访问通过mmap 创建的共享映射的详细信息。查看man pages,我看到的MAP_SHARED 如下:

分享此映射。对映射的更新可见 映射同一区域的其他进程,并且(在 文件支持的映射)被传递到底层 文件。 (精确控制何时进行更新 到底层文件需要使用msync(2)。)

但是,据我了解,msync 正在处理从页面缓存到底层存储设备的同步。但是,它似乎没有处理两个进程有mmaped 文件的情况。当两个进程同时写入映射区域时会发生什么?如果我创建了一个共享映射,我如何确定恰好映射同一个文件的不相关进程没有进行并发写入?

【问题讨论】:

    标签: c posix mmap


    【解决方案1】:

    内核本身不会做任何事情来防止多个进程(甚至单个进程中的线程)破坏共享内存内容。您必须使用同步构造(例如互斥锁)并确保访问共享内存的所有代码都同意如何进行。

    防止另一个进程简单地写入文件的方法是在映射区域之前使用flock。然后,您需要某种方式让执行映射的进程将文件描述符传递给第二个进程。

    this question 的答案建议为此目的使用 unix 文件套接字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 2023-04-06
      • 1970-01-01
      • 2011-11-21
      相关资源
      最近更新 更多