view paper/text/gears.tex @ 3:82fe279ce2cd

add abstruct and summary
author Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
date Sat, 29 Jan 2022 20:27:16 +0900
parents 739159c6668d
children 48187f47422f
line wrap: on
line source

\chapter{GearsOS}
GearsOSは本研究室で開発しているCbCを用いて信頼性と拡張性の両立を目指したOS\cite{GearsOS}である。CbCと同様にCodeGearとDataGearを基本単位として実行し、ノーマルレベルの計算とメタレベルの計算の分離により信頼性を担保している。

GearsOSは様々な役割を持つCodeGearとDataGearで構成されている。本章では構成の中心となっているMetaDataGearや、モジュール化の仕組みとして導入されているInterfaceなどについて説明を行う。

\section{Context}
ContextとはGearsOSの計算に必要なCodeGearやDataGearを持つMetaDataGearであり、従来のOSにおけるプロセスやスレッドに対応する。Contextは使用可能なCodeGearとDataGearのリストや、TaskQueueへのポインタ、DataGearを格納するためのメモリ空間などを持っている。ソースコード\ref{src:def_context}がContextの定義である。

\lstinputlisting[label=src:def_context, caption=Contextの定義]{src/context.h}

ソースコード\ref{src:def_context}6行目のcodeがCodeGearを格納するための配列である。code配列へアクセスするためのindexは、ソースコード\ref{src:def_enumCode}で定義されるenumを用いる。このenumはGearsOSで用いるCodeGearを全て列挙しており、コンパイル時に一意な番号へと変換される。この番号と配列へ格納されるCodeGearのポインタが対応しているため、特定のCodeGearの取り出しは対応した番号をindexに指定することで実現する。

\lstinputlisting[label=src:def_enumCode, caption=CodeGearのenum]{src/enumCode.h}

ソースコード\ref{src:def_context}7行目のdataがDataGearを格納するための配列である。data配列はunion Data型であり、これは共用体によって定義されている。ソースコード\ref{src:def_unionData}にunion Dataの定義を示す。
union Data 共用体の中にAtomicやCPUWorkerなどのDataGearを構造体として定義を行っている。これは通常のC言語においては、struct Atomicとstruct CPUWorkerは当然別の型として判別される。しかしGearsOSのContextにおいてはAtomicもCPUWorkerもDataGearとして等しく扱う必要がある。そのため共用体を用いて汎用的なDataGear型であるunion Data型を定義することで任意のDataGearを一律に扱うことができる。

\lstinputlisting[label=src:def_unionData, caption=union Dataの定義]{src/unionData.h}

\section{Worker}
WorkerはTaskManagerからTaskを取り出し、TaskのCodeGearの実行を行う。実行後はOutputDataGearへ書き込みを行う。
Workerはまず生成時にスレッドを作成する。スレッド生成後はTaskManagerのTaskQueueからTaskを取得する。TaskはContextの形で表現されているため、WorkerのContextをTaskに入れ替えてTaskの次のCodeGearへと継続する。Task実行後はOutputDataGearの書き出しを行う。
WorkerはCodeGearの前後で呼び出されるため、CodeGearの前後の状態を記録することが可能である。また、Worker自体がInterfaceによって定義されているためコードを変更せずにWorkerの切り替えが可能である。そのためGearsDebuggerではデバッグ用Workerを定義し、デバッグ時に通常のWorkerからデバッグ用Workerへ切り替えることによってCodeGearの実行前後でデバッグ用Workerを呼び出してデバッグを行う。

\section{TaskManager}
\label{TaskManager}
TaskManagerはTaskを実行するWorkerの生成、管理、Taskの送信などを行う。GearsOSにおけるTaskはContextの形で表現されており、実行するCodeGear、計算に必要なInputDataGear、計算後に書き出すOutputDataGearの格納場所などの情報を持っている。
TaskManagerは、CodeGearの実行に必要なInputDataGearが揃っているか確認し、揃っていなければ待ち合わせを行い、揃った場合はTaskを送信し実行させる。

\section{TaskQueue}
Workerが利用するQueueでありSynchronizedQueueによって表現されている。SynchronizedQueueはマルチスレッドでもデータの一貫性を保証するQueueとなっており、データ更新時にCAS(Check And Set)を行う。CASは更新前のデータと更新後のデータを比較し、値が同じであればデータの競合がないとして更新に成功し、値が異なる場合は更新に失敗する。

\section{Interface}
GearsOSにおけるモジュール化の仕組みとしてInterfaceが導入されている。InterfaceはDataGearの定義と、そのDataGearに対しての操作(API)を行うCodeGearの集合である。Interfaceは仕様(Interface)と実装(Implement, Impl)の2つに分けて記述する。これによってAPIとなるCodeGearの実装を変えることで、同じCodeGear(API)だが別の処理を行うというようなことが実現できる。CodeGearとしては同じであるため、呼び出し元のコードを変更することなく、処理だけ変えることが可能である。