annotate paper/sigos.tex @ 4:0c8bb16afb8d

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