view paper/text/chapter2.tex @ 6:3c9b5f9cff85

...
author matac42 <matac@cr.ie.u-ryukyu.ac.jp>
date Thu, 20 Jan 2022 13:46:45 +0900
parents 47c5e331d020
children 124583e0b372
line wrap: on
line source

\chapter{Continuation based C}
Continuation based C(CbC)\cite{cbcllvm,cbc}とはCの下位言語である.
function callの代わりにgotoによる継続を用いる.
CbCのプログラムはCodeGearと呼ばれる処理の単位で記述し,ノーマルレベルとメタレベルの処理を切り分けることが可能である.

\section{CodeGearとDataGear}
CbCでは関数の代わりにCodeGearという単位でプログラミングを行う.
CodeGearは\emph{\_\_code}という記述で宣言することができる.
データの単位にはDataGearと呼ばれる変数データを用いる.
DataGearを入力として受け取り,別のDataGearに書き込み出力することができる.
特に入力のDataGearをInput DataGear,出力のDataGearをOutput DataGearと呼ぶ.
gotoで次のCodeGearに遷移することができ,その際Output DataGearを次のCodeGearのInput DataGearとして渡すことができる.

\section{継続}
CodeGearから次のCodeGearに遷移していく一連の動作を継続と呼ぶ.
CbCの継続はfunction callをせずにgotoによるjmpで行われる.
function callによる継続と異なり,jmpによる継続はstackなどの環境を保存しないことから軽量である.
そのことからCbCにおける継続を特に軽量継続と呼ぶ.

\section{CbCの記述例}
CbCのプログラム例をソースコード\ref{src:cbc}に示す.まずmain関数においてadd1 CodeGearへgotoを行う.
その際add1へInput DataGearとしてnを渡す.
add1は処理の最後にadd2 CodeGearへgotoを行う.
その際Output DataGear out\_nをadd2のInput DataGearとして渡す.
このようにCbCではCodeGearのOutput DataGearを次のCodeGearのInput DataGearとして渡すことを繰り返すことで処理を進める.

\lstinputlisting[caption=CbCのプログラム例,label=src:cbc]{src/hello.cbc}


\chapter{GearsOS}
GearsOS\cite{gears,gearsos,cr}は 信頼性と拡張性の両立を目的として,開発されている.
Gearという概念があり,実行の単位をCodeGear,データの単位をDataGearと呼ぶ.
軽量継続を基本とし,stackを持たない代わりに全てをContext経由で実行する.
ノーマルレベルとメタレベルの処理を切り分けることができ,同様にGearの概念を持つCbC(Continuation based C)で記述されている.
GearsOSは現在開発途上であり,OSとして動作するために今後実装しなければならない機能がいくつか残っている.

\section{stubCodeGear}
図\ref{fig:meta-cgdg}はCodeGearの遷移とMetaCodeGearの関係を表している.
ノーマルレベルで見るとCodeGearがDataGearを受け取り,
処理後,DataGearを次のCodeGearに渡すという動作をしているように見える.
実際にはデータの整合性の確認や資源管理などのメタレベルの処理が存在し,
それらの計算はMetaCodeGearで行われる.
その際,MetaCodeGearに渡されるDataGearのことは特にMetaDataGearと呼ばれる.
CodeGearの前に実行されるMetaCodeGearは特にstubCodeGearと呼ばれ,
メタレベルを含めるとstubCodeGearとCodeGearを交互に実行する形で遷移していく.
\begin{figure}[h]
  \begin{center}
      \includegraphics[width=100mm]{figs/meta-cg-dg.pdf}
  \end{center}
      \caption{CodeGearとMetaCodeGearの関係}
  \label{fig:meta-cgdg}
\end{figure}

\section{Context}
Contextは全てのCodeGear,DataGearを参照することができるMetaDataGearで,従来OSのプロセスに相当する.
OS全体のContextを管理するKernel Contextやユーザープログラムごとに存在するUser Contextなどがある.
ノーマルレベルのCodeGearがContextを直接参照してしまうと,メタレベルを切り分けた意味がなくなってしまう.
そのためContextは必ずMetaDataGearとしてMetaCodeGearから参照される.

\chapter{Christie}
Christieは当研究室で開発を行っているJavaで記述された分散フレームワークである.
CbCと似ているが別物のGearという概念や,任意のTopologyを形成するためのTopologyManagerがある.

\section{Gearの概念}
Christieには以下の4つのGearという概念が存在する.

\begin{itemize}
  \item CodeGear
  \item DataGear
  \item CodeGearManager(以下CGM)
  \item DataGearManager(以下DGM)
\end{itemize}

CodeGearはクラスやスレッドに相当する.DataGearは変数データに相当し,Javaのアノテーションを用いて記述される.
CGMはいわゆるノードに相当し,CodeGear,DataGear,DGMを管理する.
複数のCGM同士が配線され,DataGearを送信し合うことで分散処理を実現している.
DGMはDataGearを管理しているもので変数プールに相当する.

\section{DataGearManager}
DataGearManagerはkey value storeの構造を持つ.
CGMが利用するCGのkeyとputされたDataGearの組み合わせでDataGearを管理する.
DGMはLocalDGMとRemoteDGMに区別することができる.
LocalDGMはCGM自身が所持するDataGearのプールである.
ReomoteDGMはCGMが配線されている別のCGMがもつDGのプールである.

\section{Topology-Manager}
Christieには任意のtopologyを生成し,ノード同士の通信接続を管理ことができるTopology-Managerという機能が存在する.
Topology-Managerで生成できるtopologyには静的topologyと動的topologyの2つがある.
静的topologyはプログラマが任意のtopologyとノードの配線を行うことができる.
dotファイルにノードの配線を記述し,Topology-Managerに参照させることで生成する.
dotファイルに記述したノードの数と参加ノードの数が一致した場合に動作する.
動的topologyは参加を表明したノードに対し,自動的に配線を行う.

\chapter{UnixのFileSystem}
\section{inode}
主にUnix系のファイルシステムで用いられる,ファイルの属性情報が書かれたデータである.
inodeにおけるファイルの属性情報は表\ref{table:inode}のようなものがある.
またinodeは識別番号としてinode numberを持つ.
inode numberは一つのファイルシステム内で一意の番号であり,\emph{ls -l}コマンドで確認可能である.
inodeはファイルシステム始動時にinode領域をディスク上に確保する.
そのためinode numberには上限があり,それに伴いファイルシステム上で扱えるファイル数の上限も決まる.
inode numberの最大値は\emph{df -i}コマンドで確認可能である.

\begin{table}[htpb]
  \begin{center}
    \small
    \begin{tabular}[htpb]{|c||c|}
      \hline
      File Types & directoryやregular fileなど,ファイルの種類 \\
      \hline
      Permissions & read write executeの実行可否\\
      \hline
      UID & ファイル所有者のID \\
      \hline
      GID & ファイル所有グループのID \\
      \hline
      File Size & ファイルのサイズ \\
      \hline
      Time Stamps & ファイル作成,編集日時 \\
      \hline
      Number of link & ハードリンクの数 \\
      \hline
      Location on hard disk & データのアドレス\\
      \hline
    \end{tabular}
    \caption{inodeでのファイル属性情報}
    \label{table:inode}
  \end{center}
\end{table}

\chapter{GearsFileSystemのdirectory}
\section{Treeによるdirectory構造}
\section{Unix Like な interface}
\subsection{mkdir}
\subsection{ls}
\subsection{cd}
\section{inodeを用いたdirectory entry}
\section{非破壊的編集によるBackup}

\chapter{File構造}
\section{I/O Stream}
\section{logによるバージョン管理}

\chapter{WordCount}
WordCount例題\cite{file}はGearsOSのファイルシステムを構築する際に用いてる例題である.
指定したファイルの文字数や行数,ファイルの内の文字列を出力する.
図\ref{fig:WCStates}はWordCount例題の処理の流れを示している.
大きく分けて,指定したファイルをFile構造体としてopenするFileOpenスレッド,
File構造体を受け取り文字数と行数をcountUpするWordCountスレッドの二つのCodeGearで記述することができる.
ファイル内の文字列を行ごとにCountUpに送信し,EOFを受け取ったらループを抜けfinishに移行する.
\section{API}
\section{GearBox的な処理}

\chapter{今後の課題}
\section{分散ファイルシステム}
\section{GearsAgda}
\section{shell}
\section{モデル検査}