Mercurial > hg > Papers > 2018 > parusu-master
annotate paper/gearsOS.tex @ 126:d15c0f582bb7 default tip
Fix
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 01 Mar 2018 16:56:54 +0900 |
parents | 010151620371 |
children |
rev | line source |
---|---|
69 | 1 %TODO stub のこうで書きすぎ |
2 % context と stub はジェネラルな紹介だけ | |
3 | |
5
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
4 \chapter{Gears OS の概念} |
53
4bdffbb885fe
Update chapter1
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
5 Gears OS は信頼性をノーマルレベルの計算に対して保証し、拡張性をメタレベルの計算で実現することを目標に開発している OSである。 |
5
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
6 |
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
7 Gears OS は処理の単位を Code Gear、データの単位を Data Gear と呼ばれる単位でプログラムを構成する。 |
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
8 信頼性や拡張性はメタ計算として、通常の計算とは区別して記述する。 |
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
9 |
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
10 本章では Gears OS を構成する様々な要素について説明する。 |
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
11 |
2 | 12 \section{Code GearとData Gear} |
13 Gears OS はプログラムとデータの単位として Gear を用いる。 | |
14 Gear は並列実行の単位、データの分割、Gear 間の接続等になる。 | |
15 | |
3 | 16 Code Gear はプログラムの処理そのもので、\figref{cdg1} で示しているように任意の数の Input Data Gear を参照し、処理が完了すると任意の数の Output Data Gear に書き込む。 |
2 | 17 また、Code Gear は接続された Data Gear 以外には参照を行わない。 |
25 | 18 この Input / Output Data Gear の対応から依存関係を解決し、Code Gear の並列実行を可能とする。 |
2 | 19 |
20 Code Gear 間の移動は継続を用いて行われる。 | |
21 継続は関数呼び出しとは異なり、呼び出し元に戻らず、Code Gear 内で次の Code Gear への継続を行う。 | |
3 | 22 そのため Code Gear、Data Gear を使ったプログラミングは末尾再帰を強制したスタイルになる。 |
2 | 23 |
25 | 24 Gear の特徴として処理やデータの構造が Code Gear、Data Gear に閉じていることにある。 |
2 | 25 これにより、実行時間、メモリ使用量などを予想可能なものにする事が可能になる。 |
26 | |
27 \begin{figure}[htbp] | |
28 \begin{center} | |
3 | 29 \includegraphics[scale=0.6]{./fig/codegear-datagear.pdf} |
2 | 30 \end{center} |
3 | 31 \caption{Code Gear と Data Gear の関係} |
32 \label{fig:cdg1} | |
2 | 33 \end{figure} |
34 | |
22
82c09c49bb4a
Update interface
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
35 また Gears OS 自体もこの Code Gear、Data Gear を用いた CbC(Continuation based C) で実装される。 |
25 | 36 そのため、Gears OS の実装は Code Gear、Data Gear を用いたプログラミングスタイルの指標となる。 |
22
82c09c49bb4a
Update interface
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
37 |
2 | 38 \section{Continuation based C} |
16 | 39 Gears OS の実装は本研究室で開発されている CbC(Continuation based C) を用いて行う。 |
2 | 40 CbC は Code Gear を基本的な処理単位として記述できるプログラミング言語である。 |
121
010151620371
Fix Paper print
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
104
diff
changeset
|
41 CbC の処理系として LLVM\cite{llvm}/Clang と GCC による実装が存在する\cite{kaito-lola}\cite{nobu-prosym}。 |
2 | 42 |
25 | 43 CbC の記述例を\coderef{cg1}に、 実際にこのソースコードが実行される際の遷移を\figref{cg1}に示す。 |
2 | 44 CbC の Code Gear は \_\_code という型を持つ関数として記述する。 |
45 Code Gear は継続で次の Code Gear に遷移する性質上、関数とは違い戻り値は持たない。 | |
46 そのため、\_\_code は Code Gear の戻り値ではなく、Code Gear であることを示すフラグとなっている。 | |
16 | 47 Code Gear から次の Code Gear への遷移は goto 文による継続で処理を行い、次の Code Gear への引数として入出力を与える。 |
25 | 48 \coderef{cg1}内の goto cg1 (a+b); が継続にあたり、(a+b) がcg1 への入力になる。 |
2 | 49 |
104 | 50 \lstinputlisting[caption=Code Gearの軽量継続, label=code:cg1]{./src/cg1.cbc} |
2 | 51 |
16 | 52 CbC の goto 文による継続は Scheme のcall/ccといった継続と異なり、呼び出し元の環境を必要とせず、行き先を指定すれば良い。 |
3 | 53 この継続を軽量継続と呼ぶ。 |
54 \coderef{cg1} は cs0 から cs1 へ継続したあとには cs0 へ戻らずに処理を続ける。 | |
55 | |
2 | 56 \begin{figure}[htbp] |
57 \begin{center} | |
58 \includegraphics[scale=1.0]{./fig/goto.pdf} | |
59 \end{center} | |
16 | 60 \caption{goto 文による Code Gearの軽量継続} |
2 | 61 \label{fig:cg1} |
62 \end{figure} | |
63 | |
3 | 64 \section{メタ計算} |
65 プログラムの記述する際は、ノーマルレベルの計算の他に、メモリ管理、スレッド管理、CPUがGPUの資源管理等を記述しなければならない処理が存在する。 | |
66 これらの計算はノーマルレベルの計算と区別してメタ計算と呼ぶ。 | |
67 | |
30 | 68 メタ計算は関数型言語では Monad\cite{moggi-monad} を用いて表現される\cite{kkb-sigos}。 |
3 | 69 Monad は Haskell では実行時の環境を記述する構文として使われる。 |
70 | |
71 従来の OS では、メタ計算はシステムコールやライブラリーコールの単位で行われる。 | |
72 実行時にメタ計算の変更を行う場合には OS 内部のパラメータの変更を使用し、実行されるユーザープログラム自体への変更は限定的である。 | |
73 しかし、メタ計算は性能測定あるいはプログラム検証、さらに並列分散計算のチューニングなど細かい処理が必要で実際のシステムコール単位では不十分である。 | |
74 例えば、モデル検査ではアセンブラあるいは バイトコード、インタプリタレベルでのメタ計算が必要になる。 | |
75 しかし、バイトコードレベルでは 粒度が細かすぎて扱いが困難になっている。具体的にはメタ計算の実行時間が大きくなってしまう。 | |
76 | |
77 \section{Meta Gear} | |
78 Gears OS の Code Gear は関数に比べて細かく分割されているため、メタ計算をより柔軟に記述できる。 | |
79 Code Gear と Data Gear にはそれぞれメタ計算の区分として Meta Code Gear、Meta Data Gear が存在し、これらを用いてメタ計算を実装する。 | |
80 Meta Gear は 制限された Monad に相当し、型付きアセンブラよりは大きな表現単位を提供する。 | |
81 Haskell などの関数型プログラミング言語では実行環境が複雑であり、実行時の資源使用を明確にすることができないが、Gears OS を記述している CbC はスタック上に隠された環境を持たないので、メタ計算で使用する資源を明確にできる利点がある。 | |
82 Meta Code Gear は\figref{mcg1}に示すように通常の Code Gear の直後に遷移され、メタ計算を実行する。 | |
25 | 83 また、Meta Code Gear は、その階層からさらにメタ計算を記述することが可能である。 |
3 | 84 |
85 \begin{figure}[htbp] | |
86 \begin{center} | |
58 | 87 \includegraphics[scale=0.8]{./fig/meta_cg_dg.pdf} |
3 | 88 \end{center} |
89 \caption{Meta Code Gear の実行} | |
90 \label{fig:mcg1} | |
91 \end{figure} | |
2 | 92 |
93 \section{Context} | |
68 | 94 Context とは一連の実行で使用される Code Gear と Data Gear の集合である。 |
95 従来のスレッドやプロセスに対応する。 | |
3 | 96 Context は接続可能な Code/Data Gear のリスト、Data Gearを確保するメモリ空間、実行される Task への Code Gear等を持っている Meta Data Gearである。 |
97 Gears OS では Code Gear と Data Gear への接続を Context を通して行う。 | |
98 | |
99 \coderef{context} に Context の定義を示す。 | |
100 | |
101 \lstinputlisting[caption=Contextの定義, label=code:context]{./src/context.h} | |
102 | |
103 \coderef{context} は以下の内容を定義している。 | |
104 | |
105 \begin{itemize} | |
106 \item Code Gear の名前と関数ポインタとの対応表 | |
10 | 107 |
126 | 108 Code Gear の名前とポインタの対応は Context 内の code(\coderef{context} 5行目) に格納される。 |
3 | 109 code は全ての Code Gear を列挙した enum と関数ポインタの組で表現される。 |
110 Code Gear の名前は enum で定義され、コンパイル後には整数へと変換される。 | |
111 実際に Code Gear に接続する際は番号(enum)を指定することで接続を行う。 | |
112 これにより、メタ計算の実行時に接続する Code Gear を動的に切り替えることが可能となる。 | |
113 \item Data Gear の Allocation 用の情報 | |
10 | 114 |
3 | 115 Data Gear のメモリ空間は事前に領域を確保した後、必要に応じてその領域を割り当てることで実現する。 |
116 実際に Allocation する際は Context内の heap(\coderef{context} 8行目)を Data Gear のサイズ分インクリメントすることで実現する。 | |
117 \item Code Gear が参照する DataGear へのポインタ | |
10 | 118 |
22
82c09c49bb4a
Update interface
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
119 Allocation で生成した Data Gear へのポインタは番号を割り振り、Context 内のdata(\coderef{context} 6行目) に格納される。 |
82c09c49bb4a
Update interface
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
120 Code Gear は data から番号を指定して Data Gear へアクセスする。 |
3 | 121 \item 並列実行用の Task 情報 |
10 | 122 |
3 | 123 Context は 並列実行の Task も兼任するため、待っている Input Data Gear のカウンタ、Input/Output Data Gear が格納されている場所を示すインデックス、GPU での実行フラグ等を持っている(\coderef{context} 13-30行目)。 |
124 \item Data Gear の型情報 | |
10 | 125 |
3 | 126 Data Gear は構造体を用いて定義する(\coderef{context} 34-49行目)。Timer や TimerImplなどの構造体が Data Gear に相当する。 |
127 メタ計算では任意のData Gear を一律に扱うため、全ての Data Gear の共用体を定義する(\coderef{context} 33-51行目)。 | |
128 Data Gear を確保する際のサイズはこの型情報から決定する。 | |
129 \end{itemize} | |
130 | |
131 \section {stub Code Gear} | |
5
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
132 stub Code Gear は Code Gear の接続の間に挟まれる Meta Code Gear である。 |
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
133 ノーマルレベルの Code Gear から Meta Data Gear である Context を直接参照してしまうと、ユーザがメタ計算をノーマルレベルで自由に記述できてしまい、メタ計算を分離した意味がなくなってしまう。 |
25 | 134 stub Code Gear はこの問題を防ぐため、Context から必要な Data Gear のみを ノーマルレベルの Code Gear に渡す処理を行っている。 |
5
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
135 |
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
136 stub Code Gear は使用される全ての Code Gear 毎に記述する必要がある。 |
72
d4ced6adca5e
Move stub Interface Code Gear
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
70
diff
changeset
|
137 しかし、全ての Code Gear に対して stub Code Gear を記述するのは膨大な記述量になってしまうため、後述する Interface を実装した Code Gear のstub Code Gear はスクリプトで自動生成する。 |
5
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
138 |
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
139 stub Code Gear はユーザーが自前で記述することも可能である。 |
9efc9009838d
Add stub Code Gear session
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
140 つまり、ユーザーがメタ計算を記述することができる。 |
11 | 141 stub Code Gear を用いたメタ計算の例として、本来 stub Code Gear は対応した Code Gear に継続するが、自前で stub Code Gear を記述することで、継続先を柔軟に変更できる。 |