# HG changeset patch # User ichikitakahiro # Date 1644562914 -32400 # Node ID ec3761cbbe24fb1c2eb178f021379c2835307eb8 # Parent bca6c79006cf39f0845d32615d9dbe9bf9724cfc tweak diff -r bca6c79006cf -r ec3761cbbe24 slide/thesis.html --- 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 @@

GearsOSのファイルシステムの設計と実装

  • Securityシステムの追加
  • @@ -612,72 +615,125 @@

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

    -

    __code Task3_stub(struct Context* context){ //正しいstub - TQueue* localDGMQueue = (struct TQueue)Gearef(context, TQueue)->tQueue; - FileString string = Gearef(context, TQueue)->data; +

    __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 +__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> +
    + +

    並列処理構文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を返信する
    • +
    +
    +  ChristieAPIによるWordCount +
    + + + +
    -## 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(2/3)

    +
      +
    • (手順3)1,2をループし、FileOpen側はEoFならフラグを送信する
    • +
    +
    +  ChristieAPIによるWordCount +
    + + + +
    -## GearsFile APIによるWordCount(3/3) -- (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる -<div style="text-align: center;"> -  <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800"> -</div> +
    + +

    GearsFile APIによるWordCount(3/3)

    +
      +
    • (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる
    • +
    +
    +  ChristieAPIによるWordCount +
    -## 以下返答用 + + +
    -## PeekのImplementation -- QueueからElement経由でDataGearを取り出す -- Takeとは異なり、Queueのリンクを修正せずに、取り出されるデータをnextへ引き渡す +
    + +

    以下返答用

    + + + +
    + +
    + +

    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, ...);
      +}
       
      -

      __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, …); -} -```

      +
    • +
    @@ -738,7 +794,7 @@

    DataGearの型

    • union Data は一つのプロセス(Context)で使われるすべてのDataGearのUnion
    • -
    • メタ部分に型に対応する番号を持っている
    • +
    • GearsOSはメタ部分に型に対応する番号を持っている
    • 番号を使って型を識別することができる
    • 任意の型を格納できるQueueやStackを作成することが可能
    • メタレベルではunion Dataを使ってDataGearの詳細に立ち入らず処理できる
    • @@ -752,13 +808,19 @@

      RemoteDGMとacknowledge

        -
      • Take/Put/Peekのコマンドは TCP上でacknowledgeを使って通信されている
      • -
      • これとは別に自分と相手のCodeGearどうしのacknowledgeが必要
      • -
      • RemoteDataGearManager経由でacknowledgeを返すのが正しい
      • -
      • しかし、acknowledgeが重複してしまう
      • -
      • メタプログラミングを利用してこの重複を消すことは可能 +
      • Take/Put/Peekのコマンドは TCP上でacknowledgeを使って通信されている +
          +
        • これとは別に自分と相手のCodeGearどうしのacknowledgeが必要
        • +
        +
      • +
      • RemoteDataGearManager経由でacknowledgeを返すのが正しい
          -
        • しかし煩雑
        • +
        • acknowledgeが重複してしまう
        • +
        • メタプログラミングを利用してこの重複を消すことは可能 +
            +
          • 煩雑な処理
          • +
          +
      diff -r bca6c79006cf -r ec3761cbbe24 slide/thesis.md --- 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は複数のチャネルを持つ diff -r bca6c79006cf -r ec3761cbbe24 slide/thesis.pdf.html --- 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 @@

      GearsOSのファイルシステムの設計と実装

      • DataGearとCodeGearという単位を用いるOS
      • -
      • 従来のファイルシステムには型とTransactionが無い
      • -
      • DataGear単位のTransactionとしてファイルシステムを設計
      • +
      • DataGear単位のTransactionとしてファイルシステムを設計 +
          +
        • 従来のOSのファイルシステムには型とTransactionが無い
        • +
        +
      • APIとしてTake/Put/Peekを採用した
      • 通信としてもDBアクセスとしても使える(メモリからSSDへの通信に見える)
      • 本研究ではsocket baseな通信とWordCountの例題を作成した
      • @@ -228,16 +231,16 @@

        GearsOSのファイルシステムの設計

        • DataGearの単位でデータを操作したい
        • -
        • 通信データに対応した複数のストリームを持つ
        • +
        • ファイルは通信データに対応した複数のストリームを持つ
        • Transactionとしてatomicに操作したい
            -
          • 従来のファイルシステムはTransactionはUserレベルで実装される
          • +
          • 従来のファイルシステムのTransactionはUserレベルで実装される
        • ファイル操作と通信を同じAPIで実現する
            +
          • Take/Put/Peek
          • ChristieのDataGearManagerを参考にする
          • -
          • Take/Put/Peek
        @@ -554,15 +557,15 @@
      • ファイルシステム向けの機能を追加したい
        • DNS
        • -
        • 中枢としてのTopologyのノード監視
        • +
        • 中枢としてのTopologyノード監視
    • Securityシステムの追加
        -
      • ファルパーミッション
      • -
      • 不正な分散ファイルシステムへのアクセスの防止
      • +
      • ファイルpermission
      • +
      • 分散ファイルシステムへの不正なアクセスの防止
    @@ -596,72 +599,125 @@

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

      -
    • ContextからのDataGearの取り出し方が間違っている -``` -__code Task3(TQueue* localDGMQueue, FileString* string){ - goto Task4(); -}
    • +
    • ContextからのDataGearの取り出し方が間違っている
    -

    __code Task3_stub(struct Context* context){ //正しいstub - TQueue* localDGMQueue = (struct TQueue)Gearef(context, TQueue)->tQueue; - FileString string = Gearef(context, TQueue)->data; +

    __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 +__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> +
    + +

    並列処理構文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を返信する
    • +
    +
    +  ChristieAPIによるWordCount +
    + + + +
    -## 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(2/3)

    +
      +
    • (手順3)1,2をループし、FileOpen側はEoFならフラグを送信する
    • +
    +
    +  ChristieAPIによるWordCount +
    + + + +
    -## GearsFile APIによるWordCount(3/3) -- (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる -<div style="text-align: center;"> -  <img src="images/slideGearsWC.pdf" alt=ChristieAPIによるWordCount width="800"> -</div> +
    + +

    GearsFile APIによるWordCount(3/3)

    +
      +
    • (手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる
    • +
    +
    +  ChristieAPIによるWordCount +
    -## 以下返答用 + + +
    -## PeekのImplementation -- QueueからElement経由でDataGearを取り出す -- Takeとは異なり、Queueのリンクを修正せずに、取り出されるデータをnextへ引き渡す +
    + +

    以下返答用

    + + + +
    + +
    + +

    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, ...);
      +}
       
      -

      __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, …); -} -```

      +
    • +
    @@ -722,7 +778,7 @@

    DataGearの型

    • union Data は一つのプロセス(Context)で使われるすべてのDataGearのUnion
    • -
    • メタ部分に型に対応する番号を持っている
    • +
    • GearsOSはメタ部分に型に対応する番号を持っている
    • 番号を使って型を識別することができる
    • 任意の型を格納できるQueueやStackを作成することが可能
    • メタレベルではunion Dataを使ってDataGearの詳細に立ち入らず処理できる
    • @@ -736,13 +792,19 @@

      RemoteDGMとacknowledge

        -
      • Take/Put/Peekのコマンドは TCP上でacknowledgeを使って通信されている
      • -
      • これとは別に自分と相手のCodeGearどうしのacknowledgeが必要
      • -
      • RemoteDataGearManager経由でacknowledgeを返すのが正しい
      • -
      • しかし、acknowledgeが重複してしまう
      • -
      • メタプログラミングを利用してこの重複を消すことは可能 +
      • Take/Put/Peekのコマンドは TCP上でacknowledgeを使って通信されている +
          +
        • これとは別に自分と相手のCodeGearどうしのacknowledgeが必要
        • +
        +
      • +
      • RemoteDataGearManager経由でacknowledgeを返すのが正しい
          -
        • しかし煩雑
        • +
        • acknowledgeが重複してしまう
        • +
        • メタプログラミングを利用してこの重複を消すことは可能 +
            +
          • 煩雑な処理
          • +
          +