Mercurial > hg > Papers > 2022 > ikki-master
changeset 29:bca6c79006cf
tweak
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 11 Feb 2022 13:14:32 +0900 |
parents | 7174f22ed695 |
children | ec3761cbbe24 |
files | Paper/images/slideGearsWC.pdf slide/images/newGearsFile.pdf slide/images/slideGearsWC.pdf slide/thesis.html slide/thesis.md slide/thesis.pdf.html |
diffstat | 6 files changed, 399 insertions(+), 398 deletions(-) [+] |
line wrap: on
line diff
--- a/slide/thesis.html Thu Feb 10 23:55:41 2022 +0900 +++ b/slide/thesis.html Fri Feb 11 13:14:32 2022 +0900 @@ -123,7 +123,7 @@ <li>ノーマルレベルでは変更されない(関数型プログラミング)</li> </ul> </li> - <li>C言語を拡張する形でCbC言語により実装される(gcc/llvm)</li> + <li>C言語を拡張する形でCbC言語により実装される</li> </ul> @@ -176,7 +176,7 @@ <li>createで作成する(通常の関数呼び出し)</li> <li>DataGearとして作成する場合はnewを使う</li> <li>gotoでputAPIを呼び出す(nextは継続)</li> - <li>InterfaceなどのDataGearはプロセスに相当するContextにすべて格納される + <li>InterfaceなどのDataGearは、プロセスに相当するContextにすべて格納される <pre><code>struct Queue* queue = createSychronizedQueue(context); struct Task* task = new Task(); goto queue->put(task, next(...)); @@ -192,9 +192,9 @@ <!-- _S9SLIDE_ --> <h2 id="interfaceの実装">Interfaceの実装</h2> <ul> - <li>Interfaceの実装に使われるデータ構造を記述するImplementがある</li> + <li>Interfaceの実装に使われるデータ構造を、記述するImplementがある</li> <li>実装で使われるDataGearを記述する(ヒープに確保される)</li> - <li>create時にAPIを実装するCodeGearをInterfaceの構造体に代入される + <li>create時にAPIを実装するCodeGearが、Interfaceの構造体に代入される <pre><code>typedef struct SynchronizedQueue <> impl Queue { struct Element* top; struct Element* last; @@ -269,7 +269,11 @@ <li>ファイルはQueueで構成される</li> <li>putでQueueに追加</li> <li>takeでQueueからの取り出し</li> - <li>peekでQueueから取り出さない読み出し</li> + <li>peekでQueueから取り出さない読み出し + <ul> + <li>次にTakeされるDataGearを先読みする</li> + </ul> + </li> </ul> <div style="text-align: center;"> <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> @@ -313,20 +317,24 @@ <!-- _S9SLIDE_ --> <h2 id="putのimplementation">PutのImplementation</h2> <ul> - <li>QueueのElementをnewで作成する</li> + <li>QueueのElementをnewで作成する + <ul> + <li>Elementには任意の型のDataGearが格納されている</li> + </ul> + </li> <li>Queueのリンクを構築する</li> - <li>継続nextに跳ぶ - <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(...); + <li>継続nextに跳ぶ</li> +</ul> + +<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> @@ -337,8 +345,7 @@ <h2 id="takeのimplementation">TakeのImplementation</h2> <ul> <li>QueueからElement経由でDataGearを取り出す</li> - <li>Queueのリンクを修正し、nextでデータを引き渡す</li> - <li>Elementには任意の型のDataGearが格納されている + <li>Queueのリンクを修正し、取り出されるデータをnextへ引き渡す <pre><code>__code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) { printf("take\n"); struct Element* top = queue->top; @@ -361,13 +368,16 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="datagearmanager">DataGearManager</h2> +<h2 id="gearsosのdatagearmanager">GearsOSのDataGearManager</h2> <ul> <li>Take/Put/PeekはDataGearManagerに対して行う</li> - <li>メモリ上のQueueはLocalDGMになる</li> - <li>RemoteDGMは他のノードやプロセスあるいはストレージデバイスをあらわす</li> - <li>一つのDataGearManager上に複数のQueueがあり、keyで識別する</li> - <li>RemoteDGMに書き込むと相手のLocalDGMに書き込まれる</li> + <li>LocalDGM:メモリ上のQueue</li> + <li>RemoteDGM:他のノードやプロセスあるいはストレージデバイスをあらわす + <ul> + <li>RemoteDGMは対応する相手のLocalDGMと接続される</li> + </ul> + </li> + <li>DataGearManager上には複数のQueueがあり、keyで識別する</li> <li>Take/Peekは書き込みを待ち合わせる</li> <li>複数のTakeを待ち合わせることができる</li> </ul> @@ -381,12 +391,11 @@ <h2 id="datagearmanagerによる通信構成">DataGearManagerによる通信構成</h2> <ul> <li>任意の相手のRemoteDGMを作成することでTopologyが形成される</li> - <li>手元のRemoteDGMに書き込むと相手のLocalDGMに書き込まれる</li> - <li>RemoteDGMはproxyとして動作する</li> + <li>RemoteDGMはproxy(RemoteDGMに書き込むと相手のLocalDGMに書き込める)</li> <li>この構成は分散フレームワークChristie(当研究室作成)と同じ</li> </ul> <div style="text-align: center;"> - <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="800" /> + <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="550" /> </div> @@ -398,10 +407,8 @@ <h2 id="socket通信によるremotedgmの実装">socket通信によるRemoteDGMの実装</h2> <ul> <li>GearsOSはUnix上の言語フレームワークとして実装されている</li> - <li>Unixのsocket通信を使ってQueueのputを実装する</li> - <li>proxy側はQueueにputされたDataをsocketで送信する</li> - <li>送信されたDataはLocal側でgetDataAPIで取り出される</li> - <li>send/recvはUnixのAPI + <li>Unixのsocket通信を使ってQueueのputを実装する(send/recvはUnixのAPI)</li> + <li>proxy側はQueueにputされたDataをsocketで送信する <pre><code>__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){ char recv_buf; int send_size, recv_size; @@ -448,31 +455,14 @@ <!-- _S9SLIDE_ --> <h2 id="複数のストリームから構成されるファイル">複数のストリームから構成されるファイル</h2> <ul> - <li>入力されるデータに応じた個別のstreamを備えたい - <ul> - <li>例えばUSBは複数のチャネルを持つ</li> - <li>メタデータの取り出しは別streamになる</li> - <li>通信として使う場合に複数のプロトコルがある方が良い(FTP)</li> - </ul> - </li> + <li>入力されるデータに応じた個別のstreamを備えたい</li> <li>Streamはkey nameを持ち、keyでアクセスを行う</li> - <li>赤黒木を用いる</li> + <li>Queueのリストとして赤黒木を用いる</li> <li>DataのTake/Put時には必ずkey nameの指定が必要となる</li> </ul> - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="socketを使ったremotedgm">socketを使ったRemoteDGM</h2> -<ul> - <li>RemoteDGMに書き込みが行われるとsocketで通信が起きる</li> - <li>受信側はLocalDGMにDataGearを書き込む</li> -</ul> <div style="text-align: center;"> - <img src="images/socketCom.pdf" alt="socketを通じたレコード送信" width="800" /> + <img src="images/newGearsFile.pdf" alt="複数ストリームの設計" width="300" /> </div> @@ -485,11 +475,9 @@ <ul> <li>ファイル内の文字列を1行づつ受け取り、文字列,行数をカウントする例題</li> <li>文字列送信側とCount側を別ノード上で行うことで、ファイルの呼び出しと通信処理が構成できる</li> - <li>RemoteDGMへの書き込みで通信する</li> - <li>acknowredgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信)</li> </ul> <div style="text-align: center;"> - <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="800" /> + <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="550" /> </div> @@ -498,42 +486,13 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="gearsfile-apiによるwordcount13">GearsFile APIによるWordCount(1/3)</h2> +<h2 id="wordcountの例題-1">wordCountの例題</h2> <ul> - <li>FileOpen側(NodeA)とWordCount側(NodeB)でノードが別れる</li> - <li>(手順1)FileOpen側はFilePloxyにDataRecordをputする</li> - <li>(手順2)WordCount側は処理の後、ackを返信する</li> + <li>二つのDataGearManagerのペアで構成される</li> + <li>acknowledgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信)</li> </ul> <div style="text-align: center;"> - <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" /> -</div> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="gearsfile-apiによるwordcount23">GearsFile APIによるWordCount(2/3)</h2> -<ul> - <li>(手順3)1,2をループし、FileOpen側はEoFならフラグを送信する</li> -</ul> -<div style="text-align: center;"> - <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" /> -</div> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="gearsfile-apiによるwordcount33">GearsFile APIによるWordCount(3/3)</h2> -<ul> - <li>(手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる</li> -</ul> -<div style="text-align: center;"> - <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" /> + <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="550" /> </div> @@ -546,17 +505,13 @@ <ul> <li>実装ずみ <ul> - <li>keyアクセスに対応したファイル通信 + <li>API:put/takeに対応したファイル通信 <ul> - <li>単一のQueueによる通信の記述</li> + <li>単一のQueueによる通信の記述をした</li> </ul> </li> - <li>リストとなるTree - <ul> - <li>赤黒木</li> - </ul> - </li> - <li>atomicな操作が行えるQueue + <li>QueueのリストとなるTree(赤黒木)</li> + <li>atomicな操作が行えるQueue(SynchronizedQueue) <ul> <li>複数からのアクセス時にデータ整合を保つ</li> </ul> @@ -565,8 +520,8 @@ </li> <li>実装中 <ul> - <li>keyアクセスが行えるQueueのリスト</li> - <li>リスト単位での通信の記述</li> + <li>key指定による任意なstreamの操作が行えるファイル</li> + <li>ファイル単位での通信の記述(Queue単体でない)</li> </ul> </li> </ul> @@ -596,10 +551,9 @@ <li>Proxyによるファイル通信</li> </ul> </li> - <li>GearsOSの調査</li> </ul> </li> - <li>Streamのリスト単位での通信の完成</li> + <li>Queue(stream)単位でない、ファイル単位の通信</li> </ul> @@ -623,8 +577,8 @@ </li> <li>Securityシステムの追加 <ul> - <li>証明書などによるファイル操作制限</li> - <li>不正な分散ファイルシステムへのアクセス</li> + <li>ファルパーミッション</li> + <li>不正な分散ファイルシステムへのアクセスの防止</li> </ul> </li> </ul> @@ -650,61 +604,80 @@ </li> </ul> -<pre><code>__code Task2(TQueue* localDGMQueue){ - goto localDGMQueue->take(Task3); -} - -__code Task3(TQueue* localDGMQueue, FileString* string){ - printf("take[%s] [num:%d]\n", string->str, string->size); - goto getData(); -} - -//プログラマが実装したいstub -__code Task3_stub(struct Context* context){ - TQueue* localDGMQueue = (struct TQueue*)Gearef(context, TQueue)->tQueue; - FileString* string = Gearef(context, TQueue)->data; - goto Task3(context, localDGMQueue, string); -} - -//自動生成されたErrorなstub -__code Task3_stub(struct Context* context) { - TQueue* localDGMQueue = Gearef(context, TQueue); - FileString* string = Gearef(context, FileString); - goto Task3(context, localDGMQueue, string); -} -</code></pre> - </div> <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="並列処理構文par-gotoが持つ問題">並列処理構文par gotoが持つ問題</h2> +<h2 id="トランスコンパイラのバグの例">トランスコンパイラのバグの例</h2> <ul> - <li>par gotoとはGearsOSに実装された並列処理構文である</li> - <li>StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた</li> - <li>par gotoはトランスコンパイラへの依存性が高い - <ul> - <li>stubCodeGearのように任意な書き換えが行えない</li> - </ul> - </li> - <li>特定のCodeGearの宣言のみでしか正常な処理が生成されない - <ul> - <li>Interfaceに記述されたAPICodeGearではバグが生じる</li> - <li>par gotoでの使用を前提としたCodeGearを書かなくてはならない</li> - </ul> - </li> - <li>処理が重いという問題点も存在する</li> + <li>ContextからのDataGearの取り出し方が間違っている +``` +__code Task3(TQueue* localDGMQueue, FileString* string){ + goto Task4(); +}</li> </ul> - +<p>__code Task3_stub(struct Context* context){ //正しいstub + TQueue* localDGMQueue = (struct TQueue<em>)Gearef(context, TQueue)->tQueue; + FileString</em> string = Gearef(context, TQueue)->data; + goto Task3(context, localDGMQueue, string); +}</p> -</div> +<p>__code Task3_stub(struct Context* context) { //自動生成されたErrorなstub + TQueue* localDGMQueue = Gearef(context, TQueue); + FileString* string = Gearef(context, FileString); + goto Task3(context, localDGMQueue, string); +}</p> +<pre><code> +## 並列処理構文par gotoが持つ問題 +- par gotoとはGearsOSに実装された並列処理構文である +- StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた +- par gotoはトランスコンパイラへの依存性が高い + - stubCodeGearのように任意な書き換えが行えない +- 特定のCodeGearの宣言のみでしか正常な処理が生成されない + - Interfaceに記述されたAPICodeGearではバグが生じる + - par gotoでの使用を前提としたCodeGearを書かなくてはならない +- 処理が重いという問題点も存在する + +## GearsFile APIによるWordCount(1/3) +- FileOpen側(NodeA)とWordCount側(NodeB)でノードが別れる +- (手順1)FileOpen側はFilePloxyにDataRecordをputする +- (手順2)WordCount側は処理の後、ackを返信する +<div style="text-align: center;"> + <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800"> +</div> -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="以下返答用">以下返答用</h2> +## GearsFile APIによるWordCount(2/3) +- (手順3)1,2をループし、FileOpen側はEoFならフラグを送信する +<div style="text-align: center;"> + <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800"> +</div> + +## GearsFile APIによるWordCount(3/3) +- (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる +<div style="text-align: center;"> + <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800"> +</div> + +## 以下返答用 + +## PeekのImplementation +- QueueからElement経由でDataGearを取り出す +- Takeとは異なり、Queueのリンクを修正せずに、取り出されるデータをnextへ引き渡す +</code></pre> +<p>__code peekSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, …)) { + struct Element* top = queue->top; + struct Element* nextElement = top->next; + if (queue->top == queue->last) { + data = NULL; + } else { + data = nextElement->data; + } + goto next(data, …); +} +```</p> @@ -715,7 +688,7 @@ <h2 id="takeputpeek-1">Take/Put/Peek</h2> <ul> <li>PeekはReadOnly (最新の設定を読みこむなど)</li> - <li>Take/PutはDGが一つならUpDataに相当する</li> + <li>Take/PutはDataGearが一つならUpdateに相当する</li> <li>書き込みが単一スレッドなら順序は保証される</li> <li>書き込みが複数の場合、Putの順序は保証されない</li> <li>データベースとの違い @@ -790,6 +763,27 @@ </li> </ul> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="複数のストリームによる利点">複数のストリームによる利点</h2> +<ul> + <li>例えばUSBは複数のチャネルを持つ + <ul> + <li>メタデータの取り出しは別streamになる</li> + </ul> + </li> + <li>複数の通信によりファイル通信の制御を行う場合がある + <ul> + <li>通信の停止などのための通信</li> + </ul> + </li> + <li>通信として使う場合に複数のプロトコルがある方が良い(FTP)</li> +</ul> + </div>
--- a/slide/thesis.md Thu Feb 10 23:55:41 2022 +0900 +++ b/slide/thesis.md Fri Feb 11 13:14:32 2022 +0900 @@ -7,8 +7,8 @@ ## GearsOSのファイルシステムの設計と実装 - DataGearとCodeGearという単位を用いるOS -- 従来のファイルシステムには型とTransactionが無い - DataGear単位のTransactionとしてファイルシステムを設計 + - 従来のOSのファイルシステムには型とTransactionが無い - APIとしてTake/Put/Peekを採用した - 通信としてもDBアクセスとしても使える(メモリからSSDへの通信に見える) - 本研究ではsocket baseな通信とWordCountの例題を作成した @@ -23,7 +23,7 @@ - DataGear - Cの構造体に相当する - ノーマルレベルでは変更されない(関数型プログラミング) -- C言語を拡張する形でCbC言語により実装される(gcc/llvm) +- C言語を拡張する形でCbC言語により実装される ## CodeGearとDataGear @@ -54,7 +54,7 @@ - createで作成する(通常の関数呼び出し) - DataGearとして作成する場合はnewを使う - gotoでputAPIを呼び出す(nextは継続) -- InterfaceなどのDataGearはプロセスに相当するContextにすべて格納される +- InterfaceなどのDataGearは、プロセスに相当するContextにすべて格納される ``` struct Queue* queue = createSychronizedQueue(context); struct Task* task = new Task(); @@ -63,9 +63,9 @@ ## Interfaceの実装 -- Interfaceの実装に使われるデータ構造を記述するImplementがある +- Interfaceの実装に使われるデータ構造を、記述するImplementがある - 実装で使われるDataGearを記述する(ヒープに確保される) -- create時にAPIを実装するCodeGearをInterfaceの構造体に代入される +- create時にAPIを実装するCodeGearが、Interfaceの構造体に代入される ``` typedef struct SynchronizedQueue <> impl Queue { struct Element* top; @@ -105,6 +105,7 @@ - putでQueueに追加 - takeでQueueからの取り出し - peekでQueueから取り出さない読み出し + - 次にTakeされるDataGearを先読みする <div style="text-align: center;"> <img src="images/QueueElement.pdf" alt=Queueの構造 width="800"> </div> @@ -122,8 +123,10 @@ ## PutのImplementation - QueueのElementをnewで作成する + - Elementには任意の型のDataGearが格納されている - Queueのリンクを構築する - 継続nextに跳ぶ + ``` __code putSingleLinkedQueue(struct SingleLinkedQueue* queue, union Data* data, __code next(...)) { Element* element = new Element(); @@ -137,8 +140,7 @@ ## TakeのImplementation - QueueからElement経由でDataGearを取り出す -- Queueのリンクを修正し、nextでデータを引き渡す -- Elementには任意の型のDataGearが格納されている +- Queueのリンクを修正し、取り出されるデータをnextへ引き渡す ``` __code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) { printf("take\n"); @@ -154,31 +156,30 @@ } ``` -## DataGearManager + + +## GearsOSのDataGearManager - Take/Put/PeekはDataGearManagerに対して行う -- メモリ上のQueueはLocalDGMになる -- RemoteDGMは他のノードやプロセスあるいはストレージデバイスをあらわす -- 一つのDataGearManager上に複数のQueueがあり、keyで識別する -- RemoteDGMに書き込むと相手のLocalDGMに書き込まれる +- LocalDGM:メモリ上のQueue +- RemoteDGM:他のノードやプロセスあるいはストレージデバイスをあらわす + - RemoteDGMは対応する相手のLocalDGMと接続される +- DataGearManager上には複数のQueueがあり、keyで識別する - Take/Peekは書き込みを待ち合わせる - 複数のTakeを待ち合わせることができる ## DataGearManagerによる通信構成 - 任意の相手のRemoteDGMを作成することでTopologyが形成される -- 手元のRemoteDGMに書き込むと相手のLocalDGMに書き込まれる -- RemoteDGMはproxyとして動作する +- RemoteDGMはproxy(RemoteDGMに書き込むと相手のLocalDGMに書き込める) - この構成は分散フレームワークChristie(当研究室作成)と同じ <div style="text-align: center;"> - <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="800"> + <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="550"> </div> ## socket通信によるRemoteDGMの実装 - GearsOSはUnix上の言語フレームワークとして実装されている -- Unixのsocket通信を使ってQueueのputを実装する +- Unixのsocket通信を使ってQueueのputを実装する(send/recvはUnixのAPI) - proxy側はQueueにputされたDataをsocketで送信する -- 送信されたDataはLocal側でgetDataAPIで取り出される -- send/recvはUnixのAPI ``` __code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){ char recv_buf; @@ -210,31 +211,100 @@ ## 複数のストリームから構成されるファイル - 入力されるデータに応じた個別のstreamを備えたい - - 例えばUSBは複数のチャネルを持つ - - メタデータの取り出しは別streamになる - - 通信として使う場合に複数のプロトコルがある方が良い(FTP) - Streamはkey nameを持ち、keyでアクセスを行う -- 赤黒木を用いる +- Queueのリストとして赤黒木を用いる - DataのTake/Put時には必ずkey nameの指定が必要となる -## socketを使ったRemoteDGM -- RemoteDGMに書き込みが行われるとsocketで通信が起きる -- 受信側はLocalDGMにDataGearを書き込む <div style="text-align: center;"> - <img src="images/socketCom.pdf" alt=socketを通じたレコード送信 width="800"> + <img src="images/newGearsFile.pdf" alt="複数ストリームの設計" width="300"> </div> - ## wordCountの例題 - ファイル内の文字列を1行づつ受け取り、文字列,行数をカウントする例題 - 文字列送信側とCount側を別ノード上で行うことで、ファイルの呼び出しと通信処理が構成できる -- RemoteDGMへの書き込みで通信する -- acknowredgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信) <div style="text-align: center;"> - <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="800"> + <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="550"> +</div> + +## wordCountの例題 +- 二つのDataGearManagerのペアで構成される +- acknowledgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信) +<div style="text-align: center;"> + <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="550"> </div> +## 現在のGearsFile APIの開発状況 +- 実装ずみ + - API:put/takeに対応したファイル通信 + - 単一のQueueによる通信の記述をした + - QueueのリストとなるTree(赤黒木) + - atomicな操作が行えるQueue(SynchronizedQueue) + - 複数からのアクセス時にデータ整合を保つ +- 実装中 + - key指定による任意なstreamの操作が行えるファイル + - ファイル単位での通信の記述(Queue単体でない) + + +## 結論 +- GearsOSのファイルの設計を行った + - ファイルの構造の設計 + - DataGear単位での操作が行える + - socketによる通信部分の実装 + - GearsOS上でのソケット通信の記述 + - APIの段階的な設計記述 + - Proxyによるファイル通信 +- Queue(stream)単位でない、ファイル単位の通信 + +## 将来的な課題 +- TopoplogyManagerの設計 + - 参加したノードを任意の形のTopologyに接続する機能 + - ファイルシステム向けの機能を追加したい + - DNS + - 中枢としてのTopologyのノード監視 +- Securityシステムの追加 + - ファルパーミッション + - 不正な分散ファイルシステムへのアクセスの防止 + + + +## GearsOSの生成形の問題点 +- GearsOSのメタレベルの処理の記述はトランスコンパイラにより行われる +- 場合によりメタレベルの記述を行わなくてはならない + - 他のInterfaceを継承したオブジェクトからのDataGear継承 + - 例)Queueからのデータ取り出し + - トランスコンパイラはどのInterfaceに記述されたDataGearを参照するべきか判断が難しい + + +## トランスコンパイラのバグの例 +- ContextからのDataGearの取り出し方が間違っている +``` +__code Task3(TQueue* localDGMQueue, FileString* string){ + goto Task4(); +} + +__code Task3_stub(struct Context* context){ //正しいstub + TQueue* localDGMQueue = (struct TQueue*)Gearef(context, TQueue)->tQueue; + FileString* string = Gearef(context, TQueue)->data; + goto Task3(context, localDGMQueue, string); +} + +__code Task3_stub(struct Context* context) { //自動生成されたErrorなstub + TQueue* localDGMQueue = Gearef(context, TQueue); + FileString* string = Gearef(context, FileString); + goto Task3(context, localDGMQueue, string); +} +``` + +## 並列処理構文par gotoが持つ問題 +- par gotoとはGearsOSに実装された並列処理構文である +- StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた +- par gotoはトランスコンパイラへの依存性が高い + - stubCodeGearのように任意な書き換えが行えない +- 特定のCodeGearの宣言のみでしか正常な処理が生成されない + - Interfaceに記述されたAPICodeGearではバグが生じる + - par gotoでの使用を前提としたCodeGearを書かなくてはならない +- 処理が重いという問題点も存在する ## GearsFile APIによるWordCount(1/3) - FileOpen側(NodeA)とWordCount側(NodeB)でノードが別れる @@ -256,91 +326,27 @@ <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800"> </div> - -## 現在のGearsFile APIの開発状況 -- 実装ずみ - - keyアクセスに対応したファイル通信 - - 単一のQueueによる通信の記述 - - リストとなるTree - - 赤黒木 - - atomicな操作が行えるQueue - - 複数からのアクセス時にデータ整合を保つ -- 実装中 - - keyアクセスが行えるQueueのリスト - - リスト単位での通信の記述 - - -## 結論 -- GearsOSのファイルの設計を行った - - ファイルの構造の設計 - - DataGear単位での操作が行える - - socketによる通信部分の実装 - - GearsOS上でのソケット通信の記述 - - APIの段階的な設計記述 - - Proxyによるファイル通信 - - GearsOSの調査 -- Streamのリスト単位での通信の完成 +## 以下返答用 -## 将来的な課題 -- TopoplogyManagerの設計 - - 参加したノードを任意の形のTopologyに接続する機能 - - ファイルシステム向けの機能を追加したい - - DNS - - 中枢としてのTopologyのノード監視 -- Securityシステムの追加 - - 証明書などによるファイル操作制限 - - 不正な分散ファイルシステムへのアクセス - - - -## GearsOSの生成形の問題点 -- GearsOSのメタレベルの処理の記述はトランスコンパイラにより行われる -- 場合によりメタレベルの記述を行わなくてはならない - - 他のInterfaceを継承したオブジェクトからのDataGear継承 - - 例)Queueからのデータ取り出し - - トランスコンパイラはどのInterfaceに記述されたDataGearを参照するべきか判断が難しい - +## PeekのImplementation +- QueueからElement経由でDataGearを取り出す +- Takeとは異なり、Queueのリンクを修正せずに、取り出されるデータをnextへ引き渡す ``` -__code Task2(TQueue* localDGMQueue){ - goto localDGMQueue->take(Task3); -} - -__code Task3(TQueue* localDGMQueue, FileString* string){ - printf("take[%s] [num:%d]\n", string->str, string->size); - goto getData(); -} - -//プログラマが実装したいstub -__code Task3_stub(struct Context* context){ - TQueue* localDGMQueue = (struct TQueue*)Gearef(context, TQueue)->tQueue; - FileString* string = Gearef(context, TQueue)->data; - goto Task3(context, localDGMQueue, string); -} - -//自動生成されたErrorなstub -__code Task3_stub(struct Context* context) { - TQueue* localDGMQueue = Gearef(context, TQueue); - FileString* string = Gearef(context, FileString); - goto Task3(context, localDGMQueue, string); +__code peekSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) { + struct Element* top = queue->top; + struct Element* nextElement = top->next; + if (queue->top == queue->last) { + data = NULL; + } else { + data = nextElement->data; + } + goto next(data, ...); } ``` -## 並列処理構文par gotoが持つ問題 -- par gotoとはGearsOSに実装された並列処理構文である -- StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた -- par gotoはトランスコンパイラへの依存性が高い - - stubCodeGearのように任意な書き換えが行えない -- 特定のCodeGearの宣言のみでしか正常な処理が生成されない - - Interfaceに記述されたAPICodeGearではバグが生じる - - par gotoでの使用を前提としたCodeGearを書かなくてはならない -- 処理が重いという問題点も存在する - -## 以下返答用 - - ## Take/Put/Peek - PeekはReadOnly (最新の設定を読みこむなど) -- Take/PutはDGが一つならUpDataに相当する +- Take/PutはDataGearが一つならUpdateに相当する - 書き込みが単一スレッドなら順序は保証される - 書き込みが複数の場合、Putの順序は保証されない - データベースとの違い @@ -375,3 +381,10 @@ - しかし、acknowledgeが重複してしまう - メタプログラミングを利用してこの重複を消すことは可能 - しかし煩雑 + +## 複数のストリームによる利点 +- 例えばUSBは複数のチャネルを持つ + - メタデータの取り出しは別streamになる +- 複数の通信によりファイル通信の制御を行う場合がある + - 通信の停止などのための通信 +- 通信として使う場合に複数のプロトコルがある方が良い(FTP)
--- a/slide/thesis.pdf.html Thu Feb 10 23:55:41 2022 +0900 +++ b/slide/thesis.pdf.html Fri Feb 11 13:14:32 2022 +0900 @@ -107,7 +107,7 @@ <li>ノーマルレベルでは変更されない(関数型プログラミング)</li> </ul> </li> - <li>C言語を拡張する形でCbC言語により実装される(gcc/llvm)</li> + <li>C言語を拡張する形でCbC言語により実装される</li> </ul> @@ -160,7 +160,7 @@ <li>createで作成する(通常の関数呼び出し)</li> <li>DataGearとして作成する場合はnewを使う</li> <li>gotoでputAPIを呼び出す(nextは継続)</li> - <li>InterfaceなどのDataGearはプロセスに相当するContextにすべて格納される + <li>InterfaceなどのDataGearは、プロセスに相当するContextにすべて格納される <pre><code>struct Queue* queue = createSychronizedQueue(context); struct Task* task = new Task(); goto queue->put(task, next(...)); @@ -176,9 +176,9 @@ <!-- _S9SLIDE_ --> <h2 id="interfaceの実装">Interfaceの実装</h2> <ul> - <li>Interfaceの実装に使われるデータ構造を記述するImplementがある</li> + <li>Interfaceの実装に使われるデータ構造を、記述するImplementがある</li> <li>実装で使われるDataGearを記述する(ヒープに確保される)</li> - <li>create時にAPIを実装するCodeGearをInterfaceの構造体に代入される + <li>create時にAPIを実装するCodeGearが、Interfaceの構造体に代入される <pre><code>typedef struct SynchronizedQueue <> impl Queue { struct Element* top; struct Element* last; @@ -253,7 +253,11 @@ <li>ファイルはQueueで構成される</li> <li>putでQueueに追加</li> <li>takeでQueueからの取り出し</li> - <li>peekでQueueから取り出さない読み出し</li> + <li>peekでQueueから取り出さない読み出し + <ul> + <li>次にTakeされるDataGearを先読みする</li> + </ul> + </li> </ul> <div style="text-align: center;"> <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> @@ -297,20 +301,24 @@ <!-- _S9SLIDE_ --> <h2 id="putのimplementation">PutのImplementation</h2> <ul> - <li>QueueのElementをnewで作成する</li> + <li>QueueのElementをnewで作成する + <ul> + <li>Elementには任意の型のDataGearが格納されている</li> + </ul> + </li> <li>Queueのリンクを構築する</li> - <li>継続nextに跳ぶ - <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(...); + <li>継続nextに跳ぶ</li> +</ul> + +<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> @@ -321,8 +329,7 @@ <h2 id="takeのimplementation">TakeのImplementation</h2> <ul> <li>QueueからElement経由でDataGearを取り出す</li> - <li>Queueのリンクを修正し、nextでデータを引き渡す</li> - <li>Elementには任意の型のDataGearが格納されている + <li>Queueのリンクを修正し、取り出されるデータをnextへ引き渡す <pre><code>__code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) { printf("take\n"); struct Element* top = queue->top; @@ -345,13 +352,16 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="datagearmanager">DataGearManager</h2> +<h2 id="gearsosのdatagearmanager">GearsOSのDataGearManager</h2> <ul> <li>Take/Put/PeekはDataGearManagerに対して行う</li> - <li>メモリ上のQueueはLocalDGMになる</li> - <li>RemoteDGMは他のノードやプロセスあるいはストレージデバイスをあらわす</li> - <li>一つのDataGearManager上に複数のQueueがあり、keyで識別する</li> - <li>RemoteDGMに書き込むと相手のLocalDGMに書き込まれる</li> + <li>LocalDGM:メモリ上のQueue</li> + <li>RemoteDGM:他のノードやプロセスあるいはストレージデバイスをあらわす + <ul> + <li>RemoteDGMは対応する相手のLocalDGMと接続される</li> + </ul> + </li> + <li>DataGearManager上には複数のQueueがあり、keyで識別する</li> <li>Take/Peekは書き込みを待ち合わせる</li> <li>複数のTakeを待ち合わせることができる</li> </ul> @@ -365,12 +375,11 @@ <h2 id="datagearmanagerによる通信構成">DataGearManagerによる通信構成</h2> <ul> <li>任意の相手のRemoteDGMを作成することでTopologyが形成される</li> - <li>手元のRemoteDGMに書き込むと相手のLocalDGMに書き込まれる</li> - <li>RemoteDGMはproxyとして動作する</li> + <li>RemoteDGMはproxy(RemoteDGMに書き込むと相手のLocalDGMに書き込める)</li> <li>この構成は分散フレームワークChristie(当研究室作成)と同じ</li> </ul> <div style="text-align: center;"> - <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="800" /> + <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="550" /> </div> @@ -382,10 +391,8 @@ <h2 id="socket通信によるremotedgmの実装">socket通信によるRemoteDGMの実装</h2> <ul> <li>GearsOSはUnix上の言語フレームワークとして実装されている</li> - <li>Unixのsocket通信を使ってQueueのputを実装する</li> - <li>proxy側はQueueにputされたDataをsocketで送信する</li> - <li>送信されたDataはLocal側でgetDataAPIで取り出される</li> - <li>send/recvはUnixのAPI + <li>Unixのsocket通信を使ってQueueのputを実装する(send/recvはUnixのAPI)</li> + <li>proxy側はQueueにputされたDataをsocketで送信する <pre><code>__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){ char recv_buf; int send_size, recv_size; @@ -432,31 +439,14 @@ <!-- _S9SLIDE_ --> <h2 id="複数のストリームから構成されるファイル">複数のストリームから構成されるファイル</h2> <ul> - <li>入力されるデータに応じた個別のstreamを備えたい - <ul> - <li>例えばUSBは複数のチャネルを持つ</li> - <li>メタデータの取り出しは別streamになる</li> - <li>通信として使う場合に複数のプロトコルがある方が良い(FTP)</li> - </ul> - </li> + <li>入力されるデータに応じた個別のstreamを備えたい</li> <li>Streamはkey nameを持ち、keyでアクセスを行う</li> - <li>赤黒木を用いる</li> + <li>Queueのリストとして赤黒木を用いる</li> <li>DataのTake/Put時には必ずkey nameの指定が必要となる</li> </ul> - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="socketを使ったremotedgm">socketを使ったRemoteDGM</h2> -<ul> - <li>RemoteDGMに書き込みが行われるとsocketで通信が起きる</li> - <li>受信側はLocalDGMにDataGearを書き込む</li> -</ul> <div style="text-align: center;"> - <img src="images/socketCom.pdf" alt="socketを通じたレコード送信" width="800" /> + <img src="images/newGearsFile.pdf" alt="複数ストリームの設計" width="300" /> </div> @@ -469,11 +459,9 @@ <ul> <li>ファイル内の文字列を1行づつ受け取り、文字列,行数をカウントする例題</li> <li>文字列送信側とCount側を別ノード上で行うことで、ファイルの呼び出しと通信処理が構成できる</li> - <li>RemoteDGMへの書き込みで通信する</li> - <li>acknowredgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信)</li> </ul> <div style="text-align: center;"> - <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="800" /> + <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="550" /> </div> @@ -482,42 +470,13 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="gearsfile-apiによるwordcount13">GearsFile APIによるWordCount(1/3)</h2> +<h2 id="wordcountの例題-1">wordCountの例題</h2> <ul> - <li>FileOpen側(NodeA)とWordCount側(NodeB)でノードが別れる</li> - <li>(手順1)FileOpen側はFilePloxyにDataRecordをputする</li> - <li>(手順2)WordCount側は処理の後、ackを返信する</li> + <li>二つのDataGearManagerのペアで構成される</li> + <li>acknowledgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信)</li> </ul> <div style="text-align: center;"> - <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" /> -</div> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="gearsfile-apiによるwordcount23">GearsFile APIによるWordCount(2/3)</h2> -<ul> - <li>(手順3)1,2をループし、FileOpen側はEoFならフラグを送信する</li> -</ul> -<div style="text-align: center;"> - <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" /> -</div> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="gearsfile-apiによるwordcount33">GearsFile APIによるWordCount(3/3)</h2> -<ul> - <li>(手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる</li> -</ul> -<div style="text-align: center;"> - <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" /> + <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="550" /> </div> @@ -530,17 +489,13 @@ <ul> <li>実装ずみ <ul> - <li>keyアクセスに対応したファイル通信 + <li>API:put/takeに対応したファイル通信 <ul> - <li>単一のQueueによる通信の記述</li> + <li>単一のQueueによる通信の記述をした</li> </ul> </li> - <li>リストとなるTree - <ul> - <li>赤黒木</li> - </ul> - </li> - <li>atomicな操作が行えるQueue + <li>QueueのリストとなるTree(赤黒木)</li> + <li>atomicな操作が行えるQueue(SynchronizedQueue) <ul> <li>複数からのアクセス時にデータ整合を保つ</li> </ul> @@ -549,8 +504,8 @@ </li> <li>実装中 <ul> - <li>keyアクセスが行えるQueueのリスト</li> - <li>リスト単位での通信の記述</li> + <li>key指定による任意なstreamの操作が行えるファイル</li> + <li>ファイル単位での通信の記述(Queue単体でない)</li> </ul> </li> </ul> @@ -580,10 +535,9 @@ <li>Proxyによるファイル通信</li> </ul> </li> - <li>GearsOSの調査</li> </ul> </li> - <li>Streamのリスト単位での通信の完成</li> + <li>Queue(stream)単位でない、ファイル単位の通信</li> </ul> @@ -607,8 +561,8 @@ </li> <li>Securityシステムの追加 <ul> - <li>証明書などによるファイル操作制限</li> - <li>不正な分散ファイルシステムへのアクセス</li> + <li>ファルパーミッション</li> + <li>不正な分散ファイルシステムへのアクセスの防止</li> </ul> </li> </ul> @@ -634,61 +588,80 @@ </li> </ul> -<pre><code>__code Task2(TQueue* localDGMQueue){ - goto localDGMQueue->take(Task3); -} - -__code Task3(TQueue* localDGMQueue, FileString* string){ - printf("take[%s] [num:%d]\n", string->str, string->size); - goto getData(); -} - -//プログラマが実装したいstub -__code Task3_stub(struct Context* context){ - TQueue* localDGMQueue = (struct TQueue*)Gearef(context, TQueue)->tQueue; - FileString* string = Gearef(context, TQueue)->data; - goto Task3(context, localDGMQueue, string); -} - -//自動生成されたErrorなstub -__code Task3_stub(struct Context* context) { - TQueue* localDGMQueue = Gearef(context, TQueue); - FileString* string = Gearef(context, FileString); - goto Task3(context, localDGMQueue, string); -} -</code></pre> - </div> <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="並列処理構文par-gotoが持つ問題">並列処理構文par gotoが持つ問題</h2> +<h2 id="トランスコンパイラのバグの例">トランスコンパイラのバグの例</h2> <ul> - <li>par gotoとはGearsOSに実装された並列処理構文である</li> - <li>StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた</li> - <li>par gotoはトランスコンパイラへの依存性が高い - <ul> - <li>stubCodeGearのように任意な書き換えが行えない</li> - </ul> - </li> - <li>特定のCodeGearの宣言のみでしか正常な処理が生成されない - <ul> - <li>Interfaceに記述されたAPICodeGearではバグが生じる</li> - <li>par gotoでの使用を前提としたCodeGearを書かなくてはならない</li> - </ul> - </li> - <li>処理が重いという問題点も存在する</li> + <li>ContextからのDataGearの取り出し方が間違っている +``` +__code Task3(TQueue* localDGMQueue, FileString* string){ + goto Task4(); +}</li> </ul> - +<p>__code Task3_stub(struct Context* context){ //正しいstub + TQueue* localDGMQueue = (struct TQueue<em>)Gearef(context, TQueue)->tQueue; + FileString</em> string = Gearef(context, TQueue)->data; + goto Task3(context, localDGMQueue, string); +}</p> -</div> +<p>__code Task3_stub(struct Context* context) { //自動生成されたErrorなstub + TQueue* localDGMQueue = Gearef(context, TQueue); + FileString* string = Gearef(context, FileString); + goto Task3(context, localDGMQueue, string); +}</p> +<pre><code> +## 並列処理構文par gotoが持つ問題 +- par gotoとはGearsOSに実装された並列処理構文である +- StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた +- par gotoはトランスコンパイラへの依存性が高い + - stubCodeGearのように任意な書き換えが行えない +- 特定のCodeGearの宣言のみでしか正常な処理が生成されない + - Interfaceに記述されたAPICodeGearではバグが生じる + - par gotoでの使用を前提としたCodeGearを書かなくてはならない +- 処理が重いという問題点も存在する + +## GearsFile APIによるWordCount(1/3) +- FileOpen側(NodeA)とWordCount側(NodeB)でノードが別れる +- (手順1)FileOpen側はFilePloxyにDataRecordをputする +- (手順2)WordCount側は処理の後、ackを返信する +<div style="text-align: center;"> + <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800"> +</div> -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="以下返答用">以下返答用</h2> +## GearsFile APIによるWordCount(2/3) +- (手順3)1,2をループし、FileOpen側はEoFならフラグを送信する +<div style="text-align: center;"> + <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800"> +</div> + +## GearsFile APIによるWordCount(3/3) +- (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる +<div style="text-align: center;"> + <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800"> +</div> + +## 以下返答用 + +## PeekのImplementation +- QueueからElement経由でDataGearを取り出す +- Takeとは異なり、Queueのリンクを修正せずに、取り出されるデータをnextへ引き渡す +</code></pre> +<p>__code peekSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, …)) { + struct Element* top = queue->top; + struct Element* nextElement = top->next; + if (queue->top == queue->last) { + data = NULL; + } else { + data = nextElement->data; + } + goto next(data, …); +} +```</p> @@ -699,7 +672,7 @@ <h2 id="takeputpeek-1">Take/Put/Peek</h2> <ul> <li>PeekはReadOnly (最新の設定を読みこむなど)</li> - <li>Take/PutはDGが一つならUpDataに相当する</li> + <li>Take/PutはDataGearが一つならUpdateに相当する</li> <li>書き込みが単一スレッドなら順序は保証される</li> <li>書き込みが複数の場合、Putの順序は保証されない</li> <li>データベースとの違い @@ -774,6 +747,27 @@ </li> </ul> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="複数のストリームによる利点">複数のストリームによる利点</h2> +<ul> + <li>例えばUSBは複数のチャネルを持つ + <ul> + <li>メタデータの取り出しは別streamになる</li> + </ul> + </li> + <li>複数の通信によりファイル通信の制御を行う場合がある + <ul> + <li>通信の停止などのための通信</li> + </ul> + </li> + <li>通信として使う場合に複数のプロトコルがある方が良い(FTP)</li> +</ul> + </div>