view paper/chapter2.tex @ 0:e248011df195

register repository
author sugi
date Sun, 03 Feb 2013 18:53:13 +0900
parents
children 236628ffc497
line wrap: on
line source

\chapter{分散ネットフレームワーク Alice}
\label{chap:concept}

\section{Alice}
AliceはJavaを用いて作成された分散ネットフレームワークである。本研究室で開発を行なっている並列タスク用管理フレームワークであるCeriumと先行研究であるFederated Lindaの開発を通して得られた知見を生かして本研究室卒業生である赤嶺一樹氏が設計、実装を行った。
近年のマルチコアのマシンが主流になっている背景からSEDAアーキテクチャが採用されている。SEDAアーキテクチャとは、処理ごとに分けられているステージと呼ばれるものが複数存在し、ステージでデータが処理され次第、次のステージにデータを伝搬していく処理方式である。これによってマルチコアを生かし、パイプライン的に効率よく処理することがが可能となっている。
また、本研究室が提唱している「CodeSegmentとDataSegmentという単位でプログラムを作成する」というプログラミング手法でプログラムを作成する。

\section{Data Segment API}
Data Segmentは、データ細かく分割したものであり、数値や文字列などのデータを構造体的に保持す
るが問題はData Segmentの相互参照問題である。AliceはData Segmentをデータベースとして扱う。
Data Segmentは必ずキーを持つ。つまり、Key Value Storeとして考えることができる。
通常のデータベースでは隠されているが、Key毎にキューがあり、key毎に順次実行される。

Aliceのデータベースは通常のKVSと若干異なっている点がある。通常のKVSはプログラミング言語の連想配列やMapと同様に「Key(キー)」と「Value(値)」がペアとなってる。そのためKeyに対して取得できるValueは当然1つである。しかし、Aliceの場合は「Key」と「Value」と「Index」がセットとなっているため、Keyに対して保存できる値が複数ある。そのため取得できるValueも複数存在する。
key毎の追加と取得は、Lindaに準じた設計になっている。

Data SegmentはData Segment Manager(以下DSM)によって管理されている。ノード毎にLocal DSMとRDSMが存在する。Local DSMは、各ノード固有のKey Value Storeとなっている。従って、Keyはノード内部でuniqueなものである。Remote DSMは他のノードのLocal DSMのproxyである。AliceのトポロジーマネージャーがRemote DSMを自動的に構築する。つまりRemote DSMは複数存在し、それぞれに対応するノードが異なる。

KVSへのアクセスはキューによって、ノード内部で逐次化される。それ以外は、すべてJavaのThread Poolによって並列実行される。Code Segmentが実行される際には、Data Segmentが揃っているのでBlockingが起こることはない。逆にBlockingが必要な場合は、Code Segmentを分割する必要がある。

以下の4つが用意されているData Segment APIである。これらを用いてデータの送受信を行う。

\begin{itemize}
\item {\ttfamily void put(String key, Value val)}
\item {\ttfamily void update(String key, Value val)}
\item {\ttfamily void peek(Receiver receiver, String key, int id)}
\item {\ttfamily void take(Receiver receiver, String key, int id)}
\end{itemize}

\subsection{put}
putはデータを追加するためのAPIである。putは受けとったvalをキーに毎重複しない連番のIDを受け取った順に振る。Lindaのout()に相当する。
\subsection{update}
updateはデータを置き換える特急メッセージのように動作する。 putと同様に受けとったvalをキーに毎重複しない連番のIDを受け取った順に振る。Lindaのupdate()に相当する。
\subsection{peek}
peekはデータを調べるAPIである。要求したData Segmentが存在しなければ、Code Segmentの待ち合わせ(Blocking)が起こる。

putやupdateによりData Segmentに更新があった場合、peekが直ちに実行される。目的のData Segmentを取得できた場合、Data Segmentを作成したCode Segmentがactive queueに移される。

Lindaのrd()に相当する。
\subsection{take}
takeもデータを読み込むためのAPIである。読み込まれたデータをKVSから取り除かれる。Lindaのin() に相当する。
\section{Data Segmentの実装}
\section{Code Segment}
\section{Code Segmentの実行方法}
\section{Code Segmentの起動方法}
\section{Topology Manager}