comparison paper/sigos.tex @ 8:1dd3a4150e7d

change
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Wed, 06 May 2015 21:10:08 +0900
parents 00c88f26710c
children a5958e372cee
comparison
equal deleted inserted replaced
7:00c88f26710c 8:1dd3a4150e7d
62 TEL: (098)895-2221\qquad FAX: (098)895-8727\\ 62 TEL: (098)895-2221\qquad FAX: (098)895-8727\\
63 email: kokubo@cr.ie.u-ryukyu.ac.jp} 63 email: kokubo@cr.ie.u-ryukyu.ac.jp}
64 64
65 % 和文概要 65 % 和文概要
66 \begin{abstract} 66 \begin{abstract}
67 当研究室ではデータをData Segment、タスクをCode Segmentという単位で分割して記述する手法を提唱しており、そのプロトタイプとして並列分散フレームワークAliceを開発している。 67 当研究室ではデータをData Segment、タスクをCode Segmentという単位で分割して記述する手法を提唱しており、それに基づく並列分散フレームワークAliceを開発している。Aliceが分散プログラムを記述する能力を有することは、Aliceを用いた水族館の例題、分散データベースJungle、木構造画面共有システムAliceVNCによって確認された。しかし、AliceVNCを作成するには、通信時にData Segmentを圧縮形式で扱える機能が必要である。本研究では、Data SegmentにObject型、MessagePackを使ったByteArray型、圧縮されたByteArray型の3つの表現を同時に持つメタ計算の設計と実装を行うことで、Data Segmentの多態性を用いた圧縮機能を実現した。
68  Aliceが分散プログラムを記述する能力を有することは確認された。しかし、Aliceで実用的なアプリケーションを作成するには、通信時にData Segmentの形式を選択できる機能が必要である。本研究では、Data Segmentの多態性を実現するため、Data SegmentをObject型、MessagePackを使ったByteArray型、圧縮されたByteArray型の3つの形式で表現できるメタ計算の設計と実装を行った。
69 68
70 69
71 \end{abstract} 70 \end{abstract}
72 71
73 % 英文概要 仮 72 % 英文概要 仮
74 \begin{eabstract} 73 \begin{eabstract}
75 lice is a prototype framework for distributed programming, which uses Data Segment and Code Segment as programming units. We checked Alice has an ability to write distributed program by previous research. 74 Alice is a framework for distributed programming, which uses Data Segment and Code Segment as programming units.We checked Alice has an ability to write distributed program using aquarium example, distributed database Jungle and share screen system AliceVNC by previous research.
76 But if programmer want to build Application by Alice, Alice need function of choice the Data Segment representation. 75 But if programmer want to build Application by Alice, Alice need function of choice the Data Segment representation.
77 76
78 In this paper, we add Alice computation of compress for achieving Data Segment polymerism. Data Segment has 3 type representation(Object type, ByteArray type using MessagePack, and compressed ByteArray type). 77 In this paper, we add Alice computation of compress for achieving Data Segment polymerism. Data Segment has 3 type representation(Object type, ByteArray type using MessagePack, and compressed ByteArray type).
79 \end{eabstract} 78 \end{eabstract}
80 79
82 \maketitle 81 \maketitle
83 82
84 % 本文はここから始まる 83 % 本文はここから始まる
85 84
86 \section{研究背景と目的} 85 \section{研究背景と目的}
87 当研究室ではデータをData Segment、タスクをCodeSegmentという単位で分割して記述する並列分散フレームワークAliceの開発を行っている。 86 並列指向プログラミング言語Erlangでは、プロセスと呼ばれる独立性を備えたスレッドにPidという識別子
88 Aliceでは分散環境の構築に必要な処理をMeta Computationとして提供することで、スケーラブルな分散プログラムを信頼性高く記述できる環境を実現している。 87 が対応しており、Pidを指定してメッセージを送受信する手法を用いて並列分散環境を実現している。
89 88 また、当研究室の先行研究であるFederated Lindaは、タプルというIDで番号付けられたデータの集合を相互接続された複数のタプルスペース(LindaServer)に出し入れするプログラミングモデルである。
90 先行研究にてAlice が分散プログラムを記述する能力を有することは確認された。 89 一方、AliceではString型のkeyに対応するQueueにデータが入っており、タスクはkeyを指定して必要なデータのみを出し入れするモデルを採用している。そのためタスクとデータの依存関係を分かりやすく記述でき、依存しない部分の並列実行が行える。また、Aliceでは分散環境の構築に必要な処理をMeta Computationとして提供することで、スケーラブルな分散プログラムを信頼性高く記述できる環境を実現している。
90
91 先行研究の水族館の例題等において、Alice が分散プログラムを記述する能力を有することは確認された。
91 だが、実用的な分散プログラムを作成するためには、受け取ったデータをそのまま転送したい場合や圧縮されたデータ形式で通信を行いたい場合がある。 92 だが、実用的な分散プログラムを作成するためには、受け取ったデータをそのまま転送したい場合や圧縮されたデータ形式で通信を行いたい場合がある。
92 93
93 本研究では、 Aliceを用いて画面共有システムAliceVNCを実装するにあたり必要となった 94 本研究では、 実用的なアプリケーションである画面共有システムTreeVNCをAliceで実装するにあたり必要となった圧縮機能を Meta Computation として実装した。
94 flip機能と圧縮機能を Meta Computation として実装した。
95 プログラムに Alice の制御を行うメタプログラムを記述することにより、 95 プログラムに Alice の制御を行うメタプログラムを記述することにより、
96 扱うデータの形式を元のコードを大きく変更することなく指定することができる。 96 扱うデータの形式を元のコードを大きく変更することなく指定することができる。
97 そして、データの多態性を実現し、扱いたいデータの状態に合わせてDataSegmentManagerを切り替えることで、ノード間通信における自由度の向上を図った。 97 そして、データの多態性を実現し、扱いたいデータの状態に合わせてDataSegmentManagerを切り替えることで、ノード間通信における自由度の向上を図った。
98 98
99 99
100 \section{分散フレームワーク Alice の概要} 100 \section{分散フレームワーク Alice の概要}
101 \subsection{Data SegmentとCode Segment} 101 \subsection*{「Data SegmentとCode Segment」}
102 AliceはデータをData Segment、(以下DS)タスクをとCode Segment(以下CS)という単位に分割してプログラミングを行う。 102 AliceはデータをData Segment、(以下DS)タスクをとCode Segment(以下CS)という単位に分割してプログラミングを行う。
103 DSはAliceが内部にもつデータベースによって管理されている。DSに対応する一意のkeyが設定されており、そのkeyを用いてデータベースを操作する。 103 DSはAliceが内部にもつデータベースによって管理されている。DSに対応する一意のkeyが設定されており、そのkeyを用いてデータベースを操作する。
104 104
105 CSは実行に必要なDSが揃うと実行されるという性質を持ち、入力されたDSに応じた結果が出力される。 105 CSは実行に必要なDSが揃うと実行されるという性質を持ち、入力されたDSに応じた結果が出力される。
106 CSを実行するために必要な入力DSはInputDS、CSが計算を行った後に出力されるDSはOutput DSと呼ばれる。データの依存関係にないCSは並列実行が可能であるため、並列度を上げるためにはCSの処理内容を細かく分割して依存するデータを少なくするのが望ましい。 106 CSを実行するために必要な入力DSはInputDS、CSが計算を行った後に出力されるDSはOutput DSと呼ばれる。データの依存関係にないCSは並列実行が可能であるため、並列度を上げるためにはCSの処理内容を細かく分割して依存するデータを少なくするのが望ましい。
107 107
108 \subsection{Data Segment} 108 \subsection*{「Data Segment」}
109 複数のスレッドから1つのデータに変更を行うためには、データの不整合を防ぐためのlockが必要になる。複数の関係のない要素を1つのデータオブジェクトで表現した場合、全ての操作でlockが必要になる。このlockがスケラビリティーを低下させる。つまりデータのサイズも並列計算には重要である。 109 複数のスレッドから1つのデータに変更を行うためには、データの不整合を防ぐためのlockが必要になる。複数の関係のない要素を1つのデータオブジェクトで表現した場合、全ての操作でlockが必要になる。このlockがスケラビリティーを低下させる。つまりデータのサイズも並列計算には重要である。
110 110
111 Aliceはデータを細かく分割して記述する。その細かく分割されたデータをDSと呼ぶ。 111 Aliceはデータを細かく分割して記述する。その細かく分割されたデータをDSと呼ぶ。
112 実際には特定のオブジェクトにマッピングされ、マッピングされたクラスを通してアクセスされる。 112 実際には特定のオブジェクトにマッピングされ、マッピングされたクラスを通してアクセスされる。
113 113
114 114
115 \subsection{Data Segment Manager} 115 \subsection*{「Data Segment Manager」}
116 DSは実際にはqueueに保存される。queueには対になるkeyが存在し、keyの数だけqueueが存在する。 116 DSは実際にはqueueに保存される。queueには対になるkeyが存在し、keyの数だけqueueが存在する。
117 このkeyを指定してDSの保存、取得を行う。queueの集合体はデータベースとして捉えられる。このデータベースをAliceではDS Manager(以下DSM)と呼ぶ。DSMにはLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のデータベースである。Remote DSMは他のノードのLocal DSMのproxyであり、接続しているノードの数だけ存在する。(図\ref{fig:RemoteDSM})Remote DSMに対して書き込むと対応するノードのLocal DSMに書き込まれる。 117 このkeyを指定してDSの保存、取得を行う。queueの集合体はデータベースとして捉えられる。このデータベースをAliceではDS Manager(以下DSM)と呼ぶ。DSMにはLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のデータベースである。Remote DSMは他のノードのLocal DSMのproxyであり、接続しているノードの数だけ存在する。(図\ref{fig:RemoteDSM})Remote DSMに対して書き込むと対応するノードのLocal DSMに書き込まれる。
118 118
119 \begin{figure}[htbp] 119 \begin{figure}[htbp]
120 \begin{center} 120 \begin{center}
122 \end{center} 122 \end{center}
123 \caption{Remote DSMは他のノードのLocal DSMのproxy } 123 \caption{Remote DSMは他のノードのLocal DSMのproxy }
124 \label{fig:RemoteDSM} 124 \label{fig:RemoteDSM}
125 \end{figure} 125 \end{figure}
126 126
127 \subsection{Data Segment API} 127 \subsection*{「Data Segment API」}
128 以下のData Segment APIを用いてデータベースにアクセスする。 128 以下のData Segment APIを用いてデータベースにアクセスする。
129 putとupdateはDSを追加する際に、peekとtakeはDSを取得する際に使用する。 129 putとupdateはDSを追加する際に、peekとtakeはDSを取得する際に使用する。
130 130
131 \begin{itemize} 131 \begin{itemize}
132 \item {\ttfamily void put(String managerKey, String key, \\ Object val)} 132 \item {\ttfamily void put(String managerKey, String key, \\ Object val)}
146 \item {\ttfamily void peek(String managerKey, String key)} 146 \item {\ttfamily void peek(String managerKey, String key)}
147 \end{itemize} 147 \end{itemize}
148 peekもDSを読み込むAPIである。takeとの違いは読み込まれたDSが削除されないことである。 148 peekもDSを読み込むAPIである。takeとの違いは読み込まれたDSが削除されないことである。
149 149
150 150
151 \subsection{Data Segmentの表現} 151 \subsection*{「Data Segmentの表現」}
152 DSの表現にはMessagePack for Javaを利用している。 152 DSの表現にはMessagePack for Javaを利用している。
153 \begin{itemize} 153 \begin{itemize}
154 \item {\ttfamily DSは一般的なJavaのクラスオブジェクト} 154 \item {\ttfamily DSは一般的なJavaのクラスオブジェクト}
155 \item {\ttfamily MessagePackを用いて変換したbyte[]で表現されたバイナリオブジェクト} 155 \item {\ttfamily MessagePackを用いて変換したbyte[]で表現されたバイナリオブジェクト}
156 \end{itemize} 156 \end{itemize}
157 の2種類があり、LocalDSMにputされた場合は一般的なJavaのクラスオブジェクトとしてenQueueされる。 157 の2種類があり、LocalDSMにputされた場合は一般的なJavaのクラスオブジェクトとしてenQueueされる。
158 RemoteDSMにputされた場合は通信時にbyteArrayに変換されたバイナリオブジェクトがenQueueされる。 158 RemoteDSMにputされた場合は通信時にbyteArrayに変換されたバイナリオブジェクトがenQueueされる。
159 159
160 \subsection{Code Segment} 160 \subsection*{「Code Segment」}
161 Alice上で実行されるタスクの単位がCSである。ユーザーはCSを組み合わせることでプログラミングを行う。CSをユーザーが記述する際に、内部で使用するDSの作成を記述する。 161 Alice上で実行されるタスクの単位がCSである。ユーザーはCSを組み合わせることでプログラミングを行う。CSをユーザーが記述する際に、内部で使用するDSの作成を記述する。
162 162
163 Input DS と Output DSはCSに用意されているAPIを用いて作成する。 163 Input DS と Output DSはCSに用意されているAPIを用いて作成する。
164 Input DSは、LocalかRemoteか、またkeyを指定する必要がある。CSは、記述したInput DSが全て揃うとThread poolに送られ、実行される。 164 Input DSは、LocalかRemoteか、またkeyを指定する必要がある。CSは、記述したInput DSが全て揃うとThread poolに送られ、実行される。
165 165
166 Output DSもLocalかRemoteか、またkeyを指定する必要がある。 166 Output DSもLocalかRemoteか、またkeyを指定する必要がある。
167 Inputの場合はsetKeyを呼ぶ際、Outputの場合はput(またはupdate)の際にノードとkeyの指定を行っている。 167 Inputの場合はsetKeyを呼ぶ際、Outputの場合はput(またはupdate)の際にノードとkeyの指定を行っている。
168 しかし、どの時点でノードとkeyの指定を行えばよいか、どのようなAPIを用意するべきかは、議論の余地がある。 168 しかし、どの時点でノードとkeyの指定を行えばよいか、どのようなAPIを用意するべきかは、議論の余地がある。
169 169
170 \subsection{Code Segmentの記述方法} 170 \subsection*{「Code Segmentの記述方法」}
171 CSをユーザーが記述する際にはCSを継承して記述する(ソースコード \ref{src:StartCodeSegment} ,\ref{src:CodeSegment})。 171 CSをユーザーが記述する際にはCSを継承して記述する(ソースコード \ref{src:StartCodeSegment} ,\ref{src:CodeSegment})。
172 継承することによりCode Segmentで使用するAPIを利用する事ができる。 172 継承することによりCode Segmentで使用するAPIを利用する事ができる。
173 173
174 \begin{table}[html] 174 \begin{table}[html]
175 \lstinputlisting[label=src:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java} 175 \lstinputlisting[label=src:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java}
213 runメソッドの内容としては10行目で取得されたDSをInteger型に変換してcountに代入している。 213 runメソッドの内容としては10行目で取得されたDSをInteger型に変換してcountに代入している。
214 16行目で もう一度TestCodeSegmentのCSが作られる。 214 16行目で もう一度TestCodeSegmentのCSが作られる。
215 17行目でcountの値をインクリメントしてLocal DSMに値を追加する。 215 17行目でcountの値をインクリメントしてLocal DSMに値を追加する。
216 13行目が終了条件であり、countの値が10になれば終了する。 216 13行目が終了条件であり、countの値が10になれば終了する。
217 217
218 \subsection{ComputationとMeta Computation} 218 \subsection*{「ComputationとMeta Computation」}
219 AliceのComputationは、keyで指し示されるDSを待ち合わせてCSを実行させると定義できる。 219 AliceのComputationは、keyで指し示されるDSを待ち合わせてCSを実行させると定義できる。
220 それに対して、AliceのMeta Computationは、AliceのComputationを支えているComputationのプログラミングと定義できる。 220 それに対して、AliceのMeta Computationは、AliceのComputationを支えているComputationのプログラミングと定義できる。
221 221
222 例えば、トポロジーを指定するAPIはMeta Computationである。Aliceが動作するためにはトポロジーを決める必要がある。つまりトポロジーの構成はAliceのComputationを支えているComputationとみなすことができる。トポロジーが決定するとそのトポロジーを構成する計算が行われる。トポロジーを指定するAPIはその構成の計算をプログラミングして変更するものである。 222 例えば、トポロジーを指定するAPIはMeta Computationである。Aliceが動作するためにはトポロジーを決める必要がある。つまりトポロジーの構成はAliceのComputationを支えているComputationとみなすことができる。トポロジーが決定するとそのトポロジーを構成する計算が行われる。トポロジーを指定するAPIはその構成の計算をプログラミングして変更するものである。
223 他にも再接続の動作を決めるAPIや切断時の動作を決めるAPIはMeta Computationである。 223 他にも再接続の動作を決めるAPIや切断時の動作を決めるAPIはMeta Computationである。
224 224
225 これらのMeta ComputationがAliceのComputationに影響することはない。プログラマーはCSを記述する際にトポロジーや切断、再接続という状況を予め想定した処理にする必要はない。プログラマーは目的の処理だけ記述する。そして、切断や再接続が起こった場合の処理を記述しMeta Computationで指定する。 225 これらのMeta ComputationがAliceのComputationに影響することはない。プログラマーはCSを記述する際にトポロジーや切断、再接続という状況を予め想定した処理にする必要はない。プログラマーは目的の処理だけ記述する。そして、切断や再接続が起こった場合の処理を記述しMeta Computationで指定する。
226 このようにプログラムすることで、通常処理と例外処理を分離することができるため、シンプルなプログラムを記述できる。 226 このようにプログラムすることで、通常処理と例外処理を分離することができるため、シンプルなプログラムを記述できる。
227 227
228 228
229 \subsection{Meta Data Segment} 229 \subsection*{「Meta Data Segment」}
230 DSは、アプリケーションに管理されているデータのことである。アプリケーションを構成するCSによってその値は変更される。 230 DSは、アプリケーションに管理されているデータのことである。アプリケーションを構成するCSによってその値は変更される。
231 それに対してMeta DSは、分散フレームワークAliceが管理しているデータである。Aliceを構成するCSによってのみ、その値は変更される。一部のMeta DSはアプリケーションに利用することができる。 231 それに対してMeta DSは、分散フレームワークAliceが管理しているデータである。Aliceを構成するCSによってのみ、その値は変更される。一部のMeta DSはアプリケーションに利用することができる。
232 232
233 例えば、"start"というkeyでは、ノードがStart CSを実行可能かどうかの状態を表す。他にも"\_CLIST"というkeyでは、利用可能なRemote DSの一覧が管理されている。ユーザーはこの一覧にある名前を指定することで、動的にDSの伝搬などを行うことができる。 233 例えば、"start"というkeyでは、ノードがStart CSを実行可能かどうかの状態を表す。他にも"\_CLIST"というkeyでは、利用可能なRemote DSの一覧が管理されている。ユーザーはこの一覧にある名前を指定することで、動的にDSの伝搬などを行うことができる。
234 234
235 また、Input DSに付随しているものもある。Input DSはCS内部でReceiverという入れ物に格納される。ユーザーは、Receiverに対して操作することでDSを入手できる。 235 また、Input DSに付随しているものもある。Input DSはCS内部でReceiverという入れ物に格納される。ユーザーは、Receiverに対して操作することでDSを入手できる。
236 このReceiverには、fromというフィールドがあり、このDSを誰がputしたという情報が入っている。この情報をデータの伝搬する際に利用することで、DSをputしたノードに送り返すことを防ぐことができる。 236 このReceiverには、fromというフィールドがあり、このDSを誰がputしたという情報が入っている。この情報をデータの伝搬する際に利用することで、DSをputしたノードに送り返すことを防ぐことができる。
237 237
238 Meta DSはDS同様にDS APIを用いて取得できる。 238 Meta DSはDS同様にDS APIを用いて取得できる。
239 239
240 \subsection{Meta Code Segment} 240 \subsection*{「Meta Code Segment」}
241 CSはアプリケーションを動作させるために必要なタスクであり、ユーザーによって定義される。 241 CSはアプリケーションを動作させるために必要なタスクであり、ユーザーによって定義される。
242 それに対してMeta CSはAliceを構成するタスクである。つまりMeta CSの群はAliceのComputationと言い換えることができる。一部のみユーザーが定義をすることができ、Aliceの挙動を変更することができる。 242 それに対してMeta CSはAliceを構成するタスクである。つまりMeta CSの群はAliceのComputationと言い換えることができる。一部のみユーザーが定義をすることができ、Aliceの挙動を変更することができる。
243 243
244 244
245 245
270 270
271 271
272 272
273 \section{Aliceの新機能} 273 \section{Aliceの新機能}
274 実用的なアプリケーションであるTreeVNCをAlice上で実装することで、Aliceに必要な機能を洗い出した。 274 実用的なアプリケーションであるTreeVNCをAlice上で実装することで、Aliceに必要な機能を洗い出した。
275 \subsection{flip機能} 275 \subsection*{「flip機能」}
276 Data Segment APIのput、updateを呼ぶとOutput Data Segmentが毎回新しく作成される。そして出力するデータのコピーが行われる。 276 Data Segment APIのput、updateを呼ぶとOutput Data Segmentが毎回新しく作成され、出力するデータのコピーが行われる。しかし、Input Data Segmentとして取得したデータをそのまま子ノードにOutput Data Segmentとして出力する場合、コピーを行なうのは無駄である。
277 しかし、AliceVNCのようにInput Data Segmentとして取得したデータをそのまま子ノードにOutput Data Segmentとして出力する場合、コピーを行なうのは無駄である。 277
278   278 そこで、Input Data SegmentとOutput Data Segmentを交換する機能をflip機能として実装した。
279 そこで、このコピーを無くしData Segmentの更新におけるオーバーヘッドを減らす方法としてflip機能の実装を行った。 279 ソースコード\ref{src:exampleFlip}のようにInput Data SegmentであるReceiverをコピーせずにflipメソッドに引数として渡すことで、コピーのオーバーヘッドをなくしている。
280 ソースコード\ref{src:exampleFlip}のようにInput Data SegmentであるReceiverをflipメソッドに引数として渡すことで、無駄なコピーを減らす。 280 TreeVNCでは親ノードから受け取った画面データをそのまま子ノードに配信するため、Meta Computationとしてflip機能が使えることは有用である。
281 \begin{table}[html] 281 \begin{table}[html]
282 \lstinputlisting[label=src:flipAlice, caption=Aliceにおけるflip]{source/flip.java} 282 \lstinputlisting[label=src:flipAlice, caption=Aliceにおけるflip]{source/flip.java}
283 \end{table} 283 \end{table}
284 284
285 \begin{table}[html] 285 \begin{table}[html]
286 \lstinputlisting[label=src:exampleFlip,caption=flipの使用例]{source/Sort.java} 286 \lstinputlisting[label=src:exampleFlip,caption=flipの使用例]{source/Sort.java}
287 \end{table} 287 \end{table}
288 288
289 \subsection{Data Segmentの表現の追加(圧縮機能)} 289 \subsection*{「Data Segmentの表現の追加(圧縮機能)」}
290 TreeVNCでは画面配信の際、データを圧縮してノード間通信を行っている。 290 TreeVNCでは画面配信の際、データを圧縮してノード間通信を行っている。
291 そのため、AliceVNCにも圧縮されたデータ形式を扱える機能が必要だと考えた。 291 そのため、AliceVNCにも圧縮されたデータ形式を扱える機能が必要だと考えた。
292 しかし、ただデータを圧縮する機構を追加すればいいわけではない。 292 しかし、ただデータを圧縮する機構を追加すればいいわけではない。
293 293
294 AliceVNCでは、ノードは受け取った画面データを描画すると同時に、子ノードのRemote DS Managerに送信する。 294 AliceVNCでは、ノードは受け取った画面データを描画すると同時に、子ノードのRemote DS Managerに送信する。
303 \item 一般的なJavaのクラスオブジェクト 303 \item 一般的なJavaのクラスオブジェクト
304 \item MessagePack for Javaでシリアライズ化されたバイナリオブジェクト 304 \item MessagePack for Javaでシリアライズ化されたバイナリオブジェクト
305 \item 2を圧縮したバイナリオブジェクト 305 \item 2を圧縮したバイナリオブジェクト
306 \end{enumerate} 306 \end{enumerate}
307 307
308 ソースコード\ref {src:ReceiveData}はReceiveData.classが持つ表現であり、{\tt val}に1. 一般的なJavaのクラスオブジェクト の表現でデータ本体が保存される。{\tt messagePack}には2. シリアライズ化されたバイナリオブジェクトが保存され、通常のRemoteDSMへの通信にこの表現が扱われる。そして、{\tt zMessagePack}には3. 圧縮されたバイナリオブジェクトが保存される。 308 ソースコード\ref {src:ReceiveData}はReceiveData.classが持つ表現であり、{\tt val}に(1) 一般的なJavaのクラスオブジェクト の表現でデータ本体が保存される。{\tt messagePack}には(2) シリアライズ化されたバイナリオブジェクトが保存され、通常のRemoteDSMへの通信にこの表現が扱われる。そして、{\tt zMessagePack}には(3) 圧縮されたバイナリオブジェクトが保存される。
309 \begin{table}[html] 309 \begin{table}[html]
310 \lstinputlisting[label=src:ReceiveData, caption=データを表現するクラス]{source/ReceiveData.java} 310 \lstinputlisting[label=src:ReceiveData, caption=データを表現するクラス]{source/ReceiveData.java}
311 \end{table} 311 \end{table}
312 312
313 また、圧縮状態を持つDSを扱うDSMとしてLocalとRemoteそれぞれにCompressed Data Segment Managerの追加した。 313 また、圧縮状態を持つDSを扱うDSMとしてLocalとRemoteそれぞれにCompressed Data Segment Managerの追加した。Compressed DSMの内部では、put/updateが呼ばれた際にReceiveData.classが圧縮表現を持っていればそれを使用し、持っていなければその時点で圧縮表現を作ってput/updateを行う。
314 put/updateでは、ソースコード\ref{src:zput}のように指定するDSM名の先頭に"compressed"をつけることでDSは自動で圧縮状態も持つようになる。さらに、take/peekもソースコード\ref{src:ztake}のようにsetKeyを実行する際にDSM名の先頭に"compressed"をつけることで圧縮形式でDSを受け取ることができる。 314 ユーザが圧縮形式での通信を行いたい場合、ソースコード\ref{src:zput}、\ref{src:ztake}のように指定するDSM名の先頭に"compressed"をつけることでCompressed DSM内部の圧縮Meta Computationが走りDSを圧縮状態で扱うようになる。
315
316
315 \begin{table}[html] 317 \begin{table}[html]
316 \lstinputlisting[label=src:zput, caption=圧縮DSのput]{source/compress_put.java} 318 \lstinputlisting[label=src:zput, caption=圧縮DSのput]{source/compress_put.java}
317 \end{table} 319 \end{table}
318 320
319 \begin{table}[html] 321 \begin{table}[html]
320 \lstinputlisting[label=src:ztake,caption=圧縮DSのtake]{source/compress_take.java} 322 \lstinputlisting[label=src:ztake,caption=圧縮DSのtake]{source/compress_take.java}
321 \end{table} 323 \end{table}
322 324
323 これによりユーザは指定するDSMを変えるだけで、他の計算部分を変えずに圧縮表現を持つDSを扱うことができる。 325 これによりユーザは指定するDSMを変えるだけで、他の計算部分を変えずに圧縮表現を持つDSを扱うことができる。ノードは圧縮されたDSを受け取った後、そのまま子ノードにflipすれば圧縮状態のまま送信されるので、送信の際の再圧縮がなくなる。
324 326 画面表示の際は{\tt asClass()}(ソースコード\ref {src:asClass} )を使うことで適切な形式でデータを取得できる。
325 ノードは圧縮されたDSを受け取った後、そのまま子ノードにflipすれば圧縮状態のまま送信されるので、送信の際の再圧縮がなくなる。 327 {\tt asClass()}はDSを目的の型にcastするメソッドであり、ReceiveData.classが圧縮表現だけを持っている場合はこのメソッド内で解凍してcastを行っている。
326 また、画面表示の際は{\tt asClass()}(ソースコード\ref {src:asClass} )を使うことで適切な形式でデータを取得できる。 328 これによりDSの表現を必要になったときにその場で作成できる。
327 {\tt asClass()}はDSを目的の型にcastするメソッドであり、圧縮されていれば解凍してcastを行っている。
328 これにより必要なDSを必要な時にだけ解凍できる。
329 329
330 \begin{table}[html] 330 \begin{table}[html]
331 \lstinputlisting[label=src:asClass, caption=asClassの処理]{source/asClass.java} 331 \lstinputlisting[label=src:asClass, caption=asClassの処理]{source/asClass.java}
332 \end{table} 332 \end{table}
333 333
334 \subsection{パケットの再設計} 334 \subsection*{「パケットの再設計」}
335 2.5で述べたように、Remoteからputされたデータは必ずシリアライズ化されておりbyteArrayで表現される。 335 2章「Data Segmentの表現」で述べたように、Remoteからputされたデータは必ずシリアライズ化されておりbyteArrayで表現される。
336 しかし、データの表現に圧縮形式を追加したことで、RemoteからでもputされたbyteArrayが圧縮されているのかそうでないのかが判断できなくなった。 336 しかし、データの表現に圧縮形式を追加したことで、RemoteからでもputされたbyteArrayが圧縮されているのかそうでないのかが判断できなくなった。
337 337
338 そこで、データの状態を表すフラグをヘッダに含めてパケットを構成するように変更した。 338 そこで、データの状態を表すフラグをヘッダに含めてパケットを構成するように変更した。
339 Aliceの通信におけるヘッダにあたるCommandMessage.class(ソースコード\ref {src:CommandMessage}にシリアライズ状態表すフラグと、圧縮状態を表すフラグを追加した。 339 Aliceの通信におけるヘッダにあたるCommandMessage.class(ソースコード\ref {src:CommandMessage})にシリアライズ状態表すフラグと、圧縮状態を表すフラグを追加した。
340 これによってputされたDSMはフラグに応じた適切な形式でReceiveData.class内にDSを格納できる。 340 これによってputされたDSMはフラグに応じた適切な形式でReceiveData.class内にDSを格納できる。
341 また、CommandMessage.classに圧縮前のデータサイズも追加したことで、適切な解凍が可能になった。 341 また、CommandMessage.classに圧縮前のデータサイズも追加したことで、適切な解凍が可能になった。
342 342
343 \begin{table}[html] 343 \begin{table}[html]
344 \lstinputlisting[label=src:CommandMessage, caption=変更後のCommandMessage]{source/CommandMessage.java} 344 \lstinputlisting[label=src:CommandMessage, caption=CommandMessage]{source/CommandMessage.java}
345 \end{table} 345 \end{table}
346 346
347 \begin{table}[htbp] 347 \begin{table}[htbp]
348 \caption{CommandMessageの変数名の説明} 348 \caption{CommandMessageの変数名の説明}
349 \label{tb:variable} 349 \label{tb:variable}
380 380
381 次に、Aliceが実用的なアプリケーションを記述するために必要なMeta Computationとして、データの多態性を実現し、指定するDSMの切り替えで扱うデータ表現を変えるようにした。 381 次に、Aliceが実用的なアプリケーションを記述するために必要なMeta Computationとして、データの多態性を実現し、指定するDSMの切り替えで扱うデータ表現を変えるようにした。
382 これにより、必要に応じた形式を扱うことができ、ユーザが記述するComputation部分を大きく変えずに自由度の高い通信を行うことが可能になった。 382 これにより、必要に応じた形式を扱うことができ、ユーザが記述するComputation部分を大きく変えずに自由度の高い通信を行うことが可能になった。
383 同様の手法を用いれば、圧縮形式以外にも暗号形式・JSON形式などの複数のデータ表現をユーザに扱いやすい形で拡張することができる。 383 同様の手法を用いれば、圧縮形式以外にも暗号形式・JSON形式などの複数のデータ表現をユーザに扱いやすい形で拡張することができる。
384 384
385 今後の課題としては、より実用的なアプリケーションを記述するために、データの永続性の確保等が挙げられる。 385 今後の課題としては、圧縮機能をAliceVNCで用いることで有効性を測る必要がある。また、AliceのMeta ComputationにProxy機能を実装することで、TreeVNCでは実装が困難であったNAT越えの機能を提供できると期待される。
386 現在のAliceはOn memoryであるためプロセスの終了とともにDS全て失われてしまう。この問題を解決するには、DSを他のKey Value Store等のシステムに保存し、永続性を確保する必要がある。
387 386
388 \nocite{*} 387 \nocite{*}
389 %\nocite{opencl} 388 %\nocite{opencl}
390 %\nocite{opencl:ref} 389 %\nocite{opencl:ref}
391 %\nocite{opencl:applied} 390 %\nocite{opencl:applied}