K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[1372] Re:関数の再起について
投稿者:
2009/06/22 19:06:01

>すみません、いまいちよくわからないです。関数呼び出しのたびにVM起動して >いるわけではないですよね? そうだった、VMが違うものでした。簡単にVMの構造を説明します。 ↓AP管理からVMとして起動される -------------------------------------- |      VM管理システム      | --------------------------------------  ↓     ・・・       ↓    ------    ------    |   |    |   |    | V |    | V |    | M |    ・・・     | M |    | 実 |    | 実 |    | 行 |    | 行 |    | 部 |    | 部 |    |   |    |   |    ------    ------  VMは上記のような構造をしています。VM管理システムは1つのスレッドで、VM実行 部のスレッド実行管理と各種サービスを提供します。機能は、  ・マルチスレッドでVM実行部の起動・停止・廃棄等の実行管理  ・動的コンパイルの管理、関数の管理  ・タイムスケジュールの管理(タイマーキューの生成と管理)  ・スレッドの実行優先順位管理(キューに優先順位がありその管理)  ・メッセージキューの管理(スレッドの実行はキューによって行われる)  ・グローバル変数の管理  ・その他各種IOや外部機能インターフェースの管理  ・言語のデバック機能  ・上記サービスをスレッドセーフで提供するための排他制御管理 等のいろいろな機能があり、それなりに大きなプログラムです。  それに対し、VM実行部は純粋にバイトコードを実行する以外何の機能も持っていま せん。VM実行部は1つのクラスで、そのオブジェクト一つが1スレッドになり、マルチ スレッドが実行可能であり、VM実行部が再起実行しても問題の無い仕様です。 そして、出来る限り単純で最小になるように作られています。  で^^;、最初に組込み関数部分を作りましたが、その時組込み関数から言語内の関数 を自由に起動したり廃棄したり、スレッド起動したり出来るように作ったので、それを 実行する一番いい方法はVM実行部の再起的実行でした。その後言語内の関数実行部を 作ったのですが。そのまま、再起で実行する部分を使って組み込んだために、関数実行 はVM実行部の再起になっています。今思えば別に再起しなくても良かったかな。^^;  今の実装の欠点は、VMのスタックを消費することと、ほんの少しのオーバーヘッド。 今の方法の利点は関数実行や管理が一元管理されて、プログラム的にすっきりしている。 かな、う~~んどうしようか、当面このままでいこうと思います。既に出来てしまっ てるし。スタックを増やさない限り再起が450回しか出来ない欠点はあるけど。 >なお、現在はDiksamはシングルスレッドですが、スレッドを分けるなら、 >VMのスタックも分離する必要があると考えています。 こちらも、1スレッドおきにスタック領域が作られます。そのためスタック領域はあまり 大きくしたくなっかったので。 ちなみにVM実行部の起動は S_Func_Val * CL_VMexe::execute(CL_Function *sfp,int stackp); 引数は関数情報と戻りスタックポインターです。ローカル変数をスタックに作成後すぐに S_Func_Val * CL_VMexe::execute_code(); のコード実行部が呼ばれる単純な構造です。
[この投稿を含むスレッドを表示] [この投稿を削除]