web-dev-qa-db-ja.com

メモリマップファイルの共有とメモリ領域の共有は、互いに基づいて実装されていますか?

メモリマップファイルの共有とメモリ領域の共有は、互いに基づいて実装されていますか?次の2つの引用はそう言っているようで、鶏卵の問題のようです。

オペレーティングシステムの概念では、メモリマップトファイルの共有を以下で紹介しています。ファイルのコンテンツを保持する同じ物理メモリ領域を共有することにより、複数のプロセスが同じファイルを共有しますか?

複数のプロセスで同じファイルを同時にマップして、データの共有を許可できます。プロセスのいずれかによる書き込みは、仮想メモリ内のデータを変更し、ファイルの同じセクションをマップする他のすべてのユーザーが見ることができます。仮想メモリの前述の説明を踏まえると、メモリのメモリマップセクションの共有がどのように実装されているかが明確である必要があります。各共有プロセスの仮想メモリマップは、物理メモリの同じページを指します。 —ディスクブロックのコピーを保持するページ。このメモリ共有を図9.22に示します。

enter image description here

また、以下では共有メモリについても説明します。

  • 複数のプロセスがメモリマップトファイルを共有することでメモリ領域を共有しますか?

  • 「メモリマップファイル」はディスクまたはメインメモリにありますか?ディスク上にあると思いますが、「メモリマップドファイルは、通信中のプロセス間で共有メモリの領域として機能する」という意味で、メインメモリに常駐しているようです。

共有メモリは、実際にはメモリマッピングファイルによって実装されることがよくあります。このシナリオでは、通信しているプロセスに同じファイルを仮想アドレス空間にメモリマップさせることで、プロセスは共有メモリを使用して通信できます。メモリマップファイルは、通信プロセス間の共有メモリの領域として機能します(図9.23)。

enter image description here

ありがとう。

2
Tim

共有メモリは、通常のファイル、ブロックデバイス、またはスワップによってサポートされます。メモリ領域がどのように作成されたかによって異なります。

複数のプロセスが同じ共有メモリ領域を使用している場合、それらの個々の仮想アドレスは同じ物理アドレスを指します。 1つのプロセスによる書き込みは、メモリが接続されているディスクファイル(存在する場合)を通過する必要なく、他のプロセスから直接見えるようになります。

共有メモリの背後にファイルがある場合、カーネルは変更されたページをRAMからファイルに同期することがあります。通常、メモリを使用するプロセスは、いつこれが発生したかを知る必要はありませんが、必要に応じて、彼らはmsyncを呼び出してより早くそれを実現することができます。

共有メモリの背後にファイルがない場合、カーネルは、非共有プロセスメモリの場合と同様に、RAMを解放する必要があるときにページをスワップに移動することがあります。それらがスワップインされると、共有メモリをマップしたすべてのプロセスですぐに使用できる新しい物理アドレスを取得します。

初めて見たときに混乱したことがもう1つあります。mmapでファイルをマップする場合、変更を加えてそれらをに保存するには、MAP_SHAREDを使用する必要があります。関係するプロセスが1つしかない場合でも、ファイル。最初はMAP_SHAREDはこの機能の間違った名前だと思っていましたが、さらに振り返ると、readでファイルにアクセスする他のプロセス、またはこれから来るプロセスと変更を「共有」しています後で、それをmmapします。つまり、それは理にかなっています。

1
user41515

メモリマップファイルの共有とメモリ領域の共有は、互いに基づいて実装されていますか?

結局のところ、一日の終わりには/dev/shmは単なるramdiskです。

「メモリマップファイル」はディスクまたはメインメモリにありますか?

はい!

アクセスされるファイルの部分は、(スワッパーによって)バッファー(RAM)にコピーされます。

そのメモリへの書き込みはすぐにファイルに表示されますが、バッファが同期またはフラッシュされるまで物理ディスクに書き込まれません。

2
Jasen