# HG changeset patch # User kkb # Date 1430732635 -32400 # Node ID 8eb14d83a1f2e713b9558171a0bca0d10ed51b00 # Parent 8e3bf4806e33e6039c1f137355cbf412db9bb4fe edit theory, design diff -r 8e3bf4806e33 -r 8eb14d83a1f2 paper/design.tex --- a/paper/design.tex Mon May 04 17:13:09 2015 +0900 +++ b/paper/design.tex Mon May 04 18:43:55 2015 +0900 @@ -1,10 +1,84 @@ -\section{設計} -\subsection{Code Segment} -Code Segment は C の関数とは異なり、返り値を持たない。 -処理が終われば、次の Code Segment に処理が移る。 -C において関数呼び出しを繰り返し行う場合、呼び出された関数の引数の数だけスタックに値が積まれていく。 -だが、返り値を持たない Code Segment ではスタックに値を積んでいく必要がなく、スタックは変更されない。 +% Theory +\section{Monad とメタ計算} +関数型言語では入力から出力を得る通常の計算の他にメタ計算と呼ばれるもの +がある。 +メタ計算の例として、失敗する可能性がある計算、並行処理、入出力などの副 +作用、メモリ管理などがある。 +メタ計算の理論的な表現として、Monad を用いることが Moggi らにより提案 +されている。 +GearsOS ではメタ計算を表現するのに、Monad と軽量継続を用いる。 + +Monad は関数が返す通常の値を含むデータ構造であり、メタ計算を表現するの +に必要な情報を格納している。 +失敗する可能性がある計算の場合は、計算が失敗したかどうかのフラグが +Monad に含まれる。 +並行処理の場合は、Monad は可能な計算の interleaving(並び替え) になるが、 +実際に並び替えを持っているわけではなく、マルチプロセッサで実行する環境 +そのものが Monad に対応する。 + +通常の関数を Monad を返すように変更することにより、メタ関数が得られる。 +逆に Monad の中にある通常の戻り値のみに着目すると通常の関数に戻る。 +このように、Monad を用いたメタ計算の表現では通常の計算とメタ計算が一対 +一に対応する。 + +一般的には + +% Code Segment +% Data Segment +% Meta Code Segment +% Meta Data Segment +\section{Code Gear と Data Gear} +GearsOS ではプログラムの実行単位として様々な Segment(Gear) を使う。 +Segment が平行実行の単位、データ分割、Segment 間の接続などになる。 + +Code Segment(Code Gear) はプログラムの実行コードそのものであり、Cuda +の kernel に相当する。 +Code Gear は複数の Data Gear を参照し、一つまたは複数の Data Gear に書 +き込む。 +Code Gear は接続された Data Gear 以外には触らない。 +Code Gear はサブルーチンコールではないので、呼び出し元に戻る概念はない。 +その代わりに、次に実行する Code Gear を指定する機能(軽量継続)を持つ。 -\subsection{Data Segment} -\subsection{Meta Code Segment} -\subsection{Meta Data Segment} +Gear の特徴の一つはその処理が Code Gear, Data Gear に閉じていることに +ある。 +これにより、Code Gear の実行時間、メモリ使用量を予測可能なものにする。 + +Code Gear, Data Gear はポインタを直接には扱わない。 +これにより、Code と Data の分離性を上げて、ポインタ関連のセキュリティフ +ローを防止する。 + +Code Gear, Data Gear はそれぞれ関係を持っている。 +例えば、ある Code Gear の次に実行される Code Gear、全体で木構造を持つ +Data Gear などである。 +Gear の関連付けは Meta Gear を通して行う。 +Meta Gear は、いままでの OS におけるライブラリや内部のデータ構造に相当 +する。 +なので、Meta Gear は Code Gear, Data Gear へのポインタを持っている。 + +Data Gear には、int や文字列などの Primitive Data Type が入る。 +自分が持っていない Code Gear, Data Gear は名前で指し示す。 +% s/Segment/Gear + +% Context +\section{継続} +ある Code Gear から継続するときには、次に実行する Code Gear を名前で指 +定する。 +Meta Code Gear が名前を解釈して、処理を対応する Code Gear に引き渡す。 +これらは、従来の OS の dynamic loding library や command 呼び出しに対 +応する。 +名前と Code Gear へのポインタの対応は Meta Data Gear に格納される。 +この Meta Data Gear を Context と呼ぶことにする。 +これは従来の OS の Process や Thread に対応する。 + +Context には以下のようなものが格納される。 + Code Gear の名前とポインタの対応表 + Data Gear の Allocation 用の情報 + Code Gear が参照する Data Gear へのポインタ + Data Gear に格納される Data Type の情報 + +[Code Gear の名前とポインタの対応表] +[Data Gear の Allocation 用の情報] +[Code Gear が参照する Data Gear へのポインタ] +[Data Gear に格納される Data Type の情報] + +\section{Sample Code}