9.Garbage Collection for C

Slides:



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

アルゴリズムとデータ構造 第2回 線形リスト(復習).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
Chapter11-4(前半) 加藤健.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
榮樂 英樹 LilyVM と仮想化技術 榮樂 英樹
全体ミーティング (4/25) 村田雅之.
データ構造とアルゴリズム 第10回 mallocとfree
LMNtalからC言語への変換の設計と実装
LMNtalからC言語への変換の設計と実装
情報は人の行為に どのような影響を与えるか
.NET Frameworkにおける マネージヒープと ガベージコレクション
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
全体ミーティング (6/13) 村田雅之.
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
アルゴリズムとデータ構造 2011年6月13日
プログラムはなぜ動くのか.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
速報: Boehm GC version 6.0α1 遠藤 敏夫.
TAL : Typed Assembly Language について
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
二分探索木によるサーチ.
型付きアセンブリ言語を用いた安全なカーネル拡張
B演習(言語処理系演習)第9回 メモリ管理・ごみ集め
Xenによる ゲストOSの監視に基づく パケットフィルタリング
定兼邦彦 今井浩 東京大学理学系研究科 情報科学専攻
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング言語入門.
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
実行時情報に基づく OSカーネルのコンフィグ最小化
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
コンパイラ 2012年11月15日
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
A Provably Sound TAL for Back-end Optimization について
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
第4回 メモリ管理 主記憶(メインメモリ)の管理 固定区画方式と可変区画方式 空き領域の管理 スワッピング.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
Boostのスマートなポインタを使ってみる
全体ミーティング (5/23) 村田雅之.
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造1 2009年6月15日
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
曖昧なポインタの存在下での Copying Garbage Collection
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
アルゴリズムとデータ構造 2010年6月17日
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
全体ミーティング (9/12) 村田 雅之.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
情報処理Ⅱ 小テスト 2005年2月1日(火).
Ibaraki Univ. Dept of Electrical & Electronic Eng.
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

9.Garbage Collection for C 早稲田大学理工学部情報学科上田研究室 山根信之

自動メモリ管理 宣言型、文字列処理言語の早期から関連付けられてきた オブジェクト指向型言語でも多くは自動メモリ管理を提供している

CでのGC プログラマがGCを使う時だけ使うようにしたい 効率的な自動管理システムがあってもあまり使われないし、メモリ操作に費やす時間は小さい                    GCが利益を得るまでは、コンパイラやランタイムシステムから独立して動作できなければならない

GCの持たない情報 どこでrootが見つかるのか スタックフレームレイアウトやレジスタの協定 どのwordがポインタで、どれがそうでないのか

9.1 曖昧なroot集めの分類法(1) Garbage collectorはコンパイラの密接な知識や協調でオブジェクトのレイアウトを明確に決定する 保守的collectorはコンパイラからヒープを受け取らない。どのwordも潜在的なポインタの可能性があるのでポインタかどうか調べる

9.1 曖昧なroot集めの分類法(2) この2つの中間に、部分的に正確だったり曖昧だったりするcollectorがある これはコンパイラの助けを全く受けないので、スタックレイアウトやレジスタに関する知識を持たない。プログラマ自身がデータ配置を決める

Conservative collector ごみの量を保守的に見積もる 使われない参照もいくらか余分に保持する コンパイラの助けのない、非強調的な環境の中で動くcollectorのことを表すことにする この章ではBoehm,Demers,Weiserの開発したcollectorとBartlettが開発したcollectorを見ていく

Boehm-Demers-Weiser collector mark and deferred sweepに基づいた   non-moving collector CやC++と共に使うのに適している      現在はincrementalやgenerationalもサポートしている 幅広いOSで実行

Bartlett’s collector The Mostly Copying Garbage collector CやC++と共に使うこともできる いくつかの他のcollectorの基本

9.2 保守的GC 明確なメモリ管理に比べてわずかなペナルティを普段から課す collectorはmark-and-sweepに基づく bitmapや異なるサイズのオブジェクトを隔離したフリーリストを使う マーカーは回収スタックを使い、オーバーフローしそうならより大きいスタックを用意

Allocation Collectorはtwo-level allocatorを使う →Section4.5 ヒープは4kbyteのブロックからなる ブロックはmalloc等のOSのスタンダードアロケータで取得 ブロックはsingle sizeのオブジェクトを含む 隣の空のブロックと結合もできる

Allocation ブロックの半分よりも大きいオブジェクトは自分の一塊のブロックにallocateされる 十分なサイズのフリーな塊が利用できなければGCに頼るかヒープを拡張する アロケータはfirst-fit戦略を使う

Allocation 小さいオブジェクトは、free-listの最初のメンバをそのオブジェクトサイズ分だけどけてallocateする free listが空になれば、sweep phaseで回収して満たそうとする 回収も成功しなければ、lower-levelのallocatorから新たなブロックを得てヒープを拡張

Root and pointer finding 保守的collectorは、遭遇した全てのwordを(特にわかっていない限り)潜在的ポインタとして扱わなければならない 正確に安価にこれを決定できるとよい 非常に保守的なcollectorは大量のごみを保持してしまう

Objectをマークするためのテスト 潜在的ポインタpはヒープを参照しているか? このオブジェクトを含んでいそうなヒープブロックは配置されたか? ブロックの初めから疑わしいオブジェクトのオフセットは、オブジェクトサイズのブロック倍か?

Interior pointer 小さいオブジェクトは内部ポインタの最初のsignificant bitを覆うことでブロックヘッダのアドレスを得る 大きいオブジェクトはその開始点を見つけるかポインタが無効になるまでブロックにスキップしてbottom_indexを調べる。

保守的GCの問題点 データをヒープポインタとして誤認識するリスクを持つか、一部のごみを不要に保持する collectorが内部ポインタを有効とみなすようにすると、ポインタでないwordがポインタとして認識されることが増える

Misidentification ポインタに間違えられたwordは大体整数 小さい整数は多くのシステム上では有効なヒープアドレスではない 非初期化データもポインタに間違えられやすい atomic objectは定義上他のヒープのオブジェクトへの参照を持てない

Misidentification 大きなprocedure frameを奨励するアーキテクチャで、フレームの大きな部分が正しく初期化されていないと間違った参照を生成する black listingはヒープにあるメモリの一部を解放して利用できなくする

Efficiency 設計はallocationとフラグメンテーションへの耐久度の間で妥協が必要 古いオブジェクトを解放するのはコストがかかるので単純にmallocやfreeの実行命令数を数えるのは効率的でない

Incremental/generational GC Boehm-Demers-Weiser collectorもこの方法をサポートしている

9.3 Mostly Copying collection 保守的なCopying collectorである。 スタックやレジスタやstatic areaから参照されているかもしれないオブジェクトはcopyされない。 そのためallocationが速く、ヒープオブジェクトにあるポインタを発見するのが単純で、GCが正確。

Heap layout Fromspace,Tospaceではなく、spaceIDのついたブロックから成る。 ブロック内のオブジェクトをコピーする方法には次の二つがある。 Tospaceとなっているブロックへコピーする そのブロックをTospaceにセットする spaceIDがcurrent_spaceと同じブロックはFromspaceである。

Allocation ブロックに十分な空きがあればそこへ配置。 ブロックに十分な空きがなければ、フリーブロックを探す。フリーブロックはIDがcurrent_spaceでもnext_spaceでもない。 大きなオブジェクトは複数のブロックにまたがる。

Garbage Collection(1) まずrootからscanしていき、辿ったブロックのIDをnext_spaceの値に変更し、そのブロックをTospace scan-listに加える。 次にTospace scan-listにあるブロックの中を調べ、到達可能なオブジェクトは新たなメモリ空間(Tospace)へとコピーされる。

Garbage Collection(2) ヒープを探索する方法は2つある。 同じIDのブロックに入っているオブジェクトの型を同じにする これはオブジェクトがコンパクトになるが、allocationが複雑になる オブジェクトごとにオブジェクト型を示すヘッダをつける

Generational GC(1) Bartlettのcollectorでも世代GCができる。 メモリの50%が使われるとminor collectionが起きる。 世代は2世代で、新しい世代はIDが偶数番号、古い世代はIDが奇数番号とする。 ルートセットから直接参照されるオブジェクトのあるブロックはID書き換えでTospaceになり、それ以外のブロックのオブジェクトは普通にコピーされる。

Generational GC(2) Minor collectionを繰り返すと古い世代が大半を占めるようになる。これが85%を超えるとmajor collection(mark and compact)が起きる。 この完了後にヒープが75%以上埋まっていれば、megabyte incrementをする。 最初のフェイズでブロックの1/3以下しか使われていないブロックをscavengeして空にし、次のフェイズでポインタを修正する。

Ambiguous data structures Unionでintとポインタを宣言すると、intなのかポインタなのかを判断できない。 Bartlettはこれを後で回収できるようにするためにcontinuationsを使う計画を設計した。 この方法だと、2倍高価になる。

The efficiency of Mostly Copying CopyingはspaceIDやオブジェクトの型情報、promotion bit、ブロックへのリンクなどの空間的オーバーヘッドがある。 Generationalはremembered setの維持コストがかかるが、GCに使う時間が減少する。