K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>>すみません、いまいちよくわからないです。関数呼び出しのたびに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(); > >のコード実行部が呼ばれる単純な構造です。
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!