[1384] マルチスレッドの仕組み
投稿者:山
2009/07/16 00:59:49
下図に示すように、ダミーmainで1スレッド、システム管理で1スレッド
VMスレッドが20、トータル22スレッドが動きます、VMが20がいいのか10が
いいのかは、今後の調査により決まると思います。 実際の動作はVMの一つ
が言語のmain関数が占有します。main関数が終了すると、サブのVMは強制
終了されます。だから、実際に作業するのは残りの19VMスレッドで処理が
自由に割り振られます。優先順位に従い、空いたVMから処理が行われます。
だから、言語上のスレッドはある時はVM3で実行しても次は空いていたVM12
が実行します。この構造が出来たことにより、普通の関数起動と同じよう
な負荷でスレッドが起動できる軽いシステムになりました。
ちなみにVMの待ち状態は、極微小の負荷しかありません。
ダミーmainは、アプリケーションの各種表示処理の担当に使います。
このシステムが出来たので言語上のファイバーは、比較的簡単に実装
できます。そのときの実行負荷も軽いです。
ダミーmain システム管理
----- ----------------------------------------
| | スレ起動 | |
| | -> | |
----- ----------------------------------------
↓ ↓ VMスレッド起動 ↓
------------------ -------- --------
| | | | | |
----------| 言 | | V | VMスレッド | V |
↓ | 語 | | M | 20個が常に | M |
-------- | 管 | | 0 | 起動し | 1 |
| コ | | 理 | | 0 | キュー待ち | 9 |
| ン | | | | | | |
| パ | | | | | | |
| イ | | | | | | |
| ラ | | | | | | |
-------- -------- -------- --------
-----------------------------
↓
上の構造が実行した場合の、トレース情報。
デバック用にVMは5個起動しています。
このトレースではVM1がmainスレッドに割り当てられています。
↓
-----------------------------
2:### ダミーmain開始-----
2:### CL_systemスレッド 開始
2:### システム開始-----
2:### 組込み関数登録処理開始-----
2:### 組込み関数登録処理終了-----
2:### CL_VMexeスレッド 開始
2:スレッドRUN開始 vmid=0
2:### CL_VMexeスレッド 開始
2:スレッドRUN開始 vmid=1
2:### CL_VMexeスレッド 開始
2:スレッドRUN開始 vmid=2
2:### CL_VMexeスレッド 開始
2:スレッドRUN開始 vmid=3
2:### CL_VMexeスレッド 開始
2:スレッドRUN開始 vmid=4
2:### コンパイル初期化処理開始-----
2:### コンパイル開始-----
2:### コンパイル終了-----
2:### コンパイルの総てのリソースを開放-----
2:キュー処理開始 vm=1 procid=0 Qid=1 p1=999
2:キュー処理開始 vm=2 procid=1 Qid=1 p1=6
2:キュー処理開始 vm=3 procid=2 Qid=1 p1=5
2:キュー処理開始 vm=0 procid=3 Qid=1 p1=4
2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1
2:キュー処理開始 vm=2 procid=2 Qid=2 p1=1
2:キュー処理開始 vm=3 procid=3 Qid=2 p1=1
2:キュー処理開始 vm=0 procid=1 Qid=2 p1=1
2:キュー処理開始 vm=4 procid=2 Qid=2 p1=1
2:キュー処理開始 vm=3 procid=3 Qid=2 p1=1
2:キュー処理開始 vm=2 procid=1 Qid=2 p1=1
2:キュー処理開始 vm=4 procid=2 Qid=2 p1=1
2:キュー処理開始 vm=3 procid=3 Qid=2 p1=1
2:キュー処理開始 vm=0 procid=1 Qid=2 p1=1
2:キュー処理開始 vm=2 procid=2 Qid=2 p1=1
2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1
2:キュー処理開始 vm=0 procid=3 Qid=2 p1=1
2:キュー処理開始 vm=3 procid=2 Qid=2 p1=1
2:キュー処理開始 vm=2 procid=1 Qid=2 p1=1
2:スレッドRUN終了 vmid=1
2:スレッドRUN終了 vmid=4
2:スレッドRUN終了 vmid=0
2:スレッドRUN終了 vmid=2
2:スレッドRUN終了 vmid=3
2:### CL_VMexeスレッド 終了
2:### CL_VMexeスレッドハンドルをクローズしました
2:### CL_VMexeスレッド 終了
2:### CL_VMexeスレッドハンドルをクローズしました
2:### CL_VMexeスレッド 終了
2:### CL_VMexeスレッドハンドルをクローズしました
2:### CL_VMexeスレッド 終了
2:### CL_VMexeスレッドハンドルをクローズしました
2:### CL_VMexeスレッド 終了
2:### CL_VMexeスレッドハンドルをクローズしました
2:#debugMsg 残っているメモリーを開放 66 66
2:#debugMsg 残っている配列メモリーを開放 26 26
2:### システム終了-----
2:### CL_systemスレッド 終了
2:### CL_systemスレッドハンドルをクローズしました
2:### ダミーmain終了-----