Mercurial > hg > Papers > 2022 > ikki-master
changeset 22:bd9284f9151d
tweak
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 09 Feb 2022 23:58:05 +0900 |
parents | f8a089dbfe06 |
children | 9a6609a2f987 |
files | .DS_Store Paper/chapter/0-introduction.tex Paper/chapter/5-Implementation.tex Paper/chapter/history.tex Paper/images/GearsFile.graffle.graffle Paper/images/GearsFile.pdf Paper/master_paper.pdf Paper/reference.bib slide/thesis.html slide/thesis.md slide/thesis.pdf.html |
diffstat | 11 files changed, 605 insertions(+), 339 deletions(-) [+] |
line wrap: on
line diff
--- a/Paper/chapter/0-introduction.tex Wed Feb 09 22:43:17 2022 +0900 +++ b/Paper/chapter/0-introduction.tex Wed Feb 09 23:58:05 2022 +0900 @@ -1,6 +1,6 @@ \chapter{GearsOSにおけるファイルシステム} コンピュータにおけるファイルシステムは必要不可欠な存在であると言える。 -コンピュータで行われる計算やそれに使われるデータは全て記憶装置上にファイルとして保持され、 +コンピュータで行われる計算やそれに使われるデータは全てデバイス上にファイルとして保持され、 ファイルという概念なしにはユーザーがコンピュータ上で用いられる資源の管理はほぼ不可能であると言える。 コンピュータの技術発展と普及に伴いファイルは物理的な存在場所に囚われない、 つまりネットワークへの接続を通して別マシン上のどこからでもアクセスが行える存在である必要が生じてきた。
--- a/Paper/chapter/5-Implementation.tex Wed Feb 09 22:43:17 2022 +0900 +++ b/Paper/chapter/5-Implementation.tex Wed Feb 09 23:58:05 2022 +0900 @@ -46,7 +46,7 @@ \begin{center} \includegraphics[width=150mm]{./images/GearsFile.pdf} \end{center} - \caption{GearsFSのread/writeAPI} + \caption{GearsFSの呼び出し/書き込み} \label{fig:gearsFile} \end{figure} @@ -54,12 +54,12 @@ ファイルに対して書き込み、つまり従来のwriteにあたる処理を行う場合はInputQueueのkeyを指定してput操作を行う。 最終的にInputQueueに格納されたデータはInputQueueから取り出され、mainQueueに対して格納される。 -ファイルの読み込み(read)を行う際はOutputQueueに対してTake操作を行えば良い。 +ファイルの読み込み(既存のファイルシステムでのread)を行う際はOutputQueueに対してTake操作を行えば良い。 OutputQueueにはmainQueueの要素が複製されており、OutputQueue内の要素を全てTakeのループにより呼び出す。 ファイルを呼び出す側は取り出したレコードを順番に読むことでファイルを構築する。 GearsOSのファイルは大域的な資源として同時に複数のプロセスから参照が可能になる作りにしたい。 -OutputQueueは複数のプロセスからファイルreadが行われた際に、データの整合性が失われてしまう危険性がある。 +OutputQueueは複数のプロセスからファイル読み込みが行われた際に、データの整合性が失われてしまう危険性がある。 そのため、OutputQueueはCAS(Compare And Swap)を実装したSynchronizedQueueを用いる。 しかしファイルのアクセス権限の設定などにより、データアクセスが単一のプロセスからしか許さないもしくは想定されない環境では 読み込みの高速化とメモリの軽量化のため、 @@ -87,7 +87,7 @@ \section{WordCount例題} GearsFSのAPIの構成をWordCount例題を通して行った。 WordCount例題とは、指定したファイルの中身を読み取り、文字数と行数列、加えて文字列を出力するという例題である。 -この例題により連続したレコードをQueueから順次読みだすreadAPIを構築した。 +この例題により連続したレコードをQueueから順次読みだす処理を構築した。 コード\ref{src:WcImpl}にCbCで記述した、Unixファイルに対してWordCountを行うプログラムの一部を示す。 ファイルとWordCountの接続はUNIXのシェルのようにプログラムの外で行われる。 @@ -98,6 +98,8 @@ putStringはstrTableの中身がなくなった(EOF)ならshowResultへ遷移する形となる。 図\ref{fig:WordCount}にCGの遷移図を示す。 +WordCountのFileOpenとWordCount処理を別ノード上で行うことで、ファイルの読み込みとファイルの送信の構成が行える。 + \lstinputlisting[label=src:WcImpl, caption=Unixファイルに対するWordCount.cbcの一部]{src/WcImpl.cbc} \begin{figure}[h] @@ -226,7 +228,7 @@ \section{ディレクトリシステム} 本研究と並行する形で又吉雄斗によるGearsFileSystemのディレクトリ構造の構築が行われている\cite{mata-thesis}。 -GearsFSのディレクトリシステムはUnixOSのディレクトリシステムのinodeの仕組みを用いて再現することを試みている。 +GearsFSのディレクトリシステムはUnixOSのディレクトリシステムのi-nodeの仕組みを用いて再現することを試みている。 通常のUnixのディレクトリシステムと異なる点として、ディレクトリを赤黒木(RedBlackTree)を用いて構成する。 図\ref{fig:GearsDirectory}にGearsFSの構成図を示す。 @@ -244,13 +246,13 @@ \label{fig:GearsDirectory} \end{figure} -GearsのディレクトリシステムはUnixのinodeの仕様を用いる。 -inodeとはファイルごとのユニークな番号(inode番号)。データ領域へのポインタや作成日時、サイズなどのメタデータを保存するための領域である。 +GearsのディレクトリシステムはUnixのi-nodeの仕様を用いる。 +i-nodeとはファイルごとのユニークな番号(i-node番号)。データ領域へのポインタや作成日時、サイズなどのメタデータを保存するための領域である。 GearsFSの赤黒木を用いたディレクトリシステムに実際に保存されるノードはkeyがFileName、 -valueがinodeのペアを保持している。 -DirectoryTreeをファイル名で探索を行うことで任意のファイルのinode番号を手に入れ、DirectroyTreeとは別に実装されたkeyにinode番号とペアとして -ファイルのディスクアドレスを保持させるTreeをinode番号で探索させる形となる。 -この形で実装することにより、ファイル自身が所属するDirectoryをinodeが保持でき、 +valueがi-nodeのペアを保持している。 +DirectoryTreeをファイル名で探索を行うことで任意のファイルのi-node番号を手に入れ、DirectroyTreeとは別に実装されたkeyにi-node番号とペアとして +ファイルのディスクアドレスを保持させるTreeをi-node番号で探索させる形となる。 +この形で実装することにより、ファイル自身が所属するDirectoryをi-nodeが保持でき、 ファイルの複数のアカウントでの共有などによる親Directoryが複数存在する場合や、 親DirectoryのFileNameが変更された場合においてもDirectoryの構造の障害の発生を防げぐことができる。
--- a/Paper/chapter/history.tex Wed Feb 09 22:43:17 2022 +0900 +++ b/Paper/chapter/history.tex Wed Feb 09 23:58:05 2022 +0900 @@ -1,5 +1,5 @@ \chapter*{発表履歴} \begin{itemize} -\item 一木 貴裕, 河野 真治. 分散フレームワークChristirによるBlock chainの実装. 情報処理学会 システムソフトウェアとオペレーティング・システム研究会 (OS), May, 2019 +\item 一木 貴裕, 河野 真治. 分散フレームワークChristieによるBlock chainの実装. 情報処理学会 システムソフトウェアとオペレーティング・システム研究会 (OS), May, 2019 \item 一木 貴裕, 河野 真治. GearsOSの分散ファイルシステムの設計. 情報処理会 システムソフトウェアとオペレーティング・システム研究会(OS), May, 2021 \end{itemize}
--- a/Paper/reference.bib Wed Feb 09 22:43:17 2022 +0900 +++ b/Paper/reference.bib Wed Feb 09 23:58:05 2022 +0900 @@ -1,4 +1,4 @@ -@article{ +March@article{ cbc, author = "Kaito TOKKMORI and Shinji KONO", title = "Implementing Continuation based language in LLVM and Clang", @@ -165,7 +165,7 @@ author = "清水 隆博 and 河野真治", title = "GearsOSのメタ計算", journal = "琉球大学理工学研究科修士論文", - month = "Merch", + month = "March", year = 2020 } @@ -174,7 +174,7 @@ author = "宮城 光輝 and 河野真治", title = "継続を基本とした言語による OS のモジュール化", journal = "琉球大学理工学研究科修士論文", - month = "Merch", + month = "March", year = 2018 } @@ -183,7 +183,7 @@ author = "徳森 海斗 and 河野真治", title = "LLVM Clang 上の Continuation based C コンパイラ の改良", journal = "琉球大学理工学研究科修士論文", - month = "Merch", + month = "March", year = 2016 } @@ -191,9 +191,9 @@ @article{ mata-thesis, author = "又吉 雄斗 and 河野 真治", - title = "GearsOS における inode を用いた File system の設計", + title = "GearsOS における i-node を用いた File system の設計", journal = "琉球大学工学部知能情報コース卒業論文", - month = "Merch", + month = "March", year = 2022 } @@ -203,7 +203,7 @@ author = "照屋 のぞみ and 河野 真治", title = "分散フレームワークChristieの設計", journal = "琉球大学理工学研究科修士論文", - month = "Merch", + month = "March", year = 2018 } @@ -212,7 +212,7 @@ author = "赤嶺 一樹 and 河野 真治", title = "分散ネットワークフレームワークAlice の 提案と実装", journal = "琉球大学理工学研究科修士論文", - month = "Merch", + month = "March", year = 2012 } @@ -221,7 +221,7 @@ author = "赤堀 貴一 and 河野 真治", title = "Christieによるブロックチェーンの実装", journal = "琉球大学工学部情報工学科卒業論文", - month = "Merch", + month = "March", year = 2019 }
--- a/slide/thesis.html Wed Feb 09 22:43:17 2022 +0900 +++ b/slide/thesis.html Wed Feb 09 23:58:05 2022 +0900 @@ -91,17 +91,17 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="gearsosのファイルシステム設計">GearsOSのファイルシステム設計</h2> +<h2 id="gearsosのファイルシステムの設計方針">GearsOSのファイルシステムの設計方針</h2> <ul> - <li>GearsOSには現時点でファイルシステムが存在していない</li> + <li>GearsOSはGearという単位で記述が行われているOSプロジェクトである</li> + <li>GearsOSのファイルシステムも同様にDataGearの単位で構成したい</li> <li>GearsOSのファイルシステムの設計と実装を行った</li> - <li>GearsOSの特性に合わせた実装 + <li>ファイルに取り扱うデータに対応した複数のストリームを持たせたい <ul> - <li>CodeGear/DataGearによる継続処理</li> - <li>同じくGear概念を持つ分散フレームワークChristieの仕組みを用いた</li> + <li>従来では異なるデータでも単一のストリームから入力される</li> </ul> </li> - <li>将来的に重要な機能をOSに取り込みたい + <li>GearsOSには将来的にアプリケーションが担う重要な機能をOSに取り込みたい <ul> <li>バックアップ</li> <li>ファイルの型認識</li> @@ -115,30 +115,36 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="gearsos">GearsOS</h2> +<h2 id="gearsosのgear概念12">GearsOSのGear概念(1/2)</h2> <ul> - <li>関数でなくGearという単位を用いて記述する + <li>関数でなくGearという単位を用いて記述する</li> + <li>Gearは関数と異なり、スタックを持たないため軽量継続と呼ぶ</li> + <li>CodeGear <ul> - <li>CodeGear - <ul> - <li>従来のThreadにあたる</li> - <li>goto文(jump命令)を使って遷移する</li> - </ul> - </li> - <li>DataGear - <ul> - <li>従来の変数データにあたる</li> - </ul> - </li> - <li>スタックを持たないため軽量継続と呼ぶ</li> + <li>従来のThreadにあたる</li> + <li>goto文(jump命令)を使って遷移する</li> </ul> </li> + <li>DataGear + <ul> + <li>従来の変数データにあたる</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsosのgear概念22">GearsOSのGear概念(2/2)</h2> +<ul> <li>CodeGearは処理を行う際、DataGearを参照し処理を行う(InputDataGear)</li> <li>CodeGearは処理の終了後、以降に必要なデータをDataGearとして出力する(OutputDataGear)</li> </ul> - <div style="text-align: center;"> - <img src="images/cg-dg.pdf" alt="cgdgの関係図" width="800" /> + <img src="images/cg-dg.pdf" alt="cgdgの関係図" width="600" /> </div> @@ -149,19 +155,198 @@ <!-- _S9SLIDE_ --> <h2 id="gearsosのinterface">GearsOSのInterface</h2> <ul> - <li>APIの宣言を行う + <li>Object型指向の仕組み</li> + <li>APIとなるCodeGearとその参照するDataGearを宣言する</li> + <li>DataGear/CodeGearの一時的な置き場としての役割を持つ + <pre><code>typedef struct Tree<>{ + union Data* tree; + struct Node* node; + __code put(Impl* tree,Type* node, __code next(...)); + __code get(Impl* tree, Type* node, __code next(...)); + __code remove(Impl* tree,Type* node, __code next(...)); + __code next(...); +} Tree; +</code></pre> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="メタレベルのgear13">メタレベルのGear(1/3)</h2> +<ul> + <li>CodeGearとDataGearにはユーザーが記述しない、メタレベルのものが存在する + <ul> + <li>メタレベルな記述はトランスコンパイラにより自動生成される</li> + </ul> + </li> +</ul> +<div style="text-align: center;"> + <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="メタレベルのgear23">メタレベルのGear(2/3)</h2> +<ul> + <li>MetaCodeGear + <ul> + <li>CodeGearの処理前と処理後に参照される</li> + <li>Input/OutputDataGearを引き渡す</li> + <li>CodeGear処理前に呼ばれるものを特にstubCodeGearと呼ぶ</li> + </ul> + </li> +</ul> +<div style="text-align: center;"> + <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="メタレベルのgear33">メタレベルのGear(3/3)</h2> +<ul> + <li>MetaDataGear + <ul> + <li>MetaCodeGearにて参照されるDataGear</li> + </ul> + </li> +</ul> +<div style="text-align: center;"> + <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsosのファイルシステムの設計">GearsOSのファイルシステムの設計</h2> +<ul> + <li>DataGearの単位でデータを操作したい</li> + <li>通信データに対応した複数のストリームを持ちたい</li> + <li>Transaction(マクロレベル)で操作したい + <ul> + <li>従来のファイルシステムは一部の操作のみTransactionである</li> + </ul> + </li> + <li>ファイルそのものが通信を担当する <ul> - <li>定義ファイル(.h)に記述を行う</li> - <li>APIとなるCodeGearとその参照するDataGearを宣言する</li> - <li>DataGear/CodeGearの一時的な置き場としての役割を持つ - <pre><code>typedef struct Tree<>{ -union Data* tree; -struct Node* node; -__code put(Impl* tree,Type* node, __code next(...)); -__code get(Impl* tree, Type* node, __code next(...)); -__code remove(Impl* tree,Type* node, __code next(...)); -__code next(...); -} Tree; + <li>ChristieのDataGearManagerを参考にする</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsosのファイルデータ操作13">GearsOSのファイルデータ操作(1/3)</h2> +<ul> + <li>GearsOSはDataGearのやりとりでプログラムが構成される + <ul> + <li>ファイルシステムも同様の実装にしたい = DataGear単位で操作したい</li> + </ul> + </li> +</ul> +<div style="text-align: center;"> + <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsosのファイルデータ操作23">GearsOSのファイルデータ操作(2/3)</h2> +<ul> + <li>GearsOSのファイルデータは任意の型を持った構造体で実装される(ファイルレコード)</li> + <li>レコードは決められた順番で連続しており、Queueに保存される</li> +</ul> +<div style="text-align: center;"> + <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsosのファイルデータ操作33">GearsOSのファイルデータ操作(3/3)</h2> +<ul> + <li>構造体の型を判別することで処理の切り替えが行える</li> +</ul> +<div style="text-align: center;"> + <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsfsのトランザクション">GearsFSのトランザクション</h2> +<ul> + <li>GearsOSのDataGear操作はマクロな操作である + <ul> + <li>よってCodeGearはTransactionである</li> + </ul> + </li> + <li>ファイルシステム操作もCodeGearで記述されるためTransactionとなる</li> + <li>トランザクションな操作によってファイルシステムの整合性の保守が行いやすい</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="queueによるgearsosのファイル">QueueによるGearsOSのファイル</h2> +<ul> + <li>GearsOSのファイルはファイルレコードを保持するQueueとなる</li> + <li>デバイスへの保存はQueueを保存すればよい</li> + <li>データの更新はQueueにレコードを書き込む</li> + <li>データの読み込みはQueueからデータを全て取り出す</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="queueapi--put-">QueueAPI -Put-</h2> +<ul> + <li>Put + <ul> + <li>Queueに対してファイルレコードを入力する</li> + <li>ファイルの更新の際に呼び出す</li> + <li>ファイルの変更をレコードとして書き込む + <pre><code>__code putSingleLinkedQueue(struct SingleLinkedQueue* queue, union Data* data, __code next(...)) { +Element* element = new Element(); +element->data = data; +element->next = NULL; +queue->last->next = element; +queue->last = element; +goto next(...); +} </code></pre> </li> </ul> @@ -174,101 +359,25 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="メタレベルのgear">メタレベルのGear</h2> -<ul> - <li>CodeGearとDataGearにはメタレベルのものが存在する - <ul> - <li>MetaCodeGear - <ul> - <li>CodeGearの処理前と処理後に参照される</li> - <li>Input/OutputDataGearを引き渡す</li> - <li>CodeGear処理前に呼ばれるものを特にstubCodeGearと呼ぶ</li> - </ul> - </li> - <li>MetaDataGear - <ul> - <li>MetaCodeGearにて参照されるDataGear</li> - </ul> - </li> - </ul> - </li> - <li>メタレベルの処理はトランスコンパイラにより自動に記述される</li> -</ul> -<div style="text-align: center;"> - <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> -</div> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="datagear単位のトランザクション">DataGear単位のトランザクション</h2> +<h2 id="queueapi--take-">QueueAPI -Take-</h2> <ul> - <li>GearsOSはDataGear単位でプロセスが進行する</li> - <li>従来のファイルシステムは一部の操作のみがTransactionとなっている</li> - <li>GearsOSのファイルシステムはDataGear単位で処理を行いたい - <ul> - <li>軽量継続への利用が行える</li> - <li>一つのDataGearに対する操作がトランザクションとなる</li> - </ul> - </li> -</ul> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="gearsosのファイルデータ操作">GearsOSのファイルデータ操作</h2> -<ul> - <li>ファイルデータの最小の単位は任意の型を持った構造体(DataGear)である - <ul> - <li>ファイルレコードと名付ける</li> - </ul> - </li> - <li>レコードは特定の順番で連続しており、Queueに保存される</li> - <li>GearsのDataGearとして利用できる</li> - <li>構造体の型により処理の分岐が行える</li> -</ul> - -<div style="text-align: center;"> - <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> -</div> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="ファイルqueueに対するapi">ファイルQueueに対するAPI</h2> -<ul> - <li>Put - <ul> - <li>Queueに対してファイルレコードを入力する</li> - <li>ファイルの更新の際に呼び出す</li> - <li>ファイルの変更をレコードとして書き込む</li> - </ul> - </li> <li>Take <ul> <li>Queueからファイルレコードを取り出す</li> <li>ファイルの中身の読み込みの際に用いる</li> <li>Queue内のレコードをループで全て取り出せば良い - <pre><code>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; + <pre><code>__code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) { +printf("take\n"); +struct Element* top = queue->top; +struct Element* nextElement = top->next; +if (queue->top == queue->last) { + data = NULL; +} else { + queue->top = nextElement; + data = nextElement->data; +} +goto next(data, ...); +} </code></pre> </li> </ul> @@ -310,12 +419,12 @@ <li>CodeGearはLocalDGMに対してDataGearを参照する</li> </ul> </li> - <li>RemoteDGMは接続する相手ノードに対応するデータプールploxyである + <li>RemoteDGMは接続する相手ノードに対応するデータプールproxyである <ul> <li>RemoteDGMに対してDataGearを書き込むことで、対応するノードのLocalDGMにデータが書き込まれる</li> </ul> </li> - <li>GearsFSも同様にファイルploxyを通して通信を行う</li> + <li>GearsFSも同様にファイルproxyを通して通信を行う</li> </ul> @@ -434,15 +543,15 @@ <li>readの場合(リモート側に読み込みたいファイルが存在する) <ul> <li>(手順1)ローカル側は空のファイルを作成し、socketを持たせる</li> - <li>(手順2)リモート側は, ローカル側の持つ空ファイルのploxyを作成する</li> - <li>(手順3)リモート側はploxyに対して、目的のファイルのデータをputする</li> + <li>(手順2)リモート側は, ローカル側の持つ空ファイルのproxyを作成する</li> + <li>(手順3)リモート側はproxyに対して、目的のファイルのデータをputする</li> </ul> </li> <li>writeの場合(リモート側に書き込みたいファイルが存在する) <ul> <li>(手順1)リモート側は対象ファイルにsocketを持たせる</li> - <li>(手順2)ローカル側は対象のファイルに対応するploxyを作成する</li> - <li>(手順3)ローカル側はploxyのkeyに対してデータをputする</li> + <li>(手順2)ローカル側は対象のファイルに対応するproxyを作成する</li> + <li>(手順3)ローカル側はproxyのkeyに対してデータをputする</li> </ul> </li> </ul> @@ -602,7 +711,7 @@ <li>GearsOSの調査</li> </ul> </li> - <li>ファイルploxyによる通信実現を行いたい</li> + <li>ファイルproxyによる通信実現を行いたい</li> </ul>
--- a/slide/thesis.md Wed Feb 09 22:43:17 2022 +0900 +++ b/slide/thesis.md Wed Feb 09 23:58:05 2022 +0900 @@ -5,36 +5,41 @@ code-engine: coderay -## GearsOSのファイルシステム設計 -- GearsOSには現時点でファイルシステムが存在していない +## GearsOSのファイルシステムの設計方針 +- GearsOSはGearという単位で記述が行われているOSプロジェクトである +- GearsOSのファイルシステムも同様にDataGearの単位で構成したい - GearsOSのファイルシステムの設計と実装を行った -- GearsOSの特性に合わせた実装 - - CodeGear/DataGearによる継続処理 - - 同じくGear概念を持つ分散フレームワークChristieの仕組みを用いた -- 将来的に重要な機能をOSに取り込みたい +- ファイルに取り扱うデータに対応した複数のストリームを持たせたい + - 従来では異なるデータでも単一のストリームから入力される +- GearsOSには将来的にアプリケーションが担う重要な機能をOSに取り込みたい - バックアップ - ファイルの型認識 -## GearsOS +## GearsOSのGear概念(1/2) - 関数でなくGearという単位を用いて記述する - - CodeGear - - 従来のThreadにあたる - - goto文(jump命令)を使って遷移する - - DataGear - - 従来の変数データにあたる - - スタックを持たないため軽量継続と呼ぶ +- Gearは関数と異なり、スタックを持たないため軽量継続と呼ぶ +- CodeGear + - 従来のThreadにあたる + - goto文(jump命令)を使って遷移する +- DataGear + - 従来の変数データにあたる + + +## GearsOSのGear概念(2/2) - CodeGearは処理を行う際、DataGearを参照し処理を行う(InputDataGear) - CodeGearは処理の終了後、以降に必要なデータをDataGearとして出力する(OutputDataGear) - <div style="text-align: center;"> - <img src="images/cg-dg.pdf" alt=cgdgの関係図 width="800"> + <img src="images/cg-dg.pdf" alt=cgdgの関係図 width="600"> </div> + + + + ## GearsOSのInterface -- APIの宣言を行う - - 定義ファイル(.h)に記述を行う - - APIとなるCodeGearとその参照するDataGearを宣言する - - DataGear/CodeGearの一時的な置き場としての役割を持つ +- Object型指向の仕組み +- APIとなるCodeGearとその参照するDataGearを宣言する +- DataGear/CodeGearの一時的な置き場としての役割を持つ ``` typedef struct Tree<>{ union Data* tree; @@ -46,66 +51,107 @@ } Tree; ``` -## メタレベルのGear -- CodeGearとDataGearにはメタレベルのものが存在する - - MetaCodeGear - - CodeGearの処理前と処理後に参照される - - Input/OutputDataGearを引き渡す - - CodeGear処理前に呼ばれるものを特にstubCodeGearと呼ぶ - - MetaDataGear - - MetaCodeGearにて参照されるDataGear -- メタレベルの処理はトランスコンパイラにより自動に記述される +## メタレベルのGear(1/3) +- CodeGearとDataGearにはユーザーが記述しない、メタレベルのものが存在する + - メタレベルな記述はトランスコンパイラにより自動生成される +<div style="text-align: center;"> + <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800"> +</div> + +## メタレベルのGear(2/3) +- MetaCodeGear + - CodeGearの処理前と処理後に参照される + - Input/OutputDataGearを引き渡す + - CodeGear処理前に呼ばれるものを特にstubCodeGearと呼ぶ +<div style="text-align: center;"> + <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800"> +</div> + +## メタレベルのGear(3/3) +- MetaDataGear + - MetaCodeGearにて参照されるDataGear <div style="text-align: center;"> <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800"> </div> - -## DataGear単位のトランザクション -- GearsOSはDataGear単位でプロセスが進行する -- 従来のファイルシステムは一部の操作のみがTransactionとなっている -- GearsOSのファイルシステムはDataGear単位で処理を行いたい - - 軽量継続への利用が行える - - 一つのDataGearに対する操作がトランザクションとなる - +## GearsOSのファイルシステムの設計 +- DataGearの単位でデータを操作したい +- 通信データに対応した複数のストリームを持ちたい +- Transaction(マクロレベル)で操作したい + - 従来のファイルシステムは一部の操作のみTransactionである +- ファイルそのものが通信を担当する + - ChristieのDataGearManagerを参考にする +## GearsOSのファイルデータ操作(1/3) +- GearsOSはDataGearのやりとりでプログラムが構成される + - ファイルシステムも同様の実装にしたい = DataGear単位で操作したい +<div style="text-align: center;"> + <img src="images/QueueElement.pdf" alt=Queueの構造 width="800"> +</div> -## GearsOSのファイルデータ操作 -- ファイルデータの最小の単位は任意の型を持った構造体(DataGear)である - - ファイルレコードと名付ける -- レコードは特定の順番で連続しており、Queueに保存される -- GearsのDataGearとして利用できる -- 構造体の型により処理の分岐が行える +## GearsOSのファイルデータ操作(2/3) +- GearsOSのファイルデータは任意の型を持った構造体で実装される(ファイルレコード) +- レコードは決められた順番で連続しており、Queueに保存される +<div style="text-align: center;"> + <img src="images/QueueElement.pdf" alt=Queueの構造 width="800"> +</div> +## GearsOSのファイルデータ操作(3/3) +- 構造体の型を判別することで処理の切り替えが行える <div style="text-align: center;"> <img src="images/QueueElement.pdf" alt=Queueの構造 width="800"> </div> -## ファイルQueueに対するAPI + +## GearsFSのトランザクション +- GearsOSのDataGear操作はマクロな操作である + - よってCodeGearはTransactionである +- ファイルシステム操作もCodeGearで記述されるためTransactionとなる +- トランザクションな操作によってファイルシステムの整合性の保守が行いやすい + +## QueueによるGearsOSのファイル +- GearsOSのファイルはファイルレコードを保持するQueueとなる +- デバイスへの保存はQueueを保存すればよい +- ファイルはQueueなのでファイルのAPIは大きく二つとなる + - Put + - Take + +## QueueAPI -Put- - Put - Queueに対してファイルレコードを入力する - - ファイルの更新の際に呼び出す - ファイルの変更をレコードとして書き込む +``` +__code putSingleLinkedQueue(struct SingleLinkedQueue* queue, union Data* data, __code next(...)) { + Element* element = new Element(); + element->data = data; + element->next = NULL; + queue->last->next = element; + queue->last = element; + goto next(...); +} +``` + +## QueueAPI -Take- - Take - Queueからファイルレコードを取り出す - - ファイルの中身の読み込みの際に用いる - Queue内のレコードをループで全て取り出せば良い ``` -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; +__code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) { + printf("take\n"); + struct Element* top = queue->top; + struct Element* nextElement = top->next; + if (queue->top == queue->last) { + data = NULL; + } else { + queue->top = nextElement; + data = nextElement->data; + } + goto next(data, ...); +} ``` - ## GearsOSのファイル - 単独のQueueのみではファイル操作に耐えることができない - GearsOSのファイルは複数のQueueをkey nameをつけて保持するリストとなる
--- a/slide/thesis.pdf.html Wed Feb 09 22:43:17 2022 +0900 +++ b/slide/thesis.pdf.html Wed Feb 09 23:58:05 2022 +0900 @@ -75,17 +75,17 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="gearsosのファイルシステム設計">GearsOSのファイルシステム設計</h2> +<h2 id="gearsosのファイルシステムの設計方針">GearsOSのファイルシステムの設計方針</h2> <ul> - <li>GearsOSには現時点でファイルシステムが存在していない</li> + <li>GearsOSはGearという単位で記述が行われているOSプロジェクトである</li> + <li>GearsOSのファイルシステムも同様にDataGearの単位で構成したい</li> <li>GearsOSのファイルシステムの設計と実装を行った</li> - <li>GearsOSの特性に合わせた実装 + <li>ファイルに取り扱うデータに対応した複数のストリームを持たせたい <ul> - <li>CodeGear/DataGearによる継続処理</li> - <li>同じくGear概念を持つ分散フレームワークChristieの仕組みを用いた</li> + <li>従来では異なるデータでも単一のストリームから入力される</li> </ul> </li> - <li>将来的に重要な機能をOSに取り込みたい + <li>GearsOSには将来的にアプリケーションが担う重要な機能をOSに取り込みたい <ul> <li>バックアップ</li> <li>ファイルの型認識</li> @@ -99,30 +99,36 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="gearsos">GearsOS</h2> +<h2 id="gearsosのgear概念12">GearsOSのGear概念(1/2)</h2> <ul> - <li>関数でなくGearという単位を用いて記述する + <li>関数でなくGearという単位を用いて記述する</li> + <li>Gearは関数と異なり、スタックを持たないため軽量継続と呼ぶ</li> + <li>CodeGear <ul> - <li>CodeGear - <ul> - <li>従来のThreadにあたる</li> - <li>goto文(jump命令)を使って遷移する</li> - </ul> - </li> - <li>DataGear - <ul> - <li>従来の変数データにあたる</li> - </ul> - </li> - <li>スタックを持たないため軽量継続と呼ぶ</li> + <li>従来のThreadにあたる</li> + <li>goto文(jump命令)を使って遷移する</li> </ul> </li> + <li>DataGear + <ul> + <li>従来の変数データにあたる</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsosのgear概念22">GearsOSのGear概念(2/2)</h2> +<ul> <li>CodeGearは処理を行う際、DataGearを参照し処理を行う(InputDataGear)</li> <li>CodeGearは処理の終了後、以降に必要なデータをDataGearとして出力する(OutputDataGear)</li> </ul> - <div style="text-align: center;"> - <img src="images/cg-dg.pdf" alt="cgdgの関係図" width="800" /> + <img src="images/cg-dg.pdf" alt="cgdgの関係図" width="600" /> </div> @@ -133,19 +139,198 @@ <!-- _S9SLIDE_ --> <h2 id="gearsosのinterface">GearsOSのInterface</h2> <ul> - <li>APIの宣言を行う + <li>Object型指向の仕組み</li> + <li>APIとなるCodeGearとその参照するDataGearを宣言する</li> + <li>DataGear/CodeGearの一時的な置き場としての役割を持つ + <pre><code>typedef struct Tree<>{ + union Data* tree; + struct Node* node; + __code put(Impl* tree,Type* node, __code next(...)); + __code get(Impl* tree, Type* node, __code next(...)); + __code remove(Impl* tree,Type* node, __code next(...)); + __code next(...); +} Tree; +</code></pre> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="メタレベルのgear13">メタレベルのGear(1/3)</h2> +<ul> + <li>CodeGearとDataGearにはユーザーが記述しない、メタレベルのものが存在する + <ul> + <li>メタレベルな記述はトランスコンパイラにより自動生成される</li> + </ul> + </li> +</ul> +<div style="text-align: center;"> + <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="メタレベルのgear23">メタレベルのGear(2/3)</h2> +<ul> + <li>MetaCodeGear + <ul> + <li>CodeGearの処理前と処理後に参照される</li> + <li>Input/OutputDataGearを引き渡す</li> + <li>CodeGear処理前に呼ばれるものを特にstubCodeGearと呼ぶ</li> + </ul> + </li> +</ul> +<div style="text-align: center;"> + <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="メタレベルのgear33">メタレベルのGear(3/3)</h2> +<ul> + <li>MetaDataGear + <ul> + <li>MetaCodeGearにて参照されるDataGear</li> + </ul> + </li> +</ul> +<div style="text-align: center;"> + <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsosのファイルシステムの設計">GearsOSのファイルシステムの設計</h2> +<ul> + <li>DataGearの単位でデータを操作したい</li> + <li>通信データに対応した複数のストリームを持ちたい</li> + <li>Transaction(マクロレベル)で操作したい + <ul> + <li>従来のファイルシステムは一部の操作のみTransactionである</li> + </ul> + </li> + <li>ファイルそのものが通信を担当する <ul> - <li>定義ファイル(.h)に記述を行う</li> - <li>APIとなるCodeGearとその参照するDataGearを宣言する</li> - <li>DataGear/CodeGearの一時的な置き場としての役割を持つ - <pre><code>typedef struct Tree<>{ -union Data* tree; -struct Node* node; -__code put(Impl* tree,Type* node, __code next(...)); -__code get(Impl* tree, Type* node, __code next(...)); -__code remove(Impl* tree,Type* node, __code next(...)); -__code next(...); -} Tree; + <li>ChristieのDataGearManagerを参考にする</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsosのファイルデータ操作13">GearsOSのファイルデータ操作(1/3)</h2> +<ul> + <li>GearsOSはDataGearのやりとりでプログラムが構成される + <ul> + <li>ファイルシステムも同様の実装にしたい = DataGear単位で操作したい</li> + </ul> + </li> +</ul> +<div style="text-align: center;"> + <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsosのファイルデータ操作23">GearsOSのファイルデータ操作(2/3)</h2> +<ul> + <li>GearsOSのファイルデータは任意の型を持った構造体で実装される(ファイルレコード)</li> + <li>レコードは決められた順番で連続しており、Queueに保存される</li> +</ul> +<div style="text-align: center;"> + <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsosのファイルデータ操作33">GearsOSのファイルデータ操作(3/3)</h2> +<ul> + <li>構造体の型を判別することで処理の切り替えが行える</li> +</ul> +<div style="text-align: center;"> + <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsfsのトランザクション">GearsFSのトランザクション</h2> +<ul> + <li>GearsOSのDataGear操作はマクロな操作である + <ul> + <li>よってCodeGearはTransactionである</li> + </ul> + </li> + <li>ファイルシステム操作もCodeGearで記述されるためTransactionとなる</li> + <li>トランザクションな操作によってファイルシステムの整合性の保守が行いやすい</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="queueによるgearsosのファイル">QueueによるGearsOSのファイル</h2> +<ul> + <li>GearsOSのファイルはファイルレコードを保持するQueueとなる</li> + <li>デバイスへの保存はQueueを保存すればよい</li> + <li>データの更新はQueueにレコードを書き込む</li> + <li>データの読み込みはQueueからデータを全て取り出す</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="queueapi--put-">QueueAPI -Put-</h2> +<ul> + <li>Put + <ul> + <li>Queueに対してファイルレコードを入力する</li> + <li>ファイルの更新の際に呼び出す</li> + <li>ファイルの変更をレコードとして書き込む + <pre><code>__code putSingleLinkedQueue(struct SingleLinkedQueue* queue, union Data* data, __code next(...)) { +Element* element = new Element(); +element->data = data; +element->next = NULL; +queue->last->next = element; +queue->last = element; +goto next(...); +} </code></pre> </li> </ul> @@ -158,101 +343,25 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="メタレベルのgear">メタレベルのGear</h2> -<ul> - <li>CodeGearとDataGearにはメタレベルのものが存在する - <ul> - <li>MetaCodeGear - <ul> - <li>CodeGearの処理前と処理後に参照される</li> - <li>Input/OutputDataGearを引き渡す</li> - <li>CodeGear処理前に呼ばれるものを特にstubCodeGearと呼ぶ</li> - </ul> - </li> - <li>MetaDataGear - <ul> - <li>MetaCodeGearにて参照されるDataGear</li> - </ul> - </li> - </ul> - </li> - <li>メタレベルの処理はトランスコンパイラにより自動に記述される</li> -</ul> -<div style="text-align: center;"> - <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> -</div> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="datagear単位のトランザクション">DataGear単位のトランザクション</h2> +<h2 id="queueapi--take-">QueueAPI -Take-</h2> <ul> - <li>GearsOSはDataGear単位でプロセスが進行する</li> - <li>従来のファイルシステムは一部の操作のみがTransactionとなっている</li> - <li>GearsOSのファイルシステムはDataGear単位で処理を行いたい - <ul> - <li>軽量継続への利用が行える</li> - <li>一つのDataGearに対する操作がトランザクションとなる</li> - </ul> - </li> -</ul> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="gearsosのファイルデータ操作">GearsOSのファイルデータ操作</h2> -<ul> - <li>ファイルデータの最小の単位は任意の型を持った構造体(DataGear)である - <ul> - <li>ファイルレコードと名付ける</li> - </ul> - </li> - <li>レコードは特定の順番で連続しており、Queueに保存される</li> - <li>GearsのDataGearとして利用できる</li> - <li>構造体の型により処理の分岐が行える</li> -</ul> - -<div style="text-align: center;"> - <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> -</div> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="ファイルqueueに対するapi">ファイルQueueに対するAPI</h2> -<ul> - <li>Put - <ul> - <li>Queueに対してファイルレコードを入力する</li> - <li>ファイルの更新の際に呼び出す</li> - <li>ファイルの変更をレコードとして書き込む</li> - </ul> - </li> <li>Take <ul> <li>Queueからファイルレコードを取り出す</li> <li>ファイルの中身の読み込みの際に用いる</li> <li>Queue内のレコードをループで全て取り出せば良い - <pre><code>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; + <pre><code>__code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) { +printf("take\n"); +struct Element* top = queue->top; +struct Element* nextElement = top->next; +if (queue->top == queue->last) { + data = NULL; +} else { + queue->top = nextElement; + data = nextElement->data; +} +goto next(data, ...); +} </code></pre> </li> </ul> @@ -294,12 +403,12 @@ <li>CodeGearはLocalDGMに対してDataGearを参照する</li> </ul> </li> - <li>RemoteDGMは接続する相手ノードに対応するデータプールploxyである + <li>RemoteDGMは接続する相手ノードに対応するデータプールproxyである <ul> <li>RemoteDGMに対してDataGearを書き込むことで、対応するノードのLocalDGMにデータが書き込まれる</li> </ul> </li> - <li>GearsFSも同様にファイルploxyを通して通信を行う</li> + <li>GearsFSも同様にファイルproxyを通して通信を行う</li> </ul> @@ -418,15 +527,15 @@ <li>readの場合(リモート側に読み込みたいファイルが存在する) <ul> <li>(手順1)ローカル側は空のファイルを作成し、socketを持たせる</li> - <li>(手順2)リモート側は, ローカル側の持つ空ファイルのploxyを作成する</li> - <li>(手順3)リモート側はploxyに対して、目的のファイルのデータをputする</li> + <li>(手順2)リモート側は, ローカル側の持つ空ファイルのproxyを作成する</li> + <li>(手順3)リモート側はproxyに対して、目的のファイルのデータをputする</li> </ul> </li> <li>writeの場合(リモート側に書き込みたいファイルが存在する) <ul> <li>(手順1)リモート側は対象ファイルにsocketを持たせる</li> - <li>(手順2)ローカル側は対象のファイルに対応するploxyを作成する</li> - <li>(手順3)ローカル側はploxyのkeyに対してデータをputする</li> + <li>(手順2)ローカル側は対象のファイルに対応するproxyを作成する</li> + <li>(手順3)ローカル側はproxyのkeyに対してデータをputする</li> </ul> </li> </ul> @@ -586,7 +695,7 @@ <li>GearsOSの調査</li> </ul> </li> - <li>ファイルploxyによる通信実現を行いたい</li> + <li>ファイルproxyによる通信実現を行いたい</li> </ul>