Context Separation

MT-Eusは、それぞれのスレッドに対し個別にスタックと環境を配置する。 そのため、他のスレッドと独立に実行することができる。 symbolやconsのようなオブジェクトは、これまでのEuslispのように 共有ヒープメモリ上に配置される。 したがって、block labelやcatch tagやローカル変数のような スレッドの個別データは、他のスレッドから保護される。 ところが、グローバル変数によって示される値(オブジェクト)は、 情報の変更が許可されているすべてのスレッドから見ることができる。

Figure: Solarisオペレーティングシステムのスレッドモデル
\begin{figure}\begin{center}
\epsfile{file=fig/threadfig.ps,width=130mm}
\end{center}\end{figure}

環境はC-stackとbinding-stackおよびlambda, block, catch, let, flet などのローカルブロックに繋がるフレームポインタにより構成されており、 新しいスレッドが作成されたときに設置される。 複数の環境が本当のマルチプロセッサマシンの上で同時に 動作できるので、グローバル変数の中の現在の環境に対して単一なポインタ を持つことができない。 むしろ、環境のポインタを最上位の評価から低レベルのメモリ管理に変換するために、 すべての内部関数にもう一つ引き数を付け加えなければならない。



2016-04-05