diff paper/cbc.tex @ 18:415fa6d79d00

Add GearsOS description
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Fri, 20 Jan 2017 14:39:45 +0900
parents db2909ab202d
children 34de798b11c3
line wrap: on
line diff
--- a/paper/cbc.tex	Fri Jan 20 12:40:43 2017 +0900
+++ b/paper/cbc.tex	Fri Jan 20 14:39:45 2017 +0900
@@ -98,9 +98,9 @@
 
 % }}}
 
+% {{{ Continuation based C におけるメタ計算の例: GearsOS
 \section{Continuation based C におけるメタ計算の例: GearsOS}
 CbC におけるメタ計算は軽量継続を行なう際に Meta CodeSegment を挟むことで実現できる。
-
 CbC を用いてメタ計算を実現した例として、GearsOS\cite{weko_142108_1}が存在する。
 GearsOS とはマルチコアCPUやGPU環境での動作を対象としたOSであり、現在OSの設計と並列処理部分の実装が行なわれている。
 現在存在するメタ計算としてメモリの確保と割り当て、並列に書き込むことが可能な Synchronized Queue、データの保存に用いる非破壊赤黒木がある。
@@ -111,5 +111,58 @@
 通常 GPU でデータの処理を行なう場合はデータの転送、転送終了を同期で確認、 kernel 実行、kernel の終了を同期で確認する、という手順が必要である。
 CPU/GPU での処理をメタ計算で行なうことにより、ノーマルレベルでは CodeGear が実行されるデバイスや DataGear の位置を意識する必要が無いというメリットがある。
 
+GearsOS においては軽量継続の呼び出し部分もメタ計算として実現されている。
+ある CodeGear から次の CodeGear へと継続する際には、次に実行される CodeGear の名前を指定する。
+その名前を Meta CodeGear が解釈し、対応する CodeGear へと処理を引き渡す。
+これは従来の OS の Dynamic Loading Libary や Command の呼び出しに相当する。
+CodeGear と名前の対応は Meta DataGear に格納されており、従来の OS の Process  や Thread に相当する。
+
+具体的には Meta DataGear には以下のようなものが格納される。
+
+\begin{itemize}
+    \item DataGear の型情報
+    \item DataGear を格納するメモリの情報
+    \item CodeGear の名前と CodeGear の関数ポインタ との対応表
+    \item CodeGear が参照する DataGear へのポインタ
+\end{itemize}
+
+実際の GearsOS におけるメモリ管理を含むメタ計算用の Meta DataGear の定義例をリスト\ref{src:context}に示す。
+Meta DataGear は Context という名前の構造体で定義されている。
+
+\lstinputlisting[label=src:context, caption=GearsOS における Meta DataGearの定義例] {src/context.h}
+
+\begin{itemize}
+    \item DataGear の型情報
+
+        DataGear は構造体を用いて定義する(リスト\ref{src:context} 27-46行)。
+        Tree や Node、 Allocate 構造体が DataGear に相当する。
+        メタ計算は任意の DataGear 扱うために全ての DataGear を扱える必要がある。
+        全ての DataGear の共用体を定義することで、 DataGear を一律に扱うことができる(リスト\ref{src:context} 26-47行)。
+        メモリを確保する場合はこの型情報からサイズを決定する。
+
+    \item DataGear を格納するメモリの情報
+
+        メモリ領域の管理は、事前に領域を確保した後、必要に応じてその領域を割り当てることで実現する。
+        そのために Context は割り当て済みの領域 heap と、割り当てた DataGear の数 dataNum を持つ。
+
+    \item CodeGear の名前と CodeGear の関数ポインタ との対応表
+
+        CodeGear の名前と CodeGear の関数ポインタの対応は enum と関数ポインタによって実現されている。
+        CodeGear の名前は enum (リスト\ref{src:context} 5-9行) で定義され、コンパイル後には整数へと変換される。
+        プログラム全体で利用する CodeGear は code フィールドに格納されており、enum を用いてアクセスする。
+        この対応表を動的に変更することにより、実行時に比較ルーチンなどを変更することが可能になる。
+
+
+    \item CodeGear が参照する DataGear へのポインタ
+
+        Meta CodeGear は Context を引数に取る CodeGear として定義されている。
+        そのため、Meta CodeGear が DataGear の値を使う為には Context から DataGear を取り出す必要がある。
+        取り出す必要がある DataGear は enum を用いて定義し(リスト\ref{src:context} 11-14行)、 CodeGear を実行する際に data フィールドから取り出す。
+        なお、この Context から DataGear を取り出す Meta CodeSegment を stub と呼ぶ。
+\end{itemize}
+
+% }}}
+
+
 \section{メタ計算ライブラリ akasha を用いた赤黒木の実装の検証}