あなたは、メモリマッピングがメモリ常駐ファイルシステム内のファイルと混同されているように見え、プロセスがファイルが移動されてもファイルへのアクセスを維持する方法のような他の概念と一緒です。
質問を1つずつ行って、問題を解決できるかどうか確認します。
- ファイルシステムのディレクトリを参照し、このディレクトリにファイルがあるとします。このファイルがディスクの領域を指すのではなく、メインメモリの領域を指すことは可能ですか?
通常、/ procにマウントされているprocfs、/ sysにあるsysfs、または/ tmpにあるtmpfsなどのメモリ常駐ファイルシステムにある場合、メインメモリを指します。
- これが可能であれば、これを「メモリマップファイル」と呼びますか?
いいえ。スティーブンキットが言ったように、「メモリマッピング」とは、read()や書く()。
- このようなファイルをファイルシステム内で移動する(つまり、そのようなファイルをディレクトリから別のディレクトリに移動する)とはどういう意味ですか?私が理解しているのは、ファイルがメモリマップされているため、ファイルと対話するプロセスは常にメインメモリの事前定義された領域に書き込み、そのファイルを開くと(たとえばvimを使用して)、その領域を読み取ります。メインメモリ(したがって、ディスクは含まれません)。したがって、ファイルをどこに移動しても、常に正しく機能しますか?はいの場合、ファイルシステム内でファイルを移動することには意味がありますか?
同じファイルシステム内で移動する場合、実際には参照、つまりiノードを1つのディレクトリから別のディレクトリに移動するだけです。このファイルが既に開かれているプログラムがある場合、ファイル記述子を介してすでにiノードが手元にあるため、同じファイルにアクセスします。これは、コメントで言及したtable_name.idbファイルで起こったことです。
- ファイルがメモリマップされているかどうかを確認するコマンドはありますか?
Wossnameは、メモリマップファイルに対して既にこれに回答しています。lsof
どのプロセスにファイルがメモリマップされているかがわかります。
ファイルがメモリ常駐ファイルシステムにあるかどうかを知るには、df
または
mount
を使用して、ファイルシステムとそのマウントポイントを一覧表示できます。(Wikipediaなどで)ファイルシステムを検索して、メモリにどのタイプのファイルシステムが存在するかを知る必要があるだけです。
- 最後に、メモリマップされたファイルをvimで開いて変更を加え、vimを保存して閉じた場合、どうなりますか?変更は単にメインメモリに書き込まれますか?その場合、このファイルを使用する他のプロセスは、今行った変更を確認できますか?私の経験では、vimを使用してファイルに変更を加えたときに、他のプロセスはファイルに加えた変更を認識しませんでした。これの理由は何ですか?
個人的に、私はmmap
Cプログラムで関数を使用していませんが、スキミングman mmap
とから理解できるように、info mmap
メモリ内の表現を同期して維持することに関与する魔法はありません。基本的な形式では、mmapを呼び出すと、ファイルの内容がメモリにコピーmsync
され、メモリからディスクに書き戻すために使用されます。ディスク上のファイルが変更された場合、それを検出してそれをマップしたすべてのプロセスのメモリ内の表現を自動的に変更する場所はありません。
編集:mmap()は実際には、特定の条件下でメモリ内の表現を同期させようとすることがわかりました。マップが読み取られるだけの場合、他のプロセスがファイルに書き込んでも、同期が維持されます。(メモリ領域に割り当てることによって)書き込まれた場合、何が起こるかは、mmap()に提供されている必須のMAP_SHAREDフラグまたはMAP_PRIVATEフラグのいずれかに依存します。MAP_PRIVATEが指定されている場合、マップはディスク上の表現から分岐し、msync()を使用するまで同期を停止します。MAP_SHAREDが提供されている場合、更新は、ファイルがマップされている他のプロセス、および(これは必ずしも即時ではありませんが)ディスク上の表現に表示されます。
既存のファイルe
でvimを開き、別の端末で実行し:w
てinotifywait -m .
いるときにコマンドを実行しました。いくつかの奇妙なビットの中で、これは私が得た重要な部分inotifywait
です。
./ MOVED_FROM e
./ MOVED_TO e~
./ CREATE e
./ OPEN e
./ MODIFY e
./ CLOSE_WRITE,CLOSE e
./ ATTRIB e
./ ATTRIB e
./ DELETE e~
Vimは新しいファイルを作成し、古いファイルを削除します。ファイルを変更する代わりにこれを行う理由はこの質問の範囲を超えていますが、要点はこれが新しいファイルであり、したがって新しいiノードを持つことです。
さて、このファイルを使用する他のプロセスとはどういう意味ですか?これを行っている間にファイルを開いていたプロセスを意味する場合、変更は表示されません。これは、同じパスでファイルを開いたにもかかわらず、同じファイルではないためです。これを行った後にファイルを開く可能性のあるプロセスを意味する場合、はい、変更が表示されます。彼らはあなたが作成した新しいファイルを開くでしょう。
プログラムがユーザーインターフェイス上でファイルを開いているように見える場合がありますが、必ずしもプロセスでファイルを開いたままにすることを意味するわけではないことに注意することが重要です。上記のように、Vimはこの例です。