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