共有メモリの鍵はファイル名なのかiノードなのか疑問に思っています。
.lastという名前のファイルがあります。これは、YYYYMMDDHHMMSSという名前のファイルへのハードリンクです。
ディレクトリは次のようになります。
20110101143000
.last
.lastは、20110101143000へのハードリンクです。
しばらくして、新しいファイルが作成されます
20110101143000
20110622083000
.last
次に、.lastを削除し、新しいファイルを参照するように再作成します。
これらの更新中に継続的に実行されている当社のソフトウェアは、MAP_SHAREDを使用して.lastファイルをmmapします。ファイルの処理が完了すると、ソフトウェアはファイルのマップを解除するのではなく、数分間キャッシュする場合があります。物理サーバーでは、ソフトウェアのインスタンスが12〜24個同時に実行されています。多くの場合、異なるインスタンスがほぼ同時に同じファイルをmmapします。私の質問は:
Linuxはファイル名を使用して共有メモリにキー入力しますか、それともiノードを使用しますか?
このシナリオを考えると:
- proc A mmaps .lastであり、マップを解除しません
- 新しいファイルが書き込まれ、.lastが削除され、新しい.lastが作成されて新しいファイルがリンクされます
- proc Bは新しい.lastをmmapし、マップを解除しません
Linuxがiノードを使用した場合、proc AとBは、異なるファイルにマップされた異なるメモリブロックを認識します。これは私たちが望んでいることです。Linuxがファイル名を使用する場合、AとBの両方が新しいファイルにマップされた同じメモリブロックを参照します。Bは問題ありませんが、シャードブロックのメモリが変更されるとAがクラッシュします。
誰もがそれが実際にどのように機能するか知っていますか?私はテストするつもりですが、それが名前ベースであることが判明した場合、誰かがトリックを知らない限り、私は失敗します。
ありがとう!