オペレーティングシステム
~ 仮想記憶
(1) ~
山田 浩史 hiroshiy @ cc.tuat.ac.jp 2015/06/19OS の目的
• 裸のコンピュータを
抽象化
(
abstraction
)し、
より
使いやすく安全な
コンピュータとして見せること
– OS はハードウェアを制御し、アプリケーションの 効率的な動作や容易な開発を支援する – OS がないと・・・ • メモリをアプリケーション自身が管理しなければならない • 他のアプリケーションが使っているメモリを容易に壊してしまう – OS-アプリケーション間は CPU のモードで隔離されている オペレーティングシステム アプリケーションWord Chrome Thunder bird Database
CPU メモリ I/O デバイス (ディスク等) 本日の
AGENDA
• OS のメモリ管理法
– 素朴な実装
– メモリ管理の要件
– 仮想記憶
– ページ
– ページテーブル
メモリも共有資源
• 複数のプロセスが同時にメモリを使用する
– プログラムを実行するにはメモリを使う • Text 領域,データ領域,スタック領域 – 例: ユーザA は emacs と gcc, ユーザ B は firefox と emacs を動作させると・・・ 0 番地 1024 M (物理メモリ量) A’s Thunderbird B’s chrome A’s iTunesアドレス B’s iTunes ⇒ OS が適切にメモリを管理する必要がある – 各プロセスが自由にメモリを使ってはダメ • 他のプロセスが使っている領域があるから – メモリの取得・解放は OS にお願いする • システムコールを発行する 例: Linux では brk() というシステムコールが用意されている
素朴なメモリ管理
• 空いているメモリを linked list として管理 – 空き領域の先頭に • 空き領域の大きさ(byte) • 次の領域へのポインタ を格納しておく 使用中 使用中 8192 4096 10248192 byte の空 4096 byte の空 1024 byte の空
free memory
• メモリ割り当て要求が来ると,空き領域からメモリを
割り当てる
どう割り当てるか?
• First-Fit
– Linked list を辿り,最初に遭遇した n byte 以上の領域から割り当てる – メモリ割り当てを最速に• Best-Fit
– Linked list を辿り,n byte 以上の最小の 領域から割り当てる
– メモリ割り当て後に残る領域を最小に
• Worst-Fit
– Linked list を辿り,最大の領域から割り当てる – メモリ割り当て後に残る領域を最大に
素朴なメモリ管理の問題点
(1/2)
• メモリの確保・解放が繰り返されると,
断片化
(fragmentation)が起こりやすい
– 断片化: 小さい空き領域がたくさんできてしまうこと• 何がまずい?
– 空き領域があるにもかかわらずメモリを 確保できなくなってしまう 断片化したメモリ領域 この大きさの連続したメモリ領域を割り当てたい! 十分な空領域があるにもかかわらず,メモリ割当を行うことができない素朴なメモリ管理の問題点
(2/2)
• プロセス間のメモリ保護が実現できない
– メモリ保護: あるプロセスが他のプロセスのメモリを 参照・変更できないようにすること• メモリ保護がないと・・・
– プログラムのミスで他のプロセスのメモリを 破壊することがある • 1 つのプロセスの不具合がシステム全体に伝播 – 悪意のあるユーザが他人のプロセスのメモリを覗ける • ウェブブラウザに入力したパスワードやクレジットカード番号 が見れる read write process 5 process 3 process 10仮想記憶
(OS によるメモリの抽象化)
•
仮想記憶(Virtual memory)
– 各プロセスに専用の仮想アドレス空間 (Virtual address space) を提供する
– 各プロセスがメモリを占有しているように見える emacs (process 3) 0番地 4Gbyte firefox (process 5) 0番地 4Gbyte gcc (process 10) 0番地 4Gbyte OS による物理メモリの仮想化 物理メモリ 0 番地 512M (物理メモリ量)
仮想アドレス
(論理アドレス)
• ある仮想アドレス空間内で有効なアドレス
• プログラム/プロセスが使うアドレス
– 普段「アドレス」と言っているものは仮想アドレス – コンパイラも仮想アドレスで object code を 生成すればよい int main() { int x, *p; printf(“%p\n”, &x); *p = 1000; printf(“%d\n”, *p); return 0; } 変数 x の仮想アドレス 仮想アドレス 1000 番地の 内容を参照仮想アドレス空間
• プロセスごとに用意された仮想的なアドレス空間
– 仮想アドレス空間の大きさはハードウェアと OS で決まる• 互いに分離している
– プロセス A の 9000 番地とプロセス B の 9000 番地は別物 – 他のプロセス内の仮想アドレスを指定する方法はない • プロセス A が参照できるメモリはプロセス A の仮想アドレスのみ⇒
プロセス間のメモリ保護が達成されている
0番地 4Gbyte 0番地 4Gbyte process A process B a F 9000 9000物理アドレス
• 物理メモリを参照するためのアドレス
– 物理メモリの空間を物理アドレス空間と呼ぶ
• メモリ参照のためのハードウェアが使用
– プロセスが使用するのは仮想アドレスのみ
CPU メモリ rd 30000 物理アドレス仮想アドレスと物理アドレス
• 仮想アドレス空間を物理アドレス空間にマップする
– 各プロセスの仮想アドレスを物理アドレスに対応づける
• 仮想アドレスを物理アドレスに変換する必要がある
0番地 emacs 4Gbyte 0番地 firefox 4Gbyte
0 番地 (物理メモリ量) 512M OS による物理メモリの仮想化