# HG changeset patch # User gi # Date 1419664016 -32400 # Node ID cf3a4335c64aae7df52c497f82bdb4cb4419c903 # Parent 295b393a7134a42553f206159434171b0f199114 add source code and modify chapters diff -r 295b393a7134 -r cf3a4335c64a paper/chapter1.tex --- a/paper/chapter1.tex Mon Dec 22 13:34:29 2014 +0900 +++ b/paper/chapter1.tex Sat Dec 27 16:06:56 2014 +0900 @@ -1,6 +1,47 @@ \chapter{分散フレームワーク Alice の概要} \label{chapter:chapter1} -\section{Code Segment} + + +\section{Data Segment} +Data Segmentはデータを細かく分割したものであり、数値や文字列などのデータを構造的に保持する。AliceはData Segmentをデータベースとして扱っている。Data Segmentには必ず対になるKeyが存在する。つまりKey Value Storeとして考える事ができる。 + +Aliceのデータベースは通常のKVSとは異なっている点がある。通常のKVSはプログラミング言語の連想配列やMapと同様に 「Key(キー)」と「Value(値)」がペアとなっている。そのため1つのKeyに対して値は1つである。しかし、Aliceの場合は「Key」と「Queue」がペアとなっているため、Keyに対して複数回putできる。従って取得できるValueも複数存在できる。便宜上これをKey Value Queueと呼ぶものとする。Key毎の追加と取得はLindaに準じた設計になっている。 + +Data SegmentはData Segment Manager(以下DSM)によって管理されている。ノード毎にLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のKVSとなっている。従ってRemote DSMを指定するKeyはノード内部でuniqueなものである。Remote DSMは他のノードのLocal DSMのproxyと考えられる。つまりRemote DSMは複数存在し、それぞれに対応するノードは異なる。 + +KVQへのアクセスはqueueによって、ノード内部で逐次化される。それ以外は、すべてJavaのThread Poolにより並列実行される。 +\subsection{Data Segment API} +以下が用意されているData Segment APIである。これらを用いてデータの送受信を行う。 +\begin{itemize} +\item {\ttfamily void put(String key, Object val)} +\item {\ttfamily void update(String key, Object val)} +\item {\ttfamily void peek(Receiver receiver, String key)} +\item {\ttfamily void take(Receiver receiver, String key)} +\end{itemize} +\subsubsection{put} +putはデータをQueueに追加するためのAPIである。Lindaのout()に相当する +\subsubsection{update} +updateはデータを置き換える特急メッセージのように動作する。Lindaのupdate()に相当する。 +\subsubsection{peek} +peekはデータを読み込むAPIである。読み込まれたデータはQueueに残る。要求したデータが存在しなければ、Code Segmentの待ち合わせ (Blocking)が起こる。putやupdateによりデータに更新があった場合、peekが直ちに実行される。Lindaのread()に相当する。 +\subsubsection{take} +takeもデータを読み込むためのAPIである。読み込まれたデータはQueueから削除される。Lindaのin()に相当する。 +\subsection{Data Segment の表現} + + \section{Meta Data Segment} +\section{Code Segment} +Code SegmentとはAlice上で実行されるタスクの単位である。ユーザーはCode Segmentを組み合わせることでプログラミングを行う。Code Segmentをユーザーが記述する際に、内部で使用するData Segmentの作成を記述する。入力時のData SegmentをInput Data Segment、出力時をOutput Data Segmentと呼ぶ。Input Data SegmentとOutput Data SegmentによってCode Segmentの間の依存関係が自動的に記述される。 + +Input Data Segment と Output Data SegmentはCode Segmentに用意されているAPIを用いて作成する。 +Input Data Segmentは、LocalかRemoteか、またkeyを指定する必要がある。Code Segmentは、記述したInput Data Segmentが全て揃うとThread poolに送られ、実行される。 + +Out Data SegmentもLocalかRemoteか、またkeyを指定する必要がある。 + +現在、Inputの場合はsetKeyを呼ぶ際、Outputはput(またはupdate)の際にノードとkeyの指定を行っている。 +しかし、どの時点でノードとkeyの指定を行えばよいか、どのようなAPIを用意するべきかは、議論の余地がある。 + \section{Meta Code Segment} -\section{Meta Data Segment} -\section{Topology Manager} \ No newline at end of file + +\section{Topology Manager} + +\section{Aliceによるプログラミング手法} \ No newline at end of file diff -r 295b393a7134 -r cf3a4335c64a paper/chapter2.tex --- a/paper/chapter2.tex Mon Dec 22 13:34:29 2014 +0900 +++ b/paper/chapter2.tex Sat Dec 27 16:06:56 2014 +0900 @@ -1,4 +1,4 @@ -\chapter{Aliceを使った例題} \label{chapter:chapter3} +\chapter{Aliceを使った例題} \label{chapter:chapter2} \section{AliceVNC} \section{水族館の例題(JavaFx)} \section{Jungle} \ No newline at end of file diff -r 295b393a7134 -r cf3a4335c64a paper/chapter3.tex --- a/paper/chapter3.tex Mon Dec 22 13:34:29 2014 +0900 +++ b/paper/chapter3.tex Sat Dec 27 16:06:56 2014 +0900 @@ -1,17 +1,41 @@ \chapter{Aliceの新機能} \label{chapter:chapter3} +水族館の例題によって、Aliceを用いて分散プログラムを記述可能であることが証明された。 +しかし、実用的なアプリケーションを記述するには、まだ機能が足りないと予測される。 +そこで、当研究室で開発を行っているTreeVNCをAlice上で実装することで、Aliceに必要な機能を洗い出した。 + \section{Dynamic Topologyへの対応} -第2章で示したように分散フレームワークAliceはTopology Fileを読み込むことでTopologyを構成する。つまり、予め参加するノードの台数が決まっている必要がある。また、Topologyに全ノードが参加するまでアプリケーションが起動しない。 -しかし、実際のアプリケーションでは、参加するノードの数は決まっていないため、Topologyを動的に変化させる必要がある。そこで、起動時にTopology Fileの代わりにTopologyを指定して起動させることで、ノードがTopologyに順次追加されるよう機能を追加した。 +第2章で示したように分散フレームワークAliceはTopology Fileを読み込むことでTopologyを構成する。 +つまり、予め参加するノードの台数が決まっている必要がある。また、Topologyに全ノードが参加するまでアプリケーションが起動しない。 +しかし、実際のアプリケーションでは、参加するノードの数は決まっていないため、Topologyを動的に変化させる必要がある。 +そこで、Topology Fileの代わりにTopologyを指定して起動させた場合、ノードがTopologyに従い、順次追加されるようにTopology Managerに機能を追加した。 + +\begin{table}[htbp] +\lstinputlisting[label=fig:TopologyManager, caption=Topology Managerの起動方法]{source/TopologyManager.sh} +\end{table} + +現在は、TreeVNCのTopologyである木構造のみ指定可能である。引数Childの後に子供の数を指定することで2分木だけではなく3分木などのTopologyを作ることができる。デフォルトでは2分木になっている。 +\section{Keep Alive} +ノード間の通信は、Remote Data Segmentに対してputやpeekを行うことでのみ発生する。従って、Code Segmentの実装次第では、長時間通信が行われない可能性がある。通信が行われない間にRemote Data Segmentとの接続が切れた場合、切断されたことを通信が行われるまで確認することができない。また、接続状態ではあるが問題が発生し、応答に時間がかかる、もしくは応答しない可能性がある。 +以上の問題を検知するために、定期的にheart beatを送り生存確認を行なうDeamonとしてKeep Aliveを実装した。 +一定時間内にノードから応答がない場合、Keep Aliveにより、そのノードのRemote Data Segmentが切断される。 -source code +\section{切断時の処理} +DataBaseではデータ更新の際にトランザクション処理に障害が起こった場合、DataBase側でトランザクション処理開始前に戻すロールバックという処理が行われる。 +同様にTreeVNCでは切断を検知した場合、LostParentというメッセージがトップノードに対して送信される。 +以上の例のように、アプリケーションはノードの切断に対する処理を用意したい場合がある。 +しかし、Aliceを用いたアプリケーションの場合、アプリケーション側で検知するのは難しい。 +切断自体は、Remote Data Segmentに対してwriteまたはreadを行った際に出るExceptionにより判断することができる。 +だが、I/O の処理はCode Segmentを実行するThreadで行われず、専用のI/O Threadによって行われるためCode SegmentでExceptionを捕まえられない。 +そこで、Aliceが切断を検知、管理する機能 (ClosedEventManager)を追加した。 +アプリケーション側でClosedEventManagerにCode Segmentを登録することで切断時に任意のCode Segmentを実行することができる。 +また、切断したRemote Data Segmentの情報を利用したい場合は、Code Segmentをextends する代わりにClosed Event Code Segmentをextendsし、用意されているMethodを使うことで取得可能である。 -現在は、TreeVNCのTopologyである木構造のみ指定可能である。 - -\section{heart beat} -ノード間の通信は、RemoteDataSegmentに対してputやpeekを行うことでのみ発生する。従って、CodeSegmentの実装によっては長時間通信が行われない可能性がある。 -\section{切断時の処理} \section{再接続の処理} -\section{Multicast} +\section{Multicast Data Segment} +TreeVNCには、Multicastを利用して起動しているTreeVNCのRoot Nodeの情報の一覧にして表示する接続先自動検索システムという機能がある。この機能によりTreeVNCの起動の際にIPアドレスを入力する手間を省くことができる。 + +現在のAliceは起動時にTopology ManagerのIPアドレスを入力する必要がある。そこで、Aliceにも同様なTopology Manager検索システムを実装するためにMulticast Data Segmentを追加した。 +Multicast Data Segmentは同じマルチキャストアドレスを持つ端末を1つのRemote Data Segmentとして扱う。 \ No newline at end of file diff -r 295b393a7134 -r cf3a4335c64a paper/source/TopologyManager.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/TopologyManager.sh Sat Dec 27 16:06:56 2014 +0900 @@ -0,0 +1,1 @@ +java -cp Alice.jar alice.topology.manager.TopologyManager -p 10000 --Topology tree --Child NUM \ No newline at end of file