それで、これはどのように行われるのでしょうか?

それで、これはどのように行われるのでしょうか?

lsofRHEL7 の出力には、ファイル記述子を持つ 1 つのファイルmemが 40 のプロセスで使用されていることが示されています。これは、このファイルがメモリに 40 回マップされていることを意味しますか? メモリ マップ ファイルの意味を説明していただけますか? メモリに 40 回マップされていることを意味しますか?

# lsof /usr/lib/locale/locale-archive
コマンド PID ユーザー FD タイプ デバイス サイズ/オフ ノード名
vmtoolsd 605 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
agetty 656 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
調整済み 963 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
iostat 1199 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
chkMtaMem 1205 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
snmpd 4704 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
スリープ 5461 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
cmsubagt 6487 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
スリープ 6649 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc1 6803 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc2 6835 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc3 6836 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc4 6856 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc5 6884 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc6 6889 usr メモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc7 6893 usr1 メモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
cmfpagt 7704 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc8 7943 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
crond 8001 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
sh 8005 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
iostat 8014 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
crond 20427 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc9 20648 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc10 20649 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc10 20760 usr2 メモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc9 20777 usr2 メモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc11 21353 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc12 21354 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc13 21355 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc14 21356 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc15 21357 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc16 21358 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc17 21554 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc18 21569 usr2 メモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc19 21590 usr2 メモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc20 21647 usr2 メモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc21 22016 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc22 22017 ルートメモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc23 22104 usr2 メモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc24 22122 usr2 メモリ REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive

答え1

仮想メモリと物理メモリの違いを見てみましょう。

多数のプロセスが同じ物理メモリをマップできます。10 個のプロセスが同じファイルをマップする場合、最大で 1 つのコピーが RAM にキャッシュされます。

メモリが共有されていない場合、1 つのプロセスがメモリを変更すると、書き込みをコミットする前に、この 1 つのページ (変更を含む) が複製されます。 (したがって、メモリのすべてがコピーされるわけではありません。これは、コピー オン ライト (COW) と呼ばれます)。

メモリ マップ ファイルとは、OS にファイルをメモリにマップするように依頼することです。読み取り/書き込みを開始するまでファイルはロードされず、必要なものだけがロードされます。メモリ マッピングは、読み取り/書き込み/シークなどに対する別のインターフェイスにすぎません。読み取り/書き込み/シークを通じてメモリにアクセスすることもできます。

それで、これはどのように行われるのでしょうか?

これは、いくつかのものが同じであることを認識することで行われます。つまり、スワップとファイルは同じであり、RAM とファイル キャッシュは同じです。したがって、ファイルを開くと、スワップとしてマップされます (他のものをスワップアウトするために使用されることはありませんので、心配しないでください)。読み取りを開始すると、セグメント エラーが生成され、OS がファイルからスワップします (例外 (セグメント エラー) は OS によって処理されるため、プロセスには渡されません) (実際には、セグメンテーション エラーではなく、ページ エラーです)。メモリまたはファイルのどちらのインターフェイスを使用するかは問題ではありません。これらは、同じ機能に対するインターフェイスにすぎません。

答え2

はい、次のマニュアルに従ってくださいlsof:

   FD         is the File Descriptor number of the file or:

                   cwd  current working directory;
                   Lnn  library references (AIX);
                   err  FD information error (see NAME column);
                   jld  jail directory (FreeBSD);
                   ltx  shared library text (code and data);
                   Mxx  hex memory-mapped type number xx.
                   m86  DOS Merge mapped file;
                   mem  memory-mapped file;
                   mmap memory-mapped device;
                   pd   parent directory;
                   rtd  root directory;
                   tr   kernel trace file (OpenBSD);
                   txt  program text (code and data);
                   v86  VP/ix mapped file;

これは、非共有モードでマップされ、任意のプロセスが仮想メモリに書き込む場合にのみ、物理メモリ内にファイルの複数のコピーが必要になります。それ以外の場合、書き込みが行われない場合 (おそらく行われません)、プロセスがメモリを読み取る前に、データが物理メモリを占有する必要さえありません。

関連情報