メモリメモ

コピーオンライトがあるのでスレッドよりもプロセスが重いなんてことはない。昔の話。

# cat /proc/meminfo 
MemTotal:        1020096 kB
MemFree:           71060 kB
Buffers:           45848 kB
Cached:           762244 kB
SwapCached:         5980 kB
Active:           183652 kB
Inactive:         668244 kB
Active(anon):      13576 kB
Inactive(anon):    30580 kB
Active(file):     170076 kB
Inactive(file):   637664 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       5079036 kB
SwapFree:        5054380 kB
Dirty:               248 kB
Writeback:             0 kB
AnonPages:         38924 kB
Mapped:            12704 kB
Shmem:               308 kB
Slab:              76584 kB
SReclaimable:      22564 kB
SUnreclaim:        54020 kB
KernelStack:        1600 kB
PageTables:         2288 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     5589084 kB
Committed_AS:     157228 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        8340 kB
VmallocChunk:   34359717896 kB
HardwareCorrupted:     0 kB
AnonHugePages:      2048 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        8180 kB
DirectMap2M:     1040384 kB

物理メモリの配分

64ビットではLowメモリとHighメモリの区別もなくなる 全てのメモリ領域がカーネルが利用できるLowメモリ領域として認識される ユーザーメモリとカーネルメモリ

ユーザメモリの分類

Anonymous (anon)

プログラムの実行中に動的に確保したメモリ。mallocとか。

File-backed(file)

ディスクキャッシュなど、ディスク上にもある種類ものと対応がある。

active

最近利用

inactive

長時間利用されていない

4種類のLRUリスト(Least Recently Used)

  • anon(active)
  • anon(inactive)
  • file(active)
  • file(inactive)

プラス

  • 原理的に開放できないもの Unevictableリスト

移動する

  • メモリの状況によって移動する。
  • anon(active) ←→ anon(inactive)
  • file(active) ←→ file(inactive)

カーネルメモリの分類

  • そもそも仮想空間ない。物理に直接
  • そもそもカーネルでは2つのメモリ管理
  • データの形式によって事前に2つの方式でまとめて確保している
    • Buddyシステム(Buddyアロケータ)
      • 4Kb以上
    • Slabアロケータ
      • 4KB以下
  • vmalloc()
    • カーネルの仮想領域が確保され、Buddyシステムから実ページを割り当てて、マッピングされる
    • 実メモリ上で連続していなくても良いケースで使用します。Buddyシステムを直接使用する場合と比較して、大きな領域を確保しやすいこと、最大オーダーの制約がないことが特徴です。
    • カーネル内部では予めこのような目的で使用する論理アドレスの範囲が決められていて、VmallocTotalがその範囲の容量。VmallocUsedが実際に使用されている容量。