# HG changeset patch # User ichikitakahiro # Date 1644552872 -32400 # Node ID bca6c79006cf39f0845d32615d9dbe9bf9724cfc # Parent 7174f22ed695d06fb7eac24bef09930b77ceaa89 tweak diff -r 7174f22ed695 -r bca6c79006cf Paper/images/slideGearsWC.pdf Binary file Paper/images/slideGearsWC.pdf has changed diff -r 7174f22ed695 -r bca6c79006cf slide/images/newGearsFile.pdf Binary file slide/images/newGearsFile.pdf has changed diff -r 7174f22ed695 -r bca6c79006cf slide/images/slideGearsWC.pdf Binary file slide/images/slideGearsWC.pdf has changed diff -r 7174f22ed695 -r bca6c79006cf slide/thesis.html --- 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 @@
  • ノーマルレベルでは変更されない(関数型プログラミング)
  • -
  • C言語を拡張する形でCbC言語により実装される(gcc/llvm)
  • +
  • C言語を拡張する形でCbC言語により実装される
  • @@ -176,7 +176,7 @@
  • createで作成する(通常の関数呼び出し)
  • DataGearとして作成する場合はnewを使う
  • gotoでputAPIを呼び出す(nextは継続)
  • -
  • InterfaceなどのDataGearはプロセスに相当するContextにすべて格納される +
  • InterfaceなどのDataGearは、プロセスに相当するContextにすべて格納される
    struct Queue* queue = createSychronizedQueue(context);
     struct Task* task = new Task();
     goto queue->put(task, next(...));
    @@ -192,9 +192,9 @@
       
     

    Interfaceの実装

      -
    • Interfaceの実装に使われるデータ構造を記述するImplementがある
    • +
    • Interfaceの実装に使われるデータ構造を、記述するImplementがある
    • 実装で使われるDataGearを記述する(ヒープに確保される)
    • -
    • create時にAPIを実装するCodeGearをInterfaceの構造体に代入される +
    • create時にAPIを実装するCodeGearが、Interfaceの構造体に代入される
      typedef struct SynchronizedQueue <> impl Queue {
       struct Element* top;
       struct Element* last;
      @@ -269,7 +269,11 @@
         
    • ファイルはQueueで構成される
    • putでQueueに追加
    • takeでQueueからの取り出し
    • -
    • peekでQueueから取り出さない読み出し
    • +
    • peekでQueueから取り出さない読み出し +
        +
      • 次にTakeされるDataGearを先読みする
      • +
      +
     Queueの構造 @@ -313,20 +317,24 @@

    PutのImplementation

      -
    • QueueのElementをnewで作成する
    • +
    • QueueのElementをnewで作成する +
        +
      • Elementには任意の型のDataGearが格納されている
      • +
      +
    • Queueのリンクを構築する
    • -
    • 継続nextに跳ぶ -
      __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(...);
      +  
    • 継続nextに跳ぶ
    • +
    + +
    __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(...);
     }
     
    -
  • - @@ -337,8 +345,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");
         struct Element* top = queue->top;
      @@ -361,13 +368,16 @@
       
       
      -

      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を待ち合わせることができる
      @@ -381,12 +391,11 @@

      DataGearManagerによる通信構成

      • 任意の相手のRemoteDGMを作成することでTopologyが形成される
      • -
      • 手元のRemoteDGMに書き込むと相手のLocalDGMに書き込まれる
      • -
      • RemoteDGMはproxyとして動作する
      • +
      • RemoteDGMはproxy(RemoteDGMに書き込むと相手のLocalDGMに書き込める)
      • この構成は分散フレームワークChristie(当研究室作成)と同じ
      - RemoteDGMの関係図 + RemoteDGMの関係図
      @@ -398,10 +407,8 @@

      socket通信によるRemoteDGMの実装

      • GearsOSはUnix上の言語フレームワークとして実装されている
      • -
      • Unixのsocket通信を使ってQueueのputを実装する
      • -
      • proxy側はQueueにputされたDataをsocketで送信する
      • -
      • 送信されたDataはLocal側でgetDataAPIで取り出される
      • -
      • send/recvはUnixのAPI +
      • Unixのsocket通信を使ってQueueのputを実装する(send/recvはUnixのAPI)
      • +
      • proxy側はQueueにputされたDataをsocketで送信する
        __code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){
           char recv_buf;
           int send_size, recv_size;
        @@ -448,31 +455,14 @@
           
         

        複数のストリームから構成されるファイル

          -
        • 入力されるデータに応じた個別のstreamを備えたい -
            -
          • 例えばUSBは複数のチャネルを持つ
          • -
          • メタデータの取り出しは別streamになる
          • -
          • 通信として使う場合に複数のプロトコルがある方が良い(FTP)
          • -
          -
        • +
        • 入力されるデータに応じた個別のstreamを備えたい
        • Streamはkey nameを持ち、keyでアクセスを行う
        • -
        • 赤黒木を用いる
        • +
        • Queueのリストとして赤黒木を用いる
        • DataのTake/Put時には必ずkey nameの指定が必要となる
        - - -
      - -
      - -

      socketを使ったRemoteDGM

      -
        -
      • RemoteDGMに書き込みが行われるとsocketで通信が起きる
      • -
      • 受信側はLocalDGMにDataGearを書き込む
      • -
      -  socketを通じたレコード送信 + 複数ストリームの設計
      @@ -485,11 +475,9 @@
      • ファイル内の文字列を1行づつ受け取り、文字列,行数をカウントする例題
      • 文字列送信側とCount側を別ノード上で行うことで、ファイルの呼び出しと通信処理が構成できる
      • -
      • RemoteDGMへの書き込みで通信する
      • -
      • acknowredgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信)
      - リモートDGMによるWordCount + リモートDGMによるWordCount
      @@ -498,42 +486,13 @@
      -

      GearsFile APIによるWordCount(1/3)

      +

      wordCountの例題

        -
      • FileOpen側(NodeA)とWordCount側(NodeB)でノードが別れる
      • -
      • (手順1)FileOpen側はFilePloxyにDataRecordをputする
      • -
      • (手順2)WordCount側は処理の後、ackを返信する
      • +
      • 二つのDataGearManagerのペアで構成される
      • +
      • acknowledgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信)
      -  ChristieAPIによるWordCount -
      - - - -
      - -
      - -

      GearsFile APIによるWordCount(2/3)

      -
        -
      • (手順3)1,2をループし、FileOpen側はEoFならフラグを送信する
      • -
      -
      -  ChristieAPIによるWordCount -
      - - - -
      - -
      - -

      GearsFile APIによるWordCount(3/3)

      -
        -
      • (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる
      • -
      -
      -  ChristieAPIによるWordCount + リモートDGMによるWordCount
      @@ -546,17 +505,13 @@
      • 実装ずみ
          -
        • keyアクセスに対応したファイル通信 +
        • API:put/takeに対応したファイル通信
            -
          • 単一のQueueによる通信の記述
          • +
          • 単一のQueueによる通信の記述をした
        • -
        • リストとなるTree -
            -
          • 赤黒木
          • -
          -
        • -
        • atomicな操作が行えるQueue +
        • QueueのリストとなるTree(赤黒木)
        • +
        • atomicな操作が行えるQueue(SynchronizedQueue)
          • 複数からのアクセス時にデータ整合を保つ
          @@ -565,8 +520,8 @@
        • 実装中
            -
          • keyアクセスが行えるQueueのリスト
          • -
          • リスト単位での通信の記述
          • +
          • key指定による任意なstreamの操作が行えるファイル
          • +
          • ファイル単位での通信の記述(Queue単体でない)
        @@ -596,10 +551,9 @@
      • Proxyによるファイル通信
    • -
    • GearsOSの調査
    -
  • Streamのリスト単位での通信の完成
  • +
  • Queue(stream)単位でない、ファイル単位の通信
  • @@ -623,8 +577,8 @@
  • Securityシステムの追加
      -
    • 証明書などによるファイル操作制限
    • -
    • 不正な分散ファイルシステムへのアクセス
    • +
    • ファルパーミッション
    • +
    • 不正な分散ファイルシステムへのアクセスの防止
  • @@ -650,61 +604,80 @@ -
    __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);
    -}
    -
    -
    -

    並列処理構文par gotoが持つ問題

    +

    トランスコンパイラのバグの例

      -
    • par gotoとはGearsOSに実装された並列処理構文である
    • -
    • StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた
    • -
    • par gotoはトランスコンパイラへの依存性が高い -
        -
      • stubCodeGearのように任意な書き換えが行えない
      • -
      -
    • -
    • 特定のCodeGearの宣言のみでしか正常な処理が生成されない -
        -
      • Interfaceに記述されたAPICodeGearではバグが生じる
      • -
      • par gotoでの使用を前提としたCodeGearを書かなくてはならない
      • -
      -
    • -
    • 処理が重いという問題点も存在する
    • +
    • 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)でノードが別れる
    +- (手順1)FileOpen側はFilePloxyにDataRecordをputする
    +- (手順2)WordCount側は処理の後、ackを返信する
    +<div style="text-align: center;">
    +   <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800">
    +</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> + +## 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 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, …); +} +```

    @@ -715,7 +688,7 @@

    Take/Put/Peek

    • PeekはReadOnly (最新の設定を読みこむなど)
    • -
    • Take/PutはDGが一つならUpDataに相当する
    • +
    • Take/PutはDataGearが一つならUpdateに相当する
    • 書き込みが単一スレッドなら順序は保証される
    • 書き込みが複数の場合、Putの順序は保証されない
    • データベースとの違い @@ -790,6 +763,27 @@
    + + + + +
    + +

    複数のストリームによる利点

    +
      +
    • 例えばUSBは複数のチャネルを持つ +
        +
      • メタデータの取り出しは別streamになる
      • +
      +
    • +
    • 複数の通信によりファイル通信の制御を行う場合がある +
        +
      • 通信の停止などのための通信
      • +
      +
    • +
    • 通信として使う場合に複数のプロトコルがある方が良い(FTP)
    • +
    +
    diff -r 7174f22ed695 -r bca6c79006cf slide/thesis.md --- 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を先読みする
     Queueの構造
    @@ -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(当研究室作成)と同じ
    - RemoteDGMの関係図 + RemoteDGMの関係図
    ## 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を書き込む
    -  socketを通じたレコード送信 + 複数ストリームの設計
    - ## wordCountの例題 - ファイル内の文字列を1行づつ受け取り、文字列,行数をカウントする例題 - 文字列送信側とCount側を別ノード上で行うことで、ファイルの呼び出しと通信処理が構成できる -- RemoteDGMへの書き込みで通信する -- acknowredgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信)
    - リモートDGMによるWordCount + リモートDGMによるWordCount +
    + +## wordCountの例題 +- 二つのDataGearManagerのペアで構成される +- acknowledgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信) +
    + リモートDGMによるWordCount
    +## 現在の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 @@  ChristieAPIによるWordCount - -## 現在の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) diff -r 7174f22ed695 -r bca6c79006cf slide/thesis.pdf.html --- 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 @@
  • ノーマルレベルでは変更されない(関数型プログラミング)
  • -
  • C言語を拡張する形でCbC言語により実装される(gcc/llvm)
  • +
  • C言語を拡張する形でCbC言語により実装される
  • @@ -160,7 +160,7 @@
  • createで作成する(通常の関数呼び出し)
  • DataGearとして作成する場合はnewを使う
  • gotoでputAPIを呼び出す(nextは継続)
  • -
  • InterfaceなどのDataGearはプロセスに相当するContextにすべて格納される +
  • InterfaceなどのDataGearは、プロセスに相当するContextにすべて格納される
    struct Queue* queue = createSychronizedQueue(context);
     struct Task* task = new Task();
     goto queue->put(task, next(...));
    @@ -176,9 +176,9 @@
       
     

    Interfaceの実装

      -
    • Interfaceの実装に使われるデータ構造を記述するImplementがある
    • +
    • Interfaceの実装に使われるデータ構造を、記述するImplementがある
    • 実装で使われるDataGearを記述する(ヒープに確保される)
    • -
    • create時にAPIを実装するCodeGearをInterfaceの構造体に代入される +
    • create時にAPIを実装するCodeGearが、Interfaceの構造体に代入される
      typedef struct SynchronizedQueue <> impl Queue {
       struct Element* top;
       struct Element* last;
      @@ -253,7 +253,11 @@
         
    • ファイルはQueueで構成される
    • putでQueueに追加
    • takeでQueueからの取り出し
    • -
    • peekでQueueから取り出さない読み出し
    • +
    • peekでQueueから取り出さない読み出し +
        +
      • 次にTakeされるDataGearを先読みする
      • +
      +
     Queueの構造 @@ -297,20 +301,24 @@

    PutのImplementation

      -
    • QueueのElementをnewで作成する
    • +
    • QueueのElementをnewで作成する +
        +
      • Elementには任意の型のDataGearが格納されている
      • +
      +
    • Queueのリンクを構築する
    • -
    • 継続nextに跳ぶ -
      __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(...);
      +  
    • 継続nextに跳ぶ
    • +
    + +
    __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(...);
     }
     
    -
  • - @@ -321,8 +329,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");
         struct Element* top = queue->top;
      @@ -345,13 +352,16 @@
       
       
      -

      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を待ち合わせることができる
      @@ -365,12 +375,11 @@

      DataGearManagerによる通信構成

      • 任意の相手のRemoteDGMを作成することでTopologyが形成される
      • -
      • 手元のRemoteDGMに書き込むと相手のLocalDGMに書き込まれる
      • -
      • RemoteDGMはproxyとして動作する
      • +
      • RemoteDGMはproxy(RemoteDGMに書き込むと相手のLocalDGMに書き込める)
      • この構成は分散フレームワークChristie(当研究室作成)と同じ
      - RemoteDGMの関係図 + RemoteDGMの関係図
      @@ -382,10 +391,8 @@

      socket通信によるRemoteDGMの実装

      • GearsOSはUnix上の言語フレームワークとして実装されている
      • -
      • Unixのsocket通信を使ってQueueのputを実装する
      • -
      • proxy側はQueueにputされたDataをsocketで送信する
      • -
      • 送信されたDataはLocal側でgetDataAPIで取り出される
      • -
      • send/recvはUnixのAPI +
      • Unixのsocket通信を使ってQueueのputを実装する(send/recvはUnixのAPI)
      • +
      • proxy側はQueueにputされたDataをsocketで送信する
        __code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){
           char recv_buf;
           int send_size, recv_size;
        @@ -432,31 +439,14 @@
           
         

        複数のストリームから構成されるファイル

          -
        • 入力されるデータに応じた個別のstreamを備えたい -
            -
          • 例えばUSBは複数のチャネルを持つ
          • -
          • メタデータの取り出しは別streamになる
          • -
          • 通信として使う場合に複数のプロトコルがある方が良い(FTP)
          • -
          -
        • +
        • 入力されるデータに応じた個別のstreamを備えたい
        • Streamはkey nameを持ち、keyでアクセスを行う
        • -
        • 赤黒木を用いる
        • +
        • Queueのリストとして赤黒木を用いる
        • DataのTake/Put時には必ずkey nameの指定が必要となる
        - - -
      - -
      - -

      socketを使ったRemoteDGM

      -
        -
      • RemoteDGMに書き込みが行われるとsocketで通信が起きる
      • -
      • 受信側はLocalDGMにDataGearを書き込む
      • -
      -  socketを通じたレコード送信 + 複数ストリームの設計
      @@ -469,11 +459,9 @@
      • ファイル内の文字列を1行づつ受け取り、文字列,行数をカウントする例題
      • 文字列送信側とCount側を別ノード上で行うことで、ファイルの呼び出しと通信処理が構成できる
      • -
      • RemoteDGMへの書き込みで通信する
      • -
      • acknowredgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信)
      - リモートDGMによるWordCount + リモートDGMによるWordCount
      @@ -482,42 +470,13 @@
      -

      GearsFile APIによるWordCount(1/3)

      +

      wordCountの例題

        -
      • FileOpen側(NodeA)とWordCount側(NodeB)でノードが別れる
      • -
      • (手順1)FileOpen側はFilePloxyにDataRecordをputする
      • -
      • (手順2)WordCount側は処理の後、ackを返信する
      • +
      • 二つのDataGearManagerのペアで構成される
      • +
      • acknowledgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信)
      -  ChristieAPIによるWordCount -
      - - - -
      - -
      - -

      GearsFile APIによるWordCount(2/3)

      -
        -
      • (手順3)1,2をループし、FileOpen側はEoFならフラグを送信する
      • -
      -
      -  ChristieAPIによるWordCount -
      - - - -
      - -
      - -

      GearsFile APIによるWordCount(3/3)

      -
        -
      • (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる
      • -
      -
      -  ChristieAPIによるWordCount + リモートDGMによるWordCount
      @@ -530,17 +489,13 @@
      • 実装ずみ
          -
        • keyアクセスに対応したファイル通信 +
        • API:put/takeに対応したファイル通信
            -
          • 単一のQueueによる通信の記述
          • +
          • 単一のQueueによる通信の記述をした
        • -
        • リストとなるTree -
            -
          • 赤黒木
          • -
          -
        • -
        • atomicな操作が行えるQueue +
        • QueueのリストとなるTree(赤黒木)
        • +
        • atomicな操作が行えるQueue(SynchronizedQueue)
          • 複数からのアクセス時にデータ整合を保つ
          @@ -549,8 +504,8 @@
        • 実装中
            -
          • keyアクセスが行えるQueueのリスト
          • -
          • リスト単位での通信の記述
          • +
          • key指定による任意なstreamの操作が行えるファイル
          • +
          • ファイル単位での通信の記述(Queue単体でない)
        @@ -580,10 +535,9 @@
      • Proxyによるファイル通信
    • -
    • GearsOSの調査
    -
  • Streamのリスト単位での通信の完成
  • +
  • Queue(stream)単位でない、ファイル単位の通信
  • @@ -607,8 +561,8 @@
  • Securityシステムの追加
      -
    • 証明書などによるファイル操作制限
    • -
    • 不正な分散ファイルシステムへのアクセス
    • +
    • ファルパーミッション
    • +
    • 不正な分散ファイルシステムへのアクセスの防止
  • @@ -634,61 +588,80 @@ -
    __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);
    -}
    -
    -
    -

    並列処理構文par gotoが持つ問題

    +

    トランスコンパイラのバグの例

      -
    • par gotoとはGearsOSに実装された並列処理構文である
    • -
    • StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた
    • -
    • par gotoはトランスコンパイラへの依存性が高い -
        -
      • stubCodeGearのように任意な書き換えが行えない
      • -
      -
    • -
    • 特定のCodeGearの宣言のみでしか正常な処理が生成されない -
        -
      • Interfaceに記述されたAPICodeGearではバグが生じる
      • -
      • par gotoでの使用を前提としたCodeGearを書かなくてはならない
      • -
      -
    • -
    • 処理が重いという問題点も存在する
    • +
    • 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)でノードが別れる
    +- (手順1)FileOpen側はFilePloxyにDataRecordをputする
    +- (手順2)WordCount側は処理の後、ackを返信する
    +<div style="text-align: center;">
    +   <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800">
    +</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> + +## 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 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, …); +} +```

    @@ -699,7 +672,7 @@

    Take/Put/Peek

    • PeekはReadOnly (最新の設定を読みこむなど)
    • -
    • Take/PutはDGが一つならUpDataに相当する
    • +
    • Take/PutはDataGearが一つならUpdateに相当する
    • 書き込みが単一スレッドなら順序は保証される
    • 書き込みが複数の場合、Putの順序は保証されない
    • データベースとの違い @@ -774,6 +747,27 @@
    + + + + +
    + +

    複数のストリームによる利点

    +
      +
    • 例えばUSBは複数のチャネルを持つ +
        +
      • メタデータの取り出しは別streamになる
      • +
      +
    • +
    • 複数の通信によりファイル通信の制御を行う場合がある +
        +
      • 通信の停止などのための通信
      • +
      +
    • +
    • 通信として使う場合に複数のプロトコルがある方が良い(FTP)
    • +
    +