電源管理機能を活用する - SKYSEA Client View1 電源管理機能を活用する 管理機から端末機の電源管理をします。複数の端末機の電源を一斉管理することで、管
メモリ管理(1) - 東京大学tau/lecture/...OSのメモリ管理API Unix : brk, sbrk, mmap, etc....
Transcript of メモリ管理(1) - 東京大学tau/lecture/...OSのメモリ管理API Unix : brk, sbrk, mmap, etc....
メモリ管理(1)
メモリ思い出そう
プログラムの実行のために,ありとあらゆるものがメモリに格納されなくてはならなかったことを
• グローバル変数,配列
• 局所変数・配列(スタック)
• 実行中に確保される領域(malloc, new)
• プログラムのコード
メモリの「管理」とは
「誰が」,メモリの「どの部分を」,「今」,使ってよいかを記憶しておき,
「メモリ割り当て要求」にこたえることができるようにすること
5000バイトくださいな
えっと,じゃ,12300番地から17300番地までがあいてるのでそこをどうぞ
帳簿
メモリ使用状況
あらゆるメモリ管理に共通の概念
割り当て(allocation)と解放(deallocation)
1000バイトくださいな 30000番地をどうぞ
30000番地返します オッケー
500バイトくださいな また30000番地をどうぞ
割り当て
解放
割り当て
OSのメモリ管理API
Unix : brk, sbrk, mmap, etc.
Win32 : VirtualAlloc, VirtualFree,
MapViewOfFile, etc.
詳しくは後述する
普段良く使っているメモリ割り当てプリミティブ・APIの実例
C • グローバル変数, スタック, malloc/free, strdup, etc.
C++ • グローバル変数, スタック, new/delete, STLの諸操作, …
Java, C# • new, Stringの連結などの諸操作
• Garbage Collection
Python • リスト, 辞書, オブジェクト生成, 文字列連結などの諸操作
• Garbage collection
Perl, シェルスクリプト,Visual Basic, …
注: OSのAPIとプログラミング言語のAPIの関係
malloc/freeなどはOSとアプリケーションプログラムの仲介屋(問屋・小売店・客)
OS メモリ管理
ライブラリ
(malloc/freeなど)
アプリケーション
malloc/
free
OSのAPI (sbrk, brk, etc.)
そもそもメモリ管理は難しいか?
空き領域をきちんと記録しておいて,メモリ割り当て・解放要求に答えればよい?
アドレス 0 512M
(物理メモリ量)
emacs IE gcc enshu.exe enshu.exe
物理メモリ
OSがない状態での安直なメモリ管理問題点
危険な相互作用
• 他のプロセスが利用しているメモリを,他のプロセスが読み書きできてしまう
• 割り当てられていないメモリでも読み書きできてしまう
メモリ量の制限
• 合計の「割り当て中」メモリ量物理メモリ量
アドレスの被再現性
• 並行して実行しているプロセスの有無などで,割り当てられるアドレスが異なる
OSが提供すべき「強い」メモリ管理
OS
プロセスAの「メモリ」
アドレス L
搭載メモリ量と無関係に定まる上限
0
プロセスBの「メモリ」
L 0
プロセスCの「メモリ」
L 0
メモリ
割り当て・解放
仮想記憶(Virtual Memory)
今時のOSが必ず提供する重要機構
• あたかも
• 「各プロセスが」
• 「他のプロセスと分離された」
• 「物理メモリ量に依存しない量の(たくさんの)」
メモリを持っているかのような錯覚を与える
仮想記憶
危険な相互作用
• 各プロセスのメモリが「分離」している
• 割り当てられていないメモリへのアクセスを防ぐ
メモリ量の制限
• 割り当て可能なメモリ量が物理メモリ量に依存しない(もちろん無制限ではない)
アドレスの被再現性
• 割り当てられるアドレスは他のプロセスの有無によらない
以降の話
以下ではこれらの機能がどのように実現されているのかを見る
• ハードウェア(CPU)とOSの組み合わせ
重要用語・概念
CPUの機能
OSの提供するメモリ管理API (次週)
仮想記憶の仕組み概要
アドレス変換
• プログラムが用いるアドレス(論理アドレス)と,メモリハードウェアが用いるアドレス(物理アドレス)は同一ではない
ページング
• すべての「割り当て済み」領域に,常に物理的なメモリ領域が割り当てられているわけではない
• いったん確保された物理メモリも他で必要になったらディスクに追い出される
重要概念
論理アドレスと物理アドレス 論理アドレス
• プログラムが理解(メモリアクセス時に指定)するアドレス
物理アドレス
• メモリハードウェアが理解するアドレス
論理アドレス
プログラムは論理アドレスを用いてメモリをアクセスする
• main() { p = 10000; printf(“%d¥n”, *p); }
複数の論理アドレス空間が存在する
• プロセス論理アドレス空間
論理アドレス10000
をアクセス
論理アドレス空間
複数の論理アドレス空間は分離している
• プロセスAの10000番地とプロセスBの10000
番地は「別の場所」
各論理アドレス空間の大きさは,物理メモリ量によらない(ポインタのbit数とOSの設計で決まる)
論理アドレス空間 A
論理アドレス空間 B
論理アドレス空間 C
0 232 – 1
物理アドレス
メモリハードウェアが理解するアドレスは物理アドレス
可能な物理アドレスは0 … 搭載メモリ量 – 1
(当然)各アドレスは計算機にひとつだけ存在する
CPU
メモリ
rd 30000
物理アドレス
これらすべての帰結(1)
アドレス空間, 論理アドレスの組を,対応する「物理アドレス」に変換する仕組み(アドレス変換; Address Translation)が必要
アドレス空間ID,
論理アドレス アドレス変換機構 物理メモリ ASID, Laddr Paddr
CPU
これらすべての帰結(2)
「割り当て中のメモリ」すべてに物理メモリを確保することは不可能
ディスクを補助記憶域としてうまくやりくり(ページング; paging)する必要がある
メモリ管理のためにCPUが備える機構
メモリ管理ユニット(Memory
Management Unit; MMU)
役割: すべてのメモリアクセス命令実行に介在して,以下を行う
• アクセス権の検査
• アドレスが物理メモリ上に存在するかの検査
• アドレス変換
• その他
MMU
メモリアクセス命令時のCPUの動作(概要)
アクセス権検査; アドレス変換; アクセス
例: load [r1], r2 (storeもほぼ同じ)
• レジスタr1の中身がアドレスaだったとする
aはread可?
物理アドレスpを読む
アクセス権検査
アドレス変換
YES
NO 例外(トラップ)発生
protection fault
aに対応する物理
アドレスpが存在? NO 例外(トラップ)発生
page fault
ページ
CPU (MMU)は各アドレスに対応する
• 保護属性(read/write可 etc.)
• 物理アドレス
などを記憶する必要がある
保護属性,アドレス変換をすべてのアドレスに個別に保持するのは不可能
「ページ」(対応付けの単位)の概念
ページ
ハードウェアが,保護属性,アドレス変換,などを保持する単位
典型的には4096バイト,8192バイトなどの連続したアドレスの範囲
0x2000
0x3000
0x4000
0x1000
ASID, 論理アドレス 属性や物理アドレス
ASID, 論理ページ番号 属性や物理ページ番号
アドレスとページ
例: 32 bit論理アドレス.4096バイトページ
アドレス空間ID, 論理ページ番号をキーとして対応付けを保持する
ページ内オフセット 論理ページ番号
20 bit 12 bit
物理ページ番号 保護属性 その他の属性
Mapping不在 (対応する物理ページなし)
0
1
重要な属性
保護属性
• 読み出し可(readable)
• 書き込み可(writable)
• ユーザモードでアクセス可
その他の属性
• 参照(reference) bit (read時にset)
• 汚れ(dirty) bit (write時にset)
Mapping不在
対応する物理ページが現在, 存在しないことを示す
二つの場合がある
• 論理的に割り当てられていない
• そこをアクセスするのは実際, 違反
• 論理的には割り当て中.だが,
• OSが「たった今は」物理メモリを割り当てていない
CPUは両者を区別しない(OSが区別する)
対応付けの実際
ページテーブル
• メモリ上に置かれた表
• 論理アドレス空間, 論理ページ番号をキーとして物理ページ番号,属性を値とする表
TLB (Translation Lookaside Buffer)
• CPU内にある, 通常100エントリ程度の連想記憶(通常fully associative)
• 役割: ページテーブルのキャッシュ
工夫のない対応付けに必要なページテーブルの大きさ
仮定
• 32 bit論理アドレス. 20 bitページ番号
• 1エントリ32 bit (物理ページ番号+属性)
220 ×4 × n = 4n MB
• n : 論理アドレス空間の数 同時に存在するプロセス数
まだ大きすぎる(もう一工夫)
ページテーブルの構造
「ほとんど空」の論理アドレス空間を小さく表現する
多段のページテーブル
多段のページテーブル
a1 a2
10 bit 10 bit
o
12 bit
a1
a2
64bitアドレス?
Madhusudhan Tallurl, Mark D. Hill, Yousef
A. Khalidi. A New Page Table for 64-bit
Address Spaces. SOSP 1995
メモリアクセス時のCPUの動作:
まとめ (read) read(a) {
p,attr = lookup_TLB(a);
if (!found) p,attr = lookup_page_table(a);
if (!found) raise page fault;
if (!attr.readable) raise protection fault;
if (!attr.user && CPU_mode == user)
raise protection fault;
read p; /* in cache or memory */
set reference bit for a;
}
Writeの場合
write(a, v) {
p,attr = lookup_TLB(a);
if (!found) p,attr = lookup_page_table(a);
if (!found) raise page fault;
if (!attr.writable) raise protection fault;
if (!attr.user && CPU_mode == user)
raise protection fault;
write v to p; /* in cache or memory */
set reference/dirty bit for a;
}
余談:セグメンテーション
ページング以前の仮想記憶
セグメント:
• (ページよりも大きな)連続したアドレスの範囲
• 必要に応じて伸ばせる
各論理アドレス空間で割り当て中のメモリは,少数(数個)のセグメントとする
必要に応じてセグメントを丸ごと移動,ディスクに退避
テキスト
セグメント
データ
セグメント
スタック
セグメント
そういえばセグメンテーションフォルトって何だっけ
セグメントを越えたアクセス
今日的には,protection fault, access
violation