Re: realtime GC (Re: GC Re: LISPを ...)
Hideki Kato <katoh@pop12.odn.ne.jp> writes:
> >「データ構造が固定」は強すぎるかも知れませんが、
> >「データ量の上限が固定」だと現実的ですよね。
>
> う,実はそれも難しいんですよね.LISP で書いたエキスパートシステムの
> 類で展開されるノード数の最大値なんて...単純に(ワーストケースを)
> 求めたら非現実的な値(まず間違いなく指数関数オーダー)になるだろう
> し...とは言え,それを前提にしないことには具体的な話ができないの
> も,また確か.
> #だからC(か FORTRAN)で作ろう,って話になってしまう...言語の問
> #題じゃないんだけど...
ふむ。「CやFortranでエキスパートシステムを書くと、ノード数の上限が決ま
る」んでしょうかね。それとも「エキスパートシステムを使うのはあきらめる。
そうするとLispを使う価値もなくなる。」ってことですかね。
> >(1) cons1回あたり(可変長の場合は、1バイトあたり)どのくらいの時間がかかっ
> > て良いかという、許容できる上限値を決める。
> >(2) それを満たすように、cons1回あたりの仕事量のパラメータを調節する。
> > (これは、比例定数を実機で測っておけば済むはずです。)
> >(3) その後、扱う(生きている)データ量の最大値と、実装されているメモリの
> > 比率から、いつ(たとえば空き領域の残りが何%になったとき)GCを始めれ
> > ば良いかのが決まる。
>
> 残念ながら実機は固定できません.市販ソフトウェアですから,どんなハー
> ド上で使われる事になるかは,売る方の与り知らぬところです.
> #起動時にベンチマークでも測るか...?
> #それでも他のタスクが有ったら...とか考えると,専用機というか,
> #ハードと組でシステムとしてしか売れなくなっちゃうわけで...これも
> #困る.
(1)「許容できる停止時間の上限値」は良いですよね。
(2)起動時に比例定数を測るのは簡単にできると思います。BogoMipsみたいな
もんですね。
(3)実装されているメモリ量(あるいはヒープに使って良いメモリの最大値)も
実行時に知る手段が何かありますよね。なければ、インストール時や起動
時に設定してもらえば良い(Java VMみたいに既定値を決めても良い)。
だから、どんなハードでもいちおう問題はないんじゃないですか?
あとは「生きているデータ量の最大値」ですが、これは「最大メモリ量の××
%以下」という仕様にしておけば良いですよね。それを越えるとエラー(下記参
照)。
> >たとえば、
> >「実時間制約(割り付けにどのくらい時間がかかって良いか)」
> >「生きているデータ量の最大値」
> >「ヒープサイズ」
> >をパラメタで渡すと、後はシステムが自動でチューニングしてくれる(制約を
> >満たす限り、なるべくGCを止めておくよう最適化するとか、あるいは停止時間
> >をなるべく均一になるよう最適化するとか)としたらどうでしょう。これなら
> >acceptableでしょうか?
>
> 上にも書いたとおり二番目が難しいんでねぇ...量だけなら仮想記憶にす
> るとか(今はメモリも安いから)目一杯実装するという手もあるんです
> が...
たとえば
gc_init(time_in_ms, max_data_bytes, heap_bytes);
と初期化するとしましょう。で、この条件で間に合わなければ初期化の時点で
エラーになったり、GCの途中で(max_data_bytesを越えると)警告が出たりエラー
になったりするとします。
このときのmax_data_bytesが決められないということですね?
しかし、
・「メモリが足りること」というのは、ソフトがハード側に要求するスペック
として当然の事項ですよね。与えられた仕事に対してメモリが足りなければ
(あるいは逆に言うとメモリに対してデータが多過ぎれば)エラーにするしか
ありませんよね。
・「生きているデータ量 +α」の *実*メモリ量は、*どんな言語でも* リア
ルタイム処理のために必須ですよね。プラスαのぶんは、Lispだと少し多く
なっちゃうかも知れないけど。
・リアルタイム処理の場合、デッドラインをミスしたらエラーですから、間に
合わない量しか「実」メモリがなければエラーにするしかありませんよね。
・逆に言うと、実メモリ量が決まると、ある量のデータまでしか扱えない、そ
れを越えたらエラーにするしかありませんよね。
そうすると最大値は(絶対量でなく)パーセンテージから計算して
gc_init(time_in_ms, heap_bytes * 0.70, heap_bytes);
のように与えれば良いのでは? で、heap_bytes * 0.70を越える量を使うと
「データ量が多過ぎてリアルタイム性が満たせません」という警告あるいはエ
ラーが出る。
> #それに,そんな事を気にしなくて済むのが LISP を使う利点の一つではな
> #かったかな,とも思ったり.
気にしなくてもかまわない(実メモリに収まらなくても、仮想記憶が足りれば
良い)場合に、気にしない使い方ができるのは利点かも知れません。
しかし、
・どんな言語であろうと実メモリ量を気にせざるを得ない場合(リアルタイム
処理)で、
・Lispだけ他の言語と違って「気にせずに書く」ということにして、
・その結果Lispだけ「リアルタイム処理には使えない」という結論にされてし
まう
のはフェアじゃないと思います。それはダブルスタンダードというものです。
他の言語でデータ量を考慮して書くことが必須な場合は、Lispででもデータ量
を考慮して書いて比べて下さい。
前田敦司
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735