Mercurial > hg > Papers > 2022 > ikki-master
changeset 1:853d7c65f524
add Chapter2,3
line wrap: on
line diff
--- a/Paper/chapter/2-CbC.tex Thu Jan 06 18:59:31 2022 +0900 +++ b/Paper/chapter/2-CbC.tex Thu Jan 06 22:50:45 2022 +0900 @@ -1,5 +1,6 @@ \chapter{Continuation based C} Continuation based C(以下CbC)とはC言語の拡張言語であり、関数呼び出しではなく軽量継続と呼ばれる処理を主体に記述をおこなう。 +GearsOSは現状ではCbCを拡張した言語フレームワークとして実装されている。 CbCにおける継続とは通常の関数呼び出しと異なり、スタック操作を行わず、次のコードブロックにjmp命令を用いて移動する処理を指す。 コードブロックごとの変数などの環境を保存しないため軽量継続と呼ばれる。 また、CbCではこの軽量継続にて再帰呼び出しを行うことでループ処理を行う。 @@ -7,28 +8,28 @@ \section{Gear概念} -CbCではCodeGearとDataGearという二つのプログラミング概念が存在する。 +CbCにはCodeGearとDataGearという二つのプログラミング概念が存在する。 CodeGearは関数に代わり宣言されるプログラミング単位と呼べる。 CbCプログラミングでは連続したCodeGear間を遷移していくことで構成される。 CodeGearはgotoという命令で遷移をしていくが、その際にDataGearと呼ばれる変数データを次のCodeGearへ引き渡していく。 DataGearはCodeGearが処理の際に参照する専用の変数データであると言える。 特に、CodeGear実行の際に入力されるDataGearをInputDataGear、CodeGearの処理後に出力されるDataGearをOutputDataGearと呼ぶ。 CodeGearはInputDataGearを参照しながら処理を実行し、OutputDataGearとして次のCodeGearへ必要なデータを出力する。 +CodeGearとDataGearの関係を図\ref{fig:cgdg}に示す。 + +\begin{figure}[tb] + \begin{center} + \includegraphics[width=120mm]{./images/cgdg.pdf} + \end{center} + \caption{CodeGearとDataGearの関係} + \label{fig:cgdg} +\end{figure} + CodeGearは関数呼び出しのようにスタックを持たないため、 一度CodeGearから別のCodeGearへ継続した場合、元の処理へ戻ってくることができない。 言い換えると、CodeGearから別のCodeGearへgotoで遷移した際、元のCodeGear内で使用されていた変数データなどの環境は全て破棄される。 この点からGearsOSのループ処理はCodeGearの再帰呼び出しで実装することが望ましい。 -CbCの継続による処理と通常の関数遷移による処理の差を図\ref{fig:cbc_vs_c}に示す。 - - -\begin{figure}[tb] - \begin{center} - \includegraphics[width=150mm]{./fig/cbc_vs_c.pdf} - \end{center} - \caption{CbCとCの処理の差} - \label{fig:cbc_vs_c} -\end{figure} \section{CbCの例題} @@ -42,3 +43,29 @@ 続いてCG2へCG1での処理結果をDataGearとして引き渡し遷移する流れとなっている。 \lstinputlisting[label=src:cbc_sample, caption=CbCの例題]{src/CbC_sample.cbc} + +\section{metaレベルのGear} +図\ref{fig:cgdg}で示したCodeGearとDataGearの関係性は +単純に連続した複数のCodeGearがDataGearを介してやりとりをしているだけのように見える。 +しかし、実際にはCodeGearの遷移の際には、プログラマが記述するノーマルレベルからは見えないメタレベルの計算が行われている。 +メタ計算とはノーマルレベルのプログラムを行うための計算を指し、 +メタレベルを考慮した上でCbCのCodeGear, DataGearの遷移を図式化すると図\ref{fig:meta-cgdg}の下段のように表現できる。 +CbCではCodeGearの遷移に必要な遷移先のCodeGearへのDataGearの受け渡しやデータの整合性の確認などは +CodeGearごとに準備されたMetaCodeGearと呼ばれるメタなCodeGearで行われ、 +またMetaCodeGearで使用されるDataGearをMetaDataGearと呼ぶ。 +特に、CodeGearの実行直前に呼び出されるMetaCodeGearを特にStubCodeGearと呼ぶ。 + +MetaCodeGearとMetaDataGearはプログラマが直接実行するのではなく、 +ビルド時に実行される、Perlスクリプトによって実装されたトランスコンパイラによって自動的に生成される。 +しかし、自動生成されるStubCodeGearに問題があったり、 +特殊な処理を組み込みたい場合はプログラマが直接記述することも可能である。 +トランスコンパイラはすでに実装されたStubCodeGearは上書きしないため、 +この場合、プログラム上にStubCodeGearを直接記述したいCodeGear名の後ろに\texttt{\_stub}を付け加えたCodeGearを記述すれば良い。 + +\begin{figure}[tb] + \begin{center} + \includegraphics[width=120mm]{./images/meta-cg-dg.pdf} + \end{center} + \caption{メタレベルを考慮した場合のGearの関係性} + \label{fig:meta-cgdg} +\end{figure}
--- a/Paper/chapter/3-GearsOS.tex Thu Jan 06 18:59:31 2022 +0900 +++ b/Paper/chapter/3-GearsOS.tex Thu Jan 06 22:50:45 2022 +0900 @@ -0,0 +1,33 @@ +\chapter{GearsOS} +GearsOSは当研究室が開発する、OS自体の信頼性の確保と拡張性の高さを目指したOSである。 +GearsOSはContinuation based Cを用いることにより、ノーマルレベルとメタレベルの分離を行い、 +プログラマが記述したノーマルレベルのコードをメタレベルから信頼性の検査を行えるような仕組みを作ることにより、 +OS自身の信頼性の向上を目指している。 +メタレベルのプログラムはPerlスクリプトによるトランスコンパイラにて実装されており、 +基本的にユーザーはノーマルレベルのプログラムの記述によりメタレベル分離の恩恵を受けられる仕組みとなっている。 + +現状ではCbCの言語フレームワークとして実装されており、OSとして実際に起動するためには実装が必要となる機能が多く存在している。 +必要な機能をCbCによる記述により実装していくことでOSの完成を目指す。 + +\section{Interface} +GearsOSの重要な仕様としてInterfaceが存在する。 +Interfaceの一つ目の役割として、通常のプログラミングにおけるモジュール化の仕組みと同様の役割を持つ。 +GearsOSに実装されているQueueのInterfaceをソースコード\ref{src:cbc_sample}に示す。 + +\lstinputlisting[label=src:Queue.h, caption=CbCの例題]{src/Queue.h} + +GearsOSにおけるInterfaceにはプログラム内で使われるCodeGearとそのCodeGearに入出力されるDataGearを記述する。 +5から10行目にはAPIとなるCodeGearが宣言されている。 +また、2, 3行目のunion Data型の変数はAPIのCodeGearで使用されるDataGearである。 + +コード内のCodeGearの第1引数はImpl*型の変数となっており、Interfaceを引き継いだImplementのポインタとなる。 +これはCbCはスタックを持たず、CodeGearの遷移の際に必要な情報はDataGearとして持ち運ぶ必要があるため、 +DataGearとして構造体のポインタを設定している。 +また、このImplementのポインタはgotoでの遷移の際はトランスコンパイラによる補完により、gotoの引数として記述する必要はない。 + +\texttt{\_\_code next(...)}は +そのCodeGearが呼び出される際に入力される別のCodeGearへのポインタであり、 +そのAPIのCodeGearの処理後の遷移先のCodeGearを指定することができる。 +\texttt{\_\_code whenEmpty(...)}も同様に別CodeGearへのポインタである。 +9行目のCodeGearではnextとWhenEmptyと二つのCodeGearのポインタを入力することにより、 +処理の結果により別れる二つの遷移先を用意している。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/chapter/one_flock_test1.pl Thu Jan 06 22:50:45 2022 +0900 @@ -0,0 +1,34 @@ +#!/usr/local/bin/perl + +use Fcntl ':flock'; + +$plane="plane_reserve"; +$hotel="hotel_reserve"; + +my $user = $ARGV[0]; + +open(HOTEL,"+<$hotel") || die("$$ $user can't open $plane\n"); +open(PLANE,"+<$plane") || die("$$ $user can't open $plane\n"); +flock(HOTEL,LOCK_EX); +flock(PLANE,LOCK_EX); +sleep 1; +&reserve('HOTEL',$hotel); +# flock(HOTEL,LOCK_UN); +close(HOTEL); # and release lock + +sleep 1; +&reserve('PLANE',$plane); +close(PLANE); # and release lock + + +sub reserve { + my ($fh,$file)=@_; + if(($value = <$fh>)>0) { + seek($fh, 0, 0); + print $fh $value-1,"\n"; + print "$user $file reserved\n"; + return 1; + } else { + die("$$ $user can't reserve $file\n"); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/Queue.h Thu Jan 06 22:50:45 2022 +0900 @@ -0,0 +1,11 @@ +typedef struct Queue<>{ + union Data* queue; + union Data* data; + + __code whenEmpty(...); + __code clear(Impl* queue, __code next(...)); + __code put(Impl* queue, union Data* data, __code next(...)); + __code take(Impl* queue, __code next(union Data* data, ...)); + __code isEmpty(Impl* queue, __code next(...), __code whenEmpty(...)); + __code next(...); +} Queue;