# HG changeset patch # User ichikitakahiro # Date 1644235097 -32400 # Node ID 9e6fd2255ee11be09a347b339c856db1cda07331 # Parent b0fde43e331b862069bc099ea3f149049a231a20 tweak slide diff -r b0fde43e331b -r 9e6fd2255ee1 Paper/master_paper.pdf Binary file Paper/master_paper.pdf has changed diff -r b0fde43e331b -r 9e6fd2255ee1 slide/.DS_Store Binary file slide/.DS_Store has changed diff -r b0fde43e331b -r 9e6fd2255ee1 slide/thesis.html --- a/slide/thesis.html Mon Feb 07 03:39:50 2022 +0900 +++ b/slide/thesis.html Mon Feb 07 20:58:17 2022 +0900 @@ -94,7 +94,7 @@

GearsOSとその現状

@@ -274,8 +267,18 @@

ContextとGearの関係性

+
- Contextの参照 + Contextの参照
@@ -291,7 +294,7 @@
  • トランスコンパイルの際に、メタレベルの記述が行われる
    • StubCodeGearの自動生成
    • -
    • Gears向けに記述された演算子(par goto ,NEW)の書き換え
    • +
    • Gears向けに記述された演算子(par goto、NEW)の書き換え
  • @@ -321,10 +324,10 @@

    分散フレームワークChristie

    @@ -338,32 +341,26 @@
  • CodeGear
    • スレッドに相当する
    • -
    • 処理開始前に任意のDataGearを待ち合わせ、揃ったら処理が実行される
    • +
    • 任意のkey nameを持つDataGearを待ち合わせ、揃ったら処理が実行される
  • DataGear
    • 変数データに相当する
    • -
    • 型を所持している
    • -
    • アノテーションによりデータの参照後の処理が変化する -
        -
      • Take : 参照されたDataGearは削除される
      • -
      • Peek : 参照されてもDataGearは削除されない
      • -
      -
    • +
    • key nameと変数データのペアで管理される
  • CodeGearManger
    • ノードに相当する
    • -
    • DataGearManagerを所持し、それによりCodeGearとDataGearを管理する
    • +
    • DataGearManagerを所持し、CodeGearとDataGearを管理する
  • DataGearManager
    • データプールに相当する
    • -
    • DataGearのkeyとデータの組み合わせを保持している
    • -
    • LocalとRemoteの二種類が存在する
    • +
    • DataGearとkeyの組み合わせを保持している
    • +
    • LocalDGMとRemoteDGMの二種類が存在する
  • @@ -380,13 +377,13 @@
  • LocalDataGearManager (LocalDGM)
    • CodeGearManagerが持つ、自身のDataGearPool
    • -
    • CodeGear中のDataGearは普段これを参照する
    • +
    • DataGearの大半はこれを参照する
  • RemoteDataGearManager (RemoteDGM)
    • 他のCodeGearManagerが持つLocalDGMに対応するploxy
    • -
    • RemoteDGMに書き込みを行うと、対応したCodeGearManagerが持つLocalDGMに書き込みが行われる
    • +
    • 書き込みを行うと、対応したCodeGearManagerが持つLocalDGMに書き込みがされる
  • DataGearManagerによる通信がChristieの通信の要となっている
  • @@ -409,8 +406,8 @@
  • 接続されたノードは他のノードを相対的な名前で参照できる(例:Child/parent, right/leftなど)
  • -
  • TopologyManagerに煩雑な通信接続を任せることができる
  • +
     TopologyManager
    @@ -421,21 +418,21 @@
    -

    GearsFileSystemの目指す仕様

    +

    GearsFileSystemの方針

    • データベース的なレコード操作によるファイルアクセス
      • KeyValueStoreに対する書き込み
    • -
    • ファイルのバックアップの +
    • ファイルのバックアップ
      • ディレクトリの非破壊的編集とファイルの構成方法
    • ファイルの型の認識
        -
      • ファイルレコードの構造体の型により認識する
      • +
      • ファイルレコードを適切な形の構造体にする
    • 自律分散を目指した分散ファイルシステム @@ -451,17 +448,18 @@
      -

      GearsFSのファイル構造1/3

      +

      GearsFSのファイル構造1/4

        -
      • ファイルのデータは任意の型を持ったレコードとして断続的に分割された状態で保存される +
      • ファイルのデータ単位は任意の型を持ったレコード
          -
        • レコードはQueueに保存される
        • -
        • ファイルはレコードが先頭から順に読むことで構成される
        • +
        • 断続的に分割された状態で保存される
        • +
        • Queueに保存される
        • +
        • レコードを先頭から順に読むことでファイルを構成する
      • ファイルレコードは構造体で再現される
          -
        • ファイルレコード構造体はGearsDataGearとして利用できる
        • +
        • ファイルレコード構造体はGearsのDataGearとして利用できる
        • レコードの構造体によりOSはファイルの型を認識する
          • ファイルの特性に合わせ、レコードとその構成方法を適した形で構成できる
          • @@ -481,25 +479,20 @@
            -

            GearsFSのファイル構造2/3

            +

            GearsFSのファイル構造2/4

              -
            • GearsOSのファイルはChristieのDataGearManagerの仕組みを用いる
            • ファイルの読み込み/書き込みはStreamを通して行われる
              • streamも同様にQueueで構成される
              • -
              • streamはそれぞれ特定のkey nameをもち、keyを用いることでアクセスが行われる
              • +
              • streamはそれぞれ特定のkey nameをもつ
              • +
              • keyを用いることでアクセスが行われる
            • -
            • 最低でも、Input/OutputのStreamとファイルデータを保持するmainなQueueの三つで構成される
            • +
            • 最低で、Input/OutputのStreamとファイルデータを保持するmainなQueueの三つで構成される
            • Write : InputStreamに対してレコードをputすれば良い
            • Read : OutputStreamからレコードを全てtakeすれば良い
            • -
            • GearsOSのファイルは大域的な資源として複数のプロセスより競合的なアクセスが行われる -
                -
              • OutputStreamは複数のアクセスが行われても整合性が保たれる必要がある
              • -
              • CAS(Compare And Swap)が採用されたSynchronizedQueueを用いる
              • -
              -
            +
             streamによるファイルアクセス
            @@ -510,11 +503,30 @@
            -

            GearsFSのファイル構造3/3

            +

            GearsFSのファイル構造3/4

            +
              +
            • ChristieのDataGearManagerに相当する
            • +
            • GearsOSのファイルは大域的な資源である +
                +
              • 複数のプロセスより競合的なアクセスが行われる
              • +
              • OutputStreamは複数のアクセスが行われても整合性が保たれる必要がある
              • +
              • CAS(Compare And Swap)が採用されたSynchronizedQueueを用いる
              • +
              +
            • +
            + + + +
            + +
            + +

            GearsFSのファイル構造4/4

            • stream、mainQueueはDataGearに相当し、keyによるアクセスが行われる
            • -
            • Queueは赤黒木に保持されており、key nameで検索が行われ参照される
            • -
            • DGMへ書き込みを行うプロセスは入力するデータに加え対象のkey nameを指定する必要がある
            • +
            • Queueは赤黒木に保持される
            • +
            • key nameで探索が行われ参照される
            • +
            • DGM書き込みは対象のkey nameを指定する
             DataGearの保存形式 @@ -528,34 +540,87 @@

            遠隔からのファイル操作

              -
            • GearsOSのファイルはファイルであり、通信そのものにも相当する
            • +
            • GearsOSのファイルは、ファイル通信そのものにも相当する
            • RemoteDGMの仕組みを用いることで遠隔からのファイル読み込み/書き込みを行う
            • -
            • readの場合(リモート側に読み込みたいファイルが存在する) -
                -
              • (手順1)ローカル側はLocalDGMの相当する空のファイルを作成し、socketを持つ
              • -
              • (手順2)リモート側はローカルの空ファイルのploxyを作成する
              • -
              • (手順3)リモート側はploxyに対してデータをputする
              • -
              -
            • -
            • writeの場合(リモート側に書き込みたいファイルが存在する) -
                -
              • (手順1)リモート側はファイルのsocketを持つ
              • -
              • (手順2)ローカル側はローカルのファイルに接続し、ploxy(RemoteDGM)を作成する
              • -
              • (手順3)ローカル側はploxyのkeyに対してデータをputする
              • -
              -
            +
            +  socketを通じたレコード送信 +
            +
            -

            遠隔からのファイル変更

            -
            -  socketを通じたレコード送信 -
            +

            socketからの受信データ取り出し

            +
              +
            • socketはImplementに記述される
            • +
            • LocalDGMに相当するファイルは、接続先socketから送信されたデータを取り出す
            • +
            • APIとして記述される
            • +
            • 取り出されたデータは次の継続先でQueueに対してputされる
            • +
            + +
            __code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenEOF(...), __code whenError(...)){
            +    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(...);
            +    }
            +    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(...)){
              +  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();
              +  }
              +  goto next(...);
              +}
              +
              +
            • +
            @@ -566,16 +631,10 @@

            WordCount例題

            • ChristieAPIの構成をWordCount例題を通して行った
            • -
            • ファイルの中を1行ずつ読み取り、ファイル内の文字数、行列を調べる
            • -
            • ファイルの読み込みと文字列のカウントをそれぞれ別ノード上で行うことで、ファイル読み込みとファイルレコードの通信の必要が生じる
            • -
            • (手順1)ファイル内文字列を1行ずつWordCount関数へ入力する、これをループ
            • -
            • (手順2)ファイル内文字列が無くなった場合(EoF)結果を出力し、終了する
            • +
            • ファイルの中の文字列を1行ずつ読み取り、ファイル内の文字数と行数を調べる
            • +
            • ファイルの送信と文字列のカウントをそれぞれ別ノード上で行うことで、ファイル読み込みとファイルレコードの通信処理が構成できる
            -
            -  WordCountの遷移図 -
            -
            @@ -600,82 +659,6 @@
            -

            LocalDGMのsocketの受信データ取り出し

            -
              -
            • socketはImplementに記述される
            • -
            • LocalDGMに相当するファイルは、接続先socketから送信されたデータを取り出す
            • -
            • 取り出されたデータはInputStreamQueueに対してputされる -
              __code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenEOF(...), __code whenError(...)){
              -  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(...);
              -  }
              -  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(...)){
                -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();
                -}
                -goto next(...);
                -}
                -
                -
              • -
              -
            • -
            - - - -
            - -
            -

            GearsFSのディレクトリ

            • ディレクトリを赤黒木で実装する
            • @@ -730,8 +713,8 @@
            • par gotoを用いる案
              • 処理速度が遅い
              • +
              • トランスコンパイラへの依存度が高い
              • 現状バグが存在している
              • -
              • トランスコンパイラへの依存度が高い
            • 新しく並列処理を開発する
            • @@ -790,23 +773,24 @@
              -

              まとめ

              +

              結論

              • GearsFileSystemの設計
                • ファイルの構成方法
                    -
                  • Queueのリストである
                  • +
                  • keyによってアクセスされるQueueのリスト
                • ファイル操作API
                    +
                  • ChristieAPI
                  • レコード単位で操作される
                • ファイル送受信の実装
                    -
                  • ファイルploxy
                  • +
                  • RemoteDGM(ファイルploxy)
                • ディレクトリの仕組み @@ -845,14 +829,17 @@ struct Atomic* atomic; } SynchronizedQueue; - +
                • +
                + +

              研究成果

              - +
              • 連続するレコードで構成されるGearsOSファイルの設計
              • keyアクセスを用いたファイルに対するRead, writeAPI
              • 赤黒木を用いたディレクトリシステムの構築
              • @@ -860,13 +847,49 @@
              • ploxyを用いたファイルの送受信
              -

              ## -<!–

              + + +
              + +
              + +

              API手順

                -
              • RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 -–>
              • +
              • readの場合(リモート側に読み込みたいファイルが存在する) +
                  +
                • (手順1)ローカル側はLocalDGMの相当する空のファイルを作成し、socketを持つ
                • +
                • (手順2)リモート側はローカルの空ファイルのploxyを作成する
                • +
                • (手順3)リモート側はploxyに対してデータをputする
                • +
                +
              • +
              • writeの場合(リモート側に書き込みたいファイルが存在する) +
                  +
                • (手順1)リモート側は対象ファイルにsocketを持たせる
                • +
                • (手順2)ローカル側は対象のファイルに対応するploxy(RemoteDGM)を作成する
                • +
                • (手順3)ローカル側はploxyのkeyに対してデータをputする
                • +
                +
              + + +
              + +
              + +

              WordCount手順

              +
                +
              • (手順1)ファイル内文字列を1行ずつWordCount関数へ入力する、これをループ
              • +
              • (手順2)ファイル内文字列が無くなった場合(EoF)結果を出力し、終了する
              • +
              +
              +  WordCountの遷移図 +
              + + +
              diff -r b0fde43e331b -r 9e6fd2255ee1 slide/thesis.md --- a/slide/thesis.md Mon Feb 07 03:39:50 2022 +0900 +++ b/slide/thesis.md Mon Feb 07 20:58:17 2022 +0900 @@ -4,14 +4,16 @@ lang: Japanese code-engine: coderay + ## GearsOSとその現状 - 信頼性の保証と拡張性の高さを目指したOSプロジェクト -- 軽量継続を用いた言語、CbC(Continuation based C)により記述される。 +- 軽量継続を用いた言語、CbC(Continuation based C)により記述される - ノーマルレベルとメタレベルを分離して記述する - 現状では言語フレームワークとしてのみ機能する - OSとして動作するには多くの機能の開発が必要 - その中の一つにファイルシステムが挙げられる + ## 従来の物より発展した分散ファイルシステムの設計 - データベース的なレコード操作によるアクセス - ファイルに対する全ての操作がTransactionとなる @@ -23,7 +25,6 @@ - 分散フレームワークChristieの仕組みにより実現する - ## CbC (Continuation based C) - C言語の拡張言語である - 関数に代わる軽量継続をメインに記述する @@ -80,11 +81,7 @@ - コンパイル時にContext(後述)に書き込まれる - Implement - Interfaceの実装 -- Context - - プログラムに使われるCodeGear/DataGearを全て管理する - - CodeGear/DataGearの格納場所でもある - - 軽量継続中、必ず持ち歩かれる - - メタレベルなCodeGearからのみ参照される + - プログラム内で共通して利用したい変数 ``` typedef struct Queue<>{ @@ -108,15 +105,20 @@ ``` ## ContextとGearの関係性 +- Context + - 遷移の際にデータを全て記録するオブジェクト + - プログラムに使われるCodeGear/DataGearを管理する + - 軽量継続中、必ず引数で参照される + - メタレベルなCodeGearからのみ参照される
              - Contextの参照 + Contextの参照
              ## GearsOSのトランスコンパイラ - CbCプログラムはトランスコンパイルによりC言語プログラムに書き換えられる - トランスコンパイルの際に、メタレベルの記述が行われる - StubCodeGearの自動生成 - - Gears向けに記述された演算子(par goto ,NEW)の書き換え + - Gears向けに記述された演算子(par goto、NEW)の書き換え - StubCodeGearはCbCプログラムへ直に記述することでユーザーの任意の処理に変えられる ``` __code putSynchronizedQueue_stub(struct Context* context) { @@ -135,37 +137,34 @@ ## 分散フレームワークChristie - Java言語で記述された分散フレームワーク -- CbCと似てはいるが異なったGearというプログラム概念がある +- CbCとは異なったGearというプログラム概念がある - 特定のkeyに対する変数データ書き込みにより通信を行う - 自律分散の実現を目指して開発された -- 通信ノードの接続を行うTopologyManagerという機能を持つ +- TopologyManagerという機能を持つ ## ChristieのGear - CodeGear - スレッドに相当する - - 処理開始前に任意のDataGearを待ち合わせ、揃ったら処理が実行される + - 任意のkey nameを持つDataGearを待ち合わせ、揃ったら処理が実行される - DataGear - 変数データに相当する - - 型を所持している - - アノテーションによりデータの参照後の処理が変化する - - Take : 参照されたDataGearは削除される - - Peek : 参照されてもDataGearは削除されない + - key nameと変数データのペアで管理される - CodeGearManger - ノードに相当する - - DataGearManagerを所持し、それによりCodeGearとDataGearを管理する + - DataGearManagerを所持し、CodeGearとDataGearを管理する - DataGearManager - データプールに相当する - - DataGearのkeyとデータの組み合わせを保持している - - LocalとRemoteの二種類が存在する + - DataGearとkeyの組み合わせを保持している + - LocalDGMとRemoteDGMの二種類が存在する ## DataGearManagerによる通信 - ChristieではDataGearの送受信によりノードどうしの通信を行う - LocalDataGearManager (LocalDGM) - CodeGearManagerが持つ、自身のDataGearPool - - CodeGear中のDataGearは普段これを参照する + - DataGearの大半はこれを参照する - RemoteDataGearManager (RemoteDGM) - 他のCodeGearManagerが持つLocalDGMに対応するploxy - - RemoteDGMに書き込みを行うと、対応したCodeGearManagerが持つLocalDGMに書き込みが行われる + - 書き込みを行うと、対応したCodeGearManagerが持つLocalDGMに書き込みがされる - DataGearManagerによる通信がChristieの通信の要となっている
               RemoteDGMの関係図 @@ -175,27 +174,28 @@ - 参加を表明したノードに対して任意の形のTopologyに接続する - 接続 = RemoteDGMを作成する - 接続されたノードは他のノードを相対的な名前で参照できる(例:Child/parent, right/leftなど) -- TopologyManagerに煩雑な通信接続を任せることができる +
               TopologyManager
              -## GearsFileSystemの目指す仕様 +## GearsFileSystemの方針 - データベース的なレコード操作によるファイルアクセス - KeyValueStoreに対する書き込み -- ファイルのバックアップの +- ファイルのバックアップ - ディレクトリの非破壊的編集とファイルの構成方法 - ファイルの型の認識 - - ファイルレコードの構造体の型により認識する + - ファイルレコードを適切な形の構造体にする - 自律分散を目指した分散ファイルシステム - プロトコルを用いないChristieAPI -## GearsFSのファイル構造1/3 -- ファイルのデータは任意の型を持ったレコードとして断続的に分割された状態で保存される - - レコードはQueueに保存される - - ファイルはレコードが先頭から順に読むことで構成される +## GearsFSのファイル構造1/4 +- ファイルのデータ単位は任意の型を持ったレコード + - 断続的に分割された状態で保存される + - Queueに保存される + - レコードを先頭から順に読むことでファイルを構成する - ファイルレコードは構造体で再現される - - ファイルレコード構造体はGearsDataGearとして利用できる + - ファイルレコード構造体はGearsのDataGearとして利用できる - レコードの構造体によりOSはファイルの型を認識する - ファイルの特性に合わせ、レコードとその構成方法を適した形で構成できる @@ -203,74 +203,51 @@  Queueの構造
              -## GearsFSのファイル構造2/3 -- GearsOSのファイルはChristieのDataGearManagerの仕組みを用いる +## GearsFSのファイル構造2/4 - ファイルの読み込み/書き込みはStreamを通して行われる - streamも同様にQueueで構成される - - streamはそれぞれ特定のkey nameをもち、keyを用いることでアクセスが行われる -- 最低でも、Input/OutputのStreamとファイルデータを保持するmainなQueueの三つで構成される + - streamはそれぞれ特定のkey nameをもつ + - keyを用いることでアクセスが行われる +- 最低で、Input/OutputのStreamとファイルデータを保持するmainなQueueの三つで構成される - Write : InputStreamに対してレコードをputすれば良い - Read : OutputStreamからレコードを全てtakeすれば良い -- GearsOSのファイルは大域的な資源として複数のプロセスより競合的なアクセスが行われる - - OutputStreamは複数のアクセスが行われても整合性が保たれる必要がある - - CAS(Compare And Swap)が採用されたSynchronizedQueueを用いる +
               streamによるファイルアクセス
              -## GearsFSのファイル構造3/3 + +## GearsFSのファイル構造3/4 +- ChristieのDataGearManagerに相当する +- GearsOSのファイルは大域的な資源である + - 複数のプロセスより競合的なアクセスが行われる + - OutputStreamは複数のアクセスが行われても整合性が保たれる必要がある + - CAS(Compare And Swap)が採用されたSynchronizedQueueを用いる + +## GearsFSのファイル構造4/4 - stream、mainQueueはDataGearに相当し、keyによるアクセスが行われる -- Queueは赤黒木に保持されており、key nameで検索が行われ参照される -- DGMへ書き込みを行うプロセスは入力するデータに加え対象のkey nameを指定する必要がある +- Queueは赤黒木に保持される +- key nameで探索が行われ参照される +- DGM書き込みは対象のkey nameを指定する
               DataGearの保存形式
              - ## 遠隔からのファイル操作 -- GearsOSのファイルはファイルであり、通信そのものにも相当する +- GearsOSのファイルは、ファイル通信そのものにも相当する - RemoteDGMの仕組みを用いることで遠隔からのファイル読み込み/書き込みを行う -- readの場合(リモート側に読み込みたいファイルが存在する) - - (手順1)ローカル側はLocalDGMの相当する空のファイルを作成し、socketを持つ - - (手順2)リモート側はローカルの空ファイルのploxyを作成する - - (手順3)リモート側はploxyに対してデータをputする -- writeの場合(リモート側に書き込みたいファイルが存在する) - - (手順1)リモート側はファイルのsocketを持つ - - (手順2)ローカル側はローカルのファイルに接続し、ploxy(RemoteDGM)を作成する - - (手順3)ローカル側はploxyのkeyに対してデータをputする - -## 遠隔からのファイル変更 -
              -  socketを通じたレコード送信 -
              - - -## WordCount例題 -- ChristieAPIの構成をWordCount例題を通して行った -- ファイルの中を1行ずつ読み取り、ファイル内の文字数、行列を調べる -- ファイルの読み込みと文字列のカウントをそれぞれ別ノード上で行うことで、ファイル読み込みとファイルレコードの通信の必要が生じる -- (手順1)ファイル内文字列を1行ずつWordCount関数へ入力する、これをループ -- (手順2)ファイル内文字列が無くなった場合(EoF)結果を出力し、終了する
              -  WordCountの遷移図 +  socketを通じたレコード送信
              -## ChristieAPIによるWordCount -- FileOpen側とWordCount側でノードが別れる -- (手順1)FileOpen側はRDGMに文字列をputする -- (手順2)WordCount側は処理の後、ackを返信する -- (手順3)1,2をループし、FileOpen側はEoFならフラグを送信する -- (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる -
              -  ChristieAPIによるWordCount -
              - -## LocalDGMのsocketの受信データ取り出し +## socketからの受信データ取り出し - socketはImplementに記述される - LocalDGMに相当するファイルは、接続先socketから送信されたデータを取り出す -- 取り出されたデータはInputStreamQueueに対してputされる +- APIとして記述される +- 取り出されたデータは次の継続先でQueueに対してputされる + ``` __code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenEOF(...), __code whenError(...)){ union Data* recv_data; @@ -306,7 +283,7 @@ ## RemoteDGMのsocketによるデータ送信 - RemoteDGM側はsocketを用いてデータを送信する - Queueに対してputされたデータを送信する - - putCodeGearの直後に呼び出される +- putCodeGearの直後に呼び出される ``` __code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){ send_size = send(cQueue->socket, data, sizeof(union Data), 0); @@ -324,6 +301,24 @@ } ``` + +## WordCount例題 +- ChristieAPIの構成をWordCount例題を通して行った +- ファイルの中の文字列を1行ずつ読み取り、ファイル内の文字数と行数を調べる +- ファイルの送信と文字列のカウントをそれぞれ別ノード上で行うことで、ファイル読み込みとファイルレコードの通信処理が構成できる + +## ChristieAPIによるWordCount +- FileOpen側とWordCount側でノードが別れる +- (手順1)FileOpen側はRDGMに文字列をputする +- (手順2)WordCount側は処理の後、ackを返信する +- (手順3)1,2をループし、FileOpen側はEoFならフラグを送信する +- (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる +
              +  ChristieAPIによるWordCount +
              + + + ## GearsFSのディレクトリ - ディレクトリを赤黒木で実装する - 赤黒木のノードとしてファイル/ディレクトリが保存される @@ -332,6 +327,7 @@  GearsOSのディレクトリ
            + ## GearsFSのバックアップ(1/2) - ディレクトリツリーを非破壊的な編集で更新する - 木構造の編集前の構造が履歴となる @@ -340,17 +336,19 @@  非破壊的なツリー編集
            + ## GearsFSのバックアップ(2/2) - ファイルレコードを変更差分として構成する - GithubやMercurialのようなバージョン管理が行える - 特定の日時までのレコードを読めばよい - 定期的なファイルの再構築が必要 + ## GearsFSの並列処理 - par gotoを用いる案 - 処理速度が遅い + - トランスコンパイラへの依存度が高い - 現状バグが存在している - - トランスコンパイラへの依存度が高い - 新しく並列処理を開発する ## GearsOSの問題点 @@ -372,15 +370,15 @@ - par gotoの改良 - 新たな案を実装する - -## まとめ +## 結論 - GearsFileSystemの設計 - ファイルの構成方法 - - Queueのリストである + - keyによってアクセスされるQueueのリスト - ファイル操作API + - ChristieAPI - レコード単位で操作される - ファイル送受信の実装 - - ファイルploxy + - RemoteDGM(ファイルploxy) - ディレクトリの仕組み - 赤黒木を用いる - 非破壊的な編集によるログ @@ -401,6 +399,8 @@ struct Atomic* atomic; } SynchronizedQueue; ``` + + ## 研究成果 - 連続するレコードで構成されるGearsOSファイルの設計 - keyアクセスを用いたファイルに対するRead, writeAPI @@ -408,7 +408,23 @@ - ファイルのバックアップ考察 - ploxyを用いたファイルの送受信 -## +## API手順 +- readの場合(リモート側に読み込みたいファイルが存在する) + - (手順1)ローカル側はLocalDGMの相当する空のファイルを作成し、socketを持つ + - (手順2)リモート側はローカルの空ファイルのploxyを作成する + - (手順3)リモート側はploxyに対してデータをputする +- writeの場合(リモート側に書き込みたいファイルが存在する) + - (手順1)リモート側は対象ファイルにsocketを持たせる + - (手順2)ローカル側は対象のファイルに対応するploxy(RemoteDGM)を作成する + - (手順3)ローカル側はploxyのkeyに対してデータをputする + +## WordCount手順 +- (手順1)ファイル内文字列を1行ずつWordCount関数へ入力する、これをループ +- (手順2)ファイル内文字列が無くなった場合(EoF)結果を出力し、終了する +
            +  WordCountの遷移図 +
            + diff -r b0fde43e331b -r 9e6fd2255ee1 slide/thesis.pdf.html --- a/slide/thesis.pdf.html Mon Feb 07 03:39:50 2022 +0900 +++ b/slide/thesis.pdf.html Mon Feb 07 20:58:17 2022 +0900 @@ -78,7 +78,7 @@

            GearsOSとその現状

            • 信頼性の保証と拡張性の高さを目指したOSプロジェクト
            • -
            • 軽量継続を用いた言語、CbC(Continuation based C)により記述される。
            • +
            • 軽量継続を用いた言語、CbC(Continuation based C)により記述される
            • ノーマルレベルとメタレベルを分離して記述する
            • 現状では言語フレームワークとしてのみ機能する
            • OSとして動作するには多くの機能の開発が必要 @@ -220,14 +220,7 @@
            • Implement
              • Interfaceの実装
              • -
              -
            • -
            • Context -
                -
              • プログラムに使われるCodeGear/DataGearを全て管理する
              • -
              • CodeGear/DataGearの格納場所でもある
              • -
              • 軽量継続中、必ず持ち歩かれる
              • -
              • メタレベルなCodeGearからのみ参照される
              • +
              • プログラム内で共通して利用したい変数
            @@ -258,8 +251,18 @@

            ContextとGearの関係性

            +
              +
            • Context +
                +
              • 遷移の際にデータを全て記録するオブジェクト
              • +
              • プログラムに使われるCodeGear/DataGearを管理する
              • +
              • 軽量継続中、必ず引数で参照される
              • +
              • メタレベルなCodeGearからのみ参照される
              • +
              +
            • +
            - Contextの参照 + Contextの参照
            @@ -275,7 +278,7 @@
          • トランスコンパイルの際に、メタレベルの記述が行われる
            • StubCodeGearの自動生成
            • -
            • Gears向けに記述された演算子(par goto ,NEW)の書き換え
            • +
            • Gears向けに記述された演算子(par goto、NEW)の書き換え
          @@ -305,10 +308,10 @@

          分散フレームワークChristie

          • Java言語で記述された分散フレームワーク
          • -
          • CbCと似てはいるが異なったGearというプログラム概念がある
          • +
          • CbCとは異なったGearというプログラム概念がある
          • 特定のkeyに対する変数データ書き込みにより通信を行う
          • 自律分散の実現を目指して開発された
          • -
          • 通信ノードの接続を行うTopologyManagerという機能を持つ
          • +
          • TopologyManagerという機能を持つ
          @@ -322,32 +325,26 @@
        • CodeGear
          • スレッドに相当する
          • -
          • 処理開始前に任意のDataGearを待ち合わせ、揃ったら処理が実行される
          • +
          • 任意のkey nameを持つDataGearを待ち合わせ、揃ったら処理が実行される
        • DataGear
          • 変数データに相当する
          • -
          • 型を所持している
          • -
          • アノテーションによりデータの参照後の処理が変化する -
              -
            • Take : 参照されたDataGearは削除される
            • -
            • Peek : 参照されてもDataGearは削除されない
            • -
            -
          • +
          • key nameと変数データのペアで管理される
        • CodeGearManger
          • ノードに相当する
          • -
          • DataGearManagerを所持し、それによりCodeGearとDataGearを管理する
          • +
          • DataGearManagerを所持し、CodeGearとDataGearを管理する
        • DataGearManager
          • データプールに相当する
          • -
          • DataGearのkeyとデータの組み合わせを保持している
          • -
          • LocalとRemoteの二種類が存在する
          • +
          • DataGearとkeyの組み合わせを保持している
          • +
          • LocalDGMとRemoteDGMの二種類が存在する
        @@ -364,13 +361,13 @@
      • LocalDataGearManager (LocalDGM)
        • CodeGearManagerが持つ、自身のDataGearPool
        • -
        • CodeGear中のDataGearは普段これを参照する
        • +
        • DataGearの大半はこれを参照する
      • RemoteDataGearManager (RemoteDGM)
        • 他のCodeGearManagerが持つLocalDGMに対応するploxy
        • -
        • RemoteDGMに書き込みを行うと、対応したCodeGearManagerが持つLocalDGMに書き込みが行われる
        • +
        • 書き込みを行うと、対応したCodeGearManagerが持つLocalDGMに書き込みがされる
      • DataGearManagerによる通信がChristieの通信の要となっている
      • @@ -393,8 +390,8 @@
      • 接続されたノードは他のノードを相対的な名前で参照できる(例:Child/parent, right/leftなど)
    • -
    • TopologyManagerに煩雑な通信接続を任せることができる
    +
     TopologyManager
    @@ -405,21 +402,21 @@
    -

    GearsFileSystemの目指す仕様

    +

    GearsFileSystemの方針

    • データベース的なレコード操作によるファイルアクセス
      • KeyValueStoreに対する書き込み
    • -
    • ファイルのバックアップの +
    • ファイルのバックアップ
      • ディレクトリの非破壊的編集とファイルの構成方法
    • ファイルの型の認識
        -
      • ファイルレコードの構造体の型により認識する
      • +
      • ファイルレコードを適切な形の構造体にする
    • 自律分散を目指した分散ファイルシステム @@ -435,17 +432,18 @@
      -

      GearsFSのファイル構造1/3

      +

      GearsFSのファイル構造1/4

        -
      • ファイルのデータは任意の型を持ったレコードとして断続的に分割された状態で保存される +
      • ファイルのデータ単位は任意の型を持ったレコード
          -
        • レコードはQueueに保存される
        • -
        • ファイルはレコードが先頭から順に読むことで構成される
        • +
        • 断続的に分割された状態で保存される
        • +
        • Queueに保存される
        • +
        • レコードを先頭から順に読むことでファイルを構成する
      • ファイルレコードは構造体で再現される
          -
        • ファイルレコード構造体はGearsDataGearとして利用できる
        • +
        • ファイルレコード構造体はGearsのDataGearとして利用できる
        • レコードの構造体によりOSはファイルの型を認識する
          • ファイルの特性に合わせ、レコードとその構成方法を適した形で構成できる
          • @@ -465,25 +463,20 @@
            -

            GearsFSのファイル構造2/3

            +

            GearsFSのファイル構造2/4

              -
            • GearsOSのファイルはChristieのDataGearManagerの仕組みを用いる
            • ファイルの読み込み/書き込みはStreamを通して行われる
              • streamも同様にQueueで構成される
              • -
              • streamはそれぞれ特定のkey nameをもち、keyを用いることでアクセスが行われる
              • +
              • streamはそれぞれ特定のkey nameをもつ
              • +
              • keyを用いることでアクセスが行われる
            • -
            • 最低でも、Input/OutputのStreamとファイルデータを保持するmainなQueueの三つで構成される
            • +
            • 最低で、Input/OutputのStreamとファイルデータを保持するmainなQueueの三つで構成される
            • Write : InputStreamに対してレコードをputすれば良い
            • Read : OutputStreamからレコードを全てtakeすれば良い
            • -
            • GearsOSのファイルは大域的な資源として複数のプロセスより競合的なアクセスが行われる -
                -
              • OutputStreamは複数のアクセスが行われても整合性が保たれる必要がある
              • -
              • CAS(Compare And Swap)が採用されたSynchronizedQueueを用いる
              • -
              -
            +
             streamによるファイルアクセス
            @@ -494,11 +487,30 @@
            -

            GearsFSのファイル構造3/3

            +

            GearsFSのファイル構造3/4

            +
              +
            • ChristieのDataGearManagerに相当する
            • +
            • GearsOSのファイルは大域的な資源である +
                +
              • 複数のプロセスより競合的なアクセスが行われる
              • +
              • OutputStreamは複数のアクセスが行われても整合性が保たれる必要がある
              • +
              • CAS(Compare And Swap)が採用されたSynchronizedQueueを用いる
              • +
              +
            • +
            + + + +
            + +
            + +

            GearsFSのファイル構造4/4

            • stream、mainQueueはDataGearに相当し、keyによるアクセスが行われる
            • -
            • Queueは赤黒木に保持されており、key nameで検索が行われ参照される
            • -
            • DGMへ書き込みを行うプロセスは入力するデータに加え対象のkey nameを指定する必要がある
            • +
            • Queueは赤黒木に保持される
            • +
            • key nameで探索が行われ参照される
            • +
            • DGM書き込みは対象のkey nameを指定する
             DataGearの保存形式 @@ -512,34 +524,87 @@

            遠隔からのファイル操作

              -
            • GearsOSのファイルはファイルであり、通信そのものにも相当する
            • +
            • GearsOSのファイルは、ファイル通信そのものにも相当する
            • RemoteDGMの仕組みを用いることで遠隔からのファイル読み込み/書き込みを行う
            • -
            • readの場合(リモート側に読み込みたいファイルが存在する) -
                -
              • (手順1)ローカル側はLocalDGMの相当する空のファイルを作成し、socketを持つ
              • -
              • (手順2)リモート側はローカルの空ファイルのploxyを作成する
              • -
              • (手順3)リモート側はploxyに対してデータをputする
              • -
              -
            • -
            • writeの場合(リモート側に書き込みたいファイルが存在する) -
                -
              • (手順1)リモート側はファイルのsocketを持つ
              • -
              • (手順2)ローカル側はローカルのファイルに接続し、ploxy(RemoteDGM)を作成する
              • -
              • (手順3)ローカル側はploxyのkeyに対してデータをputする
              • -
              -
            +
            +  socketを通じたレコード送信 +
            +
            -

            遠隔からのファイル変更

            -
            -  socketを通じたレコード送信 -
            +

            socketからの受信データ取り出し

            +
              +
            • socketはImplementに記述される
            • +
            • LocalDGMに相当するファイルは、接続先socketから送信されたデータを取り出す
            • +
            • APIとして記述される
            • +
            • 取り出されたデータは次の継続先でQueueに対してputされる
            • +
            + +
            __code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenEOF(...), __code whenError(...)){
            +    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(...);
            +    }
            +    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(...)){
              +  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();
              +  }
              +  goto next(...);
              +}
              +
              +
            • +
            @@ -550,16 +615,10 @@

            WordCount例題

            • ChristieAPIの構成をWordCount例題を通して行った
            • -
            • ファイルの中を1行ずつ読み取り、ファイル内の文字数、行列を調べる
            • -
            • ファイルの読み込みと文字列のカウントをそれぞれ別ノード上で行うことで、ファイル読み込みとファイルレコードの通信の必要が生じる
            • -
            • (手順1)ファイル内文字列を1行ずつWordCount関数へ入力する、これをループ
            • -
            • (手順2)ファイル内文字列が無くなった場合(EoF)結果を出力し、終了する
            • +
            • ファイルの中の文字列を1行ずつ読み取り、ファイル内の文字数と行数を調べる
            • +
            • ファイルの送信と文字列のカウントをそれぞれ別ノード上で行うことで、ファイル読み込みとファイルレコードの通信処理が構成できる
            -
            -  WordCountの遷移図 -
            -
            @@ -584,82 +643,6 @@
            -

            LocalDGMのsocketの受信データ取り出し

            -
              -
            • socketはImplementに記述される
            • -
            • LocalDGMに相当するファイルは、接続先socketから送信されたデータを取り出す
            • -
            • 取り出されたデータはInputStreamQueueに対してputされる -
              __code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenEOF(...), __code whenError(...)){
              -  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(...);
              -  }
              -  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(...)){
                -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();
                -}
                -goto next(...);
                -}
                -
                -
              • -
              -
            • -
            - - - -
            - -
            -

            GearsFSのディレクトリ

            • ディレクトリを赤黒木で実装する
            • @@ -714,8 +697,8 @@
            • par gotoを用いる案
              • 処理速度が遅い
              • +
              • トランスコンパイラへの依存度が高い
              • 現状バグが存在している
              • -
              • トランスコンパイラへの依存度が高い
            • 新しく並列処理を開発する
            • @@ -774,23 +757,24 @@
              -

              まとめ

              +

              結論

              • GearsFileSystemの設計
                • ファイルの構成方法
                    -
                  • Queueのリストである
                  • +
                  • keyによってアクセスされるQueueのリスト
                • ファイル操作API
                    +
                  • ChristieAPI
                  • レコード単位で操作される
                • ファイル送受信の実装
                    -
                  • ファイルploxy
                  • +
                  • RemoteDGM(ファイルploxy)
                • ディレクトリの仕組み @@ -829,14 +813,17 @@ struct Atomic* atomic; } SynchronizedQueue; - +
                • +
                + +

              研究成果

              - +
              • 連続するレコードで構成されるGearsOSファイルの設計
              • keyアクセスを用いたファイルに対するRead, writeAPI
              • 赤黒木を用いたディレクトリシステムの構築
              • @@ -844,13 +831,49 @@
              • ploxyを用いたファイルの送受信
              -

              ## -<!–

              + + +
              + +
              + +

              API手順

                -
              • RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 -–>
              • +
              • readの場合(リモート側に読み込みたいファイルが存在する) +
                  +
                • (手順1)ローカル側はLocalDGMの相当する空のファイルを作成し、socketを持つ
                • +
                • (手順2)リモート側はローカルの空ファイルのploxyを作成する
                • +
                • (手順3)リモート側はploxyに対してデータをputする
                • +
                +
              • +
              • writeの場合(リモート側に書き込みたいファイルが存在する) +
                  +
                • (手順1)リモート側は対象ファイルにsocketを持たせる
                • +
                • (手順2)ローカル側は対象のファイルに対応するploxy(RemoteDGM)を作成する
                • +
                • (手順3)ローカル側はploxyのkeyに対してデータをputする
                • +
                +
              + + +
              + +
              + +

              WordCount手順

              +
                +
              • (手順1)ファイル内文字列を1行ずつWordCount関数へ入力する、これをループ
              • +
              • (手順2)ファイル内文字列が無くなった場合(EoF)結果を出力し、終了する
              • +
              +
              +  WordCountの遷移図 +
              + + +