Mercurial > hg > Papers > 2022 > ikki-master
changeset 30:ec3761cbbe24
tweak
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 11 Feb 2022 16:01:54 +0900 |
parents | bca6c79006cf |
children | 411d86a35dd3 |
files | slide/thesis.html slide/thesis.md slide/thesis.pdf.html |
diffstat | 3 files changed, 273 insertions(+), 148 deletions(-) [+] |
line wrap: on
line diff
--- a/slide/thesis.html Fri Feb 11 13:14:32 2022 +0900 +++ b/slide/thesis.html Fri Feb 11 16:01:54 2022 +0900 @@ -94,8 +94,11 @@ <h2 id="gearsosのファイルシステムの設計と実装">GearsOSのファイルシステムの設計と実装</h2> <ul> <li>DataGearとCodeGearという単位を用いるOS</li> - <li>従来のファイルシステムには型とTransactionが無い</li> - <li>DataGear単位のTransactionとしてファイルシステムを設計</li> + <li>DataGear単位のTransactionとしてファイルシステムを設計 + <ul> + <li>従来のOSのファイルシステムには型とTransactionが無い</li> + </ul> + </li> <li>APIとしてTake/Put/Peekを採用した</li> <li>通信としてもDBアクセスとしても使える(メモリからSSDへの通信に見える)</li> <li>本研究ではsocket baseな通信とWordCountの例題を作成した</li> @@ -244,16 +247,16 @@ <h2 id="gearsosのファイルシステムの設計">GearsOSのファイルシステムの設計</h2> <ul> <li>DataGearの単位でデータを操作したい</li> - <li>通信データに対応した複数のストリームを持つ</li> + <li>ファイルは通信データに対応した複数のストリームを持つ</li> <li>Transactionとしてatomicに操作したい <ul> - <li>従来のファイルシステムはTransactionはUserレベルで実装される</li> + <li>従来のファイルシステムのTransactionはUserレベルで実装される</li> </ul> </li> <li>ファイル操作と通信を同じAPIで実現する <ul> + <li>Take/Put/Peek</li> <li>ChristieのDataGearManagerを参考にする</li> - <li>Take/Put/Peek</li> </ul> </li> </ul> @@ -570,15 +573,15 @@ <li>ファイルシステム向けの機能を追加したい <ul> <li>DNS</li> - <li>中枢としてのTopologyのノード監視</li> + <li>中枢としてのTopologyノード監視</li> </ul> </li> </ul> </li> <li>Securityシステムの追加 <ul> - <li>ファルパーミッション</li> - <li>不正な分散ファイルシステムへのアクセスの防止</li> + <li>ファイルpermission</li> + <li>分散ファイルシステムへの不正なアクセスの防止</li> </ul> </li> </ul> @@ -612,72 +615,125 @@ <!-- _S9SLIDE_ --> <h2 id="トランスコンパイラのバグの例">トランスコンパイラのバグの例</h2> <ul> - <li>ContextからのDataGearの取り出し方が間違っている -``` -__code Task3(TQueue* localDGMQueue, FileString* string){ - goto Task4(); -}</li> + <li>ContextからのDataGearの取り出し方が間違っている</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; +<pre><code>__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); -}</p> +} -<p>__code Task3_stub(struct Context* context) { //自動生成されたErrorなstub +__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を書かなくてはならない -- 処理が重いという問題点も存在する +} +</code></pre> + + + +</div> -## 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="並列処理構文par-gotoが持つ問題">並列処理構文par gotoが持つ問題</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> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsfile-apiによるwordcount13">GearsFile APIによるWordCount(1/3)</h2> +<ul> + <li>FileOpen側(NodeA)とWordCount側(NodeB)でノードが別れる</li> + <li>(手順1)FileOpen側はFilePloxyにDataRecordをputする</li> + <li>(手順2)WordCount側は処理の後、ackを返信する</li> +</ul> +<div style="text-align: center;"> + <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" /> +</div> + + + +</div> -## 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> +<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> -## GearsFile APIによるWordCount(3/3) -- (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる -<div style="text-align: center;"> - <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800"> -</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" /> +</div> -## 以下返答用 + + +</div> -## PeekのImplementation -- QueueからElement経由でDataGearを取り出す -- Takeとは異なり、Queueのリンクを修正せずに、取り出されるデータをnextへ引き渡す +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="以下返答用">以下返答用</h2> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="peekのimplementation">PeekのImplementation</h2> +<ul> + <li>QueueからElement経由でDataGearを取り出す</li> + <li>Takeとは異なり、Queueのリンクを修正せずに、取り出されるデータをnextへ引き渡す + <pre><code>__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, ...); +} </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> + </li> +</ul> @@ -738,7 +794,7 @@ <h2 id="datagearの型">DataGearの型</h2> <ul> <li>union Data は一つのプロセス(Context)で使われるすべてのDataGearのUnion</li> - <li>メタ部分に型に対応する番号を持っている</li> + <li>GearsOSはメタ部分に型に対応する番号を持っている</li> <li>番号を使って型を識別することができる</li> <li>任意の型を格納できるQueueやStackを作成することが可能</li> <li>メタレベルではunion Dataを使ってDataGearの詳細に立ち入らず処理できる</li> @@ -752,13 +808,19 @@ <!-- _S9SLIDE_ --> <h2 id="remotedgmとacknowledge">RemoteDGMとacknowledge</h2> <ul> - <li>Take/Put/Peekのコマンドは TCP上でacknowledgeを使って通信されている</li> - <li>これとは別に自分と相手のCodeGearどうしのacknowledgeが必要</li> - <li>RemoteDataGearManager経由でacknowledgeを返すのが正しい</li> - <li>しかし、acknowledgeが重複してしまう</li> - <li>メタプログラミングを利用してこの重複を消すことは可能 + <li>Take/Put/Peekのコマンドは TCP上でacknowledgeを使って通信されている + <ul> + <li>これとは別に自分と相手のCodeGearどうしのacknowledgeが必要</li> + </ul> + </li> + <li>RemoteDataGearManager経由でacknowledgeを返すのが正しい <ul> - <li>しかし煩雑</li> + <li>acknowledgeが重複してしまう</li> + <li>メタプログラミングを利用してこの重複を消すことは可能 + <ul> + <li>煩雑な処理</li> + </ul> + </li> </ul> </li> </ul>
--- a/slide/thesis.md Fri Feb 11 13:14:32 2022 +0900 +++ b/slide/thesis.md Fri Feb 11 16:01:54 2022 +0900 @@ -93,12 +93,13 @@ ## GearsOSのファイルシステムの設計 - DataGearの単位でデータを操作したい -- 通信データに対応した複数のストリームを持つ +- ファイルは通信データに対応した複数のストリームを持つ - Transactionとしてatomicに操作したい - - 従来のファイルシステムはTransactionはUserレベルで実装される + - 従来のファイルシステムのTransactionはUserレベルで実装される - ファイル操作と通信を同じAPIで実現する + - Take/Put/Peek - ChristieのDataGearManagerを参考にする - - Take/Put/Peek + ## Take/Put/Peek - ファイルはQueueで構成される @@ -261,10 +262,10 @@ - 参加したノードを任意の形のTopologyに接続する機能 - ファイルシステム向けの機能を追加したい - DNS - - 中枢としてのTopologyのノード監視 + - 中枢としてのTopologyノード監視 - Securityシステムの追加 - - ファルパーミッション - - 不正な分散ファイルシステムへのアクセスの防止 + - ファイルpermission + - 分散ファイルシステムへの不正なアクセスの防止 @@ -275,9 +276,9 @@ - 例)Queueからのデータ取り出し - トランスコンパイラはどのInterfaceに記述されたDataGearを参照するべきか判断が難しい - ## トランスコンパイラのバグの例 - ContextからのDataGearの取り出し方が間違っている + ``` __code Task3(TQueue* localDGMQueue, FileString* string){ goto Task4(); @@ -369,18 +370,18 @@ ## DataGearの型 - union Data は一つのプロセス(Context)で使われるすべてのDataGearのUnion -- メタ部分に型に対応する番号を持っている +- GearsOSはメタ部分に型に対応する番号を持っている - 番号を使って型を識別することができる - 任意の型を格納できるQueueやStackを作成することが可能 - メタレベルではunion Dataを使ってDataGearの詳細に立ち入らず処理できる ## RemoteDGMとacknowledge - Take/Put/Peekのコマンドは TCP上でacknowledgeを使って通信されている -- これとは別に自分と相手のCodeGearどうしのacknowledgeが必要 + - これとは別に自分と相手のCodeGearどうしのacknowledgeが必要 - RemoteDataGearManager経由でacknowledgeを返すのが正しい -- しかし、acknowledgeが重複してしまう -- メタプログラミングを利用してこの重複を消すことは可能 - - しかし煩雑 + - acknowledgeが重複してしまう + - メタプログラミングを利用してこの重複を消すことは可能 + - 煩雑な処理 ## 複数のストリームによる利点 - 例えばUSBは複数のチャネルを持つ
--- a/slide/thesis.pdf.html Fri Feb 11 13:14:32 2022 +0900 +++ b/slide/thesis.pdf.html Fri Feb 11 16:01:54 2022 +0900 @@ -78,8 +78,11 @@ <h2 id="gearsosのファイルシステムの設計と実装">GearsOSのファイルシステムの設計と実装</h2> <ul> <li>DataGearとCodeGearという単位を用いるOS</li> - <li>従来のファイルシステムには型とTransactionが無い</li> - <li>DataGear単位のTransactionとしてファイルシステムを設計</li> + <li>DataGear単位のTransactionとしてファイルシステムを設計 + <ul> + <li>従来のOSのファイルシステムには型とTransactionが無い</li> + </ul> + </li> <li>APIとしてTake/Put/Peekを採用した</li> <li>通信としてもDBアクセスとしても使える(メモリからSSDへの通信に見える)</li> <li>本研究ではsocket baseな通信とWordCountの例題を作成した</li> @@ -228,16 +231,16 @@ <h2 id="gearsosのファイルシステムの設計">GearsOSのファイルシステムの設計</h2> <ul> <li>DataGearの単位でデータを操作したい</li> - <li>通信データに対応した複数のストリームを持つ</li> + <li>ファイルは通信データに対応した複数のストリームを持つ</li> <li>Transactionとしてatomicに操作したい <ul> - <li>従来のファイルシステムはTransactionはUserレベルで実装される</li> + <li>従来のファイルシステムのTransactionはUserレベルで実装される</li> </ul> </li> <li>ファイル操作と通信を同じAPIで実現する <ul> + <li>Take/Put/Peek</li> <li>ChristieのDataGearManagerを参考にする</li> - <li>Take/Put/Peek</li> </ul> </li> </ul> @@ -554,15 +557,15 @@ <li>ファイルシステム向けの機能を追加したい <ul> <li>DNS</li> - <li>中枢としてのTopologyのノード監視</li> + <li>中枢としてのTopologyノード監視</li> </ul> </li> </ul> </li> <li>Securityシステムの追加 <ul> - <li>ファルパーミッション</li> - <li>不正な分散ファイルシステムへのアクセスの防止</li> + <li>ファイルpermission</li> + <li>分散ファイルシステムへの不正なアクセスの防止</li> </ul> </li> </ul> @@ -596,72 +599,125 @@ <!-- _S9SLIDE_ --> <h2 id="トランスコンパイラのバグの例">トランスコンパイラのバグの例</h2> <ul> - <li>ContextからのDataGearの取り出し方が間違っている -``` -__code Task3(TQueue* localDGMQueue, FileString* string){ - goto Task4(); -}</li> + <li>ContextからのDataGearの取り出し方が間違っている</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; +<pre><code>__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); -}</p> +} -<p>__code Task3_stub(struct Context* context) { //自動生成されたErrorなstub +__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を書かなくてはならない -- 処理が重いという問題点も存在する +} +</code></pre> + + + +</div> -## 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="並列処理構文par-gotoが持つ問題">並列処理構文par gotoが持つ問題</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> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gearsfile-apiによるwordcount13">GearsFile APIによるWordCount(1/3)</h2> +<ul> + <li>FileOpen側(NodeA)とWordCount側(NodeB)でノードが別れる</li> + <li>(手順1)FileOpen側はFilePloxyにDataRecordをputする</li> + <li>(手順2)WordCount側は処理の後、ackを返信する</li> +</ul> +<div style="text-align: center;"> + <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" /> +</div> + + + +</div> -## 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> +<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> -## GearsFile APIによるWordCount(3/3) -- (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる -<div style="text-align: center;"> - <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800"> -</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" /> +</div> -## 以下返答用 + + +</div> -## PeekのImplementation -- QueueからElement経由でDataGearを取り出す -- Takeとは異なり、Queueのリンクを修正せずに、取り出されるデータをnextへ引き渡す +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="以下返答用">以下返答用</h2> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="peekのimplementation">PeekのImplementation</h2> +<ul> + <li>QueueからElement経由でDataGearを取り出す</li> + <li>Takeとは異なり、Queueのリンクを修正せずに、取り出されるデータをnextへ引き渡す + <pre><code>__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, ...); +} </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> + </li> +</ul> @@ -722,7 +778,7 @@ <h2 id="datagearの型">DataGearの型</h2> <ul> <li>union Data は一つのプロセス(Context)で使われるすべてのDataGearのUnion</li> - <li>メタ部分に型に対応する番号を持っている</li> + <li>GearsOSはメタ部分に型に対応する番号を持っている</li> <li>番号を使って型を識別することができる</li> <li>任意の型を格納できるQueueやStackを作成することが可能</li> <li>メタレベルではunion Dataを使ってDataGearの詳細に立ち入らず処理できる</li> @@ -736,13 +792,19 @@ <!-- _S9SLIDE_ --> <h2 id="remotedgmとacknowledge">RemoteDGMとacknowledge</h2> <ul> - <li>Take/Put/Peekのコマンドは TCP上でacknowledgeを使って通信されている</li> - <li>これとは別に自分と相手のCodeGearどうしのacknowledgeが必要</li> - <li>RemoteDataGearManager経由でacknowledgeを返すのが正しい</li> - <li>しかし、acknowledgeが重複してしまう</li> - <li>メタプログラミングを利用してこの重複を消すことは可能 + <li>Take/Put/Peekのコマンドは TCP上でacknowledgeを使って通信されている + <ul> + <li>これとは別に自分と相手のCodeGearどうしのacknowledgeが必要</li> + </ul> + </li> + <li>RemoteDataGearManager経由でacknowledgeを返すのが正しい <ul> - <li>しかし煩雑</li> + <li>acknowledgeが重複してしまう</li> + <li>メタプログラミングを利用してこの重複を消すことは可能 + <ul> + <li>煩雑な処理</li> + </ul> + </li> </ul> </li> </ul>