Linuxでは、POSIX共有メモリオブジェクト[1]はtmpfs
viaを使用します/dev/shm
。その結果、Aはtmpfs
「ページキャッシュに完全に存在する」とします[2](スワップがまだアクティブになっていないと仮定します)。mmap
POSIX SHMオブジェクト(アドレス空間にプログラムされている)を使用するときに一貫性/引き裂き防止の保証が何であるか疑問に思います。
例:両方のプロセスAとBがPOSIX SHMオブジェクトを共有し、両方のプロセスがmmap
自分のアドレス空間に書き込むとします。ページが4kBで、オブジェクトがページ整列されていると仮定すると、オブジェクトのサイズは8kBまたは2ページです。
- A は 2 回の連続 [3] 書き込みを実行します。最初の書き込みは最初のページ(最初の4kブロック)に、2番目の書き込みは2番目のページで実行されます。
- Bは共有オブジェクト/両方のページをポーリングします。
Bが読んだ内容が破れた可能性はありますか?つまり、Bは新鮮で更新された2番目のページを読みましたが、最初のページは古いです。
[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);