comparison paper/gearsOS.tex @ 5:9efc9009838d

Add stub Code Gear session
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Thu, 18 Jan 2018 03:43:44 +0900 (2018-01-17)
parents 86340b0bf212
children a0f9def49535
comparison
equal deleted inserted replaced
4:7df8596223fb 5:9efc9009838d
1 \chapter{Gears OS} 1 \chapter{Gears OS の概念}
2 Gears OS は信頼性をノーマルレベルの計算に対して保証し、拡張性をメタレベルの計算で実現することを目標に開発している OSである。
3
4 Gears OS は処理の単位を Code Gear、データの単位を Data Gear と呼ばれる単位でプログラムを構成する。
5 信頼性や拡張性はメタ計算として、通常の計算とは区別して記述する。
6
7 本章では Gears OS を構成する様々な要素について説明する。
8
2 \section{Code GearとData Gear} 9 \section{Code GearとData Gear}
3 Gears OS はプログラムとデータの単位として Gear を用いる。 10 Gears OS はプログラムとデータの単位として Gear を用いる。
4 Gear は並列実行の単位、データの分割、Gear 間の接続等になる。 11 Gear は並列実行の単位、データの分割、Gear 間の接続等になる。
5 12
6 Code Gear はプログラムの処理そのもので、\figref{cdg1} で示しているように任意の数の Input Data Gear を参照し、処理が完了すると任意の数の Output Data Gear に書き込む。 13 Code Gear はプログラムの処理そのもので、\figref{cdg1} で示しているように任意の数の Input Data Gear を参照し、処理が完了すると任意の数の Output Data Gear に書き込む。
23 \end{figure} 30 \end{figure}
24 31
25 \section{Continuation based C} 32 \section{Continuation based C}
26 Gears OS の実装は本研究室で開発されているCbC (Continuation based C) を用いて行う。 33 Gears OS の実装は本研究室で開発されているCbC (Continuation based C) を用いて行う。
27 CbC は Code Gear を基本的な処理単位として記述できるプログラミング言語である。 34 CbC は Code Gear を基本的な処理単位として記述できるプログラミング言語である。
35 CbC の処理系として llvm/clang\cite{kaito-lola} と gcc\cite{nobu-prosym} による実装などが存在する。
28 36
29 CbC の記述例を\coderef{cg1}に, 実際にこのソースコードが実行される際の遷移を\figref{cg1}に示す。 37 CbC の記述例を\coderef{cg1}に, 実際にこのソースコードが実行される際の遷移を\figref{cg1}に示す。
30 CbC の Code Gear は \_\_code という型を持つ関数として記述する。 38 CbC の Code Gear は \_\_code という型を持つ関数として記述する。
31 Code Gear は継続で次の Code Gear に遷移する性質上、関数とは違い戻り値は持たない。 39 Code Gear は継続で次の Code Gear に遷移する性質上、関数とは違い戻り値は持たない。
32 そのため、\_\_code は Code Gear の戻り値ではなく、Code Gear であることを示すフラグとなっている。 40 そのため、\_\_code は Code Gear の戻り値ではなく、Code Gear であることを示すフラグとなっている。
49 57
50 \section{メタ計算} 58 \section{メタ計算}
51 プログラムの記述する際は、ノーマルレベルの計算の他に、メモリ管理、スレッド管理、CPUがGPUの資源管理等を記述しなければならない処理が存在する。 59 プログラムの記述する際は、ノーマルレベルの計算の他に、メモリ管理、スレッド管理、CPUがGPUの資源管理等を記述しなければならない処理が存在する。
52 これらの計算はノーマルレベルの計算と区別してメタ計算と呼ぶ。 60 これらの計算はノーマルレベルの計算と区別してメタ計算と呼ぶ。
53 61
54 メタ計算は関数型言語では Monad を用いて表現される。 62 メタ計算は関数型言語では Monad\cite{moggi-monad} を用いて表現される。
55 Monad は Haskell では実行時の環境を記述する構文として使われる。 63 Monad は Haskell では実行時の環境を記述する構文として使われる。
56 64
57 従来の OS では、メタ計算はシステムコールやライブラリーコールの単位で行われる。 65 従来の OS では、メタ計算はシステムコールやライブラリーコールの単位で行われる。
58 実行時にメタ計算の変更を行う場合には OS 内部のパラメータの変更を使用し、実行されるユーザープログラム自体への変更は限定的である。 66 実行時にメタ計算の変更を行う場合には OS 内部のパラメータの変更を使用し、実行されるユーザープログラム自体への変更は限定的である。
59 しかし、メタ計算は性能測定あるいはプログラム検証、さらに並列分散計算のチューニングなど細かい処理が必要で実際のシステムコール単位では不十分である。 67 しかし、メタ計算は性能測定あるいはプログラム検証、さらに並列分散計算のチューニングなど細かい処理が必要で実際のシステムコール単位では不十分である。
114 Interface は使用される Data Gear の定義と、それに対する操作を行う Code Gear の集合を表現する Data Gear である。 122 Interface は使用される Data Gear の定義と、それに対する操作を行う Code Gear の集合を表現する Data Gear である。
115 Interface には複数の実装を持つことができ、実装によって実行する Code Gear を切り替えることが可能になる。 123 Interface には複数の実装を持つことができ、実装によって実行する Code Gear を切り替えることが可能になる。
116 124
117 Queue の Interface を \coderef{queueInterface} に示す。 125 Queue の Interface を \coderef{queueInterface} に示す。
118 Interface は API となる Code Gear を \_\_code として 定義(\coderef{queueInterface} 6-9行目)する。 126 Interface は API となる Code Gear を \_\_code として 定義(\coderef{queueInterface} 6-9行目)する。
119 この \_\_code 実体は Code Gear への番号が格納される変数であり、Interface の実装毎に値は変化する。 127 この \_\_code の実体は Code Gear への番号が格納される変数であり、Interface の実装毎に値は変化する。
120 128
121 \lstinputlisting[caption=QueueのInterface, label=code:queueInterface]{./src/queueInterface.h} 129 \lstinputlisting[caption=QueueのInterface, label=code:queueInterface]{./src/queueInterface.h}
122 130
123 \coderef{singleLinkedQueue} は Queue Interface を用いた SingleLinkedQueue の実装である。 131 \coderef{singleLinkedQueue} は Queue Interface を用いた SingleLinkedQueue の実装である。
124 createSingleLinkedQueue(\coderef{singleLinkedQueue} 3-14 行目) は Queue Interface を実装した Data Gear の生成を行っている関数であり、 データ構造の初期化と実装した Code Gear の番号(enum)を Queue Interface で定義している Code Gear を示す変数に入れる(\coderef{singleLinkedQueue} 9-12行目)。 132 createSingleLinkedQueue(\coderef{singleLinkedQueue} 3-14 行目) は Queue Interface を実装した Data Gear の生成を行っている関数であり、 データ構造の初期化と実装した Code Gear の番号(enum)を Queue Interface で定義している Code Gear を示す変数に入れる(\coderef{singleLinkedQueue} 9-12行目)。
125 133
126 \lstinputlisting[caption=SingleLinkedQueue の実装, label=code:singleLinkedQueue]{./src/singleLinkedQueue.cbc} 134 \lstinputlisting[caption=SingleLinkedQueue の実装, label=code:singleLinkedQueue]{./src/singleLinkedQueue.cbc}
127 135
128 Interface での Code Gear 呼び出しは ``goto interface->method'' という構文で行う。 136 Interface での Code Gear 呼び出しは ``goto interface-\textgreater method'' という構文で行う。
129 ここの interface は createSingleLinkedQueue(\coderef{singleLinkedQueue} 3-14 行目) 等で初期化を行った Interface へのポインタ、method は実装した Code Gear の番号になる。 137 ここの interface は createSingleLinkedQueue(\coderef{singleLinkedQueue} 3-14 行目) 等で初期化を行った Interface へのポインタ、method は実装した Code Gear の番号になる。
130 138
131 \coderef{singleLinkedQueueTest} に Queue Interface を使用した Code Gearの呼び出し例を示す。 139 \coderef{singleLinkedQueueTest} に Queue Interface を使用した Code Gearの呼び出し例を示す。
132 この呼び出しでは SingleLinkedQueue の put 実装に継続される。 140 この呼び出しでは SingleLinkedQueue の put 実装に接続される。
133 141
134 \lstinputlisting[caption=Queue Interface での Code Gear の呼び出し, label=code:singleLinkedQueueTest]{./src/singleLinkedQueueTest.cbc} 142 \lstinputlisting[caption=Queue Interface での Code Gear の呼び出し, label=code:singleLinkedQueueTest]{./src/singleLinkedQueueTest.cbc}
135 143
136 \coderef{singleLinkedQueueTest} は実際にはスクリプトによって \coderef{singleLinkedQueueTest_script} に変換されコンパイルされる。 144 \coderef{singleLinkedQueueTest} は実際にはスクリプトによって \coderef{singleLinkedQueueTest_script} に変換されコンパイルされる。
137 \coderef{singleLinkedQueueTest_script} 内の Gearef マクロは Context から Interface の引数格納用の Data Gear を取り出す。 145 \coderef{singleLinkedQueueTest_script} 内の Gearef マクロは Context から Interface の引数格納用の Data Gear を取り出す。
138 この引数格納用の Data Gear は Context の初期化の際に生成される。 146 この引数格納用の Data Gear は Context の初期化の際に生成される。
139 引数格納用の Data Gear を取り出した後は変換前の呼び出しの引数を Interface で定義した Code Gear の引数情報に合わせて格納し、 指定した Code Gear に継続する。 147 引数格納用の Data Gear を取り出した後は変換前の呼び出しの引数を Interface で定義した Code Gear の引数情報に合わせて格納し、指定した Code Gear に接続する。
140 148
141 \lstinputlisting[caption=スクリプトによる変換後, label=code:singleLinkedQueueTest_script]{./src/singleLinkedQueueTest_script.cbc} 149 \lstinputlisting[caption=スクリプトによる変換後, label=code:singleLinkedQueueTest_script]{./src/singleLinkedQueueTest_script.cbc}
142 150
143 \section {stub Code Gear} 151 \section {stub Code Gear}
152 stub Code Gear は Code Gear の接続の間に挟まれる Meta Code Gear である。
153 ノーマルレベルの Code Gear から Meta Data Gear である Context を直接参照してしまうと、ユーザがメタ計算をノーマルレベルで自由に記述できてしまい、メタ計算を分離した意味がなくなってしまう。
154 stub Code Gear はこの問題を防ぐため、 Context から必要な Data Gear のみを ノーマルレベルの Code Gear に渡す処理を行っている。
155
156 \coderef{stubCodeGear} に stub Code Gear の例を示す。
157 stub Code Gear は使用される全ての Code Gear 毎に記述する必要がある。
158 しかし、全ての Code Gear に対して stub Code Gear を記述するのは膨大な記述量になってしまうため、基本的にはスクリプトで自動生成する。
159
160 \lstinputlisting[caption=stub Code Gear, label=code:stubCodeGear]{./src/stubCodeGear.cbc}
161
162 stub Code Gear はユーザーが自前で記述することも可能である。
163 つまり、ユーザーがメタ計算を記述することができる。
164 stub Code Gear を用いたメタ計算の例として、本来 stub Code Gear は対応した Code Gear に接続するが、自前で stub Code Gear を記述することで、接続先を柔軟に変更できる。