Mercurial > hg > Papers > 2022 > ikki-master
changeset 17:f4a719e93ded
Too long
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 06 Feb 2022 06:13:32 +0900 |
parents | ed9bace4039e |
children | b0fde43e331b |
files | Paper/images/GearsFile.pdf slide/images/.DS_Store slide/images/Context_ref.pdf slide/images/GearsFile.pdf slide/images/QueueElement.pdf slide/images/Remote_DataGearManager.pdf slide/images/TopologyManager.pdf slide/images/newGearsFile.pdf slide/images/wordCountDGM.pdf slide/images/wordCountStates.pdf slide/thesis.html slide/thesis.md slide/thesis.pdf.html |
diffstat | 13 files changed, 1219 insertions(+), 180 deletions(-) [+] |
line wrap: on
line diff
--- a/slide/thesis.html Sat Feb 05 06:07:28 2022 +0900 +++ b/slide/thesis.html Sun Feb 06 06:13:32 2022 +0900 @@ -224,26 +224,461 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="gearsosのinterface">GearsOSのInterface</h2> +<h2 id="gearsosの構成">GearsOSの構成</h2> <ul> - <li>定義ファイル(.h)に記述を行う</li> - <li>APIとなるCodeGearとその参照するDataGearを宣言する</li> - <li>コンパイル時にContext(後述)に取り込まれる + <li>Interface + <ul> + <li>定義ファイル(.h)に記述を行う</li> + <li>APIとなるCodeGearとその参照するDataGearを宣言する</li> + <li>コンパイル時にContext(後述)に書き込まれる</li> + </ul> + </li> + <li>Implement + <ul> + <li>Interfaceの実装</li> + </ul> + </li> + <li>Context <ul> - <li>CodeGear/DataGearの一時的な置き場でもある</li> - <li>DataGearは全て共用型(Union Data型)で管理される - <pre><code>typedef struct Queue<>{ -union Data* queue; -union Data* data; + <li>プログラムに使われるCodeGear/DataGearを全て管理する</li> + <li>CodeGear/DataGearの格納場所でもある</li> + <li>軽量継続中、必ず持ち歩かれる</li> + <li>メタレベルなCodeGearからのみ参照される</li> + </ul> + </li> +</ul> -__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(...); +<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; </code></pre> +<pre><code>typedef struct SynchronizedQueue <> impl Queue { + struct Element* top; + struct Element* last; + struct Atomic* atomic; +} SynchronizedQueue; +</code></pre> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="contextとgearの関係性">ContextとGearの関係性</h2> +<div style="text-align: center;"> + <img src="images/Context_ref.pdf" alt="Contextの参照" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsosのトランスコンパイラ">GearsOSのトランスコンパイラ</h2> +<ul> + <li>CbCプログラムはトランスコンパイルによりC言語プログラムに書き換えられる + <ul> + <li>トランスコンパイルの際に、メタレベルの記述が行われる + <ul> + <li>StubCodeGearの自動生成</li> + <li>Gears向けに記述された演算子(par goto ,NEW)の書き換え</li> + </ul> + </li> + </ul> + </li> + <li>StubCodeGearはCbCプログラムへ直に記述することでユーザーの任意の処理に変えられる + <pre><code>__code putSynchronizedQueue_stub(struct Context* context) { + SynchronizedQueue* queue = (SynchronizedQueue*)GearImpl(context, Queue, queue); + Data* data = Gearef(context, Queue)->data; + enum Code next = Gearef(context, Queue)->next; + goto putSynchronizedQueue(context, queue, data, next); +} +</code></pre> + <pre><code>__code putSynchronizedQueue(struct Context *context,struct SynchronizedQueue* queue, +union Data* data, enum Code next) { + ~省略~ +} +</code></pre> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="分散フレームワークchristie">分散フレームワークChristie</h2> +<ul> + <li>Java言語で記述された分散フレームワーク</li> + <li>CbCと似てはいるが異なったGearというプログラム概念がある</li> + <li>特定のkeyに対する変数データ書き込みにより通信を行う</li> + <li>自律分散の実現を目指して開発された</li> + <li>通信ノードの接続を行うTopologyManagerという機能を持つ</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christieのgear">ChristieのGear</h2> +<ul> + <li>CodeGear + <ul> + <li>スレッドに相当する</li> + <li>処理開始前に任意のDataGearを待ち合わせ、揃ったら処理が実行される</li> + </ul> + </li> + <li>DataGear + <ul> + <li>変数データに相当する</li> + <li>型を所持している</li> + <li>アノテーションによりデータの参照後の処理が変化する + <ul> + <li>Take : 参照されたDataGearは削除される</li> + <li>Peek : 参照されてもDataGearは削除されない</li> + </ul> + </li> + </ul> + </li> + <li>CodeGearManger + <ul> + <li>ノードに相当する</li> + <li>DataGearManagerを所持し、それによりCodeGearとDataGearを管理する</li> + </ul> + </li> + <li>DataGearManager + <ul> + <li>データプールに相当する</li> + <li>DataGearのkeyとデータの組み合わせを保持している</li> + <li>LocalとRemoteの二種類が存在する</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="datagearmanagerによる通信">DataGearManagerによる通信</h2> +<ul> + <li>ChristieではDataGearの送受信によりノードどうしの通信を行う</li> + <li>LocalDataGearManager (LocalDGM) + <ul> + <li>CodeGearManagerが持つ、自身のDataGearPool</li> + <li>CodeGear中のDataGearは普段これを参照する</li> + </ul> + </li> + <li>RemoteDataGearManager (RemoteDGM) + <ul> + <li>他のCodeGearManagerが持つLocalDGMに対応するploxy</li> + <li>RemoteDGMに書き込みを行うと、対応したCodeGearManagerが持つLocalDGMに書き込みが行われる</li> + </ul> + </li> + <li>DataGearManagerによる通信がChristieの通信の要となっている</li> +</ul> +<div style="text-align: center;"> + <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="topologymanagear">TopologyManagear</h2> +<ul> + <li>参加を表明したノードに対して任意の形のTopologyに接続する + <ul> + <li>接続 = RemoteDGMを作成する</li> + <li>接続されたノードは他のノードを相対的な名前で参照できる(例:Child/parent, right/leftなど)</li> + </ul> + </li> + <li>TopologyManagerに煩雑な通信接続を任せることができる</li> +</ul> +<div style="text-align: center;"> + <img src="images/TopologyManager.pdf" alt="TopologyManager" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsfilesystemの目指す仕様">GearsFileSystemの目指す仕様</h2> +<ul> + <li>データベース的なレコード操作によるファイルアクセス + <ul> + <li>KeyValueStoreに対する書き込み</li> + </ul> + </li> + <li>ファイルのバックアップの + <ul> + <li>ディレクトリの非破壊的編集とファイルの構成方法</li> + </ul> + </li> + <li>ファイルの型の認識 + <ul> + <li>ファイルレコードの構造体の型により認識する</li> + </ul> + </li> + <li>自律分散を目指した分散ファイルシステム + <ul> + <li>プロトコルを用いないChristieAPI</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsfsのファイル構造13">GearsFSのファイル構造1/3</h2> +<ul> + <li>ファイルのデータは任意の型を持ったレコードとして断続的に分割された状態で保存される + <ul> + <li>レコードはQueueに保存される</li> + <li>ファイルはレコードが先頭から順に読むことで構成される</li> + </ul> + </li> + <li>ファイルレコードは構造体で再現される + <ul> + <li>ファイルレコード構造体はGearsDataGearとして利用できる</li> + <li>レコードの構造体によりOSはファイルの型を認識する + <ul> + <li>ファイルの特性に合わせ、レコードとその構成方法を適した形で構成できる</li> + </ul> + </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="gearsfsのファイル構造23">GearsFSのファイル構造2/3</h2> +<ul> + <li>GearsOSのファイルはChristieのDataGearManagerの仕組みを用いる</li> + <li>ファイルの読み込み/書き込みはStreamを通して行われる + <ul> + <li>streamも同様にQueueで構成される</li> + <li>streamはそれぞれ特定のkey nameをもち、keyを用いることでアクセスが行われる</li> + </ul> + </li> + <li>最低でも、Input/OutputのStreamとファイルデータを保持するmainなQueueの三つで構成される</li> + <li>Write : InputStreamに対してレコードをputすれば良い</li> + <li>Read : OutputStreamからレコードを全てtakeすれば良い</li> + <li>GearsOSのファイルは大域的な資源として複数のプロセスより競合的なアクセスが行われる + <ul> + <li>OutputStreamは複数のアクセスが行われても整合性が保たれる必要がある</li> + <li>CAS(Compare And Swap)が採用されたSynchronizedQueueを用いる</li> + </ul> + </li> +</ul> +<div style="text-align: center;"> + <img src="images/GearsFile.pdf" alt="streamによるファイルアクセス" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsfsのファイル構造33">GearsFSのファイル構造3/3</h2> +<ul> + <li>stream、mainQueueはDataGearに相当し、keyによるアクセスが行われる</li> + <li>Queueは赤黒木に保持されており、key nameで検索が行われ参照される</li> + <li>DGMへ書き込みを行うプロセスは入力するデータに加え対象のkey nameを指定する必要がある</li> +</ul> +<div style="text-align: center;"> + <img src="images/newGearsFile.pdf" alt="DataGearの保存形式" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="遠隔からのファイル操作">遠隔からのファイル操作</h2> +<ul> + <li>GearsOSのファイルはファイルであり、通信そのものにも相当する</li> + <li>RemoteDGMの仕組みを用いることで遠隔からのファイル読み込み/書き込みを行う</li> + <li>readの場合(リモート側に読み込みたいファイルが存在する) + <ul> + <li>(手順1)ローカル側はLocalDGMの相当する空のファイルを作成し、socketを持つ</li> + <li>(手順2)リモート側はローカルの空ファイルのploxyを作成する</li> + <li>(手順3)リモート側はploxyに対してデータをputする</li> + </ul> + </li> + <li>writeの場合(リモート側に書き込みたいファイルが存在する) + <ul> + <li>(手順1)リモート側はファイルのsocketを持つ</li> + <li>(手順2)ローカル側はローカルのファイルに接続し、ploxy(RemoteDGM)を作成する</li> + <li>(手順3)ローカル側はploxyのkeyに対してデータをputする</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="wordcount例題">WordCount例題</h2> +<ul> + <li>ChristieAPIの構成をWordCount例題を通して行った</li> + <li>ファイルの中を1行ずつ読み取り、ファイル内の文字数、行列を調べる</li> + <li>ファイルの読み込みと文字列のカウントをそれぞれ別ノード上で行うことで、ファイル読み込みとファイルレコードの通信の必要が生じる</li> + <li>(手順1)ファイル内文字列を1行ずつWordCount関数へ入力する、これをループ</li> + <li>(手順2)ファイル内文字列が無くなった場合(EoF)結果を出力し、終了する</li> +</ul> + +<div style="text-align: center;"> + <img src="images/wordCountStates.pdf" alt="WordCountの遷移図" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christieapiによるwordcount">ChristieAPIによるWordCount</h2> +<ul> + <li>FileOpen側とWordCount側でノードが別れる</li> + <li>(手順1)FileOpen側はRDGMに文字列をputする</li> + <li>(手順2)WordCount側は処理の後、ackを返信する</li> + <li>(手順3)1,2をループし、FileOpen側はEoFならフラグを送信する</li> + <li>(手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる</li> +</ul> +<div style="text-align: center;"> + <img src="images/wordCountDGM.pdf" alt="ChristieAPIによるWordCount" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="localdgmのsocketの受信データ取り出し">LocalDGMのsocketの受信データ取り出し</h2> +<ul> + <li>LocalDGMに相当するファイルは接続先socketから送信されたデータを取り出す必要がある</li> + <li>取り出されたデータはInputStreamQueueに対してputされる + <pre><code>__code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenEOF(...), __code whenError(...)){ + int recv_size, send_size; + char send_buf; + + union Data* recv_data; + recv_size = recv(cQueue->socket, recv_data, sizeof(union Data), 0); + if (recv_size == -1) { + printf("recv error\n"); + goto whenError(...); + } + if (recv_size == 0) { + printf("connection ended\n"); + goto whenError(...); + } + + + FileString* fileString = NEW(FileString); + fileString = recv_data; + if (fileString->EoF) == 1) { + send_buf = 0; + send_size = send(cQueue->socket, &send_buf, 1, 0); + if (send_size == -1) { + printf("send error\n"); + } + close(cQueue->buffer); + goto whenEOF(...); + } else { + send_buf = 1; + send_size = send(cQueue->socket, &send_buf, 1, 0); + if (send_size == -1) { + printf("send error\n"); + goto whenError(...); + } + } + + Gearef(context, cQueue)->data = recv_data; + goto putLocalDGMQueue(recv_data, next); +} +</code></pre> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="remotedgmのsocketによるデータ送信">RemoteDGMのsocketによるデータ送信</h2> +<ul> + <li>RemoteDGM側はsocketを用いてデータを送信する</li> + <li>Queueに対してputされたデータを送信する + <ul> + <li>putCodeGearの直後に呼び出される + <pre><code>__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){ +char recv_buf; +int send_size, recv_size; + +send_size = send(cQueue->socket, data, sizeof(union Data), 0); +if (send_size == -1) { + printf("send error\n"); + goto whenError(); +} + +recv_size = recv(cQueue->socket, &recv_buf, 1, 0); +if (recv_size == -1) { + printf("recv error\n"); + goto whenError(); +} else if (recv_size == 0) { + printf("connection ended\n"); + goto whenError(); +} else if(recv_buf == 0) { + printf("Finish connection\n"); + close(cQueue->socket); + goto whenError(); +} +goto next(...); +} +</code></pre> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="この先保留ページ">この先保留ページ</h2> </li> </ul> </li> @@ -256,63 +691,38 @@ <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="gearsosのimplementation">GearsOSのImplementation</h2> -<p>-</p> - - +<ul> + <li>Interfaceの実装である</li> + <li>定義ファイル(.h)に記述を行う</li> + <li>必ず継承元のInterfaceを記述する必要がある</li> + <li>プロセス内のCodeGearが共通して使いたい変数を記述する + <pre><code>typedef struct SynchronizedQueue <> impl Queue { +struct Element* top; +struct Element* last; +struct Atomic* atomic; +} SynchronizedQueue; +</code></pre> + </div> <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="テスト用テキストエディタ">テスト用テキストエディタ</h2> - -<pre><code>public class MyDocumentListener implements DocumentListener { - @Override - public void insertUpdate(DocumentEvent e) { - Document doc = e.getDocument(); - loc = e.getOffset(); - System.out.println(loc); - - } - - @Override - public void removeUpdate(DocumentEvent e) { - Document doc = e.getDocument(); - sendLoc = e.getOffset(); - System.out.println("delete " + sendLoc); - } - @Override - public void changedUpdate(DocumentEvent e) { - } -} -</code></pre> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="編集位置の相違">編集位置の相違</h2> -<ul> - <li>同期編集のセッションでは命令コマンドの送信のすれ違いにより、ノードごとのファイル状態が異なってしまうことがある。</li> - <li>EditorAとEditorBはそれぞれの命令を自身のエディタバッファに施してから命令を送信するため、お互いバッファ状態が異なる状態で受け取った命令を実行してしまう。</li> +<h2 id="研究成果">研究成果</h2> + </li> + <li>連続するレコードで構成されるGearsOSファイルの設計</li> + <li>keyアクセスを用いたファイルに対するRead, writeAPI</li> + <li>赤黒木を用いたディレクトリシステムの構築</li> + <li>ファイルのバックアップ考察</li> + <li>ploxyを用いたファイルの送受信</li> </ul> -<div style="text-align: center;"> - <img src="images/difference_offset.pdf" alt="MetaGear" width="800" /> -</div> - -<!-- -- RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 ---> - -<pre><code class="language-Code">digraph test { - node0 -> node1 [label="right"] - node1 -> node2 [label="right"] - node2 -> node0 [label="right"] -} -</code></pre> +<p>## +<!–</p> +<ul> + <li>RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 +–></li> +</ul> </div>
--- a/slide/thesis.md Sat Feb 05 06:07:28 2022 +0900 +++ b/slide/thesis.md Sun Feb 06 06:13:32 2022 +0900 @@ -23,6 +23,7 @@ - 分散フレームワークChristieの仕組みにより実現する + ## CbC (Continuation based C) - C言語の拡張言語である - 関数に代わる軽量継続をメインに記述する @@ -72,12 +73,19 @@ <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800"> </div> -## GearsOSのInterface -- 定義ファイル(.h)に記述を行う -- APIとなるCodeGearとその参照するDataGearを宣言する -- コンパイル時にContext(後述)に取り込まれる - - CodeGear/DataGearの一時的な置き場でもある - - DataGearは全て共用型(Union Data型)で管理される +## GearsOSの構成 +- Interface + - 定義ファイル(.h)に記述を行う + - APIとなるCodeGearとその参照するDataGearを宣言する + - コンパイル時にContext(後述)に書き込まれる +- Implement + - Interfaceの実装 +- Context + - プログラムに使われるCodeGear/DataGearを全て管理する + - CodeGear/DataGearの格納場所でもある + - 軽量継続中、必ず持ち歩かれる + - メタレベルなCodeGearからのみ参照される + ``` typedef struct Queue<>{ union Data* queue; @@ -91,56 +99,267 @@ __code next(...); } Queue; ``` +``` +typedef struct SynchronizedQueue <> impl Queue { + struct Element* top; + struct Element* last; + struct Atomic* atomic; +} SynchronizedQueue; +``` +## ContextとGearの関係性 +<div style="text-align: center;"> + <img src="images/Context_ref.pdf" alt="Contextの参照" width="800"> +</div> + +## GearsOSのトランスコンパイラ +- CbCプログラムはトランスコンパイルによりC言語プログラムに書き換えられる + - トランスコンパイルの際に、メタレベルの記述が行われる + - StubCodeGearの自動生成 + - Gears向けに記述された演算子(par goto ,NEW)の書き換え +- StubCodeGearはCbCプログラムへ直に記述することでユーザーの任意の処理に変えられる +``` +__code putSynchronizedQueue_stub(struct Context* context) { + SynchronizedQueue* queue = (SynchronizedQueue*)GearImpl(context, Queue, queue); + Data* data = Gearef(context, Queue)->data; + enum Code next = Gearef(context, Queue)->next; + goto putSynchronizedQueue(context, queue, data, next); +} +``` +``` +__code putSynchronizedQueue(struct Context *context,struct SynchronizedQueue* queue, +union Data* data, enum Code next) { + ~省略~ +} +``` + +## 分散フレームワークChristie +- Java言語で記述された分散フレームワーク +- CbCと似てはいるが異なったGearというプログラム概念がある +- 特定のkeyに対する変数データ書き込みにより通信を行う +- 自律分散の実現を目指して開発された +- 通信ノードの接続を行うTopologyManagerという機能を持つ + +## ChristieのGear +- CodeGear + - スレッドに相当する + - 処理開始前に任意のDataGearを待ち合わせ、揃ったら処理が実行される +- DataGear + - 変数データに相当する + - 型を所持している + - アノテーションによりデータの参照後の処理が変化する + - Take : 参照されたDataGearは削除される + - Peek : 参照されてもDataGearは削除されない +- CodeGearManger + - ノードに相当する + - DataGearManagerを所持し、それによりCodeGearとDataGearを管理する +- DataGearManager + - データプールに相当する + - DataGearのkeyとデータの組み合わせを保持している + - LocalとRemoteの二種類が存在する + +## DataGearManagerによる通信 +- ChristieではDataGearの送受信によりノードどうしの通信を行う +- LocalDataGearManager (LocalDGM) + - CodeGearManagerが持つ、自身のDataGearPool + - CodeGear中のDataGearは普段これを参照する +- RemoteDataGearManager (RemoteDGM) + - 他のCodeGearManagerが持つLocalDGMに対応するploxy + - RemoteDGMに書き込みを行うと、対応したCodeGearManagerが持つLocalDGMに書き込みが行われる +- DataGearManagerによる通信がChristieの通信の要となっている +<div style="text-align: center;"> + <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="800"> +</div> + +## TopologyManagear +- 参加を表明したノードに対して任意の形のTopologyに接続する + - 接続 = RemoteDGMを作成する + - 接続されたノードは他のノードを相対的な名前で参照できる(例:Child/parent, right/leftなど) +- TopologyManagerに煩雑な通信接続を任せることができる +<div style="text-align: center;"> + <img src="images/TopologyManager.pdf" alt=TopologyManager width="800"> +</div> + +## GearsFileSystemの目指す仕様 +- データベース的なレコード操作によるファイルアクセス + - KeyValueStoreに対する書き込み +- ファイルのバックアップの + - ディレクトリの非破壊的編集とファイルの構成方法 +- ファイルの型の認識 + - ファイルレコードの構造体の型により認識する +- 自律分散を目指した分散ファイルシステム + - プロトコルを用いないChristieAPI + +## GearsFSのファイル構造1/3 +- ファイルのデータは任意の型を持ったレコードとして断続的に分割された状態で保存される + - レコードはQueueに保存される + - ファイルはレコードが先頭から順に読むことで構成される +- ファイルレコードは構造体で再現される + - ファイルレコード構造体はGearsDataGearとして利用できる + - レコードの構造体によりOSはファイルの型を認識する + - ファイルの特性に合わせ、レコードとその構成方法を適した形で構成できる + +<div style="text-align: center;"> + <img src="images/QueueElement.pdf" alt=Queueの構造 width="800"> +</div> + +## GearsFSのファイル構造2/3 +- GearsOSのファイルはChristieのDataGearManagerの仕組みを用いる +- ファイルの読み込み/書き込みはStreamを通して行われる + - streamも同様にQueueで構成される + - streamはそれぞれ特定のkey nameをもち、keyを用いることでアクセスが行われる +- 最低でも、Input/OutputのStreamとファイルデータを保持するmainなQueueの三つで構成される +- Write : InputStreamに対してレコードをputすれば良い +- Read : OutputStreamからレコードを全てtakeすれば良い +- GearsOSのファイルは大域的な資源として複数のプロセスより競合的なアクセスが行われる + - OutputStreamは複数のアクセスが行われても整合性が保たれる必要がある + - CAS(Compare And Swap)が採用されたSynchronizedQueueを用いる +<div style="text-align: center;"> + <img src="images/GearsFile.pdf" alt= streamによるファイルアクセス width="800"> +</div> + +## GearsFSのファイル構造3/3 +- stream、mainQueueはDataGearに相当し、keyによるアクセスが行われる +- Queueは赤黒木に保持されており、key nameで検索が行われ参照される +- DGMへ書き込みを行うプロセスは入力するデータに加え対象のkey nameを指定する必要がある +<div style="text-align: center;"> + <img src="images/newGearsFile.pdf" alt= DataGearの保存形式 width="800"> +</div> + + +## 遠隔からのファイル操作 +- GearsOSのファイルはファイルであり、通信そのものにも相当する +- RemoteDGMの仕組みを用いることで遠隔からのファイル読み込み/書き込みを行う +- readの場合(リモート側に読み込みたいファイルが存在する) + - (手順1)ローカル側はLocalDGMの相当する空のファイルを作成し、socketを持つ + - (手順2)リモート側はローカルの空ファイルのploxyを作成する + - (手順3)リモート側はploxyに対してデータをputする +- writeの場合(リモート側に書き込みたいファイルが存在する) + - (手順1)リモート側はファイルのsocketを持つ + - (手順2)ローカル側はローカルのファイルに接続し、ploxy(RemoteDGM)を作成する + - (手順3)ローカル側はploxyのkeyに対してデータをputする + + + +## WordCount例題 +- ChristieAPIの構成をWordCount例題を通して行った +- ファイルの中を1行ずつ読み取り、ファイル内の文字数、行列を調べる +- ファイルの読み込みと文字列のカウントをそれぞれ別ノード上で行うことで、ファイル読み込みとファイルレコードの通信の必要が生じる +- (手順1)ファイル内文字列を1行ずつWordCount関数へ入力する、これをループ +- (手順2)ファイル内文字列が無くなった場合(EoF)結果を出力し、終了する + +<div style="text-align: center;"> + <img src="images/wordCountStates.pdf" alt=WordCountの遷移図 width="800"> +</div> + + +## ChristieAPIによるWordCount +- FileOpen側とWordCount側でノードが別れる +- (手順1)FileOpen側はRDGMに文字列をputする +- (手順2)WordCount側は処理の後、ackを返信する +- (手順3)1,2をループし、FileOpen側はEoFならフラグを送信する +- (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる +<div style="text-align: center;"> + <img src="images/wordCountDGM.pdf" alt=ChristieAPIによるWordCount width="800"> +</div> + +## LocalDGMのsocketの受信データ取り出し +- LocalDGMに相当するファイルは接続先socketから送信されたデータを取り出す必要がある +- 取り出されたデータはInputStreamQueueに対してputされる +``` +__code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenEOF(...), __code whenError(...)){ + int recv_size, send_size; + char send_buf; + + union Data* recv_data; + recv_size = recv(cQueue->socket, recv_data, sizeof(union Data), 0); + if (recv_size == -1) { + printf("recv error\n"); + goto whenError(...); + } + if (recv_size == 0) { + printf("connection ended\n"); + goto whenError(...); + } + + + FileString* fileString = NEW(FileString); + fileString = recv_data; + if (fileString->EoF) == 1) { + send_buf = 0; + send_size = send(cQueue->socket, &send_buf, 1, 0); + if (send_size == -1) { + printf("send error\n"); + } + close(cQueue->buffer); + goto whenEOF(...); + } else { + send_buf = 1; + send_size = send(cQueue->socket, &send_buf, 1, 0); + if (send_size == -1) { + printf("send error\n"); + goto whenError(...); + } + } + + Gearef(context, cQueue)->data = recv_data; + goto putLocalDGMQueue(recv_data, next); +} +``` + +## RemoteDGMのsocketによるデータ送信 +- RemoteDGM側はsocketを用いてデータを送信する +- Queueに対してputされたデータを送信する + - putCodeGearの直後に呼び出される +``` +__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){ + char recv_buf; + int send_size, recv_size; + + send_size = send(cQueue->socket, data, sizeof(union Data), 0); + if (send_size == -1) { + printf("send error\n"); + goto whenError(); + } + + recv_size = recv(cQueue->socket, &recv_buf, 1, 0); + if (recv_size == -1) { + printf("recv error\n"); + goto whenError(); + } else if (recv_size == 0) { + printf("connection ended\n"); + goto whenError(); + } else if(recv_buf == 0) { + printf("Finish connection\n"); + close(cQueue->socket); + goto whenError(); + } + goto next(...); +} +``` +## この先保留ページ ## GearsOSのImplementation -- Impl - -## テスト用テキストエディタ - +- Interfaceの実装である +- 定義ファイル(.h)に記述を行う +- 必ず継承元のInterfaceを記述する必要がある +- プロセス内のCodeGearが共通して使いたい変数を記述する ``` -public class MyDocumentListener implements DocumentListener { - @Override - public void insertUpdate(DocumentEvent e) { - Document doc = e.getDocument(); - loc = e.getOffset(); - System.out.println(loc); - - } +typedef struct SynchronizedQueue <> impl Queue { + struct Element* top; + struct Element* last; + struct Atomic* atomic; +} SynchronizedQueue; +``` +## 研究成果 +- 連続するレコードで構成されるGearsOSファイルの設計 +- keyアクセスを用いたファイルに対するRead, writeAPI +- 赤黒木を用いたディレクトリシステムの構築 +- ファイルのバックアップ考察 +- ploxyを用いたファイルの送受信 - @Override - public void removeUpdate(DocumentEvent e) { - Document doc = e.getDocument(); - sendLoc = e.getOffset(); - System.out.println("delete " + sendLoc); - } - @Override - public void changedUpdate(DocumentEvent e) { - } -} -``` - - -## 編集位置の相違 -- 同期編集のセッションでは命令コマンドの送信のすれ違いにより、ノードごとのファイル状態が異なってしまうことがある。 -- EditorAとEditorBはそれぞれの命令を自身のエディタバッファに施してから命令を送信するため、お互いバッファ状態が異なる状態で受け取った命令を実行してしまう。 - -<div style="text-align: center;"> - <img src="images/difference_offset.pdf" alt="MetaGear" width="800"> -</div> - - +## <!-- - RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 --> - - - -```Code -digraph test { - node0 -> node1 [label="right"] - node1 -> node2 [label="right"] - node2 -> node0 [label="right"] -} -```
--- a/slide/thesis.pdf.html Sat Feb 05 06:07:28 2022 +0900 +++ b/slide/thesis.pdf.html Sun Feb 06 06:13:32 2022 +0900 @@ -208,26 +208,461 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="gearsosのinterface">GearsOSのInterface</h2> +<h2 id="gearsosの構成">GearsOSの構成</h2> <ul> - <li>定義ファイル(.h)に記述を行う</li> - <li>APIとなるCodeGearとその参照するDataGearを宣言する</li> - <li>コンパイル時にContext(後述)に取り込まれる + <li>Interface + <ul> + <li>定義ファイル(.h)に記述を行う</li> + <li>APIとなるCodeGearとその参照するDataGearを宣言する</li> + <li>コンパイル時にContext(後述)に書き込まれる</li> + </ul> + </li> + <li>Implement + <ul> + <li>Interfaceの実装</li> + </ul> + </li> + <li>Context <ul> - <li>CodeGear/DataGearの一時的な置き場でもある</li> - <li>DataGearは全て共用型(Union Data型)で管理される - <pre><code>typedef struct Queue<>{ -union Data* queue; -union Data* data; + <li>プログラムに使われるCodeGear/DataGearを全て管理する</li> + <li>CodeGear/DataGearの格納場所でもある</li> + <li>軽量継続中、必ず持ち歩かれる</li> + <li>メタレベルなCodeGearからのみ参照される</li> + </ul> + </li> +</ul> -__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(...); +<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; </code></pre> +<pre><code>typedef struct SynchronizedQueue <> impl Queue { + struct Element* top; + struct Element* last; + struct Atomic* atomic; +} SynchronizedQueue; +</code></pre> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="contextとgearの関係性">ContextとGearの関係性</h2> +<div style="text-align: center;"> + <img src="images/Context_ref.pdf" alt="Contextの参照" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsosのトランスコンパイラ">GearsOSのトランスコンパイラ</h2> +<ul> + <li>CbCプログラムはトランスコンパイルによりC言語プログラムに書き換えられる + <ul> + <li>トランスコンパイルの際に、メタレベルの記述が行われる + <ul> + <li>StubCodeGearの自動生成</li> + <li>Gears向けに記述された演算子(par goto ,NEW)の書き換え</li> + </ul> + </li> + </ul> + </li> + <li>StubCodeGearはCbCプログラムへ直に記述することでユーザーの任意の処理に変えられる + <pre><code>__code putSynchronizedQueue_stub(struct Context* context) { + SynchronizedQueue* queue = (SynchronizedQueue*)GearImpl(context, Queue, queue); + Data* data = Gearef(context, Queue)->data; + enum Code next = Gearef(context, Queue)->next; + goto putSynchronizedQueue(context, queue, data, next); +} +</code></pre> + <pre><code>__code putSynchronizedQueue(struct Context *context,struct SynchronizedQueue* queue, +union Data* data, enum Code next) { + ~省略~ +} +</code></pre> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="分散フレームワークchristie">分散フレームワークChristie</h2> +<ul> + <li>Java言語で記述された分散フレームワーク</li> + <li>CbCと似てはいるが異なったGearというプログラム概念がある</li> + <li>特定のkeyに対する変数データ書き込みにより通信を行う</li> + <li>自律分散の実現を目指して開発された</li> + <li>通信ノードの接続を行うTopologyManagerという機能を持つ</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christieのgear">ChristieのGear</h2> +<ul> + <li>CodeGear + <ul> + <li>スレッドに相当する</li> + <li>処理開始前に任意のDataGearを待ち合わせ、揃ったら処理が実行される</li> + </ul> + </li> + <li>DataGear + <ul> + <li>変数データに相当する</li> + <li>型を所持している</li> + <li>アノテーションによりデータの参照後の処理が変化する + <ul> + <li>Take : 参照されたDataGearは削除される</li> + <li>Peek : 参照されてもDataGearは削除されない</li> + </ul> + </li> + </ul> + </li> + <li>CodeGearManger + <ul> + <li>ノードに相当する</li> + <li>DataGearManagerを所持し、それによりCodeGearとDataGearを管理する</li> + </ul> + </li> + <li>DataGearManager + <ul> + <li>データプールに相当する</li> + <li>DataGearのkeyとデータの組み合わせを保持している</li> + <li>LocalとRemoteの二種類が存在する</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="datagearmanagerによる通信">DataGearManagerによる通信</h2> +<ul> + <li>ChristieではDataGearの送受信によりノードどうしの通信を行う</li> + <li>LocalDataGearManager (LocalDGM) + <ul> + <li>CodeGearManagerが持つ、自身のDataGearPool</li> + <li>CodeGear中のDataGearは普段これを参照する</li> + </ul> + </li> + <li>RemoteDataGearManager (RemoteDGM) + <ul> + <li>他のCodeGearManagerが持つLocalDGMに対応するploxy</li> + <li>RemoteDGMに書き込みを行うと、対応したCodeGearManagerが持つLocalDGMに書き込みが行われる</li> + </ul> + </li> + <li>DataGearManagerによる通信がChristieの通信の要となっている</li> +</ul> +<div style="text-align: center;"> + <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="topologymanagear">TopologyManagear</h2> +<ul> + <li>参加を表明したノードに対して任意の形のTopologyに接続する + <ul> + <li>接続 = RemoteDGMを作成する</li> + <li>接続されたノードは他のノードを相対的な名前で参照できる(例:Child/parent, right/leftなど)</li> + </ul> + </li> + <li>TopologyManagerに煩雑な通信接続を任せることができる</li> +</ul> +<div style="text-align: center;"> + <img src="images/TopologyManager.pdf" alt="TopologyManager" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsfilesystemの目指す仕様">GearsFileSystemの目指す仕様</h2> +<ul> + <li>データベース的なレコード操作によるファイルアクセス + <ul> + <li>KeyValueStoreに対する書き込み</li> + </ul> + </li> + <li>ファイルのバックアップの + <ul> + <li>ディレクトリの非破壊的編集とファイルの構成方法</li> + </ul> + </li> + <li>ファイルの型の認識 + <ul> + <li>ファイルレコードの構造体の型により認識する</li> + </ul> + </li> + <li>自律分散を目指した分散ファイルシステム + <ul> + <li>プロトコルを用いないChristieAPI</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsfsのファイル構造13">GearsFSのファイル構造1/3</h2> +<ul> + <li>ファイルのデータは任意の型を持ったレコードとして断続的に分割された状態で保存される + <ul> + <li>レコードはQueueに保存される</li> + <li>ファイルはレコードが先頭から順に読むことで構成される</li> + </ul> + </li> + <li>ファイルレコードは構造体で再現される + <ul> + <li>ファイルレコード構造体はGearsDataGearとして利用できる</li> + <li>レコードの構造体によりOSはファイルの型を認識する + <ul> + <li>ファイルの特性に合わせ、レコードとその構成方法を適した形で構成できる</li> + </ul> + </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="gearsfsのファイル構造23">GearsFSのファイル構造2/3</h2> +<ul> + <li>GearsOSのファイルはChristieのDataGearManagerの仕組みを用いる</li> + <li>ファイルの読み込み/書き込みはStreamを通して行われる + <ul> + <li>streamも同様にQueueで構成される</li> + <li>streamはそれぞれ特定のkey nameをもち、keyを用いることでアクセスが行われる</li> + </ul> + </li> + <li>最低でも、Input/OutputのStreamとファイルデータを保持するmainなQueueの三つで構成される</li> + <li>Write : InputStreamに対してレコードをputすれば良い</li> + <li>Read : OutputStreamからレコードを全てtakeすれば良い</li> + <li>GearsOSのファイルは大域的な資源として複数のプロセスより競合的なアクセスが行われる + <ul> + <li>OutputStreamは複数のアクセスが行われても整合性が保たれる必要がある</li> + <li>CAS(Compare And Swap)が採用されたSynchronizedQueueを用いる</li> + </ul> + </li> +</ul> +<div style="text-align: center;"> + <img src="images/GearsFile.pdf" alt="streamによるファイルアクセス" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsfsのファイル構造33">GearsFSのファイル構造3/3</h2> +<ul> + <li>stream、mainQueueはDataGearに相当し、keyによるアクセスが行われる</li> + <li>Queueは赤黒木に保持されており、key nameで検索が行われ参照される</li> + <li>DGMへ書き込みを行うプロセスは入力するデータに加え対象のkey nameを指定する必要がある</li> +</ul> +<div style="text-align: center;"> + <img src="images/newGearsFile.pdf" alt="DataGearの保存形式" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="遠隔からのファイル操作">遠隔からのファイル操作</h2> +<ul> + <li>GearsOSのファイルはファイルであり、通信そのものにも相当する</li> + <li>RemoteDGMの仕組みを用いることで遠隔からのファイル読み込み/書き込みを行う</li> + <li>readの場合(リモート側に読み込みたいファイルが存在する) + <ul> + <li>(手順1)ローカル側はLocalDGMの相当する空のファイルを作成し、socketを持つ</li> + <li>(手順2)リモート側はローカルの空ファイルのploxyを作成する</li> + <li>(手順3)リモート側はploxyに対してデータをputする</li> + </ul> + </li> + <li>writeの場合(リモート側に書き込みたいファイルが存在する) + <ul> + <li>(手順1)リモート側はファイルのsocketを持つ</li> + <li>(手順2)ローカル側はローカルのファイルに接続し、ploxy(RemoteDGM)を作成する</li> + <li>(手順3)ローカル側はploxyのkeyに対してデータをputする</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="wordcount例題">WordCount例題</h2> +<ul> + <li>ChristieAPIの構成をWordCount例題を通して行った</li> + <li>ファイルの中を1行ずつ読み取り、ファイル内の文字数、行列を調べる</li> + <li>ファイルの読み込みと文字列のカウントをそれぞれ別ノード上で行うことで、ファイル読み込みとファイルレコードの通信の必要が生じる</li> + <li>(手順1)ファイル内文字列を1行ずつWordCount関数へ入力する、これをループ</li> + <li>(手順2)ファイル内文字列が無くなった場合(EoF)結果を出力し、終了する</li> +</ul> + +<div style="text-align: center;"> + <img src="images/wordCountStates.pdf" alt="WordCountの遷移図" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christieapiによるwordcount">ChristieAPIによるWordCount</h2> +<ul> + <li>FileOpen側とWordCount側でノードが別れる</li> + <li>(手順1)FileOpen側はRDGMに文字列をputする</li> + <li>(手順2)WordCount側は処理の後、ackを返信する</li> + <li>(手順3)1,2をループし、FileOpen側はEoFならフラグを送信する</li> + <li>(手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる</li> +</ul> +<div style="text-align: center;"> + <img src="images/wordCountDGM.pdf" alt="ChristieAPIによるWordCount" width="800" /> +</div> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="localdgmのsocketの受信データ取り出し">LocalDGMのsocketの受信データ取り出し</h2> +<ul> + <li>LocalDGMに相当するファイルは接続先socketから送信されたデータを取り出す必要がある</li> + <li>取り出されたデータはInputStreamQueueに対してputされる + <pre><code>__code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenEOF(...), __code whenError(...)){ + int recv_size, send_size; + char send_buf; + + union Data* recv_data; + recv_size = recv(cQueue->socket, recv_data, sizeof(union Data), 0); + if (recv_size == -1) { + printf("recv error\n"); + goto whenError(...); + } + if (recv_size == 0) { + printf("connection ended\n"); + goto whenError(...); + } + + + FileString* fileString = NEW(FileString); + fileString = recv_data; + if (fileString->EoF) == 1) { + send_buf = 0; + send_size = send(cQueue->socket, &send_buf, 1, 0); + if (send_size == -1) { + printf("send error\n"); + } + close(cQueue->buffer); + goto whenEOF(...); + } else { + send_buf = 1; + send_size = send(cQueue->socket, &send_buf, 1, 0); + if (send_size == -1) { + printf("send error\n"); + goto whenError(...); + } + } + + Gearef(context, cQueue)->data = recv_data; + goto putLocalDGMQueue(recv_data, next); +} +</code></pre> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="remotedgmのsocketによるデータ送信">RemoteDGMのsocketによるデータ送信</h2> +<ul> + <li>RemoteDGM側はsocketを用いてデータを送信する</li> + <li>Queueに対してputされたデータを送信する + <ul> + <li>putCodeGearの直後に呼び出される + <pre><code>__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){ +char recv_buf; +int send_size, recv_size; + +send_size = send(cQueue->socket, data, sizeof(union Data), 0); +if (send_size == -1) { + printf("send error\n"); + goto whenError(); +} + +recv_size = recv(cQueue->socket, &recv_buf, 1, 0); +if (recv_size == -1) { + printf("recv error\n"); + goto whenError(); +} else if (recv_size == 0) { + printf("connection ended\n"); + goto whenError(); +} else if(recv_buf == 0) { + printf("Finish connection\n"); + close(cQueue->socket); + goto whenError(); +} +goto next(...); +} +</code></pre> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="この先保留ページ">この先保留ページ</h2> </li> </ul> </li> @@ -240,63 +675,38 @@ <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="gearsosのimplementation">GearsOSのImplementation</h2> -<p>-</p> - - +<ul> + <li>Interfaceの実装である</li> + <li>定義ファイル(.h)に記述を行う</li> + <li>必ず継承元のInterfaceを記述する必要がある</li> + <li>プロセス内のCodeGearが共通して使いたい変数を記述する + <pre><code>typedef struct SynchronizedQueue <> impl Queue { +struct Element* top; +struct Element* last; +struct Atomic* atomic; +} SynchronizedQueue; +</code></pre> + </div> <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="テスト用テキストエディタ">テスト用テキストエディタ</h2> - -<pre><code>public class MyDocumentListener implements DocumentListener { - @Override - public void insertUpdate(DocumentEvent e) { - Document doc = e.getDocument(); - loc = e.getOffset(); - System.out.println(loc); - - } - - @Override - public void removeUpdate(DocumentEvent e) { - Document doc = e.getDocument(); - sendLoc = e.getOffset(); - System.out.println("delete " + sendLoc); - } - @Override - public void changedUpdate(DocumentEvent e) { - } -} -</code></pre> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="編集位置の相違">編集位置の相違</h2> -<ul> - <li>同期編集のセッションでは命令コマンドの送信のすれ違いにより、ノードごとのファイル状態が異なってしまうことがある。</li> - <li>EditorAとEditorBはそれぞれの命令を自身のエディタバッファに施してから命令を送信するため、お互いバッファ状態が異なる状態で受け取った命令を実行してしまう。</li> +<h2 id="研究成果">研究成果</h2> + </li> + <li>連続するレコードで構成されるGearsOSファイルの設計</li> + <li>keyアクセスを用いたファイルに対するRead, writeAPI</li> + <li>赤黒木を用いたディレクトリシステムの構築</li> + <li>ファイルのバックアップ考察</li> + <li>ploxyを用いたファイルの送受信</li> </ul> -<div style="text-align: center;"> - <img src="images/difference_offset.pdf" alt="MetaGear" width="800" /> -</div> - -<!-- -- RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 ---> - -<pre><code class="language-Code">digraph test { - node0 -> node1 [label="right"] - node1 -> node2 [label="right"] - node2 -> node0 [label="right"] -} -</code></pre> +<p>## +<!–</p> +<ul> + <li>RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 +–></li> +</ul> </div>