Hatena::ブログ(Diary)

やねうらお−ノーゲーム・ノーライフ このページをアンテナに追加 RSSフィード

GT-Rの買取ならここですわ。どこよりも高く買取ってもらえるはず。お勧め!GT-R 買取
電王戦出場記念! 書籍化されたで! 監修したで!(`ω´) 絶版なってしもた Kindle版で復活!! 記事書いたで!
解析魔法少女美咲ちゃん マジカル・オープン!

YaneuLabs / やねうら王公式 / やねうらおにメール / twitter / プロフィール

 | 

2004-04-10 いまどきのGC

[][][][] conservativeなGC  conservativeなGCを含むブックマーク  conservativeなGCのブックマークコメント

BoehmのGCは保守的(conservative)なGCである。これは、root集合から辿れるならば、配列の中身すべての要素を辿ることを意味する。画像imageのように大きな配列を扱う場合、こんなことをされてはたまらない。配列の要素がでたらめな数字だと、そんなところを辿ってアクセス違反にならないの?と思うかも知れないが、GCは自分のヒープから割り当てたメモリしか辿らないので、アクセス違反は起きない。


そこで、D言語の場合、大きな配列はGCのヒープからではなく他のallocator(たとえばmallocで)からメモリを割り当てるのが常套手段となっている。他のallocatorから割り当てたメモリGCのヒープから割り当てたものではないので、GCはその先をスキャンすることをあきらめるからである。


まあ、どのみちアプリケーションが肥大化してきたときに保守的なGCではどうしようもいかなくなる。保守的なGCが使われる限り、リアルタイム性が問題になる大規模なアプリは書けないんじゃないかとも思う。


そうは言ってもBoehmのGCは、一番メジャーである。D言語は言うに及ばないが、monoプロジェクト(C#ネイティブコンパイラなどを作っているプロジェクト)でもBoehmのGCが採用されている。いっちょ大規模なアプリを開発したろかい!とか考えているやねうらおにとって、これは非常に迷惑な話だ。CLI自体は型情報を持っているわけで、保守的なGCなんか使う必要はないというのに。*1


ちなみに、Microsoftの.NET frameworkはそのへんどうなっているかというと次のようになっている。


ガベージコレクション入門: Microsoft .NET Framework の自動メモリ管理 Part I

http://www.microsoft.com/japan/msdn/net/mag00/GCI.asp

ガベージコレクション入門: Microsoft .NET Framework の自動メモリ管理 Part II

http://www.microsoft.com/japan/msdn/net/mag00/GCI2.asp


しかし、上の記事を読んでGCの仕組みについてひと通り理解するだけでも大変だろう。まあ、GCというのは、高速化したり、並列的に効率よく実行できるようにしたりするのは、非常に難しいのだ。Microsoftの.NET frameworkはそれなりにうまくやっている。とりあえずそのくらい理解しておけば十分だと思う。少なくとも、趣味研究目的でもない限りはGC自作はお勧めしない。まして、まともなGCともなるとゲームを作るついでにひょいっと自作出来る規模のものでは決してないのだ。

*1monoGCは、将来的にはIntelのORPに変更されるかも知れない。ORPについては、この解説が参考になるだろう。http://yamaguch.sytes.net/~tora/java/orp.html

あひあひ 2004/04/10 05:24 結局GCなんてものは、言語的に実装されるようなものではなくOSが根幹でメモリ管理を抽象化するぐらいの仕組みでなくてはいかんのですたい。そしてなおかつリアルタイムの速度を出せるプロセッサが。

yaneuraoyaneurao 2004/04/10 05:40 もちろん、そうです。言語ごとにGCを実装されたら言語間でやりとりができましぇん..。

authorNariauthorNari 2009/10/24 23:35 ご存じかと思いますが、GC_malloc_atomic()という関数があります。
"画像imageのように大きな配列を扱う場合、こんなことをされてはたまらない。"

 | 

1900 | 01 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 06 | 08 | 10 | 11 | 12 |
2015 | 01 | 02 |


Microsoft MVP
Microsoft MVP Visual C# 2006.07-2011.06