[#3536] Re: [ruby-list:10256] Re: for が修飾子だったら — Junichi Kurokawa <jun@...>

Reply-To: ruby-devとしました。

15 messages 1998/10/22

[ruby-dev:3528] Re: GC target (Re: [ruby-list:10035] Re: Ruby/Gtk text widget)

From: "D.Kanda" <MAP2303@...>
Date: 1998-10-13 09:38:21 UTC
List: ruby-dev #3528
  かんだです。

matz@netlab.co.jp (Yukihiro Matsumoto)さんの書かれた、
	「[ruby-dev:3527] Re: GC target (Re: [ruby-list:10035] Re: Ruby/Gtk text widget)」
からの引用です。

> まつもと ゆきひろです
> 
> In message "[ruby-dev:3526] Re: GC target (Re: [ruby-list:10035] Re: Ruby/Gtk text widget)"
>     on 98/10/13, "D.Kanda" <MAP2303@mapletown.net> writes:
> 
> |  かんだです
> 
> |  オブジェクトがどう保存されているのか知らないんですけれど、たぶん intern
> |をキーにして表形式のように考えられるんじゃないかと思います。

> なるほどね.そうだったら可能ですね.
> でも,残念なことに実際にはそうはなってないんですよ.

  うーん、違ったか。


> rubyのメモリ管理機能はgc.cを見る必要があるんですが,rubyのオ
> ブジェクトは heaps という配列の配列の要素です.

  gc.c は何回か挑戦しているんですけれど、難しいです。
  勉強になります。

>   [heaps....]
>      |
>      +->[heap....]
>      |
>      +->[heap....]
> 
> heapのひとつの要素がオブジェクトになります.で,この要素への
> ポインタでオブジェクトを指しているわけです.たとえば
> 
>   &heaps[0][0]
> 
> はヒープの先頭にあるオブジェクトですね.ですから,keyからオ
> ブジェクトへの表のようなものは存在しないんです.変数は大域変
> 数,インスタンス変数,定数,ローカル変数それぞれに異なる形式
> でテーブル(のようなもの)を持っています.
> 
> GCはどうしているかというと,以下のルートから再帰的にたぐれる
> オブジェクトにマークを付けて(mark phase),マークのついていな
> いオブジェクトを回収(sweep)しています.

  gc_gc() ですね。なるほど。

  で、sweep はこんな感じになってるわけですね。

  for (i=0; i < heaps.size; i++) {
    for (j=0; j < heaps[i].size; j++) {
      if (! heaps[i][j].isMarked())
        obj_free(&heaps[i][j]);
    }
  }

> 落ちたのがGCの中でなければ,その時参照していたオブジェクト
> (またはその上流)のオブジェクトの保護忘れの可能性が高いです.

  これはスクリプトのどこで落ちたかが分かる場合ですよね。見当がつけばなんと
かなります。


> GCの中の場合で落ちた場合には少々厄介で,gc_mark()を何段階か
> 遡って当たりをつける必要があります.

  こっちの場合は、heaps から辿っている場合ですよね。これは結構ハマる。
この場合には i,j をキーにしたテーブルとはみなせないかしら。


> Cのスタック領域は「なにがポインタでなにが整数であるか」の情
> 報が存在しないので,「とりあえず全部ポインタとみなし,heapの
> 中を指しているものはオブジェクトの参照ということにする」とい
> う方針になっています.このようなGCを保守的なGC(Conservative
> GC)と呼びます.

  保守的なGC というのはたまに耳にしますが、そういう意味でしたか。
# 革新的なGC は全てを整数とみなすのだろうか ← それじゃ役に立たないぞ ^^;


> フリーでない場合には…私とコンサルティング契約を結ぶと言うの
> はどうでしょう? お安くしておきます.^^;;;

  業務で ruby を扱える日が来るといいのですが :)
# 趣味で作るのは全部フリーなので


In This Thread