Slide 1

Slide 1 text

Linuxのメモリ管理入門 プロセスごとに違う世界を見せる 仮想記憶 Nov. 30th, 2023 Satoru Takeuchi twitter: satoru_takeuchi

Slide 2

Slide 2 text

Linuxカーネルはメモリをページ単位で管理する ● x86_64の場合は1ページ4KiB ○ 📝 1ページ2MiBのhuge pageというものを使うこともある。いずれ触れるかも ● メモリ32GiBのシステムだと800万個以上のページがある ● 物理的に存在するメモリのことを物理メモリと呼ぶ 物理メモリ (32GiB) ページ ページ ページ 800万個以上のページ 4KiB 0 8KiB 32GiB

Slide 3

Slide 3 text

単純化すると、こんなかんじでメモリを共有 物理メモリ カーネル プロセスA プロセスB 空き領域 4KiB 0 8KiB 12KiB 16KiB 20KiB 32KiB 24KiB 28KiB

Slide 4

Slide 4 text

直接アクセスすると考えると… 物理メモリ カーネル プロセスA プロセスB 空き領域 4KiB 0 8KiB 12KiB 16KiB 20KiB 32KiB 24KiB 28KiB プロセスA プロセスB

Slide 5

Slide 5 text

直接アクセスすると考えると… 物理メモリ カーネル プロセスA プロセスB 空き領域 4KiB 0 8KiB 12KiB 16KiB 20KiB 32KiB 24KiB 28KiB プロセスA プロセスB 懸念点 ● 他のプロセスとアドレスが重なるので扱うのが面倒では? ● というか盗み見たり破壊したりできるのでは? ● なんならカーネルもぶち壊せるのでは?

Slide 6

Slide 6 text

実はプロセスごとに違う世界が見えている ● これが仮想記憶 ○ の、ページング方式 物理メモリ カーネル プロセスA プロセスB 空き領域 4KiB 0 8KiB 12KiB 16KiB 20KiB 32KiB 24KiB 28KiB プロセスA プロセスB 4KiB 0 8KiB 4KiB 0 8KiB

Slide 7

Slide 7 text

ここで難しい用語がたくさん出てくる 物理メモリ カーネル プロセスA プロセスB 空き領域 4KiB 0 8KiB 12KiB 16KiB 20KiB 32KiB 24KiB 28KiB プロセスA プロセスB 4KiB 0 8KiB 4KiB 0 8KiB プロセスAの 仮想アドレス空間 プロセスBの 仮想アドレス空間 物理アドレス空間(*1) *1) 本当はここももうちょっと複雑

Slide 8

Slide 8 text

自分用以外のメモリにアクセスできない(させない) 物理メモリ カーネル プロセスA プロセスB 空き領域 4KiB 0 8KiB 12KiB 16KiB 20KiB 32KiB 24KiB 28KiB プロセスA 4KiB 0 8KiB プロセスAの 仮想アドレス空間 物理アドレス空間

Slide 9

Slide 9 text

物理アドレス空間 物理メモリ上のばらばらの領域を連続領域に見せられる 物理メモリ カーネル プロセスA プロセスB 空き領域 4KiB 0 8KiB 12KiB 16KiB 20KiB 32KiB 24KiB 28KiB プロセスA 4KiB 0 8KiB プロセスAの 仮想アドレス空間

Slide 10

Slide 10 text

まとめ ● Linuxはページ単位でメモリを管理する ● 仮想記憶という仕組みによってプロセスごとに別のメモリ空間を見せている ● 仮想記憶によって以下のようなメリットがある ○ プロセスが自分に与えられたもの以外のメモリに読み書きできなくなる ○ 物理メモリが断片化してもプロセスには連続領域として見せられる