Resource Sensitive Gaucheの略(仮)。
あとで名前を変更する可能性有り。
また、より良いプラットフォームがGauche以外にあった場合は、そっちに移行する可能性有り。
- 今のところ、Gauche以外の候補としては、Clojureがある。Clojureでは並行処理がやりやすいので、並行処理で後述の第一要求(時間制限機能)を達成できる反面、第二要求(メモリ使用量制限機能)の達成が非常に厳しいように思える。
概要/方針
- 個人的に必要な、リソース敏感な要素(後述)を、Gaucheに追加する。
- この機能は実行速度とトレードオフになる為、必要な人のみ利用できるように、Gauche構築時のコンパイルオプションで指定した場合のみ有効になるように実装する。
- gauche.rsのモジュール空間にインターフェースを置く(仮)。
- まともに動くようになったら、本家に取り込んでもらえないか聞いてみる。
- まずは「とりあえず動く」レベルのものを作り上げる。この時点では仕様が多少適当でもよい。そしてそれを使って「こんな事ができる」というのを再確認する。その後、しっかりした実装を行う。
要求
大きく分けて二つの要求がある。
- 「一定時間/一定ステップ数を指定して手続きを実行し、指定値以内に制御が戻ってこない場合は規定の動作を行う」という機能を特定ブロックでのみ使える機能
- この際の判定基準は実時間、cpu時間、GaucheのVMのステップ毎、どれでも実装しやすいものでよい。
- 無限ループ等による制御不帰と、(デッドロックや応答待ちによる)ブロックによる制御不帰の、どちらにも対応できる必要がある。
- 無限ループの方についてはVMのステップ毎の判定時等に例外もしくは継続もしくは手続き実行で対応できるが、ブロックの方はそうはできないので、何らかの工夫が必要になる。
- リエントラントである事が要求される。つまりこの機能はネストできる事。
- ネストした場合は、全てのブロック条件でタイムオーバーかどうかを調べる事。
- 安いコストで可能であれば、タイムオーバー時に継続を生成して、再試行できるとより良い(が必須の機能ではない)。
- 「一定メモリ量を指定して手続きを実行し、制御が戻ってくる前に指定値をオーバーした場合は規定の動作を行う」という機能を特定ブロックでのみ使える機能
- 簡易な実装なら、malloc時にフックを仕込むだけで実現はできそう。
- 但し、問題点があり、GCによってメモリが解放される際に、それがどこに所属していたメモリなのかを判定できないので、例えばループで確保→解放を繰り返した場合に指定値オーバーと判定されてしまう。これはよくない。
- 一応、メモリ解放時に、それがどこの所属であってもカウント値をマイナスしてもそれらしく機能はするが、誤判定する可能性は残る。が、とりあえず今はこの方針で実装する。正確な判定を行えるようにするのは将来とする。
仕様
あとで
実装
- 現在のところ、Gauche-0.9をベースに実装する。
続きはあとで
これとは直接関係ないが、個人的に必要となる機能
最終更新 : 2010/02/06 02:38:24 JST