在 Linux 上,POSIX 共享内存对象 [1] 使用tmpfs
via /dev/shm
。反过来, Atmpfs
被称为“完全存在于页面缓存中”[2](我假设交换尚未启用)。我想知道使用 POSIX SHM 对象mmap
(编入程序地址空间)时的一致性/不撕裂保证是什么。
示例:假设两个进程 A 和 B 共享一个 POSIX SHM 对象,这两个进程都mmap
被写入各自的地址空间。该对象的大小为 8kB 或两个页面,假设页面为 4kB 并且对象是页面对齐的。
- A 发出两次连续的 [3] 写入,第一次写入第一页(第一个 4k 块),第二次写入第二页。
- 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);