annotate Paper/paper.tex @ 11:0cf15f862f02

transaction
author matac42 <matac@cr.ie.u-ryukyu.ac.jp>
date Sun, 16 Apr 2023 22:01:29 +0900
parents 091510a8cd0a
children e739be918b0e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
k228587
parents:
diff changeset
1 %%
k228587
parents:
diff changeset
2 %% 研究報告用スイッチ
k228587
parents:
diff changeset
3 %% [techrep]
k228587
parents:
diff changeset
4 %%
k228587
parents:
diff changeset
5 %% 欧文表記無しのスイッチ(etitle,eabstractは任意)
k228587
parents:
diff changeset
6 %% [noauthor]
k228587
parents:
diff changeset
7 %%
k228587
parents:
diff changeset
8
k228587
parents:
diff changeset
9 %\documentclass[submit,techrep]{ipsj}
k228587
parents:
diff changeset
10 \documentclass[submit,techrep,noauthor]{ipsj}
k228587
parents:
diff changeset
11
k228587
parents:
diff changeset
12
k228587
parents:
diff changeset
13
k228587
parents:
diff changeset
14 \usepackage[dvips, dvipdfmx]{graphicx}
k228587
parents:
diff changeset
15 \usepackage{latexsym}
k228587
parents:
diff changeset
16 \usepackage{listings}
k228587
parents:
diff changeset
17 \lstset{
k228587
parents:
diff changeset
18 language=C,
k228587
parents:
diff changeset
19 tabsize=2,
k228587
parents:
diff changeset
20 frame=single,
k228587
parents:
diff changeset
21 basicstyle={\tt\footnotesize}, %
k228587
parents:
diff changeset
22 identifierstyle={\footnotesize}, %
k228587
parents:
diff changeset
23 commentstyle={\footnotesize\itshape}, %
k228587
parents:
diff changeset
24 keywordstyle={\footnotesize\ttfamily}, %
k228587
parents:
diff changeset
25 ndkeywordstyle={\footnotesize\ttfamily}, %
k228587
parents:
diff changeset
26 stringstyle={\footnotesize\ttfamily},
k228587
parents:
diff changeset
27 breaklines=true,
k228587
parents:
diff changeset
28 captionpos=t,
k228587
parents:
diff changeset
29 columns=[l]{fullflexible}, %
k228587
parents:
diff changeset
30 xrightmargin=0zw, %
k228587
parents:
diff changeset
31 xleftmargin=1zw, %
k228587
parents:
diff changeset
32 aboveskip=1zw,
k228587
parents:
diff changeset
33 numberstyle={\scriptsize}, %
k228587
parents:
diff changeset
34 stepnumber=1,
k228587
parents:
diff changeset
35 numbersep=0.5zw, %
k228587
parents:
diff changeset
36 lineskip=-0.5ex
k228587
parents:
diff changeset
37 }
k228587
parents:
diff changeset
38 \usepackage{caption}
k228587
parents:
diff changeset
39
k228587
parents:
diff changeset
40
k228587
parents:
diff changeset
41 \def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline}
k228587
parents:
diff changeset
42 \def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\}
k228587
parents:
diff changeset
43 \def\|{\verb|}
k228587
parents:
diff changeset
44 %
k228587
parents:
diff changeset
45
k228587
parents:
diff changeset
46 %\setcounter{巻数}{59}%vol59=2018
k228587
parents:
diff changeset
47 %\setcounter{号数}{10}
k228587
parents:
diff changeset
48 %\setcounter{page}{1}
k228587
parents:
diff changeset
49 \renewcommand{\lstlistingname}{Code}
k228587
parents:
diff changeset
50
k228587
parents:
diff changeset
51 \begin{document}
k228587
parents:
diff changeset
52
k228587
parents:
diff changeset
53
k228587
parents:
diff changeset
54 \title{Gears OSのファイルシステムとDB}
k228587
parents:
diff changeset
55
k228587
parents:
diff changeset
56 \affiliate{IPSJ}{情報処理学会\\
k228587
parents:
diff changeset
57 IPSJ, Chiyoda, Tokyo 101--0062, Japan}
k228587
parents:
diff changeset
58
k228587
parents:
diff changeset
59
k228587
parents:
diff changeset
60 \paffiliate{JU}{琉球大学大学院理工学研究科工学専攻知能情報プログラム\\
k228587
parents:
diff changeset
61 University of the Ryukyus, Graduate School of Engineering and Science}
k228587
parents:
diff changeset
62
k228587
parents:
diff changeset
63 \author{又吉 雄斗}{Matayoshi Yuto}{KIE}[matac@cr.ie.u-ryukyu.ac.jp]
k228587
parents:
diff changeset
64 \author{佐野 巧曜}{Sano Yoshiaki}{KIE}[yoshisaur@cr.ie.u-ryukyu.ac.jp]
k228587
parents:
diff changeset
65 \author{河野 真治}{Kono Shinzi}{IE}[kono@ie.u-ryukyu.ac.jp]
k228587
parents:
diff changeset
66
k228587
parents:
diff changeset
67 \begin{abstract}
k228587
parents:
diff changeset
68 当研究室では,Continuation based C(CbC)を用い,定理証明やモデル検査などで信頼性を保証することを目的としたGearsOSを開発している.
k228587
parents:
diff changeset
69 OSにおいてファイルシステムは重要な機能の一つであるため実装する必要がある.
k228587
parents:
diff changeset
70 現在,一般的なアプリケーションはファイルシステムとデータベースを併用する形で構成される.
k228587
parents:
diff changeset
71 DBはSQLによってデータの挿入や変更が可能だがスキーマを事前に定義したり,insert時にそれらのschemaを指定したりする必要がある.
k228587
parents:
diff changeset
72 GearsOSのファイルシステムではSQLの機能に相当するgrepやfindなどのインターフェースを実装し,
k228587
parents:
diff changeset
73 アプリケーションのデータベースとしてファイルシステムを使用する構成が取れるようにしたい.
k228587
parents:
diff changeset
74 ファイルシステムとデータベースの違いについて考え,データベースとしても利用可能なファイルシステムを構築したい.
k228587
parents:
diff changeset
75 本研究では,ファイルシステムとデータベースの違いについて考察し,Gears OSのファイルシステムの設計について述べる.
k228587
parents:
diff changeset
76 \end{abstract}
k228587
parents:
diff changeset
77
k228587
parents:
diff changeset
78
k228587
parents:
diff changeset
79 %
k228587
parents:
diff changeset
80 %\begin{jkeyword}
k228587
parents:
diff changeset
81 %情報処理学会論文誌ジャーナル,\LaTeX,スタイルファイル,べからず集
k228587
parents:
diff changeset
82 %\end{jkeyword}
k228587
parents:
diff changeset
83 %
k228587
parents:
diff changeset
84 %\begin{eabstract}
k228587
parents:
diff changeset
85 %This document is a guide to prepare a draft for submitting to IPSJ
k228587
parents:
diff changeset
86 %Journal, and the final camera-ready manuscript of a paper to appear in
k228587
parents:
diff changeset
87 %IPSJ Journal, using {\LaTeX} and special style files. Since this
k228587
parents:
diff changeset
88 %document itself is produced with the style files, it will help you to
k228587
parents:
diff changeset
89 %refer its source file which is distributed with the style files.
k228587
parents:
diff changeset
90 %\end{eabstract}
k228587
parents:
diff changeset
91 %
k228587
parents:
diff changeset
92 %\begin{ekeyword}
k228587
parents:
diff changeset
93 %IPSJ Journal, \LaTeX, style files, ``Dos and Dont's'' list
k228587
parents:
diff changeset
94 %\end{ekeyword}
k228587
parents:
diff changeset
95
k228587
parents:
diff changeset
96 \maketitle
k228587
parents:
diff changeset
97
k228587
parents:
diff changeset
98 %1
k228587
parents:
diff changeset
99 \section{GearsOSにおけるファイルシステム}
k228587
parents:
diff changeset
100
k228587
parents:
diff changeset
101 アプリケーションの信頼性を保証することは
k228587
parents:
diff changeset
102 情報システムやコンピュータを用いる業務の信頼性の保障につながる重要な課題である.
k228587
parents:
diff changeset
103 したがって,アプリケーションの信頼性を保証するために,基盤となるOSの信頼性を高める必要がある.
k228587
parents:
diff changeset
104
k228587
parents:
diff changeset
105 当研究室では,信頼性の保証を目的としたGearsOSを開発している.
k228587
parents:
diff changeset
106 GearsOSは,OSの信頼性を定理証明やモデル検査を行うことで保証することを目指している\cite{modelcheck}.
k228587
parents:
diff changeset
107 同じく,当研究室で開発しているプログラム言語であるCbC(Continuation based C)で記述されており,
k228587
parents:
diff changeset
108 ノーマルレベルとメタレベルを簡単に切り分けることを可能としている.
k228587
parents:
diff changeset
109 そのようにして,CbCでメタレベルの処理を切り出したものに対して,定理証明やモデル検査を行うことで信頼性を保証する.
k228587
parents:
diff changeset
110
k228587
parents:
diff changeset
111 GearsOSは現在OSとして重要な機能がいくつか未実装であり,その一つとしてファイルシステムが挙げられる.
k228587
parents:
diff changeset
112 ファイルシステムはファイルやディレクトリといった構造を持ち,データの保存,整理を行う.
k228587
parents:
diff changeset
113 また,OSが管理するデータの操作を人間が行いやすいようにインターフェースを提供する.
k228587
parents:
diff changeset
114 OSの機能の中でも特に重要な機能であるため,GearsOSにも実装を行う必要がある.
k228587
parents:
diff changeset
115
5
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
116 今回GearsOSへファイルシステムを実装するにあたり,
0
k228587
parents:
diff changeset
117
k228587
parents:
diff changeset
118 \section{Continuation based C}
k228587
parents:
diff changeset
119
k228587
parents:
diff changeset
120 Continuation based C(CbC)\cite{cbcllvm,cbc}は,当研究室で開発しているCの下位言語である.
k228587
parents:
diff changeset
121 CbCでは関数の代わりにCodeGearという単位でプログラミングを行う.
k228587
parents:
diff changeset
122 CodeGearは\emph{\_\_code}という記述で宣言することができる.
k228587
parents:
diff changeset
123 また,データの単位にはDataGearと呼ばれる変数データを用いる.
k228587
parents:
diff changeset
124 図\ref{fig:dgcg}はCodeGearと入出力の関係を表している.
k228587
parents:
diff changeset
125 CodeGearはDataGearを入力として受け取り,別のDataGearに書き込み出力することができる.
k228587
parents:
diff changeset
126 特に,入力のDataGearをInput DataGear,出力のDataGearをOutput DataGearと呼ぶ.
k228587
parents:
diff changeset
127 gotoで次のCodeGearに遷移することができ,その際,Output DataGearを次のCodeGearのInput DataGearとして渡すことができる.
k228587
parents:
diff changeset
128
k228587
parents:
diff changeset
129 \begin{figure}[ht]
k228587
parents:
diff changeset
130 \begin{center}
k228587
parents:
diff changeset
131 \includegraphics[width=80mm]{figs/cgdg.pdf}
k228587
parents:
diff changeset
132 \end{center}
k228587
parents:
diff changeset
133 \caption{CodeGearと入出力の関係図}
k228587
parents:
diff changeset
134 \label{fig:dgcg}
k228587
parents:
diff changeset
135 \end{figure}
k228587
parents:
diff changeset
136
k228587
parents:
diff changeset
137 CodeGearから次のCodeGearに遷移していく一連の動作を継続と呼ぶ.
k228587
parents:
diff changeset
138 通常の関数の場合,関数から次の関数へ遷移する時にfunction callが行われる.
k228587
parents:
diff changeset
139 function callは前の関数へ戻る場合があり,そのためにcall stackを保存する.
k228587
parents:
diff changeset
140 他方,CbCの継続はfunction callをせずにgotoによるjmpで行われる.
k228587
parents:
diff changeset
141 jmpはfunction callと異なり,call stackのような環境を保存しない.
k228587
parents:
diff changeset
142 よって,CbCのgotoによる継続はfunction callによる継続と比較して軽量であるといえる.
k228587
parents:
diff changeset
143 そのことから,CbCにおける継続をfunction callによる継続と区別して,軽量継続と呼ぶ.
k228587
parents:
diff changeset
144 これらの仕組みにより,ノーマルレベルとメタレベルの処理を容易に切り分けることが可能となる.
k228587
parents:
diff changeset
145
k228587
parents:
diff changeset
146 CbCのプログラム例をソースコード\ref{src:cbc}に示す.
k228587
parents:
diff changeset
147 まずmain関数においてadd1 CodeGearへgotoを行う.
k228587
parents:
diff changeset
148 その際add1へInput DataGearとしてnを渡す.
k228587
parents:
diff changeset
149 Cのgotoが\emph{goto label;}という記法で,ラベリングした箇所へjmpを行うのに対し,
k228587
parents:
diff changeset
150 CbCのgotoは\emph{goto add1(n);}という記法で,add1 CodeGearへn DataGearを渡してjmpを行う.
k228587
parents:
diff changeset
151 add1は処理の最後にadd2 CodeGearへgotoを行う.
k228587
parents:
diff changeset
152 その際Output DataGear out\_nをadd2のInput DataGearとして渡す.
k228587
parents:
diff changeset
153 このようにCbCではCodeGearのOutput DataGearを次のCodeGearのInput DataGearとして渡すことを繰り返すことで処理を進める.
k228587
parents:
diff changeset
154
k228587
parents:
diff changeset
155 \lstinputlisting[caption=CbCのプログラム例,label=src:cbc]{src/hello.cbc}
k228587
parents:
diff changeset
156
1
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
157 \section{信頼性の保証を目的としたGearsOS}
0
k228587
parents:
diff changeset
158
k228587
parents:
diff changeset
159 GearsOS\cite{gears,gearsos,cr}は当研究室で開発している,信頼性と拡張性の両立を目的としたOSである.
k228587
parents:
diff changeset
160 GearsOSにはGearという概念があり,実行の単位をCodeGear,データの単位をDataGearと呼ぶ.
k228587
parents:
diff changeset
161 軽量継続を基本とし,stackを持たない代わりに全てをContext経由で実行する.
k228587
parents:
diff changeset
162 同様にGearの概念を持つContinuation based C(CbC)で記述されており,ノーマルレベルとメタレベルの処理を切り分けることが容易である.
k228587
parents:
diff changeset
163 また,GearsOSは現在開発途上であり,OSとして動作するために今後実装しなければならない機能がいくつか残っている.
k228587
parents:
diff changeset
164
9
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
165 GearsOSには現在3つの種類がある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
166 1つ目が型式手法による信頼性の向上を目的とした,GearsAgdaと呼ばれるGearsOSである.
10
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
167 これは,Agdaによって実装されている.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
168 2つ目がユーザーレベルタスクマネジメントの実装を目的としたGearsOSがある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
169 これは,CbCによって実装されている.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
170 3つ目はスタンドアロンOSの開発を目的とした,CbC\_xv6と呼ばれるGearsOSがある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
171 これは,教育用に開発されたx.v6 OSをCbCで書き換える形で実装している.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
172 今回,ファイルシステムを実装する対象は3つ目のCbC\_xv6である.
9
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
173
0
k228587
parents:
diff changeset
174 ContextはGearsOS上全てのCodeGear,DataGearの参照を持ち,CodeGearとDataGearの接続に用いられる.
k228587
parents:
diff changeset
175 OS上の処理の実行単位で,従来のOSにおけるプロセスに相当する機能であるといえる.
k228587
parents:
diff changeset
176 また,CodeGearをDataGearの一種であると考えると,ContextはGearの概念ではMetaDataGearに当たる.
k228587
parents:
diff changeset
177 Contextはノーマルレベルから直接参照されず,必ずMetaDataGearとしてMetaCodeGearから参照される.
k228587
parents:
diff changeset
178 それは,ノーマルレベルのCodeGearがContextを直接参照してしまうと,
k228587
parents:
diff changeset
179 メタレベルを切り分けた意味がなくなってしまうためである.
k228587
parents:
diff changeset
180
k228587
parents:
diff changeset
181 図\ref{fig:context}はContextを参照する流れを表したものである.
k228587
parents:
diff changeset
182 まずCodeGearがOutputDataGearへデータをoutputする.
k228587
parents:
diff changeset
183 stubCodeGearはInputDataGear(前のCodeGearのOutputDataGear)とOutputDataGearをContextから参照し,次のCodeGearへgotoを行う.
k228587
parents:
diff changeset
184 CodeGearでの処理後,OutputDataGearへデータをoutputする.
k228587
parents:
diff changeset
185
k228587
parents:
diff changeset
186 Contextはいくつかの種類に分けることができる.
k228587
parents:
diff changeset
187 OS全体のContextを管理するKernel Contextやユーザープログラムごとに存在するUser Context,
k228587
parents:
diff changeset
188 CPUやGPUごとに存在するCPU Contextがある.
k228587
parents:
diff changeset
189 \begin{figure}[ht]
k228587
parents:
diff changeset
190 \begin{center}
k228587
parents:
diff changeset
191 \includegraphics[width=80mm]{figs/context.pdf}
k228587
parents:
diff changeset
192 \end{center}
k228587
parents:
diff changeset
193 \caption{Contextを参照する流れ}
k228587
parents:
diff changeset
194 \label{fig:context}
k228587
parents:
diff changeset
195 \end{figure}
k228587
parents:
diff changeset
196
k228587
parents:
diff changeset
197 図\ref{fig:meta-cgdg}はCodeGearの遷移とMetaCodeGearの関係を表している.
k228587
parents:
diff changeset
198 OSのプログラムはユーザーが実際に行いたい処理を表現するノーマルレベルと,
k228587
parents:
diff changeset
199 カーネルが行う処理を表現するメタレベルが存在する.
k228587
parents:
diff changeset
200 ノーマルレベルで見るとCodeGearがDataGearを受け取り,
k228587
parents:
diff changeset
201 処理後にDataGearを次のCodeGearに渡すという動作をしているように見える.
k228587
parents:
diff changeset
202 しかしながら,実際にはデータの整合性の確認や資源管理などのメタレベルの処理が存在し,
k228587
parents:
diff changeset
203 それらの計算はMetaCodeGearで行われる.
k228587
parents:
diff changeset
204 その際,MetaCodeGearに渡されるDataGearのことは特にMetaDataGearと呼ばれる.
k228587
parents:
diff changeset
205 また,CodeGearの前に実行されるMetaCodeGearは特にstubCodeGearと呼ばれ,
k228587
parents:
diff changeset
206 メタレベルを含めるとstubCodeGearとCodeGearを交互に実行する形で遷移していく.
k228587
parents:
diff changeset
207 \begin{figure}[ht]
k228587
parents:
diff changeset
208 \begin{center}
k228587
parents:
diff changeset
209 \includegraphics[width=80mm]{figs/meta-cg-dg.pdf}
k228587
parents:
diff changeset
210 \end{center}
k228587
parents:
diff changeset
211 \caption{CodeGearとMetaCodeGearの関係}
k228587
parents:
diff changeset
212 \label{fig:meta-cgdg}
k228587
parents:
diff changeset
213 \end{figure}
k228587
parents:
diff changeset
214
1
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
215 \section{RedBlackTreeよるファイルシステムの構成}
0
k228587
parents:
diff changeset
216
1
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
217 ファイルシステムは全てRedBlackTreeで構成する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
218 それにより,プログラムの証明がより簡単になるからである.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
219 また,ファイルシステムとDBはデータを保管するという本質的な役割は同じである.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
220 よって,それらをまとめてRedBlackTreeで構成する.
0
k228587
parents:
diff changeset
221
1
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
222 ファイルシステムとDBの違いとして,スキーマが挙げられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
223 DBは事前にスキーマを定義し,それに沿ってデータを挿入したり参照したりする.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
224 対して,ファイルシステムにはスキーマに当たるものがなく,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
225 データはファイルパスによって管理される.
2
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
226 スキーマを定義することによってデータは構造化され,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
227 構造化されたデータは非構造化データと比較して,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
228 インデックスを作成することが容易であり,データの検索性が向上する利点がある.
1
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
229 しかしながら,スキーマはDBの運用中に変更されることがあり,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
230 スキーマを変更した以前へロールバックができない問題がある.
0
k228587
parents:
diff changeset
231
1
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
232 ロールバックがスキーマの変更によって出来なくなることは信頼性に問題があると考えると,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
233 スキーマを定義する必要のないスキーマレスなDBが必要になる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
234 ファイルシステムはスキーマレスなDBといえるので,ファイルシステムを構築しつつ
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
235 DBがスキーマによって実現していた機能を付け加えることを試みる.
0
k228587
parents:
diff changeset
236
1
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
237 RedBlackTreeは実装によって,操作が破壊的なものとそうでないものがある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
238 今回用いるのは,非破壊的な実装のRedBlackTreeである.
3
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
239 図\ref{fig:TreeEdit}は非破壊的編集を行うRedBlackTreeを表している.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
240 編集前の木構造の6のノードをAにアップデートすることを考える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
241 まず,ルートノードからアップデートしたいノード6までをコピーする.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
242 その後,コピーしたもののノード6をAにアップデートする.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
243 これにより,アップデート前のノード6を破壊することなくAにアップデートが可能である.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
244 参照する時は,黒のルートノードから辿れば古い6が,赤のルートノードから辿れば新しいAが見える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
245 この仕組みは,データのバックアップやDBのロールバックに用いることが可能だと考える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
246
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
247 \begin{figure}[ht]
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
248 \begin{center}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
249 \includegraphics[width=80mm]{figs/nonDestroyTreeEdit.pdf}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
250 \end{center}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
251 \caption{非破壊的なTree編集}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
252 \label{fig:TreeEdit}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
253 \end{figure}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
254
0
k228587
parents:
diff changeset
255
1
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
256 \section{ディスク上とメモリ上のデータ構造}
0
k228587
parents:
diff changeset
257
1
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
258 ディスク上とメモリ上でデータの構造は,RedBlackTreeに統一する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
259 一般的に,ディスク上のデータ構造としてB-Treeが用いられることが多い.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
260 なぜならば,HDDを用いる場合はブロックへのアクセス回数を減らしデータアクセスの時間を短くするために,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
261 B-Treeのようなノードを複数持つことができる構造が効果的だからである.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
262 その点ではRedBlackTreeはB-Treeに劣る.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
263 しかしながら,SSDはランダムアクセスによってデータにアクセスするため,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
264 RedBlackTreeでなくB-Treeを用いる利点は少ないと考える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
265 よって,ディスク上とメモリ上のデータ構造をRedBlackTreeに統一することが考えられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
266 そうすることによって,ディスク上とメモリ上のデータのやりとりは単純なコピーで実装できる.
0
k228587
parents:
diff changeset
267
4
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
268 % メモリからディスクに書き戻すタイミングの話をしたい
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
269
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
270 \section{データのロールバックとバックアップ}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
271
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
272 DBの重要な機能の一つにロールバックがある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
273 RDBのロールバックは,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
274 コミットするまではトランザクションの開始時点に戻ることができる機能である.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
275 コミットが完了するとそれ以前の状態に戻すことはできないが,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
276 データのバックアップをとっておくことで復元を行う.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
277 このような,ロールバックとバックアップの仕組みをファイルシステムに実装したい.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
278
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
279 今回は,RedBlackTreeのルートノードがデータのバージョンの役割を果たしていることを利用し,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
280 データの復元が行える仕組みを構築することを考える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
281 非破壊的なTree編集はアップデートのたびに,ルートノードを増やす.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
282 つまり,ルートノードはアップデートのログと言えその時点のデータのバージョンを表していると考えることができる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
283 よって,ロールバックを行いたい場合は参照を過去のルートノードに切り替える.
2
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
284
4
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
285 ルートノードはデータのアップデート時に増えるため,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
286 データが際限なく増加していく問題がある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
287 この問題はCopyingGCを行うことによって解決する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
288 まず,RedBlackTreeを丸ごとコピーして最新のルートを残して他のルートは削除する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
289 その後,コピーしたものはバックアップとしてディスクに書き込む.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
290 そうすることで,データの増加によるリソースの枯渇を防ぎ,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
291 かつデータのバックアップを作成することで信頼性の向上が期待できる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
292
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
293
11
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
294 \section{RedBlackTreeのトランザクション}
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
295
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
296 トランザクションはDBの重要な機能の一つである.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
297 データの競合を防ぎ信頼性を向上させ,DBとしても扱えるよう
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
298 トランザクションの仕組みを考える必要がある.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
299 今回,ファイルシステムは全てRedBlackTreeで実装するため,
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
300 RedBlackTreeのノードに対するトランザクションを考える.
6
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
301
11
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
302 トランザクションをwriteとreadに分けて考える.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
303 writeする場合,トランザクションはRedBlackTreeのルートの置き換えと対応する.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
304 writeするために,まずルートを生やし書き込みが終わった後ルートを置き換える.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
305 そのため,書き込みの並列度はルートの数と一致する.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
306 しかしながら,ルートの置き換えは競合的なので,
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
307 複数書き込みを行っても1つしか成功しない.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
308 よって,単一のRedBlackTreeに複数の書き込みポイントを作り,
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
309 並行実行可能にする必要がある.
4
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
310
11
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
311 RedBlackTreeに複数の書き込みポイントを作るために,
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
312 キーごとのルートを作成する.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
313 ノードはそれぞれがキーとRedBlackTreeを持つ状態になる.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
314 writeする際は,そのキーのルートを置き換える.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
315 それによって,RedBlackTreeは複数の書き込みポイントを持つことができ,
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
316 writeを並行実行することが可能となる.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
317
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
318 readはデータに変更を加えないため,複数同時に同じノードを読み込むことが可能である.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
319 しかし,常に最新の情報を読み込めるとは限らない.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
320 最新の情報が欲しい場合は書き込みを一旦止めるような処理が必要になる.
0cf15f862f02 transaction
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
321
6
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
322
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
323 \section{スキーマレスな実装}
4
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
324
6
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
325 従来のSQLのようなスキーマの定義が存在すると,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
326 個別にバックアップなどを取らない限り
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
327 スキーマの変更以前にロールバックすることができない.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
328 しかしながら,実際運用する上でスキーマを変更することは多々ある.
7
07b274fbdfda update bib
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
329 これは,データの信頼性を低下させると考える.
6
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
330 また,DB上のデータ構造とプログラム上で扱うデータ構造に差が生まれる
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
331 インピーダンスミスマッチが発生し,DBのデータをプログラムが扱う際に
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
332 その差を埋めるような変換を必要とする場合が生まれる.
8
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
333 一方で,スキーマがあることによってデータに対して高度な操作を行なったり,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
334 インデックスを容易に作成することができたりするといったメリットがある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
335 よって,スキーマフルなDBとスキーマレスなDBはそれぞれメリットデメリットがあり,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
336 状況によって使い分けるのが良いと考えるが,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
337 非構造化データ内であれば構造化データを扱うことが可能であることと,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
338 信頼性を保証したいという点から今回は,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
339 スキーマレスなDBとしてのファイルシステムを実装することを考える.
6
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
340
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
341
7
07b274fbdfda update bib
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
342
3
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
343 \section{インデックス}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
344 \section{今後の課題}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
345 \section{まとめ}
2
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
346
0
k228587
parents:
diff changeset
347 \nocite{*}
k228587
parents:
diff changeset
348 \bibliographystyle{ipsjunsrt}
k228587
parents:
diff changeset
349 \bibliography{matac-bib}
k228587
parents:
diff changeset
350
k228587
parents:
diff changeset
351 \end{document}