POSIX 共有メモリオブジェクトにはどのような一貫性が保証されていますか?

POSIX 共有メモリオブジェクトにはどのような一貫性が保証されていますか?

Linuxでは、POSIX共有メモリオブジェクト[1]はtmpfsviaを使用します/dev/shm。その結果、Aはtmpfs「ページキャッシュに完全に存在する」とします[2](スワップがまだアクティブになっていないと仮定します)。mmapPOSIX SHMオブジェクト(アドレス空間にプログラムされている)を使用するときに一貫性/引き裂き防止の保証が何であるか疑問に思います。

例:両方のプロセスAとBがPOSIX SHMオブジェクトを共有し、両方のプロセスがmmap自分のアドレス空間に書き込むとします。ページが4kBで、オブジェクトがページ整列されていると仮定すると、オブジェクトのサイズは8kBまたは2ページです。

  1. A は 2 回の連続 [3] 書き込みを実行します。最初の書き込みは最初のページ(最初の4kブロック)に、2番目の書き込みは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);

ベストアンサー1

おすすめ記事