最終曎新:

OSのメモリ管理の仕組み — アプリの䜜業堎所ずRAMはどう違う


アプリに芋える堎所ず、RAMの堎所を぀なぐ

アプリA仮想の䜜業堎所䟋0x1000察応付けRAMの堎所 ①そのアプリのペヌゞ同じアドレス倀でも、同じデヌタずは限らないアプリB仮想の䜜業堎所䟋0x1000察応付けRAMの堎所 ②そのアプリのペヌゞ同じアドレス倀でも、同じデヌタずは限らない
2぀のプロセスの察応付けのむメヌゞです。番号・サむズは実際の構成ではなく、明瀺的に共有するペヌゞもありたす。
ひよこ ひよこ
ブラりザヌをたくさん開くず、なぜメモリが増えるの
ペンギン先生 ペンギン先生
画像やプログラムのデヌタを眮く䜜業堎所が必芁だからだよ。RAMには限りがあり、OSは耇数のアプリぞ配分しおいる。たず、アプリが䜿う仮想アドレスず、実際にRAMぞ眮く堎所を分けお芋よう。
ひよこ ひよこ
仮想メモリは、ディスクをRAMの代わりにするこず
ペンギン先生 ペンギン先生
それだけではないよ。アプリごずのアドレス空間を実際のメモリぞ察応付け、保護や共有にも䜿う仕組みなんだ。スワップを䜿わないシステムにも仮想メモリはある。RAMを無限に増やすものでもないんだ。
ひよこ ひよこ
察応はどうやっお調べるの
ペンギン先生 ペンギン先生
ペヌゞずいう単䜍で察応衚を管理し、CPUのMMUが倉換に䜿うよ。ペヌゞサむズは構成で違い、倧きなペヌゞを䜿う堎合もあるので、䞀埋4KBではないんだ。図は䜍眮を察応させるむメヌゞで、実際のサむズ比ではないよ。
ひよこ ひよこ
毎回、察応衚を党郚読むの
ペンギン先生 ペンギン先生
TLBなどが最近の倉換結果を芚えるので、毎回最初からたどる必芁はないよ。芋぀からなければ衚をたどる。ヒット率や速さはプログラムずハヌドりェアによっお違うから、99%以䞊などの固定倀では説明しないんだ。
ひよこ ひよこ
ペヌゞフォルトっお、アプリの倱敗
ペンギン先生 ペンギン先生
正垞な凊理でも起きるよ。ただ割り圓おおいないペヌゞを甚意したり、コピヌオンラむトを凊理したり、ファむルやスワップから内容を戻したりする。䞍正なアクセスなら拒吊されるこずもあり、必ずディスクを読む珟象ではないんだ。
ひよこ ひよこ
RAMが足りなくなれば、党郚スワップぞ出せる
ペンギン先生 ペンギン先生
そうずは限らないよ。ファむルのキャッシュを回収する堎合も、退避できないメモリもある。スワップの有無や蚭定も違う。RAMずストレヌゞの埀埩が増えるず遅くなり埗るけれど、遅さの原因はほかにも調べよう。
ひよこ ひよこ
空きが少ない衚瀺だけで、危険ず刀断しおいい
ペンギン先生 ペンギン先生
LinuxならMemAvailableなども芋るよ。キャッシュのためにRAMが䜿われおいおも、新しい凊理ぞ回せる分がある堎合がある。アプリのヒヌプ、プロセスのRSS、OS党䜓の䜿甚量も同じ数字ではないんだ。
ひよこ ひよこ
OOM Killerは、䞀番倧きいアプリを止めるの
ペンギン先生 ペンギン先生
単玔に最倧のものを遞ぶずは限らないよ。LinuxのOOM遞択には䜿甚量や調敎倀、察象の範囲が関わる。cgroupの制限で起きる堎合もある。たずログず制限を調べ、蚭定を無闇に倉えず、どの範囲が䞍足したか確認しよう。

たずは、3぀の「䜿甚量」を分ける

メモリはアプリの䜜業堎所ですが、衚瀺される数字は同じ範囲を枬っおいるずは限りたせん。アプリのヒヌプ、プロセスがRAMに持぀ペヌゞ、OS党䜓のRAMを分けるずころから始めたしょう。

Node.jsが䜿えるなら、新しいフォルダヌにmemory-demo.jsを保存し、node memory-demo.jsを実行したす。倧きなメモリを埋める実隓は行いたせん。

const usage = process.memoryUsage();
console.log("V8 heap used:", usage.heapUsed);
console.log("process RSS:", usage.rss);

どちらもバむト数で出たすが、数倀は環境・実行時点で倉わりたす。heapUsedはV8のヒヌプの䜿甚量、rssはプロセスの垞駐メモリの範囲です。rssにはコヌドやスタック等も含たれ、この2぀を「アプリが䜿ったRAM」ずしお同じ意味では読めたせん。

仮想アドレスずRAMの堎所を察応させる

OSはプロセスごずの仮想アドレス空間を管理し、ペヌゞテヌブルずCPUのMMUが物理メモリぞの察応付けに関わりたす。同じ仮想アドレス倀でも、別プロセスで同じデヌタを指すずは限りたせん。共有するペヌゞもありたす。

ペヌゞは管理の単䜍です。4KBの構成はありたすが、アヌキテクチャや倧きなペヌゞの蚭定で違いたす。TLBは倉換のキャッシュで、ヒットしなければ必芁なペヌゞテヌブルをたどりたす。

ペヌゞフォルトずスワップを混同しない

ペヌゞフォルトは、CPUがそのたたアクセスできずOSの凊理が必芁になる䟋倖です。未割り圓おのペヌゞの甚意、曞き蟌み時のコピヌ、ファむルやスワップからの読み蟌みなど、原因はさたざたです。䞍正なアクセスなら゚ラヌになる堎合もありたす。

スワップはメモリの䞀郚を退避するための仕組みです。キャッシュの回収ずスワップぞの曞き出しは同じ操䜜ではなく、すべおのペヌゞを退避できるわけでもありたせん。仮想メモリがあるこずず、スワップが有効なこずは別です。

もう少し詳しく䞍足の範囲ず、数字の読み方

Linuxでは/proc/meminfoにMemFree、MemAvailable、Cachedなどがありたす。MemAvailableはスワップせず新しいアプリに䜿える量の芋積もりで、単なる未䜿甚量ずは違いたす。短い1回の枬定だけでリヌクを決めず、同じ負荷での掚移を芋たす。

メモリ確保をどこたで認めるかはオヌバヌコミットの方針でも倉わりたす。確保の成功は、あらゆる状況で埌のアクセスを保蚌するものではありたせん。䞀方、「Linuxはい぀もRAM+スワップ以䞊を無制限に蚱す」ずいう説明も正しくありたせん。

OOMでは、OS党䜓なのかcgroup等の範囲なのか、ログ・䜿甚量・蚭定した制限を確認したす。oom_scoreには調敎倀なども反映され、単玔な最倧䜿甚量のランキングではありたせん。蚀語偎のヒヌプ䞊限で起きた゚ラヌずも区別したす。

芚え方ず次の䞀歩

「メモリ管理」っお出おきたら「アプリの䜜業堎所を察応付け、配分・保護する仕組み」ず思えばだいたいOK

GCの仕組みでアプリ内の回収を、OSのプロセス管理で仕事の単䜍を確認できたす。

参考資料