コンパイラ演習 第 12 回 (2012/01/05) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.

Slides:



Advertisements
Similar presentations
G ゼミ 2010/5/14 渡辺健人. パフォーマンスの測定 CUDA Visual Profiler CUDA の SDK に標準でついているパフォーマン ス測定用のツール 使い方: exe ファイルのパスと作業ディレクトリ指定して実 行するだけ 注意点 : GPU のコード実行後にプログラム終了前に,
Advertisements

コンパイラ演習 第 6 回 2005/11/17 大山 恵弘 佐藤 秀明. 今回の内容 実マシンコード生成 – アセンブリ生成 (emit.ml) – スタブ、ライブラリとのリンク 末尾呼び出し最適化 – 関数呼び出しからの効率的なリターン (emit.ml) –[ 参考 ]CPS 変換 種々の簡単な拡張.
コンパイラ演習 第 6 回 (2011/11/17) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
9.Garbage Collection for C
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
Chapter11-4(前半) 加藤健.
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
プログラミング基礎I(再) 山元進.
2006/10/5 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
全体ミーティング (4/25) 村田雅之.
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ演習番外編 (その2): JVM コンテスト
コンパイラ演習番外編 (その1): min-rt 改 コンテスト
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
プログラミング基礎I(再) 山元進.
2006/10/12 山下 諒蔵 佐藤 春旗 前田俊行 大山 恵弘 佐藤 秀明 住井 英二郎
IT入門B2 (木曜日1限) 第一回 講義概要 2004年月9日30日.
コンパイラ演習 第 8 回 (2011/12/01) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
全体ミーティング (6/13) 村田雅之.
応用情報処理V 第1回 プログラミングとは何か 2004年9月27日.
コンパイラ演習 第 9 回 (2011/12/08) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
App. A アセンブラ、リンカ、 SPIMシミュレータ
コンパイラ演習 第12回 2006/1/26 大山 恵弘 佐藤 秀明.
2006/12/7 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
情報科学1(G1) 2016年度.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
アルゴリズムとデータ構造 2011年6月13日
2006/11/02 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/11/16 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ演習 第 4 回 (2011/10/27) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
応用情報処理V 第1回 プログラミングとは何か 2003年9月29日.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
プログラミング 4 記憶の割り付け.
“Separating Regular Languages with First-Order Logic”
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
コンパイラ 2012年11月15日
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
バイトコードを単位とするJavaスライスシステムの試作
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
Boostのスマートなポインタを使ってみる
全体ミーティング (5/23) 村田雅之.
アルゴリズムとデータ構造 2012年6月11日
Mondriaan Memory Protection の調査
コンピュータアーキテクチャ 第 5 回.
アルゴリズムとデータ構造1 2009年6月15日
2008/7/16(情報コース)2008/7/22(通信コース) 住井
コンピュータアーキテクチャ 第 5 回.
SMP/マルチコアに対応した 型付きアセンブリ言語
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
曖昧なポインタの存在下での Copying Garbage Collection
X64 函数呼び出し規約 長谷川啓
アルゴリズムとデータ構造 2010年6月17日
参考:大きい要素の処理.
全体ミーティング (9/12) 村田 雅之.
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング 3 ポインタ(1).
Presentation transcript:

コンパイラ演習 第 12 回 (2012/01/05) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎

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

Garbage Collection 概論 遠藤敏夫先生の資料を参考にしています 遠藤敏夫先生 – 東京工業大学大学院 特任准教授

今回紹介する GC の種類 参照カウント (reference counting) Tracing GC – マーク & スィープ – Copying GC

参照カウント (Reference Counting) オブジェクトへの参照 ( ポインタ ) の数を オブジェクト自身に記録しておく 参照を作る / なくすたびにカウントを増減 カウントが 0 になったらオブジェクトを 解放

参照カウントの例 Roots ※ ここで roots とは、レジスタやメモリスタックなど GC の起点となる集合 ( 参照され得ることが分かっている集合 ) を表す

参照カウントの例 Roots 1

参照カウントの例 Roots 1 1

参照カウントの例 Roots 1 1 1

参照カウントの例 Roots 1 1 1

参照カウントの例 Roots

参照カウントの例 Roots

参照カウントの例 Roots

参照カウントの例 Roots

参照カウントの例 Roots

参照カウントの例 Roots

参照カウントの例 Roots

参照カウントの例 Roots カウントが 0 になったら 解放

参照カウントでは上手くいかない 例 Roots

参照カウントでは上手くいかない 例 Roots

参照カウントでは上手くいかない 例 Roots

参照カウントでは上手くいかない 例 Roots

参照カウントでは上手くいかない 例 Roots 循環参照はどうする ?

マーク & スィープ マークとスィープの 2 段階からなる – マーク : 参照可能なオブジェクトにフラグを立 てる – スィープ : フラグの立ってないオブジェクトを 解放 Roots ✓ ✓ ✓ ✓ フラグが付かなかったものを解 放

3 色マーク & スィープの例 まず全て「白」にする Roots

3 色マーク & スィープの例 到達可能なオブジェクトを「灰」にする Roots

3 色マーク & スィープの例 未探索の参照のない「灰」を「黒」にす る Roots 今回は該当なし

3 色マーク & スィープの例 到達可能なオブジェクトを「灰」にする Roots

3 色マーク & スィープの例 未探索の参照のない「灰」を「黒」にす る Roots

3 色マーク & スィープの例 「灰」が無くなったのでマーク終了 Roots

3 色マーク & スィープの例 全ての「白」を解放する ( スイープ ) Roots フラグが付かなかったものを解 放 これらのオブジェクトを解放す る

Copying GC ヒープを二分割し、片方だけを使う 片方が埋まったら、参照可能なオブジェ クトをもう片方に移す – 移されなかったオブジェクトはそのまま解放 移すついでにヒープのデフラグができる

Copying GC の例 (GC 開始前 ) From-spaceTo-space Roots a b c d e

Copying GC の例 到達可能なオブジェクトを to-space へコピー From-spaceTo-space Roots a b c d e a コピー済みだが まだ from-space を指す オブジェクトは「灰」 コピー済みだが まだ from-space を指す オブジェクトは「灰」 コピー元のオブジェクトに コピー先のオブジェクトへ の参照を保存する a

Copying GC の例 「灰」のオブジェクトから参照されるオブジェクトをコ ピー From-spaceTo-space Roots a b c d e a b コピー済みで もう from-space を参照しない オブジェクトは「黒」 コピー済みで もう from-space を参照しない オブジェクトは「黒」 b a

Copying GC の例 「灰」のオブジェクトから参照されるオブジェクトをコ ピー From-spaceTo-space Roots a b c d e a b c d c d b

Copying GC の例 「灰」のオブジェクトから参照されるオブジェクトをコ ピー From-spaceTo-space Roots a b c d e a b c d c から d への参照を 復元するために コピー元の d に保存され た 参照を利用する c から d への参照を 復元するために コピー元の d に保存され た 参照を利用する c

Copying GC の例 「灰」のオブジェクトから参照されるオブジェクトをコ ピー From-spaceTo-space Roots a b c dd e a b c d

From-spaceTo-space Copying GC の例 (GC 終了 ) Roots a b d e c a b c d

GC の利点・欠点 malloc/free vs. 参照カウント vs. tracing GC マーク & スィープ vs. copying – メモリ確保は大抵 copying GC が勝つ – メモリ効率は大抵マーク & スィープが勝つ 1 回の GC にかかる時間はスィープを lazy に行う マーク & スィープが勝つ malloc/free 参照カウン ト Tracing GC プログラムの 書きやすさ × ○ ( △ ?) ○ 停止時間 ○○× 実行時間全体 ○× △ (○?) メモリ効率 ○ △ ×

Tracing GC の改良 インクリメンタル GC: ちょっとづつ GC – GC の処理を細切れにして プログラムの実行と交互に行う手法 世代別 GC (Generational GC) – ヒープを幾つかの「世代」に分ける手法 大抵のオブジェクトはすぐ不要になるので 「若い世代」の GC だけで済ませる – 寿命の長いオブジェクトの探索回数を減らせる ただし、どちらの手法も write barrier が必要に なる Write barrier = ここでは、オブジェクトへの書き込み時に特別な処理を行うこと

GC のその他の話題 保守的な GC (conservative GC) 並行 GC (concurrent GC) と 並列 GC (parallel GC) 分散環境の GC – 分散参照カウント – 分散 tracing GC

“Conservative” garbage collection と は 参照と整数の区別がつかない環境でも行え る garbage collection のこと – 例えば C 言語ではメモリの中身を見ても 整数とポインタを区別できない 解決方法 : とりあえず全部ポインタだと思う

配列境界検査 GC のための拡張と同様に 配列データに長さを表すタグを付加する 配列アクセスを行う命令列の前に 配列長と添字を比較する命令を出力する

共通課題 MinCaml に以下の改造を加えよ – 配列長を表すタグを配列に付加する – 配列アクセスの前に境界検査を行い 配列の範囲外にアクセスしようとしていたら プログラムを終了させるなどの処理を行う

コンパイラ係用選択課題 Garbage collection を自作コンパイラまたは MinCaml に実装せよ – 使用する GC アルゴリズムは自由 – ゴミをたくさん作りながら動く サンプルプログラムを記述し それが複数回の GC を経て 動き続けることを確認すること

演習でどの GC を実装するか ? たぶん copying GC が一番楽 興味があれば mark-sweep GC に 挑戦してみるのもよい コンパイラ側の改造が多いのを いとわなければ reference count も おもしろい さらに余裕があれば incremental GC や generational GC も

GC 導入のための コンパイラの変更 (1) ヒープを作成する( stub の)コードの改造 – Copying GC を採用する場合はヒープを 2 つ用意する 等 ヒープ内にメモリを確保するコードの改造 – ヒープポインタとヒープリミットを比較し ヒープがあふれそうなら GC ルーチンに飛ぶ ヒープ内のデータを扱うコードの改造 – 配列やタプルなどに型やサイズを表すタグを付加 – 採用する GC によっては mark bit 領域や reference count 領域などを追加し それらを操作するコードも追加

GC 導入のための コンパイラの変更 (2) GC が rootset を得るための機構の追加 – スタックに積まれた各ワードの型を GC ルーチンが知るための機構の導入 フレームに保存された PC の値から そのフレームの各ワードの型を得られるような表を 作る スタックに値をプッシュする際に その値の型の情報もどこかに書き込んでおく など – 大域変数のアドレスと型を GC ルーチンが知るための機構の導入

課題の提出先と締め切り 提出先 : 締め切り : 2 週間後 (1/19) の午後 1 時 – コンパイラ係用課題の締め切り : 2012 年 2 月 27 日 Subject: Report 12 – 例: Report 本文にも氏名と学籍番号を明記のこと 半角スペース 1 個ずつ  質問は まで

コンパイラ係の 成績評価について (1) 選択課題を 1 つ以上提出してください – また選択課題と同等以上の難度の言語機構の実 装 をもって選択課題の提出とみなすことも可能で す 事前に相談してください

コンパイラ係の 成績評価について (2) 各コンパイラ係に前田と TA が面談をします – 基本的にはレイトレ競技会の当日または付近の日 – にメールして予約をとって下さい – 場所は地下端末室、時間は 20 分程度 – やること: 自作コンパイラの特徴や独創的な点などの説明 自作コンパイラによる、プログラム (レイトレ含む) の コンパイル・実行のデモ – 自作コンパイラでコンパイルしたレイトレが 自作 CPU またはシミュレータ上で動く様子を見せて下さい