Mercurial > hg > Papers > 2023 > matac-sigos
comparison Paper/paper.tex @ 1:c4f210d08680
update
author | matac42 <matac@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 14 Apr 2023 11:43:21 +0900 |
parents | 466b958a3419 |
children | 8b8d396619a9 |
comparison
equal
deleted
inserted
replaced
0:466b958a3419 | 1:c4f210d08680 |
---|---|
163 その際Output DataGear out\_nをadd2のInput DataGearとして渡す. | 163 その際Output DataGear out\_nをadd2のInput DataGearとして渡す. |
164 このようにCbCではCodeGearのOutput DataGearを次のCodeGearのInput DataGearとして渡すことを繰り返すことで処理を進める. | 164 このようにCbCではCodeGearのOutput DataGearを次のCodeGearのInput DataGearとして渡すことを繰り返すことで処理を進める. |
165 | 165 |
166 \lstinputlisting[caption=CbCのプログラム例,label=src:cbc]{src/hello.cbc} | 166 \lstinputlisting[caption=CbCのプログラム例,label=src:cbc]{src/hello.cbc} |
167 | 167 |
168 \section{GearsOS} | 168 \section{信頼性の保証を目的としたGearsOS} |
169 | 169 |
170 GearsOS\cite{gears,gearsos,cr}は当研究室で開発している,信頼性と拡張性の両立を目的としたOSである. | 170 GearsOS\cite{gears,gearsos,cr}は当研究室で開発している,信頼性と拡張性の両立を目的としたOSである. |
171 GearsOSにはGearという概念があり,実行の単位をCodeGear,データの単位をDataGearと呼ぶ. | 171 GearsOSにはGearという概念があり,実行の単位をCodeGear,データの単位をDataGearと呼ぶ. |
172 軽量継続を基本とし,stackを持たない代わりに全てをContext経由で実行する. | 172 軽量継続を基本とし,stackを持たない代わりに全てをContext経由で実行する. |
173 同様にGearの概念を持つContinuation based C(CbC)で記述されており,ノーマルレベルとメタレベルの処理を切り分けることが容易である. | 173 同様にGearの概念を持つContinuation based C(CbC)で記述されており,ノーマルレベルとメタレベルの処理を切り分けることが容易である. |
212 \end{center} | 212 \end{center} |
213 \caption{CodeGearとMetaCodeGearの関係} | 213 \caption{CodeGearとMetaCodeGearの関係} |
214 \label{fig:meta-cgdg} | 214 \label{fig:meta-cgdg} |
215 \end{figure} | 215 \end{figure} |
216 | 216 |
217 \section{Unixのファイルシステム} | 217 \section{RedBlackTreeよるファイルシステムの構成} |
218 | 218 |
219 UnixのファイルシステムはBTreeとinodeで構成されており,xv6もその仕組みを用いている. | 219 ファイルシステムは全てRedBlackTreeで構成する. |
220 xv6\cite{xv6}はMITで教育用の目的で開発されたOSで,Unixの基本的な構造を持つ. | 220 それにより,プログラムの証明がより簡単になるからである. |
221 当研究室ではxv6のCbCでの書き換え,分析を行なっている\cite{xv6component,xv6kernel}. | 221 また,ファイルシステムとDBはデータを保管するという本質的な役割は同じである. |
222 | 222 よって,それらをまとめてRedBlackTreeで構成する. |
223 inodeは主にUnix系のファイルシステムで用いられる,ファイルの属性情報が書かれたデータである. | 223 |
224 inodeにおけるファイルの属性情報は表\ref{table:inode}のようなものがある. | 224 ファイルシステムとDBの違いとして,スキーマが挙げられる. |
225 また,inodeは識別番号としてinode numberを持つ. | 225 DBは事前にスキーマを定義し,それに沿ってデータを挿入したり参照したりする. |
226 inode numberは一つのファイルシステム内で一意の番号であり,\emph{ls -i}コマンドで確認可能である. | 226 対して,ファイルシステムにはスキーマに当たるものがなく, |
227 inodeはファイルシステム始動時にinode領域をディスク上に確保する. | 227 データはファイルパスによって管理される. |
228 そのため,inode numberには上限があり,それに伴いファイルシステム上で扱えるファイル数の上限も決まる. | 228 スキーマを定義することによってデータを構造化されるため非構造化データと比較すると |
229 inode numberの最大値は\emph{df -i}コマンドで確認可能である. | 229 インデックスを作成することが容易でデータの検索性が向上する利点がある. |
230 | 230 しかしながら,スキーマはDBの運用中に変更されることがあり, |
231 \begin{table}[tb] | 231 スキーマを変更した以前へロールバックができない問題がある. |
232 \begin{center} | 232 |
233 \small | 233 ロールバックがスキーマの変更によって出来なくなることは信頼性に問題があると考えると, |
234 \begin{tabular}[htpb]{|c||l|} | 234 スキーマを定義する必要のないスキーマレスなDBが必要になる. |
235 \hline | 235 ファイルシステムはスキーマレスなDBといえるので,ファイルシステムを構築しつつ |
236 File Types & ファイルの種類 \\ | 236 DBがスキーマによって実現していた機能を付け加えることを試みる. |
237 \hline | 237 |
238 Permissions & read write executeの実行可否\\ | 238 RedBlackTreeは実装によって,操作が破壊的なものとそうでないものがある. |
239 \hline | 239 今回用いるのは,非破壊的な実装のRedBlackTreeである. |
240 UID & ファイル所有者のID \\ | 240 |
241 \hline | 241 |
242 GID & ファイル所有グループのID \\ | 242 \section{ディスク上とメモリ上のデータ構造} |
243 \hline | 243 |
244 File Size & ファイルのサイズ \\ | 244 ディスク上とメモリ上でデータの構造は,RedBlackTreeに統一する. |
245 \hline | 245 一般的に,ディスク上のデータ構造としてB-Treeが用いられることが多い. |
246 Time Stamps & ファイル作成,編集日時 \\ | 246 なぜならば,HDDを用いる場合はブロックへのアクセス回数を減らしデータアクセスの時間を短くするために, |
247 \hline | 247 B-Treeのようなノードを複数持つことができる構造が効果的だからである. |
248 Number of link & ハードリンクの数 \\ | 248 その点ではRedBlackTreeはB-Treeに劣る. |
249 \hline | 249 しかしながら,SSDはランダムアクセスによってデータにアクセスするため, |
250 Location on hard disk & データのアドレス\\ | 250 RedBlackTreeでなくB-Treeを用いる利点は少ないと考える. |
251 \hline | 251 よって,ディスク上とメモリ上のデータ構造をRedBlackTreeに統一することが考えられる. |
252 \end{tabular} | 252 そうすることによって,ディスク上とメモリ上のデータのやりとりは単純なコピーで実装できる. |
253 \caption{inodeでのファイル属性情報} | 253 |
254 \label{table:inode} | 254 \section{並行アップデート時の問題} |
255 \end{center} | |
256 \end{table} | |
257 | |
258 当研究室ではxv6のCbCでの実装を行なっているが,今回はxv6のFileルーチンをCbCで書き換えるのではなく | |
259 GearsOSへUnixのファイルシステムの仕組みを取り入れるアプローチをとる. | |
260 まず,ファイルシステムを大まかにディレクトリシステムとファイルの二つに分けて考える. | |
261 ディレクトリシステムはUnixのinodeの仕組みを取り入れる. | |
262 今回作成した,GearsOSのディレクトリシステムであるGearsDirectoryについて説明する. | |
263 ファイルについては後の章で述べる. | |
264 | |
265 FileSystemTreeはディレクトリ構造,inodeの仕組みを取り入れる際に用いるTreeである. | |
266 ソースコード\ref{src:ftree}はFileSystemTreeのinterfaceである. | |
267 GearsOSにおけるinterfaceはCodeGearと各CodeGearが用いるI/O DataGearの集合を記述する. | |
268 よって,FileSystemTreeのinterfaceはfTreeとnodeのDataGearとput,get,remove,nextのCodeGearを持つ. | |
269 FileSystemTreeのfTreeはGearsOSの永続データを構築する際に使用されるRedBlackTreeであり,put,get,removeはRedBlackTreeの操作を行うためのCodeGearである. | |
270 また,nextは遷移先のCodeGearを参照するために用いる. | |
271 \lstinputlisting[caption=FTreeのinterface,label=src:ftree]{src/FTree.h} | |
272 | |
273 ディレクトリ構造は2つのFileSystemTreeで実装する. | |
274 1つ目はinode numberとfileのポインタのペアを持つ木である. | |
275 それは,inode numberをkey,inodeをvalueとして持つためinode numberからinodeを検索するために用いる(以下,inode treeとする). | |
276 2つ目はfilenameとinode numberのペアを持つ木である. | |
277 それは,filenameをkey, inode numberをvalueとして持つため,filenameからinode numberを検索するために用いる. | |
278 また,inodeをfilenameで検索するためのindex treeであるといえる(以下,index treeとする). | |
279 | |
280 図\ref{fig:inode}はindex treeを用いたinodeの検索の流れを表す. | |
281 まずindex treeからkeyがfilenameのnodeをgetする. | |
282 keyがfilenameのnodeのvalueよりinode numberがわかる. | |
283 次に,取得したinode numberをkeyとしてinode treeを検索する. | |
284 keyがinode numberのnodeはvalueとしてinodeを持っていて,inodeを参照することができる. | |
285 | |
286 \begin{figure}[ht] | |
287 \begin{center} | |
288 \includegraphics[width=80mm]{figs/inode.pdf} | |
289 \end{center} | |
290 \caption{index treeを用いたinodeの検索の流れ} | |
291 \label{fig:inode} | |
292 \end{figure} | |
293 | |
294 GearsOSにおける永続データは非破壊的な編集を行う木構造を用いて保存する. | |
295 図\ref{fig:TreeEdit}は非破壊的編集を木構造に対し行う様子である. | |
296 赤で示されたノード6をAに編集する場合,まずルートノードから編集ノードまでのパスを全てコピーする. | |
297 コピーしたパス上に存在しないノードは,コピー元の木構造と共有する. | |
298 それにより,編集後の木構造の赤のルートノードから探索を行う場合は編集されたAのノードが見え, | |
299 黒のルートノードから探索を行う場合は編集前の6のノードを見ることができる. | |
300 ディレクトリシステムを非破壊的な木構造の編集を用いて実装することにより, | |
301 ディレクトリシステム自体にバックアップの機能を搭載することが可能であると考える. | |
302 | |
303 \begin{figure}[ht] | |
304 \begin{center} | |
305 \includegraphics[width=80mm]{figs/nonDestroyTreeEdit.pdf} | |
306 \end{center} | |
307 \caption{非破壊的なTree編集} | |
308 \label{fig:TreeEdit} | |
309 \end{figure} | |
310 | |
311 \section{GearsFileSystemにおけるインターフェース} | |
312 | |
313 ファイルやディレクトリの操作を行うインターフェースをUnix Likeに実装を行った. | |
314 実装を行ったmkdir, ls, cdを説明する. | |
315 | |
316 \subsection{mkdir} | |
317 Unixにおいてmkdirは新しくディレクトリを作成するコマンドである. | |
318 GearsDirectoryのmkdirはindex treeとinode treeにnodeをputすることでディレクトリを作成する. | |
319 ソースコード\ref{src:mkdir}はGearsDirectoryにおけるmkdirのCodeGearであり,図\ref{fig:mkdir}はその処理を図で表したものである. | |
320 まず1行目の\emph{\_\_code mkdir}ではinode treeへinodeのputが行われ,\emph{\_\_code mkdir2}へ遷移する. | |
321 inodeは4,5行目でkeyにinode number, valueにディレクトリのポインタがセットされる. | |
322 次に,11行目の\emph{\_\_code mkdir2}ではindex treeへkeyがfilename,valueがinode numberのnodeのputが行われ,nextのCodeGearへ遷移する. | |
323 このように,FileSystemTreeのputを2回行うため,mkdirは\emph{\_\_code mkdir}と\emph{\_\_code mkdir2}の2つのCodeGearで構成されている. | |
324 また,InputDataGearの\emph{name}はfilenameを表す. | |
325 \lstinputlisting[caption=mkdirのCodeGear,label=src:mkdir]{src/mkdir.cbc} | |
326 \begin{figure}[ht] | |
327 \begin{center} | |
328 \includegraphics[width=80mm]{figs/mkdir.pdf} | |
329 \end{center} | |
330 \caption{mkdirの操作の流れ} | |
331 \label{fig:mkdir} | |
332 \end{figure} | |
333 | |
334 \subsection{ls} | |
335 Unixにおいてlsはファイルやディレクトリの一覧,メタ情報を表示するコマンドである. | |
336 GearsDirectoryのlsはindex treeに対し,getをすることでディレクトリのnameを取得する. | |
337 これは,Unixのlsコマンドにおける\emph{\$ls filename}に等しい機能である. | |
338 ソースコード\ref{src:ls}はGearsDirectoryにおけるlsのCodeGearであり,図\ref{fig:ls}はその処理を図で表したものである. | |
339 まず1行目の\emph{\_\_code ls}ではindex treeに対しgetを行うため, | |
340 3行目でgetしたいfilenameをkeyにセットし,index treeのgetへgotoしている. | |
341 その後,9行目の\emph{\_\_code ls2}ではnode\verb|->|keyに格納されたgetの結果をprintfで出力する. | |
342 本来lsコマンドは引数を渡さずに実行するとカレントディレクトリ下のディレクトリやファイルを一覧で表示するが, | |
343 現時点では未実装である. | |
344 なお,一覧表示の機能はfilenameのリストをディレクトリに持たせることで実装可能であると思われる. | |
345 \lstinputlisting[caption=lsのCodeGear,label=src:ls]{src/ls.cbc} | |
346 \begin{figure}[ht] | |
347 \begin{center} | |
348 \includegraphics[width=80mm]{figs/ls.pdf} | |
349 \end{center} | |
350 \caption{lsの操作の流れ} | |
351 \label{fig:ls} | |
352 \end{figure} | |
353 | |
354 \subsection{cd} | |
355 Unixにおいてcdはディレクトリを移動するコマンドである. | |
356 GearsDirectoryのcdはindex treeとinode treeに対しgetを行い,currentDirectoryを書き換えることで実装する. | |
357 機能としてはディレクトリが持つ子ディレクトリへの移動ができる. | |
358 ソースコード\ref{src:cd}はGearsDirectoryにおけるcdのCodeGearであり,図\ref{fig:cd}はその処理を図で表したものである. | |
359 まず1行目の\emph{\_\_code cd2Child}でindex treeに対しgetを行うため,index treeのgetへgotoしている. | |
360 次に,9行目の\emph{\_\_code cd2Child2}でinode treeに対しgetを行うため,inode treeのgetへgotoしている. | |
361 この際,getは1行目のcd2Childでgetしたnodeのvalueをもとに行う.valueにはinode numberがセットされている. | |
362 その後,15行目の\emph{\_\_code cd2Child3}でcurrent ディレクトリを保存しているgearsDirectory\verb|->|currentDirectoryを | |
363 getしたnode\verb|->|valueに書き換える. | |
364 \lstinputlisting[caption=cdのCodeGear,label=src:cd]{src/cd.cbc} | |
365 \begin{figure}[ht] | |
366 \begin{center} | |
367 \includegraphics[width=80mm]{figs/cd.pdf} | |
368 \end{center} | |
369 \caption{cdの操作の流れ} | |
370 \label{fig:cd} | |
371 \end{figure} | |
372 | |
373 \section{GearsFileSystemにおけるファイルの構成} | |
374 | |
375 ファイルシステムはディレクトリの構成だけでなく,ファイルの構成についても考える必要がある. | |
376 本研究と並行する形で一木貴裕による分散ファイルシステムの設計が行われており\cite{cfile}, | |
377 ファイルの構成に関しても実装,検討されている. | |
378 GearsOSにおけるファイル構成を説明する. | |
379 | |
380 ファイルのInput/Output Streamは競合的なアクセスに対応するため,3つのSynchronizedQueueを用いる. | |
381 それぞれをInputQueue, OutputQueue, mainQueueと呼ぶ. | |
382 データをinputしたい場合InputQueueへputを行い,取得したい場合OutputQueueからgetを行う. | |
383 mainQueueはデータそのものであり,InputQueueからmainQueue,mainQueueからOutputQueueへデータが流れるように接続される. | |
384 これらは,Gearの概念ではDataGearにあたり,DataGearManagerにkeyとI/O Queueが対応する形で保持される. | |
385 ファイルの中身のデータをレコードに分割し,レコードをQueueにputしてstreamに入れる. | |
386 データを取り出す際はQueueからgetし,順番に読むことでファイルを構築する. | |
387 | |
388 分散ファイルシステムはファイルのデータ送受信をする際に用いられるAPIを作成する必要がある. | |
389 WordCount例題\cite{file}を通して,GearsFileのAPIの作成を行う. | |
390 WordCount例題は指定したファイルの文字数や行数,ファイルの内の文字列を出力する. | |
391 図\ref{fig:WCStates}はWordCount例題の処理の流れを示している. | |
392 これは大きく分けて,指定したファイルをFile構造体としてopenするFileOpenスレッド, | |
393 File構造体を受け取り文字数と行数をcountUpするWordCountスレッドの二つのCodeGearで記述することができる. | |
394 また,ファイル内の文字列を行ごとにCountUpに送信し,EOFを受け取ったらループを抜けfinishに移行する. | |
395 \begin{figure}[ht] | |
396 \begin{center} | |
397 \includegraphics[width=80mm]{figs/wordCountStates.pdf} | |
398 \end{center} | |
399 \caption{WordCount with CbC} | |
400 \label{fig:WCStates} | |
401 \end{figure} | |
402 | |
403 \section{GearsOSのメモリマネージメントシステムの考察} | |
404 | |
405 GearsOSのメモリマネージメントは,メモリ上のデータとディスク上のデータの構造が等しくなる形で実装をしたい. | |
406 メモリ上とディスク上でデータの構造を等しくすることで,単純なコピーでメモリとディスク間のデータのやり取りを行うことができる.よって,比較的簡素に実装を行うことができると予想する. | |
407 しかしながら,メモリ上とディスク上でオフセットの差が出る問題がある. | |
408 これは,メタ計算でオフセットの差を吸収する処理を行うことで解決させる. | |
409 また,メモリ上とディスク上のデータのアドレスが異なるため,ユーザーレベルからポインタを用いた場合,問題になる. | |
410 しかしながら,GearsOSではユーザーレベルでポインタを用いることを禁止しているため,問題ないと考える. | |
411 | |
412 ガベージコレクションについては,Copying GCを用いる. | |
413 Copying GCは単純に用いるとメモリ容量が倍必要になるという問題がある. | |
414 そこで,リンクしているデータのみをコピーすることによってメモリ使用量を削減したい. | |
415 データがリンクされているかどうかはLinkedListを参照し判断する. | |
416 | |
417 | |
418 \section{今後の課題} | |
419 | |
420 \subsection{GearsShell} | |
421 GearsOSに存在する未実装の機能の一つにshellが挙げられる. | |
422 現状のGearsOSはユーザーの入力を受け付けることが出来ず,プログラミングインターフェースの様に機能している. | |
423 GearsFileSystemなどGearsOSの各機能と接続し,今回作成したcdやlsの様なコマンドを受け付けるGearsShellを作成したい. | |
424 | |
425 \subsection{GearsDirectory filename} | |
426 現状はGearsDirectoryのfilenameはIntegerの構造で管理されている. | |
427 しかしながら,filenameは一般的に文字列型であるためIntegerから文字列型に変更する必要がある. | |
428 | |
429 \subsection{GearsDirectory path} | |
430 GearsDirectoryにはpathの機能が実装されていない. | |
431 よってfull path指定のlsなどが実装できない状態である. | |
432 FileSystemTreeを拡張し,ノードをたどりpathを生成する様な機能を実装する必要がある. | |
433 | |
434 \subsection{ファイルのバックアップ} | |
435 ディレクトリに関しては非破壊的なTree編集を用いることで,バックアップを行うことを考えたが | |
436 ファイルに関してはレコードのDataをファイルの差分履歴として保持し, | |
437 日時情報を付け加えることでVersion Control Systemのような機能を持たせることが可能であると考えられる. | |
438 | |
439 \subsection{GearsDirectory on disk} | |
440 現状はGearsDirectoryのinodeはon memoryで実装されている. | |
441 データの保存はdisk上に行うため,inodeをdisk上に構築し必要がある | |
442 | |
443 \section{まとめ} | |
444 | |
445 本研究では主としてGearsFileSystemの構築に必要なGearsDirectoryの実装について説明した. | |
446 いくつか課題はあるが,RedBlackTreeのシンプルなインターフェースにより比較的容易に実装を行うことができた. | |
447 また,RedBlackTreeを用いてinodeの仕組みを構築し,ls,cd,mkdirを作成するなどして, | |
448 Unix Likeに構築することが出来た. | |
449 メモリマネージメントについては,今後の研究で実装と考察を行い, | |
450 Gears OSのメモリマネージメントシステムを構築していく. | |
451 | |
452 信頼性については,定理証明やモデル検査を用いて保証を行うが, | |
453 非破壊的なTree編集によるディレクトリのバックアップやファイルのバックアップをファイルシステムに組み込むことでも | |
454 信頼性の向上が期待できる.形式手法とファイルシステムの機能の両面で信頼性の向上が図れると考える. | |
455 | 255 |
456 \nocite{*} | 256 \nocite{*} |
457 \bibliographystyle{ipsjunsrt} | 257 \bibliographystyle{ipsjunsrt} |
458 \bibliography{matac-bib} | 258 \bibliography{matac-bib} |
459 | 259 |