comparison paper/chapter/03-gears.tex @ 73:e1842c36937e

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Thu, 04 Feb 2021 15:39:15 +0900
parents 951cb9681030
children e6e62457048e
comparison
equal deleted inserted replaced
72:951cb9681030 73:e1842c36937e
146 これは処理系では特に使用していないキーワードであるが、 このClosureを持ち歩いていることを意識するために導入されている。 146 これは処理系では特に使用していないキーワードであるが、 このClosureを持ち歩いていることを意識するために導入されている。
147 147
148 148
149 149
150 \section{TaskManager} 150 \section{TaskManager}
151 TaskManagerはGearsOS上で実行されるTaskの管理を行う。
152 GearsOS上のTaskとはContextのことであり、 各Contextには自分の計算に必要なDataGearのカウンタなどが含まれている。
153 TaskManagerは、CodeGearの計算に必要な入力のDataGear(InputDataGear)が揃っているかの確認、揃っていなかったら待ち合わせを行う処理がある。
154 すべてのDataGearが揃った場合、 TaskをWorkerのQueueに通知しTaskを実行させる。
155 この処理はGearsOSを並列実行させる場合に必要な機能となっている。
156
151 TaskManagerは性質上シングルトンである。 157 TaskManagerは性質上シングルトンである。
152 その為、複数Workerを走らせた場合でも1全体で1つのみの値を持っていたいものはTaskManagerが握っている必要がある。 158 その為、複数Workerを走らせた場合でも1全体で1つのみの値を持っていたいものはTaskManagerが握っている必要がある。
153 例えばモデル検査用の状態保存用のデータベース情報は、 TaskManagerが所有している。 159 例えばモデル検査用の状態保存用のデータベース情報は、 TaskManagerが所有している。
160
161 \section{TaskQueue}
162 GearsOSのTaskQueueはSynchronizedQueueで表現されている。
163 TaskQueueはWorkerが利用するQueueとなっている。
164
165 WorkerのQueueは、TaskManagerに接続してTaskを送信するスレッドと、 Taskを実行するWorker自身のスレッドで扱われる。
166 さらにWorkerが複数走る可能性もある。
167 その為SynchronizedQueueは、マルチスレッドでもデータの一貫性を保証する必要がある。
168 GearsOSではCAS(Check and Set, Compare and Swap)を利用して実装が行われている。
154 169
155 \section{Worker} 170 \section{Worker}
156 WorkerはWorkerの初期化にスレッドを作る。 171 WorkerはWorkerの初期化にスレッドを作る。
157 GearsOSではスレッドごとにそれぞれContextが生成される。 172 GearsOSではスレッドごとにそれぞれContextが生成される。
158 Workerはスレッド作製後にContextの初期化APIを呼び出し、自分のフィールドにContextのアドレスを書き込む。 173 Workerはスレッド作製後にContextの初期化APIを呼び出し、自分のフィールドにContextのアドレスを書き込む。
184 このためenumで指定した場所に入っているunion Dataの具体的な型は、 enumと対応するDataGearになる。 199 このためenumで指定した場所に入っているunion Dataの具体的な型は、 enumと対応するDataGearになる。
185 contextのヒープにアロケートされたDataGearの場合は、 型情報を取得できるMetaDataGearにアクセスすると、なんの型であったかが分かる。 200 contextのヒープにアロケートされたDataGearの場合は、 型情報を取得できるMetaDataGearにアクセスすると、なんの型であったかが分かる。
186 201
187 Contextから取り出してきたunion DataからDataGearの型への変換はメタ計算で行われる。 202 Contextから取り出してきたunion DataからDataGearの型への変換はメタ計算で行われる。
188 GearsOSの場合は、計算したいCodeGearの直前で実行されるStubCodeGearで値のキャストが行われる。 203 GearsOSの場合は、計算したいCodeGearの直前で実行されるStubCodeGearで値のキャストが行われる。
204
205 \section{Interface}
206 GearsOSのモジュール化の仕組みとしてInterfaceがある。
207 InterfaceはCodeGearと各CodeGearで使う入出力のDataGearの集合である。
208 Interfaceに定義されているCodeGearは、各Interfaceが満たすこと期待するAPIである。
209 GearsOSに実装されているQueueのInterfaceの定義をソースコード\ref{src:queue}に示す。
210 \lstinputlisting[label=src:queue, caption=QueueのInterface]{src/queue.h}
211
212 Intefaceは仕様(Interface)と、実装(Implement, Impl)を別けて記述する。
213 Interfaceを呼び出す場合は、Interfaceに定義されたAPIに沿ってプログラミングをすることで、Implの内容を隠蔽することができる。
214 これによってメタ計算部分で実装を入れ替えつつInterfaceを使用したり、 ふるまいを変更することなく具体的な処理の内容のみを変更することが容易にできる。
215 これはJavaのInterface、Haskellの型クラスに相当する機能である。
216 GearsOSではStackやQueueがInterfaceとして定義済みであり、 SingleLinkedStackなどが実装として提供されている。
217 また、WorkerやTaskManagerもInterfaceであり、 コンストラクタを呼び出している箇所を切り替えれば様々な用途に応じたWorkerなどを呼び出すことが可能である。
218
219 \lstinputlisting[label=src:SingleLinkedQueueOld, caption=SingleLinkedQueueの実装]{src/SingleLinkedQueueOld.cbc}
220
221 Interface自身もDataGearであり、実際の定義はcontextのunion Data型に記述されている。
222
223 Interfaceで定義したCodeGearの出力は必ずDataGearでなければならない。
224 OutputDataGear自体はInteface自身のDataGearにメタレベルで書き込まれる。
225
226
189 \section{GearsOSのビルドシステム} 227 \section{GearsOSのビルドシステム}
190 GearsOSではビルドツールにCMakeを利用している。 228 GearsOSではビルドツールにCMakeを利用している。
191 ビルドフローを図\ref{fig:gearsbuild1}に示す。 229 ビルドフローを図\ref{fig:gearsbuild1}に示す。
192 CMakeはautomakeなどのMakeファイルを作成するツールに相当するものである。 230 CMakeはautomakeなどのMakeファイルを作成するツールに相当するものである。
193 GearsOSでプログラミングする際は、ビルドしたいプロジェクトで利用するソースコード群をCMakeの設定ファイルであるCMakeLists.txtに記述する。 231 GearsOSでプログラミングする際は、ビルドしたいプロジェクトで利用するソースコード群をCMakeの設定ファイルであるCMakeLists.txtに記述する。