POSIX 共享内存对象有哪些一致性保证?

POSIX 共享内存对象有哪些一致性保证?

在 Linux 上,POSIX 共享内存对象 [1] 使用tmpfsvia /dev/shm。反过来, Atmpfs被称为“完全存在于页面缓存中”[2](我假设交换尚未启用)。我想知道使用 POSIX SHM 对象mmap(编入程序地址空间)时的一致性/不撕裂保证是什么。

示例:假设两个进程 A 和 B 共享一个 POSIX SHM 对象,这两个进程都mmap被写入各自的地址空间。该对象的大小为 8kB 或两个页面,假设页面为 4kB 并且对象是页面对齐的。

  1. A 发出两次连续的 [3] 写入,第一次写入第一页(第一个 4k 块),第二次写入第二页。
  2. B 轮询共享对象/两个页面。

B 的读取是否有可能被撕裂,这意味着 B 读取的是新鲜且更新的第二页,但第一页是陈旧的?


[1]https://www.man7.org/linux/man-pages/man7/shm_overview.7.html
[2]https://www.kernel.org/doc/html/latest/filesystems/tmpfs.html
[3] 这将是相关的 C 伪代码:

int fd = shm_open(...);
void *share = mmap(0, 8192, $flags, fd, 0);
memcpy(share       , data1, 4096);
memcpy(share + 4096, data2, 4096);

相关内容