メモリ管理

Similar documents
メモリ管理

メモリ管理

10-vm1.ppt

メモリ管理

Microsoft PowerPoint - No6note.ppt

Microsoft PowerPoint - OS09.pptx

Operating System 仮想記憶

メモリ管理

Microsoft PowerPoint - os ppt [互換モード]

21 章のお話

Microsoft PowerPoint - No15›¼‚z‰L›¯.ppt

Microsoft PowerPoint - OS07.pptx

PowerPoint プレゼンテーション

今日の内容 Garbage Collection (GC, ごみ集め ) 参照されなくなったメモリ領域を解放すること 配列境界検査

Microsoft PowerPoint - sp ppt [互換モード]

Microsoft PowerPoint - No7note.ppt

OS

04-process_thread_2.ppt

Microsoft PowerPoint mm2

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

OS

Microsoft PowerPoint - OS12.pptx

Microsoft PowerPoint - OS11.pptx

Microsoft PowerPoint - 05.pptx

PowerPoint プレゼンテーション

PowerPoint Presentation

Microsoft PowerPoint - OS02.pptx

スライド 1

Microsoft PowerPoint - os ppt [互換モード]

Microsoft PowerPoint - OS08.pptx

NetworkVantage 9

ex04_2012.ppt

PowerPoint プレゼンテーション

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

OS

スライド 1

Microsoft PowerPoint - sp ppt [互換モード]

今週の進捗

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint pptx

マニュアル訂正連絡票

Microsoft PowerPoint - 09.pptx

01-introduction.ppt

計算機のリソースとは 1.CPU 2. 主記憶 3. 補助記憶装置 の抽象化

Linux2.4でのメモリ管理機構

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

プログラミング実習I

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

プログラミングI第10回

Microsoft PowerPoint - pc11.ppt

Microsoft PowerPoint ppt

スライド 1

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

TFTP serverの実装

PowerPoint プレゼンテーション

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

2015 TRON Symposium セッション 組込み機器のための機能安全対応 TRON Safe Kernel TRON Safe Kernel の紹介 2015/12/10 株式会社日立超 LSIシステムズ製品ソリューション設計部トロンフォーラム TRON Safe Kernel WG 幹事

24th Embarcadero Developer Camp

02: 変数と標準入出力

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

計算機アーキテクチャ

Microsoft PowerPoint ppt

Microsoft PowerPoint - kougi7.ppt

Taro-リストⅠ(公開版).jtd

Taro-スタック(公開版).jtd

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

Microsoft PowerPoint ppt

Java の ConcurrentHashMap における同期化 バッドケースとその対処法 2013 年 9 月湊隆行 1. はじめに表 1.1 に示すように Java の Collections Framework には 3 つの世代があります バージョン 1.0 から存在するレガシー API バ

Microsoft PowerPoint - OS02.ppt

メモリについて考えてみよう_REL_

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft PowerPoint - OS02.pptx

Microsoft PowerPoint - ca ppt [互換モード]

計算機システム概論

この手の問題を診断する際に Simics は完璧なツールなのですが 実行するためには 問題が発生するプログラムを Simics に取り込まなければなりません すなわち Simics 上で Simics を実行するのです まず Simics 内部に開発ホストの複製を作成します これは何も難しいことでは

第2回

テスト

Microsoft PowerPoint - kougi11.ppt

memo

C プログラミング 1( 再 ) 第 5 回 講義では C プログラミングの基本を学び演習では やや実践的なプログラミングを通して学ぶ

計算機概論

POSIXスレッド

ユーティリティ 管理番号 内容 対象バージョン 157 管理情報バッチ登録コマンド (utliupdt) のメッセージ出力に対し リダイレクトまたはパイプを使用すると メッセージが途中までしか出 力されないことがある 267 転送集計コマンド (utllogcnt) でファイル ID とホスト名の組

C5

Intel Memory Protection Extensions(Intel MPX) x86, x CPU skylake 2015 Intel Software Development Emulator 本資料に登場する Intel は Intel Corp. の登録

講義計画 1. コンピュータの歴史 1 2. コンピュータの歴史 2 3. コンピュータの歴史 3 4. 論理回路と記憶, 計算 : レジスタとALU 5. 主記憶装置とALU, レジスタの制御 6. 命令セットアーキテクチャ 7. 演習問題 8. パイプライン処理 9. メモリ階層 : キャッシュ

システムソフトウエア2013/1/30 演習問題 学科 学籍番号 氏名 1. つぎの文章の空白を埋めなさい. コンピュータは,CPU( 中央処理装置 ) とメモリ, およびその他の入出力装置から構成されて いる. このうち,CPU は命令の (a) とデコードなどを行う制御部と, 実際の計 算を行う

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

PowerPoint プレゼンテーション

Microsoft PowerPoint - OS12.pptx

インストール先 PC 推奨環境 Intel Virtualization Technology 対応 CPU Windows 7 以降 64 bit メモリ 4 GB 以上 ハードディスク空き容量 20 GB 以上 インターネット接続 ( アップデートを うため ) ( 動作を保証するものではありま

PowerPoint プレゼンテーション

02: 変数と標準入出力

PowerPoint プレゼンテーション

コンピュータのしくみ

ファイルシステム

Microsoft PowerPoint - db03-9.ppt

Transcription:

イベント通知機構 メモリ保護 API

仮想記憶機構 毎メモリアクセスに介在し, アドレス変換 条件により例外発生 ( ページフォルト, 保護違反 ) 元々の目的 プロセス間の保護 ( メモリの分離 ) 仮想記憶 > 物理記憶 demand paging

仮想記憶機構の 応用 備わっている 機構 の, もともとの目的をちょっと逸脱した利用

OS 内部で用いられた応用 (1) メモリマップドファイル 大きなファイルの効率的なランダムアクセス 読み込み専用メモリのプログラム間での共有 ( メモリ節約 ) プログラムテキスト ( ライブラリ ) プロセス間共有メモリ 異なる ( 論理 ) ページを同一の物理ページにマッピングする (API : メモリマップドファイルの MAP_SHARED)

OS 内部で用いられた応用 (2) Copy-on-write プライベートマッピングであっても, 実際に書き込まれるまでは物理ページを共有 ( メモリの節約 ) 書き込まれたらコピーを生成 書き込みの検出はページテーブル,TLB 内の保護属性を 書き込み不可 にすることで行う 一番の用途 : Unix の fork

共通アイデア ページテーブルに 仕掛け をしておく 書き込み不可, マッピング不在, 物理メモリ共有 etc. 重要な メモリアクセスを OS が CPU 例外で検出 保護違反またはページフォルト 例外時の動作によって様々な処理 (copyon-write, ページング, etc.) を実現

さらなるアイデア : ユーザレベル仮想記憶 API メモリ ( ページ ) の保護属性をアプリケーションが操作できるようにする 読み出し可 不可 書き込み可 不可 出る単 readonly ( 読み込み可 書き込み不可 ) 保護違反 をユーザレベルに通知 単にプログラムを終了させるのではない処理が可能 Segmentation Fault は実はその一例

以降の概要 ( 準備となる話題 ): イベントの通知 API Unix : シグナル Windows : 構造化例外処理 保護違反通知の高度な応用例 Andrew W. Appel and Kai Li. Virtual Memory Primitives for User Programs

イベント通知 API 基本概念 スレッド実行中におこる例外的な事象またはスレッドの外でおこる事象を ( スレッドが明示的に監視することなく ) 通知する cf. CPU に対する割り込み いわば スレッドに対する割り込み API Unix : シグナル Windows : 構造化例外処理

Unix シグナル : 基本概念 スレッドが, 受け取りたいシグナルと, それを受け取ったときの処理 (action; シグナルハンドラ ) を OS に登録 シグナルの配達 事象発生時に OS が配達 他のプロセスが明示的にシグナルを配達 対応するハンドラが ( 突然 ) 実行される

例 1 シグナル : SIGSEGV (Segmentation Fault) いつ発生するか? プロセスが 保護違反 ( 違法なメモリアクセス ) を起こしたとき 注 : プロセスが毎メモリアクセスごとに 違法チェック をやっているわけではない

例 2 シグナル : SIGALRM いつ発生するか? alarm システムコールによって指定した時間が経過したとき 注 : プロセスが 1 命令 ( または数命令 ) ごとに 現在時刻チェック をやっているわけではない

例 3 シグナル : SIGINT いつ発生するか? ( 通常 ) 端末に向かって Ctrl-C を type したとき

kill システムコールと kill コマンド 明示的にシグナルを送る API kill(pid, sig); /* システムコール */ kill -sig pid # コマンド プロセス pid にシグナル sig を発生させる 良く使う kill -9 pid は pid にシグナル SIGKILL を発生させている

その他のシグナル ( 抜粋 ) SIGILL /* 不正命令の実行 */ SIGBUS /* バスエラー */ SIGUSR1, SIGUSR2 /* ユーザ定義シグナル */ SIGKILL /* プロセスの消滅 */

シグナルハンドラの登録 int sigaction(signum, &act, &oldact); シグナル signum 発生時の動作を act で指定 これまでの動作を oldact に格納

シグナル使用テンプレート void h(signum) { シグナル発生時の処理 ; } struct sigaction act; act.sa_handler = h; /* シグナルハンドラ登録 : SIGINT 発生時に h が実行される */ int sigaction(sigint, &act, &oldact);

シグナル発生時の流れ スレッド t にシグナル発生 t は sigaction によってハンドラを指定しているか Y t は一時実行を中断しハンドラ実行 N default の処理 ( 通常 t を含むプロセスが終了 ) ハンドラ終了後 t は実行を再開

Windows 構造化例外処理 Visual C++ に組み込まれた例外処理の構文で 例外 と 対応する処理 ( 例外ハンドラ ) を指定 文法 : try { 本体 ; } except ( 例外フィルタ ) { 例外ハンドラ ; }

構造化例外処理 try { S; } except (F) { H; } 注 : S 内にまた try が現れることもある 意味 : S を実行 try try try 途中に例外が発生しなければそのまま上の文全体の実行が終了 例外が発生したら, ( 最も最近突入した try ブロックに対応する )F を実行. その値によってその後の実行方法が決まる

構造化例外処理 フィルタ (F) の評価結果により, EXCEPTION_CONTINUE_EXECUTION 例外発生地点から実行再開 EXCEPTION_EXECUTE_HANDLER E に対応する例外ハンドラ (H) を実行 EXCEPTION_CONTINUE_SEARCH ひとつ前に突入した try に対応するフィルタを実行 ( なければ終了 )

例外の種類 STATUS_ACCESS_VIOLATION: 保護違反 STATUS_FLOATING_DIVIDE_BY_ZERO : 0 除算 STATUS_ILLEGAL_INSTRUCTION: 未定義命令 STATUS_PRIVILEGED_INSTRUCTION: 特権命令の不正な実行 多くが Unix のシグナルに対応

シグナル 例外がなぜ有用か? 毎回検査していたのでは遅すぎる処理の代わりに, ハードウェアによる検査 + 例外 の処理で代用する 割り算 a/b のたびに b 0 を検査する メモリアクセス *p のたびに p がある領域をさしていないかどうかを検査する

保護違反 (SEGV) の捕捉 例外処理の中でも特に, メモリ保護 API (mprotect, mmap, VirtualAlloc, VirtualProtect, MapViewOfFile) によるメモリ領域の保護属性の設定 シグナル 構造化例外処理による, それらの領域へのアクセスの捕捉 には多数の応用が発明されてきた 仮想記憶 API の応用

多くの応用に共通の基本アイデア ある領域を READ (WRITE) 不可に設定 通常通りプログラムを実行 途中で保護違反が発生したら, その場所を READ (WRITE) 可に設定 + 実行を継続 ポイント 実行結果は通常と変わらない 実行中どこ ( どのページ ) にアクセスしたか の情報が得られる

これまでに発明された応用 圧縮つきメモリマップドファイル 並行チェックポインティング トランザクションつきメモリマップドファイル ( 永続オブジェクト ) Incremental Garbage Collection ネットワークページング 仮想共有メモリ (Shared Virtual Memory) 興味のある人は, Andrew W. Appel and Kai Li. Virtual Memory Primitives for User Programs

応用例 1: 差分チェックポインティング チェックポインティング : ( 長い ) 計算の途中でデータをファイルに書き出す おもな目的 : 将来のクラッシュ時に途中から再開するため チェックポイント

差分 チェックポインティング チェックポイント保存時に 前回との差分 だけを保存 ( 高速 停止時間が短い ) チェックポイント

差分チェックポインティング : 方法 チェックポイント保存後 全ページを readonly に設定 Write fault 時に書き込まれたページを記録 dirty pages 次回チェックポイント時には dirty pages だけを保存

応用例 2: 圧縮つきメモリマップドファイル 通常のメモリマップドファイル : あるページに初めてアクセスした時 OS がファイルの内容をメモリに ( そのまま ) コピー 圧縮つきメモリマップドファイル : ファイルの内容が圧縮して格納されている 初めてアクセスした時, メモリの内容を 解凍して コピー

通常 vs 圧縮つき 注 : OS がメモリマップドファイルの拡張としてサポートしてもよいのだが, 今はそれがないという前提で, メモリ保護 API を利用して ユーザが 実現することを考える 通常のメモリマップドファイル 圧縮つきメモリマップドファイル

圧縮つきメモリマップドファイル 実現概要 ファイルは断片 ( 例 : 16KB) ごとに圧縮して格納 将来内容が展開される領域を アクセス不可 に設定 保護違反発生時に, 対応する断片を解凍して, 読み込み ( コピー or マップ )

応用例 3: ネットワークページング ディスクの代わりに ほかの計算機のメモリ をページング領域 ( 退避場所 ) として使う ディスクの速度 < ネットワークの速度のときに有効 通常のネットワーク ( ソケット API 利用 )

ネットワークページング 基本アイデア OS のページングをユーザレベルで 真似 OS のページング 空のページをアクセス ページフォルト ディスクからページイン ユーザレベルのページング 読み書き禁止のページをアクセス 保護違反 (segmentation fault) ネットワーク経由でページイン

ネットワークページング OS のページング 物理メモリにないページをアクセス ページフォルト 2 次記憶からページイン アプリに戻る 基本アイデア OS のページングをユーザレベルで模倣 ユーザレベルのページング 物理メモリにないページをアクセス アクセス違反 (segmentation fault) ( シグナルハンドラ ) 他のマシンからページイン

ネットワークページング 実際 一定数 (< 物理ページ数 ) のページ以外はすべて アクセス不可 に設定 Segmentation fault のハンドラ アクセス違反を起こした対象ページを取得 ネットワーク経由でページを取得 代わりにどれかのページを追い出す

応用例 4: 仮想共有メモリ 物理的にはメモリを共有していない, 複数の計算機間での 擬似的な メモリの共有 誰かが書き込んだ結果が自動的に他の人に反映

基本の復習 : 共有メモリ 1 プロセス内の複数スレッド 物理メモリ共有, アドレス空間共有 プロセス間共有メモリ 物理メモリ共有, アドレス空間は分離 明示的な API ( メモリマップドファイル +MAP_SHARED) によって, ことなる論理ページを同一の物理ページにマッピング

仮想共有メモリ 異なる ( 物理メモリを共有していない ) 計算機間で あたかも メモリを共有しているかのような錯覚を与える技術 擬似的な共有 通常のネットワーク ( ソケット API 利用 )

そもそも共有メモリとは 通信の一形態 メモリへの書き込み 結果を ( 明示的な通信プリミティブの呼び出し無しに ) 自動的に他のプロセス スレッド 計算機に反映する 仮想共有メモリ 分散共有メモリ : ( 最も単純には ) すべてのメモリ書き込みを捕捉できれば実現可能 メモリ保護機能を使う

各ページの状態とその状態間遷移 read/write read modified (writable) write 他人による read shared (readonly) write 他人による write invalidate ( 無効化 ) read invalid 他人による write invalidate ( 無効化 ) 不変条件 : 各ページについて, 1 modified + (n 1) invalid または 0 modified

ページの状態 Invalid : ページはアクセス不可 他のプロセス (1 つ ) が同一ページを modified で保持しているかもしれない Shared : ページは read 可,write 不可 他のプロセス ( 任意個 ) が同一ページを shared で保持しているかもしれない Modified : ページは read/write 可 他のプロセスは同ページを保持していない ( 全員 invalid)

Read 違反 invalid なページを読もうとしたときに発生 1. modified invalid read 違反 2. 3. modified shared req_share ack_share invalid invalid ハンドラ 4. shared shared

Write 違反 invalid/shared なページを読もうとしたときに発生 1. 2. 3. shared shared invalid req_exclusive ack_exclusive shared write 違反 shared ハンドラ shared 4. invalid modified

応用例 5: Incremental Garbage Collection 目的 : Garbage Collection (GC; 自動メモリ管理 ) の 停止時間 を短くする 以降の話 GC の基本 GC の停止時間 Incremental GC の原理 write barrier

GC とは? malloc/free (new/delete) に代わる自動メモリ管理の一種 今後もう使われない領域 を自動的に検出して解放 (free)

自動メモリ管理 ( ごみ集め ; Garbage Collection) もう使われない領域 を自動的に発見して解放 プログラムの安全性は格段に向上する 最近のほとんどの言語に備わる機能 C/C++ 用にはライブラリ (Boehm GC) がある GC 用語 ( プログラム実行中のある時点で ) 生きている領域 = その時点以降使われる ( アクセスされる ) 領域 反対語 : 死んでいる領域

生きている 死んでいる領域を見 つけるのに GC が行っている近似 現在局所 大域変数に入っているアドレス ( が指すメモリ領域 ) は 生きている 注 : アドレスが指す メモリ領域 そのアドレスを含む, 一回のメモリ割り当てで割り当てられた領域 ある 使われる メモリ領域中に入っているアドレス ( が指すメモリ領域 ) は 生きている 配列の要素, 構造体のフィールドなど 今後使われる 生きている

要するに局所 大域変数から 到達 可能 なものが 生きている 局所変数大域変数

GC の基本原理 割り当て (e.g., malloc(sz);) 空き領域から sz バイト分の連続した空き領域 (a) を発見 [a, a + sz) を使用中と記録 (a をキーとして探索すると sz が分かるよう, 何らかのデータ構造に記録しておく ) このとき, 空き領域が足りなくなったら ( 基準は様々 )GC を起動 GC_MALLOC() { if (GC した方がよい ) { GC(); } 空き領域を見つけて return; }

マーク 生きているものすべてに 印 をつける 印の場所 : オブジェクトの先頭に専用の領域を作っておく, ハッシュ表などを作る, などがある 要するにグラフ探索の要領

基本的な GC アルゴリズム (mark-and-sweep GC) GC() { mark_phase(); sweep_phase(); } mark_phase() { root ( 局所変数, 大域変数 ) から, ポインタの鎖をたどってたどれるオブジェクトをすべて見つける (mark) } sweep_phase() { mark されてないオブジェクトを全部解放 } 注 : オブジェクト = 1 回のメモリ割り当てで割り当てられたメモリ領域

GC はいつ起動されるのか? メモリ割り当て要求時に, 自分が管理しているヒープ領域 が満杯なったら... 選択肢 1: GC を起動 選択肢 2: OS からメモリを獲得 ( ヒープ拡張 ) alloc, alloc, alloc, alloc GC ヒープ拡張

mark フェーズ 実質的にはグラフの探索 ルート

mark_phase() { mark_stack = empty_stack(); for all pointer p in ROOT { mark(p); } while (!empty(mark_stack)) { p = pop(mark_stack); for all pointer q in object pointed by p { mark(q); }}} mark(p) { if (already_marked(p)) return; set a flag indicating p is already marked; push(p, mark_stack); }

mark stack

1 回の mark フェーズにかかる時間 実行時間はほぼ, mark されたオブジェクトの量 ( バイト数 ) に比例 大きなデータを用いるプログラムは一回の mark フェーズ ( つまり GC) にかかる時間が長くなる 通常の GC アルゴリズムではその間ユーザプログラムが停止している つまりメモリ割り当てに, 時々非常に時間がかかる

Incremental GC 通常 mark フェーズを 少しずつ 行う 例 : 1 度のメモリ割り当て毎に一定量 (e.g., 50KB)mark する incremental 少し mark = 少しオブジェクトグラフを探索

難しさ (GC の側から見ると ) mark と mark の間にオブジェクトグラフが変化している

問題と解決方法 問題 : すでに GC が探索済みであるようなオブジェクトへ, 他のオブジェクトへのポインタが新たに書き込まれた場合 解決方法 (write barrier): そのような書き込み を見つける 書き込まれた探索済みオブジェクトを再び 未探索 とみなす

Write Barrier 方法 1: コンパイラ ( 言語処理系 ) にポインタの書き込み時に実行される特別なコードを挿入させる 方法 2: 仮想記憶 API を用いて,(read-only に設定 ) 書き込みを検出 記録する

仮想記憶 API による write barrier を用いた incremental GC 新しい mark phase 開始時 : 全ページを read-only に設定 各 allocation 時 : Mark phase 中であれば一定量のオブジェクトを mark 書き込み検出時 : 書き込まれたページを dirty page 集合に追加 Mark phase 終了時 Dirty page 集合から再び mark