annotate Paper/master_paper.tex @ 47:49c1503c9176

...
author matac42 <matac@cr.ie.u-ryukyu.ac.jp>
date Mon, 29 Jan 2024 18:45:13 +0900
parents 9baf70df56fa
children 9f0ef2d6ce2f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \documentclass[12pt,a4paper,platex]{jreport}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 \usepackage{master_paper}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 \usepackage{ascmac}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 \usepackage[dvipdfmx]{graphicx}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 \usepackage{here}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 \usepackage{listings}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 \usepackage{comment}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 \usepackage{url}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 \usepackage[deluxe, multi]{otf}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 %\input{dummy.tex} %% font
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
14
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
16 \jtitle{GearsOSのファイルシステムにおけるGCとレプリケーション}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
17 \etitle{GC and Replication in the File System of GearsOS}
2
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 \year{2024年 3月}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 \eyear{March 2024}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 \author{又吉 雄斗}
6
8e0c6a7e9b7f use latexmk
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
21 \eauthor{Matayoshi Yuto}
8e0c6a7e9b7f use latexmk
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
22 \chife{指導教員:教授 和田 知久}
8e0c6a7e9b7f use latexmk
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
23 \echife{Supervisor: Prof. Wada Tomohisa}
2
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 \marklefthead{% 左上に挿入
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 \begin{minipage}[b]{.4\textwidth}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 琉球大学大学院学位論文(修士)
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 \end{minipage}}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 % \markleftfoot{% 左下に挿入
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 % \begin{minipage}{.8\textwidth}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 % Gears OS の Paging
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 % \end{minipage}}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 \newcommand\figref[1]{図 \ref{fig:#1}}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 \newcommand\coderef[1]{ソースコード \ref{code:#1}}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 \lstset{
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 frame=single,
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 keepspaces=true,
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 stringstyle={\ttfamily},
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 commentstyle={\ttfamily},
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 identifierstyle={\ttfamily},
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 keywordstyle={\ttfamily},
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 basicstyle={\ttfamily},
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 breaklines=true,
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 xleftmargin=0zw,
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 xrightmargin=0zw,
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 framerule=.2pt,
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 columns=[l]{fullflexible},
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 numbers=left,
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 stepnumber=1,
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 numberstyle={\scriptsize},
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 numbersep=1em,
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 language={},
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 tabsize=4,
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 lineskip=-0.5zw,
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 escapechar={@},
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 }
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 \def\lstlistingname{ソースコード}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 \def\lstlistlistingname{ソースコード目次}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 %%% 索引のために以下の2行を追加
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 \usepackage{makeidx,multicol}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 \makeindex
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 \begin{document}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 %rome
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 \maketitle
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 \pagenumbering{roman}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 \setcounter{page}{0}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 \newpage
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 \makecommission
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 %\input{chapter/signature.tex}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 \newpage
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 %要旨
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 \input{chapter/abstract.tex}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 \mainmatter
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 %目次
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 \tableofcontents
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 %図目次
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 \listoffigures
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 %リスト目次
24
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
89 \lstlistoflistings
2
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 %chapters
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
92
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
93 \chapter{GearsOSにおけるファイルシステムとDB}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
94
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
95 情報システムの信頼性を確保することは重要な課題である.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
96 2023年には銀行システムや航空機の旅客システム,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
97 電子決済システムなどで障害が発生した\cite{zengin,ana,glory}.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
98 信頼性の高いシステムを構築することは,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
99 これらのような社会的影響のあるシステムの重大な障害発生防止につながり,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
100 サービス提供者や受容者の機会的,経済的損失を防ぐことにつながる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
101 情報システムはアプリケーション,OS,DB,メモリやSSDなどのハードウェア,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
102 分散ノードやネットワークなどさまざまな要素で構成される.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
103 それらのうちどれか1つでも信頼性を損なうと,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
104 システム全体の信頼性の低下につながる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
105 情報システム全体の信頼性を確保するためには,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
106 これらの要素それぞれにおいて,信頼性を保証する必要がある.
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
107
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
108 当研究室では,信頼性の保証を目的としたGearsOSを開発している.
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
109 GearsOSは,定理証明やモデル検査などの形式手法を用いて信頼性を保証できることを目標としている.\cite{modelcheck}.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
110 一般的に信頼性を保証する手法としてテストコードを用いることが挙げられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
111 しかしながら,OSなどの大規模なソフトウェアにおいて人力で記述するテストコードのみでは
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
112 カバレッジが不十分であり,検証漏れが発生する可能性がある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
113 GearsOSではテストコードに加え,形式手法を用いることでより高い信頼性の保証を目指している.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
114 GearsOSは当研究室で開発しているプログラム言語であるContinuation based C(CbC)で記述されており,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
115 ノーマルレベルとメタレベルを容易に切り分けることを可能とする拡張性を有す.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
116 CbCによって本来行いたい処理をノーマルレベルで記述し,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
117 信頼性を保証するための処理をメタレベルで記述するといった書き分け,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
118 拡張を比較的容易に可能とする.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
119
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
120 OSの重要な機能の1つとしてファイルシステムが挙げられる.
36
5294b155ad72 fix: chapter1 last
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
121 ファイルシステムはOSのプロセスやユーザーデータの管理に必要な機能である.
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
122 ファイルシステムには可変長の文字列を格納するファイルと,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
123 そのファイルにアクセスするための名前管理の機能がある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
124 ファイルの名前の一貫性は名前管理によって保証される.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
125 しかし,ファイルに同時に書き込まれた際の一貫性を保証する機能を
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
126 ファイルシステムとしては持っておらず,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
127 ファイルの書き込みを制御するロック機構をアプリケーションが持つことによって,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
128 ファイルの一貫性を保証している.ファイルシステムによく似たものとしてDBが挙げられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
129 DBは入力の属性名と型の組み合わせを複数持つレコードと,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
130 特定の属性をキーとしたテーブルがある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
131 また,レコードのinsert,delete,updateの直列化可能性を保証する機能を持つ.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
132 ファイルシステムとDBは格納するものの形式やそれにアクセスする方法,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
133 直列化可能性を保証する手法が異なるが,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
134 データをある形式で保持する仕組みであるという本質的な部分において違いはない.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
135 よって,ファイルシステムとDBを同一のシステムとして実装することが可能であると考える.
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
136
36
5294b155ad72 fix: chapter1 last
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
137 ファイルシステムはOSにおいて重要な機能であるためGearsOSにおいても実装をする必要があると考えられ,
5294b155ad72 fix: chapter1 last
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
138 当研究室では分散ファイルシステムやi-nodeを用いたファイルシステムの設計がされてきた\cite{cfile, directory}.
5294b155ad72 fix: chapter1 last
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
139 しかしながら,データの多重度や一貫性を確保するための機能がないため実装したい.
5294b155ad72 fix: chapter1 last
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
140 本研究では,データのレプリケーションやガベージコレクションの仕組みに必要である,
5294b155ad72 fix: chapter1 last
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
141 RedBlackTreeのCopyの仕組みを設計,構築を行った.
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
142
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
143
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
144
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
145
10
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
146 \chapter{軽量継続を基本とする言語CbC}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
147
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
148 Continuation based C(CbC)\cite{cbcllvm,cbc}はC言語の下位言語であり,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
149 関数呼び出しを行わない軽量な継続を基本とするプログラミング言語である.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
150 CbCは処理の単位のCodeGear,データの単位のDataGearといったGearの概念をもつ.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
151 CodeGearはC言語などにおける関数と違い,gotoによるjmp命令が用いられ,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
152 プログラムの継続においてコールスタックを持たない.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
153 これを通常の関数による継続と区別して,軽量継続と呼ぶ.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
154 軽量継続によってリフレクションのような処理の挿入や切り分けを容易にしている.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
155
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
156 \section{Gearの概念}
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
157
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
158 CbCには処理の単位のCodeGearとデータの単位であるDataGearという概念が存在する.
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
159 CodeGearは\emph{\_\_code}という記述で宣言することができる.
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
160 CbCはC言語の下位言語であるため,通常の関数も使用することは可能だが,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
161 基本的にCodeGearの単位でプログラミングを行う.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
162 DataGearはCodeGearで入出力される変数データである.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
163 図\ref{fig:dgcg}はCodeGearとDataGearの入出力の関係を表している.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
164 CodeGearはDataGearを複数入力として受け取ることができ,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
165 別のDataGearに複数書き込み出力することができる.
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
166 特に,入力のDataGearをInput DataGear,出力のDataGearをOutput DataGearと呼ぶ.
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
167 gotoで次のCodeGearに遷移する際,Output DataGearを次のCodeGearのInput DataGearとして渡すことができる.
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
168
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
169 \begin{figure}[ht]
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
170 \begin{center}
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
171 \includegraphics[width=100mm]{fig/cgdg.pdf}
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
172 \end{center}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
173 \caption{CodeGearと入出力の関係図}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
174 \label{fig:dgcg}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
175 \end{figure}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
176
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
177 \section{gotoによる軽量継続}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
178
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
179 CodeGearから次のCodeGearに遷移していく一連の動作を継続と呼ぶ.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
180 通常の関数の場合,関数から次の関数へ遷移する時にfunction callが行われる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
181 function callは前の関数へ戻る場合があり,そのためにcall stackを保存する.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
182 他方,CbCの継続はfunction callをせずにgotoによるjmpで行われる.
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
183 jmpはfunction callと異なり,call stackによる変数などの環境を保存しない.
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
184 よって,CbCのgotoによる継続はfunction callによる継続と比較して軽量であるといえる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
185 そのことから,CbCにおける継続をfunction callによる継続と区別して,軽量継続と呼ぶ.
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
186 軽量継続の利点としてリフレクションのような処理をより柔軟に行える点が挙げられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
187 リフレクションはプログラム自身のメタデータを分析し,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
188 それによってプログラムを実行時に書き換える一種のメタプログラミング手法である.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
189 一般的にクラスやメソッド,関数の単位で書き換えが行われる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
190 手法の例としてJavaにおけるAspectJライブラリを用いたプログラミングが挙げられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
191 軽量継続の場合,CodeGear遷移のどの地点においてもメタな処理を挿入することが可能であるため,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
192 より柔軟なリフレクションが可能と考える。
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
193
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
194
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
195 \section{CodeGearの記述例}
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
196
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
197 CbCのプログラム例をソースコード\ref{src:cbc}に示す.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
198 まずmain関数においてadd1 CodeGearへgotoを行う.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
199 その際add1へInput DataGearとしてnを渡す.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
200 Cのgotoが\emph{goto label;}という記法で,ラベリングした箇所へjmpを行うのに対し,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
201 CbCのgotoは\emph{goto add1(n);}という記法で,add1 CodeGearへn DataGearを渡してjmpを行う.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
202 add1は処理の最後にadd2 CodeGearへgotoを行う.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
203 その際Output DataGear out\_nをadd2のInput DataGearとして渡す.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
204 このようにCbCではCodeGearのOutput DataGearを次のCodeGearのInput DataGearとして渡すことを繰り返すことで処理を進める.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
205
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
206 \lstinputlisting[caption=CbCのプログラム例,label=src:cbc]{src/hello.cbc}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
207
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
208 \chapter{信頼性の保証を目的としたGearsOS}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
209
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
210 GearsOS\cite{gears,gearsos,cr}は当研究室で開発している,信頼性と拡張性の両立を目的としたOSである.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
211 GearsOSにはGearという概念があり,実行の単位をCodeGear,データの単位をDataGearと呼ぶ.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
212 軽量継続を基本とし,stackを持たない代わりに全てをContext経由で実行する.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
213 同様にGearの概念を持つContinuation based C(CbC)で記述されており,ノーマルレベルとメタレベルの処理を切り分けることが容易である.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
214 また,GearsOSは現在開発途上であり,OSとして動作するために今後実装しなければならない機能がいくつか残っている.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
215
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
216 \section{3種類のGearsOS}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
217
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
218 GearsOSには現在3つの種類がある.
18
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
219 1つ目が形式手法による信頼性の向上を目的とした,GearsAgdaと呼ばれるGearsOSである\cite{gearsagda}.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
220 これは,Agdaによって実装されており,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
221 森 逸汰によるGearsAgdaによるRed Black Treeの検証などの取り組みがされている\cite{garbtree}.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
222 2つ目はスタンドアロンOSの開発を目的とした,CbC\_xv6と呼ばれるGearsOSがある\cite{cbcxv6}.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
223 これは,教育用に開発されたx.v6\cite{xv6}をCbCで書き換える形で実装している.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
224 CbC\_xv6では仲吉 菜々子によるGears OSのCodeGear Managementの取り組みがされている\cite{gearscodemngment}.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
225 3つ目はユーザーレベルタスクマネジメントの実装を目的としたGearsOSがある.
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
226 これは,CbCによって実装されており,
18
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
227 分散ファイルシステムの設計やRedBlackTreeでのディレクトリシステムの構築などの取り組みがされている\cite{cfile, directory}.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
228
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
229 本研究では,CbCによって実装されたユーザーレベルタスクマネジメント実装のGearsOSを対象に
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
230 ファイルシステムのレプリケーションやGC機能の実装を考える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
231 以下,GearsOSはユーザーレベルタスクマネジメント実装のGearsOSを指す.
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
232
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
233 \section{メタ処理を記述するmetaGear}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
234
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
235 図\ref{fig:meta-cgdg}はCodeGearの遷移とMetaCodeGearの関係を表している.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
236 OSのプログラムはユーザーが実際に行いたい処理を表現するノーマルレベルと,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
237 カーネルが行う処理を表現するメタレベルが存在する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
238 ノーマルレベルで見るとCodeGearがDataGearを受け取り,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
239 処理後にDataGearを次のCodeGearに渡すという動作をしているように見える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
240 しかしながら,実際にはデータの整合性の確認や資源管理などのメタレベルの処理が存在し,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
241 それらの計算はMetaCodeGearで行われる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
242 その際,MetaCodeGearに渡されるDataGearのことは特にMetaDataGearと呼ばれる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
243 また,CodeGearの前に実行されるMetaCodeGearは特にstubCodeGearと呼ばれ,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
244 メタレベルを含めるとstubCodeGearとCodeGearを交互に実行する形で遷移していく.
18
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
245
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
246 \begin{figure}[ht]
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
247 \begin{center}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
248 \includegraphics[width=160mm]{fig/meta-cg-dg.pdf}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
249 \end{center}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
250 \caption{CodeGearとMetaCodeGearの関係}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
251 \label{fig:meta-cgdg}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
252 \end{figure}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
253
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
254 \section{全てのGearを参照するContext}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
255
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
256 ContextはGearsOS上全てのCodeGear,DataGearの参照を持ち,CodeGearとDataGearの接続に用いられる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
257 OS上の処理の実行単位で,従来のOSにおけるプロセスに相当する機能であるといえる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
258 また,CodeGearをDataGearの一種であると考えると,ContextはGearの概念ではMetaDataGearに当たる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
259 Contextはノーマルレベルから直接参照されず,必ずMetaDataGearとしてMetaCodeGearから参照される.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
260 それは,ノーマルレベルのCodeGearがContextを直接参照してしまうと,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
261 メタレベルを切り分けた意味がなくなってしまうためである.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
262
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
263 図\ref{fig:context}はContextを参照する流れを表したものである.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
264 まずCodeGearがOutputDataGearへデータをoutputする.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
265 stubCodeGearはInputDataGear(前のCodeGearのOutputDataGear)とOutputDataGearをContextから参照し,次のCodeGearへgotoを行う.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
266 CodeGearでの処理後,OutputDataGearへデータをoutputする.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
267
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
268 Contextはいくつかの種類に分けることができる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
269 OS全体のContextを管理するKernel Contextやユーザープログラムごとに存在するUser Context,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
270 CPUやGPUごとに存在するCPU Contextがある.
18
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
271
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
272 \begin{figure}[ht]
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
273 \begin{center}
12
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
274 \includegraphics[width=150mm]{fig/context.pdf}
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
275 \end{center}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
276 \caption{Contextを参照する流れ}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
277 \label{fig:context}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
278 \end{figure}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
279
26
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
280 \section{モジュール化の仕組みInterface}
23
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
281
26
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
282 Gears OSにはモジュール化の仕組みであるInterfaceという概念が存在する.
23
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
283 モジュール化とはJavaのクラスのように複数のメソッドや属性を1つの機能として
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
284 まとめて記述することである.
26
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
285 GearsOSではInterfaceによって,DataGearやCodeGearを複数まとめてモジュール化する.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
286 Interfaceは仕様と実装を分けて記述する.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
287 例としてQueue Interfaceの仕様記述部分をソースコード\ref{src:Queue.h}に示す.
23
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
288
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
289 \lstinputlisting[label=src:Queue.h, caption=Queueのインターフェース]{src/Queue.h}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
290
26
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
291 Interfaceの仕様はC言語の構造体定義の形で記述する.
23
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
292 2,3行目はDataGearを記述しており,DataGearは\texttt{union Data*}型で表現する.
26
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
293 ここにはInterfaceにおいて,CodeGearが使用するDataGearを列挙する.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
294 5行目から10行目まではCodeGearの引数型を記述しており,\texttt{\_\_code}型で表現する.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
295 ここに列挙したCodeGearはInterfaceのAPIとして機能する.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
296 InterfaceのAPIの呼び出し例をソースコード\ref{exinterface}に示す.
23
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
297
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
298 \begin{lstlisting}[label=exinterface,frame=lrbt,caption={Interfaceの呼び出し}]
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
299 __code odgCommitCPUWorker3(struct CPUWorker* worker, struct Context* task) {
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
300 int i = worker->loopCounter;
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
301 struct Queue* queue = GET_WAIT_LIST(task->data[task->odg+i]);
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
302 goto queue->take(odgCommitCPUWorker4);
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
303 }
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
304 \end{lstlisting}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
305
26
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
306 4行目でgotoによってqueue Interfaceのtake CodeGearに継続するよう記述している.
23
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
307 takeのinputDataGearにはodgCommitCPUWorker4 CodeGearを指定している.
37
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
308 ソースコード\ref{src:Queue.h}の仕様記述ではtakeにはqueue,nextがinputDataGearの型として指定されている.
23
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
309 しかし,実際に呼び出す際にはnextに当たるodgCommitCPUWorker4のみを渡している.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
310 仕様記述の際に全てのCodeGearの第1引数(inputDataGear)に渡している\texttt{Impl* queue}は,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
311 仕様から実装のCodeGearにgotoするために必要な記述である.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
312 軽量継続において,CodeGearを跨いで状態を保持することはできない.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
313 よって仕様から実装に遷移するためには,実装のCodeGearをinput DataGearとして渡す必要がある.
37
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
314 このImplの第1引数はstubCodeGearで自動挿入されるため,
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
315 実際にAPIを使用する際は渡す必要がない.
23
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
316 inputDataGearのnextはCodeGearの処理が終わった際に次にgotoするCodeGearを指定する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
317 よって,take CodeGearの処理が全て終了すると,次にodgCommitCPUWorker4へgotoする.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
318 nextは\texttt{next(...)}と引数に\texttt{...}が渡される.
24
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
319 これは仕様を記述する時点では不定である次に遷移するCodeGearのinputDataGearを表現している.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
320 GearsOSでgotoする際は実際にはContextから必要な値を取り出す.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
321 よって,\texttt{...}は必要な値をContextから取り出すことを意味している.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
322
26
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
323 次にInterfaceの実装について説明する.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
324 Queue Interfaceの実装の1つであるSingleLinkedQueueをソースコード\ref{src:SingleLinkedQueue.cbc}に示す.
24
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
325
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
326 \lstinputlisting[label=src:SingleLinkedQueue.cbc, caption=Queueのインターフェース]{src/SingleLinkedQueue.cbc}
23
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
327
26
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
328 3行目の\texttt{\#impl as}はInterfaceの実装を記述する際に指定する.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
329 implの直後に実装したいInterfaceの仕様を指定し,
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
330 asの後ろには実装の型名を記述する.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
331 であるから,\texttt{\#impl "Queue.h" as "SingleLinkedQueue.h"}は仕様Queueの実装を
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
332 SingleLinkedQueueとして定義することになる.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
333 7行目の\texttt{createSingleLinkedQueue}はSingleLinkedQueueのコンストラクタを定義しており,
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
334 DataGearのアロケートやCodeGearを保持するメソッドの初期化を行っている.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
335 8,9行目ではnewでアロケートを行っている.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
336 アロケートのようなメタレベルの処理はノーマルレベルには記述されない.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
337 そのためこのnewはC言語のnewとは違うGearsOS独自の記述であり,
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
338 実際にはメタレベルにアロケートを行う処理を挿入している.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
339 10〜16行目ではSingleLinkedQueueで使用するCodeGearとDataGearを
28
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
340 queueのメソッドとして初期化している.
26
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
341 CodeGearはQueueの仕様で記述したCodeGearと一致している.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
342 \texttt{C\_}で始まる記述にはenum CodeにおけるCodeGearの整数を格納している.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
343 CodeGearはenum Codeで整数と対応付けられており,
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
344 この整数を元にCodeGearが参照される.
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
345 20行目以降では\texttt{putSingleLinkedQueue}や\texttt{takeSingleLinkedQueue}
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
346 のように,仕様で記述されたCodeGearを実装している.
37
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
347 15,16行目では実装の型定義で定義されたその実装独自のDataGearを初期化している.
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
348 実装の型定義はソースコード\ref{src:SingleLinkedQueue.h}の通りである.
26
905910e9fb04 interface
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
349
37
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
350 \lstinputlisting[label=src:SingleLinkedQueue.h, caption=SingleLinkedQueueの型定義]{src/SingleLinkedQueue.h}
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
351
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
352 3行目にあるように,実装の型定義ではimplキーワードで実装した型名を指定する.
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
353 4,5行目でSingleLinkedQueueが独自にもつtop,lastのDataGearを記述している.
23
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
354
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
355 \section{GearsOSのRedBlackTree}
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
356
28
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
357 Red-black tree(赤黒木)は二分探索木の一種で,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
358 ノードに赤か黒の色を付けて色に関するいくつかの条件をもつデータ構造である.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
359 木に対する探索,挿入,削除操作における最悪計算量がO(log n)であるため,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
360 赤黒木は大規模なデータを扱う際に効率的なデータ構造となる.
27
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
361
28
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
362 GearsOSのRedBlackTreeはGearsFileSystemで用いられる重要な構造の1つであり,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
363 ディレクトリ構造を表現するために使用されている.
38
9e5d521df475 rbtree def fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
364 GearsOSにおけるTreeの仕様記述をソースコード\ref{src:Tree.h}に示す.
28
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
365
27
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
366 \lstinputlisting[label=src:Tree.h, caption=Treeの仕様]{src/Tree.h}
37
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
367
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
368 ソースコード\ref{src:Tree.h}より,Treeはtree DataGearと
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
369 put,get,remove,nextの4つのCodeGearをAPIとして持っていることがわかる.
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
370 他にも探索や木のローテートを行うCodeGearが実装されているが,
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
371 RedBlackTreeのAPIとして提供しているのはput,get,removeの3つであり,
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
372 RedBlackTree Interfaceの使用者は木に対してこの3つの操作ができる.
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
373 それぞれノードの挿入,取得,削除を行うCodeGearである.
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
374 取得は,指定したnodeと一致するノードを木から探し,
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
375 存在すればそのまま返す.
38
9e5d521df475 rbtree def fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
376 次に,RedBlackTreeの実装の記述の一部をソースコード\ref{src:RedBlackTreeImpl.cbc}に示す.
9e5d521df475 rbtree def fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
377
28
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
378 \lstinputlisting[label=src:RedBlackTreeImpl.cbc, caption=RedBlackTreeの実装]{src/RedBlackTreeImpl.cbc}
27
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
379
28
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
380 ソースコード\ref{src:RedBlackTreeImpl.cbc}の4行目から,
40
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
381 RedBlackTreeはTreeの実装であることがわかり,
28
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
382 13〜16行目で仕様に対応するCodeGearを初期化している.
40
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
383 19,20行目ではRedBlackTreeが実装で持つ変数を初期化している.
38
9e5d521df475 rbtree def fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
384 次に,RedBlackTreeの実装の型定義をソースコード\ref{src:RedBlackTree.h}に示す.
9e5d521df475 rbtree def fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
385
9e5d521df475 rbtree def fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
386 \lstinputlisting[label=src:RedBlackTree.h, caption=RedBlackTreeの実装の型定義]{src/RedBlackTree.h}
9e5d521df475 rbtree def fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
387
9e5d521df475 rbtree def fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
388 \begin{figure}[ht]
9e5d521df475 rbtree def fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
389 \begin{center}
47
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
390 \includegraphics[width=100mm]{fig/rbtree_def.pdf}
38
9e5d521df475 rbtree def fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
391 \end{center}
39
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
392 \caption{RedBlackTreeのノードの種類}
38
9e5d521df475 rbtree def fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
393 \label{fig:rbtree-def}
9e5d521df475 rbtree def fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
394 \end{figure}
37
727091139c84 impl def
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
395
39
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
396 2〜7行目はRedBlackTreeが持つノードを表しており,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
397 それぞれのノードの役割は図\ref{fig:rbtree-def}のように示される.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
398 rootはRedBlackTreeの全てのノードを参照できる親ツリーのルートノードを指す.
46
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
399 読み込み中のノードはcurrentで指されており,追加するノードをnewNodeで表している.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
400 previousは木を操作する以前の木を保持するノードであり,
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
401 これにより非破壊的な操作を可能とする.
39
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
402 また,RedBlackTreeは挿入,更新,削除の際に木の回転操作を行う.
46
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
403 その際,起点のノード(current)に対して親のノードをparent,祖父母のノードをgrandparentで指す.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
404 8行目のnodeStackは木の操作時,木を辿るために使用するスタックである.
39
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
405 9行目のfindNodeNextはfindNode CodeGearを実行後,次に実行するCodeGearを保持する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
406 10行目のresultはノードを探索する際のノードの比較結果を保持する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
407
44
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
408 ソースコード\ref{src:RedBlackTree.h}にある通り,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
409 RedBlackTreeはNode構造体を複数持つ.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
410 ソースコード\ref{src:Node.h}にNodeの型定義を示す.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
411
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
412 \lstinputlisting[label=src:Node.h, caption=Nodeの型定義]{src/Node.h}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
413
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
414 1,2行目よりノードのキーがint型であり,valueとしてDataGearのポインタを持つことがわかる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
415 また,3〜7行目よりleft,rightで子のNodeのポインタを持つことによって木構造を構築し,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
416 enum ColorでRedBlackTreeとして必要なノードの色を表現していることがわかる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
417
46
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
418 \section{ALLOCATE}
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
419
47
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
420 \lstinputlisting[label=src:allocate.h, caption=ALLOCATEの定義]{src/allocate.h}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
421
29
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
422 \chapter{GearsFileSystem}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
423
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
424 ファイルシステムはOSにおいてユーザーやアプリケーションが使用するファイルや
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
425 プロセスの管理に用いられる重要なシステムである.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
426 そのため,GearsOSにおいてもi-nodeを用いたディレクトリシステムや,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
427 DataGearManagerによる分散ファイルシステムの仕組みをもつ,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
428 GearsFileSystemの取り組みがいくつかされてきた.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
429
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
430 \section{i-nodeを用いたディレクトリシステム}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
431
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
432 GearsFileSystemにはi-nodeを用いたディレクトリの仕組みが存在する\cite{directory}.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
433 i-nodeは主にUnix系のファイルシステムで用いられる,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
434 ファイルの属性情報が書かれたデータである.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
435 inodeにおけるファイルの属性情報は表\ref{table:inode}のようなものがある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
436 またinodeは識別番号としてinode numberを持つ.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
437 inode numberは一つのファイルシステム内で一意の番号であり,\emph{ls -i}コマンドで確認可能である.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
438 inodeはファイルシステム始動時にinode領域をディスク上に確保する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
439 そのためinode numberには上限があり,それに伴いファイルシステム上で扱えるファイル数の上限も決まる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
440 inode numberの最大値は\emph{df -i}コマンドで確認可能である.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
441
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
442 \begin{table}[htpb]
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
443 \begin{center}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
444 \small
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
445 \begin{tabular}[htpb]{|c||c|}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
446 \hline
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
447 File Types & directoryやregular fileなど,ファイルの種類 \\
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
448 \hline
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
449 Permissions & read write executeの実行可否\\
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
450 \hline
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
451 UID & ファイル所有者のID \\
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
452 \hline
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
453 GID & ファイル所有グループのID \\
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
454 \hline
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
455 File Size & ファイルのサイズ \\
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
456 \hline
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
457 Time Stamps & ファイル作成,編集日時 \\
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
458 \hline
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
459 Number of link & ハードリンクの数 \\
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
460 \hline
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
461 Location on hard disk & データのアドレス\\
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
462 \hline
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
463 \end{tabular}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
464 \caption{inodeでのファイル属性情報}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
465 \label{table:inode}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
466 \end{center}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
467 \end{table}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
468
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
469 GearsFileSystemではi-nodeをi-node numberがkey,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
470 i-nodeでのファイル属性情報をvalueであるノードを持つinode treeをRedBlackTreeで表現している.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
471 また,ファイル名からi-node numberを検索するためのindex treeも同じRedBlackTreeで表現している.
31
a1abb0cd88cb dir fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
472 データ構造にRedBlackTreeのみを用いているのは,
29
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
473 ls,cd,mkdirといった,ディレクトリ操作を行うためのUnix Likeなユーザーインターフェースをもつ.
31
a1abb0cd88cb dir fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
474 図\ref{fig:GearsDir}にGears Directoryの処理の例を示す.
a1abb0cd88cb dir fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
475
a1abb0cd88cb dir fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
476 \begin{figure}[ht]
a1abb0cd88cb dir fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
477 \begin{center}
a1abb0cd88cb dir fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
478 \includegraphics[width=160mm]{fig/gears_dir.png}
a1abb0cd88cb dir fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
479 \end{center}
a1abb0cd88cb dir fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
480 \caption{i-nodeを用いたディレクトリシステムの処理の流れ}
a1abb0cd88cb dir fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
481 \label{fig:GearsDir}
a1abb0cd88cb dir fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
482 \end{figure}
29
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
483
32
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
484 lsコマンドはディレクトリ内のファイルやファイル自体の情報を出力するコマンドである.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
485 \texttt{ls hoge.txt}を実行すると\textcircled{\scriptsize 1}index treeを参照し,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
486 ファイル名hoge.txtからi-node numberの2を取得する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
487 次に,\textcircled{\scriptsize 2}i-node treeを参照し,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
488 i-node numberを元にファイルの属性を取得し,lsコマンドの場合はそれを出力する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
489
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
490 \section{非破壊RedBlackTreeによる構成}
15
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
491
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
492 ディスク上とメモリ上でデータの構造は,RedBlackTreeに統一する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
493 一般的に,ディスク上のデータ構造としてB-Treeが用いられることが多い.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
494 なぜならば,HDDを用いる場合はブロックへのアクセス回数を減らしデータアクセスの時間を短くするために,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
495 B-Treeのようなノードを複数持つことができる構造が効果的だからである.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
496 その点ではRedBlackTreeはB-Treeに劣る.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
497 しかしながら,SSDはランダムアクセスによってデータにアクセスするため,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
498 RedBlackTreeでなくB-Treeを用いる利点は少ないと考える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
499 よって,ディスク上とメモリ上のデータ構造をRedBlackTreeに統一することが考えられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
500 そうすることによって,ディスク上とメモリ上のデータのやりとりは単純なコピーで実装できる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
501
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
502 \section{RedBlackTreeのトランザクション}
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
503
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
504 トランザクションはDBの重要な機能の一つである.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
505 データの競合を防ぎ信頼性を向上させ,DBとしても扱えるよう
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
506 トランザクションの仕組みを考える必要がある.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
507 今回,ファイルシステムは全てRedBlackTreeで実装するため,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
508 RedBlackTreeのノードに対するトランザクションを考える.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
509
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
510 トランザクションをwriteとreadに分けて考える.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
511 writeする場合,トランザクションはRedBlackTreeのルートの置き換えと対応する.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
512 writeするために,まずルートを生やし書き込みが終わった後ルートを置き換える.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
513 そのため,書き込みの並列度はルートの数と一致する.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
514 しかしながら,ルートの置き換えは競合的なので,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
515 複数プロセスから同時に書き込みを行っても1つしか成功しない.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
516 よって,単一のRedBlackTreeに複数の書き込みポイントを作り,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
517 並行実行可能にする必要がある.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
518
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
519 % TODO: writeトランザクションの図を入れたい
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
520
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
521 RedBlackTreeに複数の書き込みポイントを作るために,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
522 キーごとのルートを作成する.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
523 ノードはそれぞれがキーとRedBlackTreeを持つ状態になる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
524 writeする際は,そのキーのルートを置き換える.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
525 それによって,RedBlackTreeは複数の書き込みポイントを持つことができ,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
526 writeを並行実行することが可能となる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
527
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
528 図\ref{fig:Transaction}にトランザクショナルなwrite操作を表す.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
529 Aの木はファイルシステム全体を表すRedBlackTreeである.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
530 ノードNのデータに対して書き込みすることを考えると,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
531 キーがaであるBの木のルートからロックしCの木を作成して,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
532 Bの木からCの木のルートに入れ替えることで書き込みを行う.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
533 この書き込みを行っている際,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
534 Aの木のノードはロックしないのでAの木のどのノードに対しても並行して書き込み可能となる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
535
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
536 \begin{figure}[ht]
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
537 \begin{center}
47
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
538 \includegraphics[width=150mm]{fig/transaction.png}
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
539 \end{center}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
540 \caption{トランザクショナルなwrite操作}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
541 \label{fig:Transaction}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
542 \end{figure}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
543
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
544 % TODO: read時常に最新の情報が取れないことを説明する図を入れたい
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
545
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
546 readはデータに変更を加えないため,複数同時に同じノードを読み込むことが可能である.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
547 しかし,常に最新の情報を読み込めるとは限らない.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
548 最新の情報が欲しい場合は書き込みを一旦止めるような処理が必要になる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
549
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
550 \section{ディスク上とメモリ上のデータ構造}
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
551
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
552
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
553 ファイルシステムは全てRedBlackTreeで構成する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
554 それにより,プログラムの証明がより簡単になるからである.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
555 また,ファイルシステムとDBはデータを保管するという本質的な役割は同じである.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
556 よって,それらはまとめてRedBlackTreeで構成する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
557
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
558 ファイルシステムとDBの違いとして,スキーマが挙げられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
559 DBは事前にスキーマを定義し,それに沿ってデータを挿入,参照する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
560 対して,ファイルシステムにはスキーマに当たるものがなく,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
561 データはファイルパスによって管理される.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
562 スキーマを定義することによってデータは構造化され,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
563 構造化されたデータは非構造化データと比較して,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
564 インデックスを作成することが容易であり,データの検索性が向上する利点がある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
565 しかしながら,スキーマはDBの運用中に変更されることがあり,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
566 スキーマを変更した以前へロールバックができない問題がある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
567
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
568 ロールバックがスキーマの変更によって出来なくなることは信頼性に問題があると考えると,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
569 スキーマを定義する必要のないスキーマレスなDBが必要になる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
570 ファイルシステムはスキーマレスなDBといえるので,ファイルシステムを構築しつつ
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
571 DBがスキーマによって実現していた機能を付け加えることを試みる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
572
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
573 RedBlackTreeは実装によって,操作が破壊的なものとそうでないものがある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
574 今回用いるのは,非破壊的な実装のRedBlackTreeである.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
575 図\ref{fig:TreeEdit}は非破壊的編集を行うRedBlackTreeを表している.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
576 編集前の木構造の6のノードをAにアップデートすることを考える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
577 まず,ルートノードからアップデートしたいノード6までをコピーする.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
578 その後,コピーしたもののノード6をAにアップデートする.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
579 これにより,アップデート前のノード6を破壊することなくAにアップデートが可能である.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
580 参照する時は,黒のルートノードから辿れば古い6が,赤のルートノードから辿れば新しいAが見える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
581 この仕組みは,データのバックアップやDBのロールバックに用いることが可能だと考える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
582
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
583 \begin{figure}[ht]
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
584 \begin{center}
47
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
585 \includegraphics[width=150mm]{fig/nonDestroyTreeEdit.pdf}
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
586 \end{center}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
587 \caption{非破壊的なTree編集}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
588 \label{fig:TreeEdit}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
589 \end{figure}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
590
41
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
591 \section{DataGearManagerによる分散ファイルシステム}
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
592
14
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
593 \chapter{GearsFileSystemにおけるGCとレプリケーション}
21
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
594
44
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
595 本章ではRedBlackTreeのCopyによるGCとレプリケーションの基本設計を述べる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
596 GC,レプリケーション,バックアップをRedBlackTreeのコピーを基礎とする,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
597 統一的な仕組みにより実装することが考えられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
598
14
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
599 \section{ファイルシステムの信頼性に関する機能}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
600
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
601 ファイルシステムはデータを保持することを基本的な機能としている.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
602 信頼性に関する機能など,その他の機能は追加機能として実装する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
603 ファイルシステムやDBにおける信頼性に関する追加機能として,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
604 システムの電源断時にデータが残るpersistency,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
605 データを書き込めたかどうかを判定するatomic write,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
606 1つのノードが失われた際にデータを保護する多重性,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
607 複数のコピーを調停するコミット機構などが挙げられる.
15
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
608
14
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
609 現状のGearsOSには分散ファイルシステムの通信機能やUnix Likeな
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
610 インターフェースを持つi-nodeファイルシステムの基本機能は存在するものの,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
611 多重性やメモリ管理などの信頼性を確保するための機能が存在しない.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
612 データの多重度を確保するための一般的な手法として,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
613 データのバックアップやシステム自体のレプリケーションをすることが挙げられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
614 メモリ管理の機能としてはガーベージコレクションが挙げられる.
15
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
615 ガベージコレクションは通常プログラム言語のレイヤで行われる.
42
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
616 これらの機能をファイルシステムのレベルで実装することで,
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
617 より信頼性の高いファイルシステムを構築したい.
14
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
618
16
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
619 \section{メモリの管理手法}
14
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
620
15
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
621 GCのアルゴリズムは大きく分けてMark \& Sweep GC,Reference counting GC,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
622 Copying GCの3つの種類が存在する.
20
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
623 Mark \& Sweep GCはマークフェーズとスイープフェーズからなる。
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
624 マークフェーズはヒープ上でルートから参照することができるオブジェクト全てにマークをし,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
625 その後、スイープフェーズでマークされていないオブジェクトを
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
626 使用されていないオブジェクトのリストであるフリーリストに接続することでGCを行う.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
627 Reference counting GCはオブジェクトの被参照数を表すReference counterを用いるGCである.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
628 新たに参照される度にReference counterをインクリメントし,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
629 参照が外れる度にデクリメントする.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
630 そのようにして,カウンターが0になった時点でフリーリストに接続することでGCを行う.
15
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
631 CopyingGCはメモリ上のヒープ領域をFrom領域とTo領域に分割し,
20
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
632 ルートから参照できるオブジェクトをFrom領域からTo領域にコピーする.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
633 From領域を参照していたポインタはTo領域のオブジェクトを参照するように置き換える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
634 その後,From領域とTo領域を入れ替えることでGCを行う.
15
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
635
20
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
636 一般的にこれらのGC手法は複数を組み合わせて用いられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
637 世代別GCではオブジェクトの生存期間によって適用するGCアルゴリズムを使い分ける.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
638 アロケートされてすぐのオブジェクトを新世代オブジェクト,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
639 任意の回数のGCを生き残ったオブジェクトを旧世代オブジェクトとし,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
640 それぞれの特性に合ったGCアルゴリズムを適用する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
641 すぐに回収されることが多い新世代オブジェクトはCopying GCで網羅的にGCをし,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
642 長く生き残る旧世代オブジェクトはMark \& Sweep GCで適宜回収するなどが例として挙げられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
643 このように複数のGCアルゴリズムを組み合わせることで,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
644 それぞれのアルゴリズムの利点を享受できる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
645
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
646 また,メモリ管理手法としてRust言語の所有権がある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
647 所有権ではメモリを所有する変数がスコープを抜ける時に,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
648 同時にメモリも解放する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
649 そのためRustではGCの仕組みを必要とせず,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
650 より高速にメモリの管理を行うことができる.
15
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
651
16
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
652 \section{GearsFileSystemのGC}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
653
20
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
654 GearsFileSystemのGCはCopying GCを基本的なアルゴリズムとする.
21
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
655 他のGC手法と比較して参照できるオブジェクトをコピーするだけであるため,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
656 実装が簡単で,より高いスループットが期待できる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
657 Mark \& Sweep GCやReference counting GCの場合は,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
658 GCを複数フェーズで実装したり,カウンターの扱いについて考える必要がある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
659 また,同様の構造をコピーするのみで実装することによって,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
660 データの透過性の確保がしやすい.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
661 ファイルやディレクトリを表現するRedBlackTreeは全てのデータの参照を持つ.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
662 そのため,オブジェクトルートからオブジェクトを辿ってコピーを行うCopying GCとの相性が良い.
15
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
663
21
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
664 一般的なCopying GCではFrom領域上のオブジェクトをTo領域にコピーする形で実装される.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
665 一方,GearsFileSystemではファイルやディレクトリの基本構造であるRedBlackTreeをコピーする.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
666 ファイルやディレクトリの操作を行うFromのRedBlackTreeから,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
667 ルートから辿れるノードのみをToのRedBlackTreeとしてコピーする.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
668 それにより,辿れなかったノード,つまり参照されていないノードはコピーされず,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
669 不要なオブジェクトが回収された状態となる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
670
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
671 \begin{figure}[ht]
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
672 \begin{center}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
673 \includegraphics[width=160mm]{fig/rbtree_gc.png}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
674 \end{center}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
675 \caption{RedBlackTReeのCopyによるGC}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
676 \label{fig:TreeCopyGC}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
677 \end{figure}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
678
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
679 DBの重要な機能の一つにロールバックがある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
680 RDBのロールバックは,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
681 コミットするまではトランザクションの開始時点に戻ることができる機能を持つ.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
682 コミットが完了するとそれ以前の状態に戻すことはできないが,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
683 データのバックアップをとっておくことで復元を行う.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
684
43
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
685 RedBlackTreeのルートノードがデータのバージョンの役割を果たしていることを利用し,
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
686 データの復元が行える仕組みを考える.
21
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
687 非破壊的なTree編集はアップデートのたびに,ルートノードを増やす.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
688 つまり,ルートノードはアップデートのログと言えその時点のデータのバージョンを表していると考えることができる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
689 よって,ロールバックを行いたい場合は参照を過去のルートノードに切り替える.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
690
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
691 ルートノードはデータのアップデート時に増えるため,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
692 データが際限なく増加していく問題がある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
693 この問題はCopyingGCを行うことによって解決する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
694 まず,RedBlackTreeを丸ごとコピーして最新のルートを残して他のルートは削除する.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
695 その後,コピーしたものはバックアップないしログとしてディスクに書き込む.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
696 そうすることで,データの増加によるリソースの枯渇を防ぎ,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
697 かつデータのログ付きバックアップを作成することで信頼性の向上が期待できる.
14
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
698
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
699
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
700 \section{GearsFileSystemのレプリケーション}
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
701
42
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
702 DBの多重性を確保する機能としてレプリケーションがある.
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
703 レプリケーションはデータや状態が等しいレプリカを別のノードに生成する機能である.
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
704 レプリケーション機能があることによって,地理的に距離のあるノードにレプリカを設置することが可能になり,
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
705 災害などによって発生するシステム障害を防止することや,
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
706 アクセス分散によるネットワーク負荷の低減につながる.
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
707 そのため,GearsFileSystemにおいてもレプリケーションの機能を実装したい.
43
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
708
42
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
709 GearsFileSystemではディレクトリをRedBlackTreeによって構成しており,
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
710 RedBlackTreeから全てのデータにアクセス可能である.
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
711 よって,RedBlackTreeのコピーを行うことによって,
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
712 FileSystemのレプリカを作成することが可能であると考えられる.
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
713 GearsFileSystemのレプリケーションの基本設計を図\ref{fig:RBTreeReplica}に示す.
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
714
22
a3cc406f4706 rbtree replica fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
715 \begin{figure}[ht]
a3cc406f4706 rbtree replica fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
716 \begin{center}
a3cc406f4706 rbtree replica fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
717 \includegraphics[width=160mm]{fig/rbtree_replica.png}
a3cc406f4706 rbtree replica fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
718 \end{center}
42
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
719 \caption{GearsFileSystemのレプリケーションの基本設計}
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
720 \label{fig:RBTreeReplica}
22
a3cc406f4706 rbtree replica fig
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
721 \end{figure}
21
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
722
42
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
723 基本的には図\ref{fig:TreeCopyGC}に示されているGCの仕組みと同様で,
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
724 RedBlackTreeのCopyで構成される.
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
725 レプリケーションにおいてコピー元をメイン,コピーをレプリカと呼ぶ場合,
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
726 Node1がメインでNode2がレプリカとなる.
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
727 Node1はGCの仕組みと同様であり,違いはNode2にもコピーを行う部分である.
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
728 このように,GCとレプリケーションを同様の仕組みで実装することが考えられる.
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
729 しかし,Node2にコピーを行う際はNode1とNode2間で操作やデータを送信するための
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
730 通信の仕組みが必要である.
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
731 レプリケーションを実装する際は通信の仕組みについて考える必要がある.
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
732
43
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
733 既存のDBにおけるレプリケーション手法は同期のタイミングやレプリカの作成単位によっていくつか種類がある.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
734
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
735 \section{コピー実行のタイミング}
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
736
47
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
737 TODO: ここはContextレベルに書き直す
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
738
43
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
739 GCやレプリケーション,バックアップはそれを実行するタイミングが重要である.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
740 GCはメモリの使用状況に応じて実行される.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
741 例えば,RedBlackTreeに新規ノードを追加する際にメモリが不足した場合などが
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
742 GCを実行するタイミングとして挙げられる.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
743 レプリケーションは同期のタイミングがあり,同期型,非同期型,準同期型が挙げられる.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
744 また,バックアップは1日に1回,週に1回など定期的な実行をする.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
745 そのため,RedBlackTreeのコピーにコピー実行のタイミングを制御する機構が必要である.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
746 GearsOSは拡張性の高いCbCによって記述され,本来実行したい処理に追加の処理を挿入することが比較的容易に可能である.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
747 図\ref{fig:GCTiming}にGC実行処理の挿入の仕組みの例を示す.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
748
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
749 \begin{figure}[ht]
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
750 \begin{center}
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
751 \includegraphics[width=160mm]{fig/timing.png}
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
752 \end{center}
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
753 \caption{GC実行処理の挿入}
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
754 \label{fig:GCTiming}
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
755 \end{figure}
42
a6031e4cd85a replication
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
756
43
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
757 矢印は軽量継続であり,
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
758 \textcircled{\scriptsize 1}ではメモリアロケーションを必要とする本来行いたい処理を表している.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
759 \textcircled{\scriptsize 2}はメモリ使用率をチェックするCodeGearを挿入し,
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
760 使用率が80\%以上の場合にGCを実行する.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
761 メモリ使用率をチェックするCodeGearは条件によって実行するCodeGearを切り替えるものであり,
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
762 既存のGearsOSのコードにもこのような処理を行うものは存在し,
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
763 例としてSingleLinkedStackのコードの一部をソースコード\ref{src:isEmpty.cbc}に示す.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
764
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
765 \lstinputlisting[label=src:isEmpty.cbc, caption=実行するCodeGearの切り替えのコード]{src/isEmpty.cbc}
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
766
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
767 CodeGearは遷移先のCodeGearの参照を持つ必要があるため,
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
768 inputDataGearとしてnextとwhenEmptyを渡している.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
769 条件分岐は通常のif文で行われ,条件ごとに次のCodeGearを指定している.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
770
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
771 このようにして,条件分岐をして実行するCodeGearを切り替えることができる.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
772 しかし,GCは本来行いたい処理ではなくメタレベルの処理である.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
773 そのため,GCへの切り替えにおいてソースコード\ref{src:isEmpty.cbc}のようなコードを記述すると,
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
774 ノーマルレベルとメタレベルが混在するCodeGearとなってしまう問題がある.
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
775
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
776
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
777
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
778 \chapter{CopyRedBlackTreeの実装}
14
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
779
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
780 データのバックアップやレプリケーション,GCの機能を実装するためには,
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
781 データのコピーをする必要がある.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
782 GearsOSのファイルシステムにおいて,データは全てRedBlackTreeに格納される.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
783 しかしながら,現状のRedBlackTreeには木をコピーする機能が無い.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
784 よって,RedBlackTreeに木のコピー機能を実装する必要がある.
46
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
785 CopyRedBlackTreeの実装について述べる.
14
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
786
46
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
787 \section{Tree InterfaceのCopy API}
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
788
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
789 CopyRedBlackはTree InterfaceのAPIの1つとして実装した.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
790 ソースコード\ref{src:TreeCopy.h}にCopy APIを追加したTree Interfaceの仕様定義を示す.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
791
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
792 \lstinputlisting[label=src:TreeCopy.h, caption=Tree Interfaceの使用定義(Copy追加後)]{src/TreeCopy.h}
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
793
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
794 10行目にcopy()が追加されており,inputDataGearは\emph{\_\_code} nextのみとしている.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
795 これにより,
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
796 \texttt{goto tree->copy(next);}といった記述でRedBlackTreeのコピーを行うことができる.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
797 次にRedBlackTreeの実装の型定義をソースコード\ref{src:CopyRedBlackTree.h}に示す.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
798 9,12行目にある通り,コピー時に使用するtoStackを1つと
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
799 木のコピーが完了しているかどうかを示すcopiedフラグを追加している.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
800 今回の実装ではStackを2つ使用する.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
801 追加したtoStackの他に,元からRedBlackTreeの操作に使用しているnodeStackを用いる.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
802 これらのStackはdataとしてNode構造体のポインタを持つ.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
803
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
804 \lstinputlisting[label=src:CopyRedBlackTree.h, caption=RedBlackTreeの実装の型定義(Copy追加後)]{src/CopyRedBlackTree.h}
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
805
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
806 % \lstinputlisting[label=src:CopyRedBlackTree.cbc, caption=CopyRedBlackTreeの実装]{src/CopyRedBlackTree.cbc}
19
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
807
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
808 \section{コピーのアルゴリズム}
19
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
809
46
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
810 コピーは2つのStackを使用し,left方向から深さ優先でRedBlackTreeのノードをリーフ方向に降りながら行う.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
811 図\ref{fig:TreeAndStack}にコピー時のある地点でのコピー元の木と2つのStackの状態を例示する.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
812 leftDownを2回行い,\texttt{tree->current}がkeyが1のノードを指している.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
813 この時,木を辿るためのnodeStackは\texttt{tree->current}以前に辿った3と2のノードが積まれている.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
814 toStackにはコピー元の木のノードとkey,value,colorの値が同じでアドレスが異なるノードが積まれている.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
815 ノードは辿った際にコピーを行いtoStackへと積むため,すでに辿った3,2,1のノードが積まれている.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
816 葉ノードまでたどり着いた時やleft,rightがすでに辿ったノードだった場合はupでroot方向に戻る.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
817 その際は,\texttt{tree->current}を親ノードに付け替え,nodeStackとtoStackを1回popする.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
818 toStackは新規にアロケートした子ノードと親ノードを接続したり,
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
819 すでにノードをアロケートしているかどうかを判断するなど,
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
820 コピー先の木を操作したり状態を確認したりするために必要である.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
821 例えば,upする場合はコピー元のrightノードの存在を確認し,
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
822 toStackのtopをみてすでにrightノードを新規にアロケートしているかを見ることで,
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
823 さらにupするかどうかを判断するなどがある.
19
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
824
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
825 \begin{figure}[ht]
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
826 \begin{center}
46
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
827 \includegraphics[width=150mm]{fig/copy_algo4.png}
19
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
828 \end{center}
46
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
829 \caption{コピー元のTreeと2つのStackの状態の例}
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
830 \label{fig:TreeAndStack}
19
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
831 \end{figure}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
832
46
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
833 図\ref{fig:CopyCGTransition}にCopy時のCodeGearの大まかな遷移を示す.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
834 四角ノードがCodeGear,丸ノードが遷移条件を表す.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
835 それらを囲む四角はCodeGearの遷移をLeftDown,RightDown,Upの3つのフェーズに区切ったもので,
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
836 図を簡略化するためのものである.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
837 フェーズの四角に矢印が向くと,フェーズが持つStart(オレンジで示される箇所)から遷移が始まる.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
838 青のStart,EndはCopyの始めと終わりである.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
839 実際にはleftDownなどはleftDown1,leftDown2のような複数のCodeGearで構成され,
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
840 それぞれでStackの操作やアロケート,ノードの存在確認を行う.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
841 Upはすでに木全体を辿ったかどうかを判定し,
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
842 辿っていた場合はswap CodeGearへ遷移を行う.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
843 swapはコピー元の木とコピー先の木を入れ替える.
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
844 これはCopying GCにおけるFrom領域とTo領域を入れ替える操作を想定している.
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
845
46
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
846 \begin{figure}[ht]
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
847 \begin{center}
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
848 \includegraphics[width=160mm]{fig/copy_algo3.png}
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
849 \end{center}
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
850 \caption{Copy時のCodeGearの大まかな遷移}
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
851 \label{fig:CopyCGTransition}
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
852 \end{figure}
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
853
46
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
854 \section{コピーの実装の詳細}
9baf70df56fa copy algo
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
855
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
856
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
857
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
858 \chapter{まとめと今後の課題}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
859
44
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
860 本研究ではGearsOSのファイルシステムであるGearsFileSystemにおける
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
861 GCとレプリケーションについての考察,CopyRedBlackTreeの実装と考察を行った.
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
862
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
863 また,今後の課題や議題として次のようなものが挙げられる.
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
864
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
865 \section{ファイルシステムにおけるスキーマ}
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
866
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
867 従来のRDBのようなスキーマが存在すると,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
868 個別にバックアップなどを取らない限り
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
869 スキーマの変更以前にロールバックすることができない.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
870 しかしながら,実際運用する上でスキーマを変更することは多々ある.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
871 これは,データの信頼性を低下させると考える.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
872 また,DB上のデータ構造とプログラム上で扱うデータ構造に差が生まれる
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
873 インピーダンスミスマッチが発生し,DBのデータをプログラムが扱う際に
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
874 その差を埋めるような変換を必要とする場合が生まれる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
875 一方で,スキーマがあることによってデータに対して高度な操作を行うことができ,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
876 また,インデックスを容易に作成することができるといったメリットがある.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
877 よって,スキーマフルなDBとスキーマレスなDBはそれぞれメリットデメリットがあり,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
878 状況によって使い分けるのが良いと考える.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
879
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
880 今回は,非構造化データ内であれば構造化データを扱うことが可能であることと,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
881 信頼性を保証したいという点から,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
882 スキーマレスなDBとしてのファイルシステムを考える.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
883 しかしながら,トランザクションの仕組みを作る上でRedBlackTreeに対し,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
884 キーを設定することから完全なスキーマレスとは言えない構成となる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
885
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
886 GearsOSのデータは全てDataGearで表される.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
887 よって,GearsOSにおけるファイルシステムはDataGearの集合となる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
888 スキーマレスとはキーがない状態のことといえるが,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
889 DataGearはキーが設定されていないため,その集合自体にスキーマは無い.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
890 そのことから,GearsOSにおけるスキーマとはDataGear上のキーの構成であることがわかる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
891 なお,今回のRedBlackTreeによる構成の場合,キーはRedBlackTreeを指す.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
892 DataGearはKernelのContextからプロセスのContextを経由して全て繋がっている.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
893 よって,KernelのContext上にキーを用いたDataGearの参照を書き込む.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
894
11
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
895 \section{RedBlackTreeによる権限の表現}
9
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
896
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
897 ファイルの権限はファイルシステムの重要な機能の一つであるため実装する必要がある.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
898 今回のRedBlackTreeによる構成の場合,木のルートの所持者を設定することが
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
899 ファイルに対して権限を設定することにあたる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
900 ルートに対してアクセスする権限がなければ,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
901 読み書きができないといった実装になると考える.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
902 \section{データクエリ言語}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
903
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
904 ユーザーやアプリケーションがDBのデータにアクセスするための言語設計を
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
905 する必要がある.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
906 RedBlackTreeのキーを用いたインデックスに対応し,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
907 従来のSQLと比較してより柔軟なクエリを実行できることを目指したい.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
908
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
909 \section{ログなどの時系列データの保存}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
910
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
911 時系列データは通常のデータと違った保存の方法を考えることができる.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
912 時系列に並んでいることを生かしたデータの保存方式や,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
913 時間経過に伴うデータの重要性の変化を考慮に入れたデータ圧縮の方法をとることで,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
914 より効率的な保存が可能だと考える.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
915
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
916 \section{スタンドアロンなDB}
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
917
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
918 MySQLやPostgreSQLなどはOSの機能としてではなく,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
919 それ自体が一つのアプリケーションとして自立的に動作している.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
920 自立的に動作するのは,データのポータビリティを向上させるためである.
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
921 スタンドアロンなDBの形にするか,
83b783747d1a overwrite
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
922 その他の方法でポータビリティを向上させる手法を考えたい.
2
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
923
43
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
924 \section{GCタイミングに必要な処理の自動挿入}
6e3720c12b23 gc timing
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
925
2
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
926
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
927
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
928 % %謝辞
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
929 \input{chapter/thanks.tex}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
930
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
931
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
932 %参考文献
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
933 \nocite{*}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
934 \bibliography{reference}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
935 \bibliographystyle{junsrt}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
936
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
937
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
938 %発表履歴
20
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
939 \input{chapter/history.tex}
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
940 \addcontentsline{toc}{chapter}{研究関連論文業績}
2
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
941
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
942 %付録
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
943 \addcontentsline{toc}{chapter}{付録}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
944 \appendix
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
945 \input{chapter/appendix.tex}
c8151a82f313 copy tex files from ikki master
matac42 <matac@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
946 \end{document}