メモリ管理

EusLispは、すべての型のオブジェクトに対して単一のヒープの中で フィボナッチバディを用いたメモリ管理方法を採用している。 異なったメモリ要求を持つプログラムを実行した後、 フィボナッチバディが様々な大きさのオブジェクトを等しく高速に配置することができ、コピーなしに素早くガーベージコレクトができ、 かつ、高いメモリ利用率(内部損失が10〜15%で外部損失は無視できる) を示すことを確信した。 マルチスレッドのためには、2つ目のポイントすなわちコピーなしの ガーベージコレクトが重要である。 もし、オブジェクトのアドレスがガーベージコレクトのコピーにより 変化したならば、すべてのスレッド環境のスタックおよびCPUのレジスタ 内のポインタを新しいアドレスに書き換えなければならない。 しかし、この書き換えは不可能かあるいは大変困難である。

すべてのメモリ配置要求は、低レベルのalloc関数によって処理される。 allocは、mutex-lockingをする。なぜなら、大きさを持たないリストの グローバルデータベースを扱うからである。 ガーベージコレクトの始まる時期およびどのスレッドによってガーベージコレクトが 生じるのかを予言できないので、 すべてのスレッドは突発的に起こるガーベージコレクトのために 準備をしておかなければならない。 生きているオブジェクトへのすべてのポインタは、ゴミとして掃除されない ように保護するためいつでもガーベージコレクトからアクセスできるよう 調整されなければならない。 これは、スタックの上に保存されていることを信用する代わりに、 それぞれの環境の固定されたスロットの中に極最近に配置されたオブジェクトに 対するポインタを蓄積することによって達成される。

[*]は、スレッドのメモリ要求とforkされたガーベージコレクト 内部でのmarkingおよびsweepingを並列に行っている流れ図を示したものである。 メモリ要求およびポインタの処理を行わないスレッドはガーベージコレクトと並列に 実行することができ、信号処理や画像獲得のような低レベルのタスクの 実時間応答を改善することに注意すること。

Figure: 並列スレッドのメモリ要求とガーベージコレクトに並列実行
\begin{figure}\begin{center}
\epsfile{file=fig/parathreads.ps,width=120mm}
\end{center}\end{figure}



2016-04-05