annotate paper/sigos.tex @ 5:bec6eb1e0297

sigos_3
author suruga
date Fri, 21 Apr 2017 00:30:14 +0900
parents 0c8bb16afb8d
children 8cf4c8681595
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
1 \documentclass[techrep]{ipsjpapers}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
2 \usepackage[dvipdfmx]{graphicx}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
3 \usepackage{url}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
4 \usepackage{listings,jlisting}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
5 \usepackage{enumitem}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
6
19917a6272f6 sigos_test
suruga
parents:
diff changeset
7
19917a6272f6 sigos_test
suruga
parents:
diff changeset
8 \lstset{
19917a6272f6 sigos_test
suruga
parents:
diff changeset
9 language=C,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
10 tabsize=2,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
11 frame=single,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
12 basicstyle={\ttfamily\footnotesize},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
13 identifierstyle={\footnotesize},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
14 commentstyle={\footnotesize\itshape},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
15 keywordstyle={\footnotesize\bfseries},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
16 ndkeywordstyle={\footnotesize},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
17 stringstyle={\footnotesize\ttfamily},
19917a6272f6 sigos_test
suruga
parents:
diff changeset
18 breaklines=true,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
19 captionpos=b,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
20 columns=[l]{fullflexible},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
21 xrightmargin=0zw,%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
22 xleftmargin=1zw,%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
23 aboveskip=1zw,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
24 numberstyle={\scriptsize},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
25 stepnumber=1,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
26 numbersep=0.5zw,%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
27 lineskip=-0.5ex,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
28 }
19917a6272f6 sigos_test
suruga
parents:
diff changeset
29 \renewcommand{\lstlistingname}{Code}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
30
19917a6272f6 sigos_test
suruga
parents:
diff changeset
31 \input{dummy.tex} %% Font
19917a6272f6 sigos_test
suruga
parents:
diff changeset
32
19917a6272f6 sigos_test
suruga
parents:
diff changeset
33 % ユーザが定義したマクロなど.
19917a6272f6 sigos_test
suruga
parents:
diff changeset
34 \makeatletter
19917a6272f6 sigos_test
suruga
parents:
diff changeset
35
19917a6272f6 sigos_test
suruga
parents:
diff changeset
36 \begin{document}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
37
19917a6272f6 sigos_test
suruga
parents:
diff changeset
38 % 和文表題
19917a6272f6 sigos_test
suruga
parents:
diff changeset
39 \title{Code Gear、 Data Gear に基づく OS のプロトタイプ}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
40 % 英文表題
19917a6272f6 sigos_test
suruga
parents:
diff changeset
41 \etitle{}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
42
19917a6272f6 sigos_test
suruga
parents:
diff changeset
43 % 所属ラベルの定義
19917a6272f6 sigos_test
suruga
parents:
diff changeset
44 \affilabel{1}{琉球大学大学院理工学研究科情報工学専攻 \\Interdisciplinary Information Engineering, Graduate School of Engineering and Science, University of the Ryukyus.}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
45 \affilabel{2}{琉球大学工学部情報工学科\\Information Engineering, University of the Ryukyus.}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
46
19917a6272f6 sigos_test
suruga
parents:
diff changeset
47 % 和文著者名
19917a6272f6 sigos_test
suruga
parents:
diff changeset
48 \author{
19917a6272f6 sigos_test
suruga
parents:
diff changeset
49 仲松 栞\affiref{1}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
50 \and
19917a6272f6 sigos_test
suruga
parents:
diff changeset
51 照屋 のぞみ \affiref{2}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
52 \and
19917a6272f6 sigos_test
suruga
parents:
diff changeset
53 河野 真治\affiref{2}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
54 }
19917a6272f6 sigos_test
suruga
parents:
diff changeset
55
19917a6272f6 sigos_test
suruga
parents:
diff changeset
56 % 英文著者名
19917a6272f6 sigos_test
suruga
parents:
diff changeset
57 \eauthor{
19917a6272f6 sigos_test
suruga
parents:
diff changeset
58 Nakamatsu Shiori\affiref{1}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
59 \and
19917a6272f6 sigos_test
suruga
parents:
diff changeset
60 eruya Nozomi\affiref{2}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
61 \and
19917a6272f6 sigos_test
suruga
parents:
diff changeset
62 Shinji KONO\affiref{2}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
63 }
19917a6272f6 sigos_test
suruga
parents:
diff changeset
64
19917a6272f6 sigos_test
suruga
parents:
diff changeset
65 % 連絡先(投稿時に必要.製版用では無視される.)
19917a6272f6 sigos_test
suruga
parents:
diff changeset
66 \contact{仲松 栞\\
19917a6272f6 sigos_test
suruga
parents:
diff changeset
67 〒903-0213 沖縄県西原町千原1番地\\
19917a6272f6 sigos_test
suruga
parents:
diff changeset
68 琉球大学工学部情報工学科\\
19917a6272f6 sigos_test
suruga
parents:
diff changeset
69 TEL: (098)895-2221\qquad FAX: (098)895-8727\\
19917a6272f6 sigos_test
suruga
parents:
diff changeset
70 email: innparusu@cr.ie.u-ryukyu.ac.jp}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
71
19917a6272f6 sigos_test
suruga
parents:
diff changeset
72 % 和文概要
19917a6272f6 sigos_test
suruga
parents:
diff changeset
73 \begin{abstract}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
74
19917a6272f6 sigos_test
suruga
parents:
diff changeset
75 \end{abstract}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
76
19917a6272f6 sigos_test
suruga
parents:
diff changeset
77 % 英文概要
19917a6272f6 sigos_test
suruga
parents:
diff changeset
78 \begin{eabstract}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
79 \end{eabstract}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
80
19917a6272f6 sigos_test
suruga
parents:
diff changeset
81 % 表題などの出力
19917a6272f6 sigos_test
suruga
parents:
diff changeset
82 \maketitle
19917a6272f6 sigos_test
suruga
parents:
diff changeset
83
19917a6272f6 sigos_test
suruga
parents:
diff changeset
84 % 本文はここから始まる
19917a6272f6 sigos_test
suruga
parents:
diff changeset
85
19917a6272f6 sigos_test
suruga
parents:
diff changeset
86 % Introduce
19917a6272f6 sigos_test
suruga
parents:
diff changeset
87 \section{研究目的と背景}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
88
19917a6272f6 sigos_test
suruga
parents:
diff changeset
89 \section{非破壊的木構造データベースJungle}
5
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
90 Jungleは、当研究室で開発を行っている非破壊的木構造データベースで、Javaを用いて実装されている。非破壊的木構造とは、データの編集を一度生成した木を上書きせず、ルートから編集を行う位置までのノードをコピーする特徴を持つ(図\ref{fig:non_destructive_tree} )。これにより、読み込み中にデータが変更されないことが保証されているため、書き込みと読み込みを同時に行うことできる。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
91 %木のルートをAtomicに置き換えることで、木のアップデートを行う。変更前の木が残っているので、そのまま使用できる。変更されないノードは変更前と変更後のルートから共有されることになる。
3
07a31c08d082 add sigos_ver1_pdf
suruga
parents: 2
diff changeset
92 \begin{figure}[ht]
5
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
93 \begin{center}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
94 \includegraphics[width=60mm]{./pic/non_destructive_tree.pdf}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
95 \end{center}
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
96 \caption{非破壊的木構造の編集}
5
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
97 \label{fig:non_destructive_tree}
3
07a31c08d082 add sigos_ver1_pdf
suruga
parents: 2
diff changeset
98 \end{figure}
07a31c08d082 add sigos_ver1_pdf
suruga
parents: 2
diff changeset
99  Jungleは名前付きの複数の木の集合からなり、木は複数のノードの集合でできている。ノードは自身の子のリストと属性名、属性値を持ち、データベースのレコードに相応する。通常のレコードと異なるのは、ノードに子供となる複数のノードが付くところである。Jungleでは、子供からの親へのポインタは持たないため、親から子への片方向の参照しかできない。
07a31c08d082 add sigos_ver1_pdf
suruga
parents: 2
diff changeset
100  通常のRDBと異なり、Jungleは木構造をそのまま読み込むことができる。例えば、XMLやJsonで記述された構造を、データベースを設計することなく読み込むことが可能である。また、この木を、そのままデータベースとして使用することも可能である。しかし、木の変更の手間は木の構造に依存する。特に非破壊木構造を採用しているJungleでは、木構造の変更の手間はO(1)からO(n)となりえる。つまり、アプリケーションに合わせて木を設計しない限り、十分な性能を出すことはできない。逆に、正しい木の設計を行えば高速な処理が可能である。
07a31c08d082 add sigos_ver1_pdf
suruga
parents: 2
diff changeset
101  Jungleは基本的にon memoryで使用することを考えており、一度、木のルートを取得すれば、その上で木構造として自由にアクセスして良い。Jungleは分散データベースを構成するように設計されており、分散ノード間の通信は木の変更のログを交換することによって行われる。持続性のある分散ノードを用いることでJungleの持続性を保証することができる。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
102
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
103 \section{Index}
5
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
104 Jungleは、非破壊的木構造というデータ構造上、過去の版の木構造を全て保持している。よって、すべての版に独立したIndexが必要となるため、前の版のIndexを破壊すること無く、Indexを更新する必要がある。既存の TreeMap では、一度 Index の複製を行い、その後更新する必要があったため、Indexの更新オーダーがO(n)となっていた。その問題を解決するため、Java 上で関数型プログラミングを行えるライブラリである、 Functional Java の TreeMap を使用し、それを用いて Index 実装を行なった。この TreeMap は、 Jungle と同じようにルートから変更を加えたノードまでの経路の複製を行い、データの更新を行なった際、前の版と最大限データを共有した新しい TreeMap を作成する。Jungle との違いは、木の回転処理が入ることである。これにより複数の版すべてに対応した Index をサポートすることが可能になった。
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
105 \section{NodePath}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
106 Jungle では、木のノードの位置を NodePath クラスを使って表す。 NodePath クラスはルートノードからスタートし、対象のノードまでの経路を数字を用いて指し示す。また、ルートノードは例外として-1と表記される。 NodePath クラスを用いて \textless -1,0,2,3 \textgreater を表している際の例を(図\ref{fig:nodepath})に示す。
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
107
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
108 \begin{figure}[htpb]
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
109 \begin{center}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
110 \includegraphics[width=60mm]{./pic/nodepath.pdf}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
111 \end{center}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
112 \caption{NodePath}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
113 \label{fig:nodepath}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
114 \end{figure}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
115
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
116 \section{非破壊TreeMap}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
117  Jungle の Index は、Functional Java の非破壊 TreeMap を用いて実装を行なっている。しかし、Functional Java の TreeMap は、木の変更の手間が大きい、並列実行処理速度が落ちるなど、実用的な性能を持っていなかった。そのため、Jungleの性能も、TreeMap 部分がネックとなっていた。その問題を解決するため、 Jungle で使用する非破壊 TreeMap を作成した。TreeMap は、Red Black Tree のアルゴリズムを用いている。RedBlackTreeとは二分木探索の一つで、以下の条件を満たした木のことである。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
118 \begin{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
119 \item 各ノードは赤か黒の色を持つ。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
120 \item ルートノードは黒色である。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
121 \item 全ての葉は黒色である。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
122 \item 赤いノードの子は黒色である。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
123 \item 全ての葉からルートノードまでのパスには、同じ個数の黒いノードがある。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
124 \end{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
125 %ここもうちょっとかく。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
126 \section{Indexの差分Updateの実装}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
127  Jungleは木の編集を行う際に、編集を行うノードと、経路にあるノードの複製を行い新しい木構造を構築するため、 Index の中には、編集後の木には存在しない複製前のノードが残ってしまう。なので、 Index の差分 Update を行う際には、それらのノードを Index から削除して、新しく複製されたノードを Index に登録する必要がある。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
128  そのためには、編集を行なったノードを覚えておく必要がある。そこで、 Jungle Tree Editor 内に、編集を加えたノードを覚えておくためのリストを定義した。 Editor は木に編集を加えた際、リストに編集前のノードを保存する。そして、Commit 時にリストにあるノードを使って Index の中に残っている、編集後の木に存在しないノードを削除する。その後、新しく作られたノードを Index に登録して Update は終了する。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
129
19917a6272f6 sigos_test
suruga
parents:
diff changeset
130
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
131 \paragraph* {編集前ののノードの削除}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
132 ndex のUpdate を行う際、初めに、編集後の木に存在しないノードを Index から削除する。削
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
133 除の対象は、変更を加えたノードと、ルートから変更を加えたノードまでの経路にあるノード
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
134 である。ノードの削除は、以下の手順で行われる。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
135 \begin{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
136 \item 編集を行なったノードのリストからノードを取得する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
137 \item 取得したノードが、保持している値をIndex から削除する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
138 \item 自身と子供のペアを Parent Index から削除する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
139 \item ParentIndex から親を取得する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
140 \item 2 - 4 をルートノードにたどり着くか、 ParentIndex から親を取得できなkなるまで続ける。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
141 \item 1 - 5 をリストからノードが無くなるまで続ける。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
142 \end{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
143  Parent Index に現在のノードが登録されていない場合は、現在のノードからルートまでの経路にあるノードはIndexから削除されているため、削除を終えて、リストに入っている次のノードの削除処理を行なっても構わない。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
144
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
145 \paragraph* {Indexへのノードの挿入}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
146 Index から不要なノードを削除した後は、木の編集時新しく作られたノードを Index に挿入する。ノードの挿入は、以下の手順で行われる。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
147 \begin{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
148 \item 木からルートノードを取得する
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
149 \item 取得したノードがIndex に登録されているかを調べる。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
150 \item 登録されている場合、そのノード以下の Sub treeは、全てIndexに登録されているので、次のノードに移動する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
151 \item 登録されていなかった場合、自身が保持している値をIndex に登録する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
152 \item 自身と子ノードを Parent Index に登録する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
153 \item 自身の子ノードを取得したノードとして2に戻る。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
154 \item 全てのノードを登録したら終了する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
155 \end{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
156
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
157 \section{Differential Jungle Treeの実装}
3
07a31c08d082 add sigos_ver1_pdf
suruga
parents: 2
diff changeset
158   Jungleは木の編集時、ルートから編集を行う位置までのノードの複製を行う。そのため、木の編集の手間は、木構造の形によって異なる。特に線形の木は、全てのノードの複製を行うため、変更の手間がO(n)になってしまう。そこで、Jungleは、線形の木をO(1)で変更するPushPop の機能を持つ。PushPop とは、ルートノードの上に新しいルートノードを付け加える API である(図\ref{fig:PushPopDemerit} )。すると、木の複製を行う必要が無いため、木の変更の手間がO(1)でノードの追加を行える。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
159 \begin{figure}[ht]
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
160 \begin{center}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
161 \includegraphics[width=70mm]{./pic/PushPopDemerit.pdf}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
162 \end{center}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
163 \caption{PushPop}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
164 \label{fig:PushPopDemerit}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
165 \end{figure}
3
07a31c08d082 add sigos_ver1_pdf
suruga
parents: 2
diff changeset
166  しかし、PushPopはルートノードを追加していくため、図\ref{fig:PushPopDemerit} のようにノードの並びが逆順になってしまう。Logなどの正順の木でなければデータを表現できない場合、木の編集時PushPop を使用できない。そこで、木の編集の手間を O(1) で、正順の木を構築できるDifferential Jungle Tree の実装を行なった。 Differential Jungle Tree は。木のバージョンごとに、自身の木の最後尾を表す末尾ノードを保持する。木の編集は、別途構築したSub Tree に対して破壊的に更新を行い、Commit 時に末尾のノードに Sub Tree を Append することで行う。この場合は木が破壊的に変更されているように見えるが、前の版の末端部分を超えてアクセスすることがなければ複数の版を同時に使用することができる。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
167
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
168 \paragraph* {Differential Tree Context}
3
07a31c08d082 add sigos_ver1_pdf
suruga
parents: 2
diff changeset
169  Jungleの木はTreeContext というオブジェクトに自身の木の情報を保持している。Differential Jungle Tree では、現在の版の木構造の末尾ノードを保持することが可能な Differential Tree Context を作成した。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
170
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
171 \paragraph* {Differential Jungle Tree の作成}
3
07a31c08d082 add sigos_ver1_pdf
suruga
parents: 2
diff changeset
172 Differential Jungle Tree を作成するためにJungle に、新しいAPIを実装した。表(\ref{table:Differential API})
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
173
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
174 \begin{table}[htb]
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
175 \begin{center}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
176 \caption{Jungleに新しく実装したAPI}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
177 \begin{tabular}{|p{3cm}|p{4cm}|} \hline
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
178 \hline \shortstack{ createNewDifferenceTree\\ (StringtreeName)}& Jungleに新しくDifferential Jungle Treeを生成する。木の名前が重複した場合、生成に失敗し null を返す。\\
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
179 \hline
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
180 \end{tabular}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
181 \label{table:Diffetential API}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
182 \end{center}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
183 \end{table}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
184
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
185
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
186 \paragraph* {末尾ノードを使用した木の編集}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
187  Differential Jungle Tree の木の編集は、Differential Jungle Tree Editor を使用して行う。 Differential Jungle Tree Editor は、Default Jungle Tree Editor と違い、生成時に新しい木構造(Sub Tree)を自身の中に構築する。そして、木の編集は、Editor が保持している木構造に対して行う。編集後、Commit を行う際に構築した木構造を、 Differential Jungle Tree の末尾ノードにAppend する。その際木の複製は行わない。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
188  また、Differential Tree は自身が保持している木構造に対する変更しか行えないため、一度Commit した木に対して変更は行えない。図\ref{fig:EditDifferencialTree}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
189
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
190 \begin{figure}[ht]
19917a6272f6 sigos_test
suruga
parents:
diff changeset
191 \begin{center}
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
192 \includegraphics[width=70mm]{./pic/EditDifferencialTree.pdf}
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
193 \end{center}
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
194 \caption{末尾ノードを使用した木の編集}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
195 \label{fig:EditDifferencialTree}
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
196 \end{figure}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
197
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
198 \begin{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
199 \item 木からgetJungleTreeEditor で Editor を取得する。(このとき Editor は新しい木構造(Sub Tree)を持つ)。
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
200 \item Editorが保持している木構造に対して addNewChild( \textless-1.0\textgreater)を実行し、ノードの追加を行う。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
201 \item Commit を行い、Treeの末尾ノードにEditorが保持している木構造を Append する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
202 \end{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
203  Editor が保持している木構造に最後に追加したノードが、新しい木の末尾ノードとなる。また、Differential Jungle Tree は、木の編集時複製を行わないため、 Index のアップデートは、 Editor が保持している木構造のデータを Index に追加するだけで良い。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
204
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
205 \paragraph* {Differential Jungle Tree の検索}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
206  Differential Jungle Tree は、末尾ノードを使って、現在の木構造を表現している。なので、過去の木に対して全探索を行なった場合、その版には無いはずのノードが取得できてしまう。例として、編集前の木である Tree ver1 と編集後の木である Tree ver2 があるとする(図\ref{fig:PushPopDemerit})。ここで、Tree ver1 に対して、全探索を行なった場合、本来Tree ver1 に存在しないノード3・4も検索対象に含まれてしまう。そこで、その版の木が持つ末尾ノード以下のSub Tree を検索対象から除外する、Differential Interface Traverser を実装した。Differential Interface Traverserを用いて木の全探索を行なった場合、Tree ver1 に存在しないノード3・4は検索対象から省かれる。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
207 %画像つくる
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
208 \begin{figure}[ht]
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
209 \begin{center}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
210 \includegraphics[width=70mm]{./pic/EditDifferencialTree.pdf}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
211 \end{center}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
212 \caption{複数の版の木の表現}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
213 \label{fig:EditDifferencialTree}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
214 \end{figure}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
215  Index を使用した検索を行う場合、各版の木に対応した Index があるため、Default Tree と検索のアルゴリズムは変わらない。これらの実装により Differential Jungle Tree は木構造の構築・検索を行う。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
216
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
217 \paragraph* {Differential Jungle Tree の検索}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
218  Differential Jungle Tree への Commit は、編集後の木のデータを持つ TreeContext を作り、編集前の木が持つ TreeContext と Atomic に入れ替えることで行われる。しかし、Differential Jungle Tree のCommit は、Default Jungle Tree の Commit と異なり、TreeContext の入れ替えと、 Editor が保持している木構造の末尾ノードへの Append の2つのプロセスからなる。 TreeContext の入れ替えに関しては、 Default Jungle Tree と同じように行い、末尾ノードへの Editor が持っている木構造の Append は、TreeContect の入れ替えが成功した後に行う。そうすることで、別Thread で行われている Commit と競合した際に、 TreeContext を入れ替えた Thread と別 Thread がAppend を行い、木の整合性が崩れることを回避している。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
219  また、過去の版の木に対して、編集を加えCommit を行なった場合、木の整合性が崩れてしまう問題もある。図()()を例に解説する。図()の過去の版の木 Tree ver1 に新しいノード5を追加・Commit を行うと、新しい木 Tree ver'2 が構築される。ここで、Tree ver'2 に対して全検索を行う。differential Jungle Tree に対する全検索は、末尾ノードよ上にあるノードを検索対象にする。しかしノード3・4という、本来存在しないはずのノードが検索対象に含まれてしまう。これは、過去の版の木である、 tree ver1 の末尾ノードが2つの子ノードを持っているせいで発生する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
220  この問題を解決するために、Differential Jungle Tree では、過去の木に対する変更を禁止している。具体的には。末尾ノードは子を1つしか持つことができないようにした。そうすることで木の整合性を保証している。
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
221
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
222
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
223 %画像つくる
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
224 \begin{figure}[ht]
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
225 \begin{center}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
226 \includegraphics[width=70mm]{./pic/EditDifferencialTree.pdf}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
227 \end{center}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
228 \caption{木の整合性が崩れる例}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
229 \label{fig:EditDifferencialTree}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
230 \end{figure}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
231
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
232 \section{Red Black Jungle Tree の実装}
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
233  Jungle は木に編集を加えた際、ルートから編集を行う位置までのノードをコピーする。その為、木の編集の手間は木の大きさにも依存している。バランスの取れた木構造を構築することで、編集の手間をO(log n)にすることは可能だが、Default Jungle Tree の場合、ユーザーがPath を用いて、バランスを取りながら木を構築する必要がある。しかし、ユーザーが全ての木構造の形を把握し、バランスの取れた木を構築するのは困難である。そこで、自動で木のバランスを取り、最適な形の木構造を構築する機能を持つ Red Black Jungle Tree を実装した。バランスは、木の生成時に特定の Balance Key を決定し、それを使って行う。木のバランスを取るアルゴリズムは、前述した非破壊 TreeMap と同じものを使用する。しかし、木の編集を加えた際、木がどのようにバランスを取るか予想するのは困難であるため、木構造自体がデータを表現していない場合に限る。また、自身の木構造が、Balance Key を使った Index と同じ働きを持つため、木のCommit 時に別途 Index を構築する必要が無い、といったメリットもある。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
234
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
235 \paragraph* {Red Black Jungle Tree の作成}
5
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
236 Red Black Jungle Tree を作成するため、Jungle に新しいAPIを実装した。(表)
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
237
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
238 \begin{table}[htb]
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
239 \begin{center}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
240 \caption{Jungleに新しく実装したAPI}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
241 \begin{tabular}{|p{3cm}|p{4cm}|} \hline
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
242 \hline \shortstack{ createNewRedBlackTree\\ (StringtreeName, \\String balanceKey)}& Jungleに新しくRed Black Jungle Treeを生成する。第一引数に木の名前、第2引数に木のバランスを取る時に使用する Balance Key を受け取る。木の名前が重複した場合、生成に失敗し null を返す。\\
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
243 \hline
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
244 \end{tabular}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
245 \label{table:Diffetential API}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
246 \end{center}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
247 \end{table}
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
248
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
249 \paragraph* { NodePath の拡張}
5
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
250 Red Black Jungle Tree は、ノードを追加・削除するたびに木のバランスが行われ、各ノードの Path が変わってしまう。その為、数字を使った NodePath では、編集を加える際、編集対象のノードの Path
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
251 を毎回調べる必要がある。その問題を解決するために、NodePath を拡張した Red Black Tree Node Path を作成し、属性名 BalanceKey 属性値 value のペアでノードを指定できるようにした。 Red Black Jungle Node Path は、引数に String 型の BalanceKey と ByteBuffer 型の value を取る。
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
252 %サンプル要りますでしょうか
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
253 Red Black Tree Node Path で指定できる属性名は、木の生成時に宣言した属性名しか使用できない。これは、Red Black Jungle Tree が木の生成時に宣言した属性名でソートされているからである。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
254
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
255 %\paragraph* { Red Black Jungle Tree の編集}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
256  %Red Black Jungle Tree Editor は、既存の Jungle Tree Editor とくらべてAPIの使い方が異なる。以下にDefault Jungle Tree と Red Black Jungle Tree Editor のAPIの使い方の違いを記述する。
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
257 %\paragraph* { Jungle Red Black Tree の検索}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
258 %編集と検索をいれるか迷います。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
259
19917a6272f6 sigos_test
suruga
parents:
diff changeset
260 %Code \ref{src: "src"フォルダの中のコードのファイル名}で、文章中にコードの指定ができる。
19917a6272f6 sigos_test
suruga
parents:
diff changeset
261 %\lstinputlisting[label=src:ファイル名, caption=Enqueue]{./src/ファイル名.拡張子}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
262
19917a6272f6 sigos_test
suruga
parents:
diff changeset
263
19917a6272f6 sigos_test
suruga
parents:
diff changeset
264 \section{分散環境でのJungleDBの書き出し実験方法の提案}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
265
19917a6272f6 sigos_test
suruga
parents:
diff changeset
266 \section{まとめ}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
267
19917a6272f6 sigos_test
suruga
parents:
diff changeset
268
19917a6272f6 sigos_test
suruga
parents:
diff changeset
269 %参考文献 
19917a6272f6 sigos_test
suruga
parents:
diff changeset
270 \nocite{*}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
271 \bibliographystyle{ipsjunsrt}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
272 \bibliography{sigos}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
273
19917a6272f6 sigos_test
suruga
parents:
diff changeset
274 \end{document}