Mercurial > hg > Papers > 2018 > parusu-master
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 を記述することで、接続先を柔軟に変更できる。 |