Mercurial > hg > Papers > 2024 > matac-master
view marp-slide/slide.md @ 77:5847cf59e9b3
...
author | matac42 <matac@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Feb 2024 13:49:06 +0900 |
parents | 13969295f118 |
children | 4ab8a9a8389a |
line wrap: on
line source
--- marp: true theme: cr paginate: true --- <!-- 全体の流れ - 目的 - 基礎概念 - 問題提起 -> 解決 の繰り返し - 評価 --> # GearsOSのファイルシステムにおける GCとレプリケーション <!-- スピーカーノート --> 琉球大学 理工学研究科 工学専攻 知能情報プログラム 河野研究室 又吉 雄斗 --- <!-- 目的 --> ## システム全体の信頼性を上げたい - システムの構成要素全体の信頼性を上げる必要がある - アプリケーション - OS - ファイルシステム - DB - メモリとSSD - 分散ノード - ネットワーク --- ## Gears OSを使って実現する - CodeGear - 処理の単位 - DataGear - データの単位 - metaGear - データの整合性 - 資源管理 --- ## 信頼性を上げる方法 - 証明 - GearsAgdaを使ってinvariantを証明する - テスト - モデル検査 - システムの構成要素全体にこれらの方法を適用したい - 既存システムの信頼性における問題点の解決 --- <!-- ここからGears OSの基礎概念だと明示する --> ## Continuation based C - Cの下位言語である - 処理の単位 CodeGear - データの単位 DataGear - ノーマルレベルとメタレベルの切り分け - gotoによる軽量継続 --- ## CodeGearとmetaCodeGearの関係 - ノーマルレベルとメタレベルの存在 ![w:1100](figs/meta_cg_dg.svg) --- ## Context - Gears OS上全てのCodeGear、DataGearの参照を持つ - OS上の処理の実行単位 - プロセスに相当 - Gearの概念ではmetaDataGearに当たる - ノーマルレベルから直接参照されない - metaCodeGearから参照される --- ## CodeGear遷移の流れ ![w:1100](figs/context.svg) --- ## 3種類のGears OS - GearsAgda(Agda) - 形式手法による信頼性の向上 - CbC x.v6 - スタンドアロンOS - Gears OS(CbC) ← 今回の実装対象 - ユーザーレベルタスクマネージメント --- ## GearsAgdaとGearsOSの対応 - GearsOSのCodeGearと直接対応している - GearsAgdaでRedBlackTreeの証明が進められている - find完了、insert証明中 - GearsOSのファイルシステムの構造はRedBlackTreeが多くを占める GearsAgdaでRedBlackTreeが証明できれば、GearsOSのファイルシステムの大部分を証明したことになる --- ## 非破壊RedBlackTree ![w:1100](figs/nondestructive_tree_modification.png) --- <!-- ここまでがGears OSの基礎概念だと明示する --> ## GearsFilesystem - GearsOSで書かれたファイルシステム - i-nodeによるディレクトリシステム - 分散ファイルシステムの通信機能 - 非破壊RedBlackTreeで構成される - indexやi-nodeの木 - DataGearを保持するQueueのリスト - ディスク上とメモリ上のデータ構造を統一する --- ## ファイルシステムの信頼性 - 電源断時にデータが残るpersistency - データを書き込めたかどうかを判定するatomic write - ノード喪失時にデータを保護する多重性 - 複数のコピーを調停するコミット機構 --- ## メモリ管理や多重性の機能がない <!-- それぞれが何のためにあるのか説明する感じでやると良い --> メモリ管理 - メモリ割り当てと保護、メモリリーク防止に必要 - 例:アロケーション、GC(ガベージコレクション) 多重性 - 単一障害点の排除、可用性の保証、災害復旧に必要 - 例:レプリケーション、バックアップ --- ## メモリ管理や多重性の機能の要件 <!-- 照明のしやすさの維持が唐突な感じ 動作の正しさがわかりやすい実装で証明しやすく --> - 信頼性を上げたい - 証明のしやすい実装 - データの持続性 - 持続性のあるストレージにちゃんとコピーする - 適切なタイミングでコピーを行う - 非破壊RedBlackTreeのメモリ管理 - 非破壊RedBlackTreeは履歴を全て持つ - 過去の履歴分のメモリを解放する必要がある --- ## GearsOSのGC - CopyingGCのような仕組み - 新しいContextのメモリに新規にコピーする - 古いContextをそのまま全部解放する ![bg right:52% 85%](figs/copy_context.svg) --- ## GearsOSの レプリケーション - 複数のストレージに同時に木をコピーする - そのうちの一部は持続的なストレージにする - システム起動時には必要な分をメモリにコピーする - トランザクションも考慮する ![bg right:48% 85%](figs/copy_context.svg) --- ## RedBlackTreeの トランザクション - トランザクションはルートの置き換え - 複数の書き込みポイント - 最新の情報が欲しい場合は書き込み停止処理が必要 ![bg right:45% 65%](figs/transaction.svg) --- ## copyRedBlackTreeの実装をした - GCやレプリケーションの機能のために木のコピーが必要 - RedBlackTreeのコピーが出来るAPIを実装した --- ## Tree InterfaceのAPIとして実装 ```c typedef struct Tree<> { union Data* tree; struct Node* node; __code put(Impl* tree, Type* node, __code next(...)); __code get(Impl* tree, Type* node, __code next(...)); __code remove(Impl* tree, Type* node, __code next(...)); __code copy(Impl* tree, __code next(...)); __code next(...); } Tree; ``` - `goto tree->copy(next);`という形で使用できる --- ## コピーの アルゴリズム - left方向へ深さ優先探索を行う - 2つのStackを使用する - nodeStackは元の木を辿る - toStackは新しい木を操作 - 大まかにleftDown, rightDown, upの3つの動作 ![bg right:45% 65%](figs/copy_algo4.svg) --- ## アロケーション部分 - leftDown、rightDownで新しい木のノードをアロケートする - newキーワードでアロケートしている ```c struct Node* newNode = new Node(); struct Node* data = (Node*)(stack->data); newNode->key = tree->current->left->key; newNode->value = (union Data*)new Integer(); ((Integer*)newNode->value)->value = ((Integer*)tree->current->left->value)->value; newNode->color = tree->current->left->color; if(data) { data->left = newNode; } ``` --- ## ALLOCATEマクロ - newキーワードによってビルド時に挿入されるマクロ - Contextが持つヒープ領域にDataGearサイズの領域を確保する - リニアアロケートする ```c #define ALLOCATE(context, t) ({ \ context->heap = __builtin_align_up(context->heap + sizeof(Meta) , sizeof(void *)) - sizeof(Meta); \ Meta* meta = (Meta*)context->heap;\ context->heap += sizeof(Meta);\ union Data* data = context->heap; \ context->heap += sizeof(t); \ meta->type = D_##t; \ meta->size = sizeof(t); \ meta->len = 1;\ meta->data = data; \ *context->metaData = meta; \ context->metaData++; \ data; }) ``` --- ## swap - コピー完了後に木を切り替える - CopyingGCのFrom To切り替えを想定 - 同一Context上での動作になっている ![bg right:50% 90%](figs/swap.svg) --- <!-- ## 実行方法 --- --> ## 評価 - 非破壊RedBlackTreeの増大抑制できる - コピーで木の持続性を確保できる 課題点 - 同一Contextへコピーしている - Stack使っているので余計なメモリを消費する - Stackも非破壊であるという問題がある - 証明しやすさを優先しているから - 非破壊である意味があまりない - コピーの正しさ --- ## 今後の研究方針 - 別Contextコピー - GearsAgdaでの記述 - Stack領域の圧縮 - Stackの再利用 - GC、レプリケーションの実装 - 多重性やメモリ管理以外の機能の実装 --- ## まとめ - copyRedBlackTreeを実装した - それにより多重性を確保できるようになった - 多重性はシステムの信頼性を向上させる - 非破壊RedBlackTreeの増大抑制により実用的なシステム構築が可能になった