changeset 4:e950b7aaeeaa

add about Christie
author ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
date Wed, 12 Jan 2022 01:52:39 +0900
parents e655f81a0c76
children d8f93db60366
files Paper/.DS_Store Paper/chapter/4-Christie.tex Paper/fig/.DS_Store Paper/images/ChristieClass.pdf Paper/images/TopologyManager.graffle.graffle Paper/images/TopologyManager.pdf Paper/images/newGearsReletion.graffle.graffle Paper/images/newGearsReletion.pdf Paper/master_paper.pdf Paper/src/HelloWorldCodeGear.java Paper/src/StartHelloWorld.java
diffstat 11 files changed, 185 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
Binary file Paper/.DS_Store has changed
--- a/Paper/chapter/4-Christie.tex	Tue Jan 11 00:39:04 2022 +0900
+++ b/Paper/chapter/4-Christie.tex	Wed Jan 12 01:52:39 2022 +0900
@@ -1,12 +1,13 @@
 \chapter{分散フレームワークChristie}
 分散フレームワークChristieは当研究室が開発するJava言語で記述された分散フレームワークである。
 Christieは将来的にGearsOSに組み込むことが考えられており、CbCと似てはいるが異なった別のGearという概念が存在している。
+
 また、分散処理を行う複数のノード接続を任意の形のTopologyに自動で形成してくれる機能である、TopologyManagearが存在する。
 Christieではノード同士の接続を煩雑な記述を行うことなく、TopologyManagerに一任することで簡潔な記述で分散処理が行える。
 
 
 \section{gear概念}
-Christieのgearは四種類存在する。
+Christieのgearは四種類存在し、以下のように名付けられている。
 
 \begin{quote}
  \begin{itemize}
@@ -16,3 +17,148 @@
   \item DataGearManager(以下DGM)
  \end{itemize}
 \end{quote}
+
+CodeGearはクラスやスレッドに相当する。
+DataGearは変数データであり、CodeGear内でアノテーションを用いて記述する。
+また、ChristieのDataGearはkeyとデータがペアで管理されている。
+この二点はGearsOSと同様の名称であり、
+CodeGearをDataGearを介してCodeGearへの遷移を繰り返す形がChristieの仕組みの根幹となる点がGearsOSと類似点であると言える。
+
+CodeGearManagerはいわゆるノードに相当している。
+CodeGearManagerはCodeGearを管理し、CodeGearに必要なDataGearが揃った場合にそのCodeGearをWorkerで実行する。
+また、CodeGearManagerはそれぞれ独立したDataGearManagerを所持している。
+DataGearManagerはデータプールに相当しており、put操作された全てのDataGearがkeyとデータのペアで保存されている。
+また、DataGearManagerはLocalDataGearManagerとRemoteDataGearManagerに区分される。
+図\ref{fig:gearsRelation}にChristieのGearの関係図を示す。
+
+\begin{figure}[tb]
+    \begin{center}
+        \includegraphics[width=150mm]{./images/newGearsReletion.pdf}
+    \end{center}
+    \caption{ChristieのそれぞれのGear関係図}
+    \label{fig:gearsRelation}
+\end{figure}
+
+\section{LocalDGMとRemoteDGM}
+DataGearManagerはLocalDGMとRemoteDGMの二種類が存在する。
+LocalDGMは所有しているCodeGearManager自身に対応するDGMである。
+LocalDGMにput操作を行うことで自身の持つkeyに対してDataGearを送ることができる。
+
+RemoteDGMは別のCodeGearManagerが持つLocalDGMのploxyに相当する。
+つまり、RemoteDGMは別のCodeGearManagerに必ず対応しており、
+RemoteDGMにput操作すると対応したCGMが持つLocalDGMへDataGearをputすることができる。
+図\ref{fig:gearsRelation}に示す。
+
+ChristieのノードどおしのやりとりはこのRemoteDGMを介して行われる。
+つまりRemoteDGMを作成することはノードどおしの接続を行うことにあたる。
+また、RemoteDGMは単方向の通信にあたるため、複数のノードを双方向で通信させたい場合は双方に相手のRemoteDGMを作る必要がある。
+
+
+\begin{figure}[tb]
+    \begin{center}
+        \includegraphics[width=150mm]{./images/Remote_DataGearManager.pdf}
+    \end{center}
+    \caption{RemoteDGMを介したノード接続}
+    \label{fig:gearsRelation}
+\end{figure}
+
+
+\section{DataGearアノテーション}
+CodeGearには処理に必要なDataGearを記述する必要がある。
+DataGearの取り出し操作は以下の四つに分けられる。
+
+\begin{description}
+\item[Take] 先頭のDGを読み込み、そのDGを削除する、DGが複数ある場合、この動作を用いる。
+\item[Peek] 先頭のDGを読み込むが、DGが削除されない、そのため、特に操作をしない場合は同じデータを参照し続ける。
+\item[TakeFrom(Remote DGM name)] RemoteDGM nameを指定することで、その接続先(Remote)のDGMからTake操作を行える。
+\item[PeekFrom(Remote DGM name)] RemoteDGM nameを指定することで、その接続先(Remote)のDGMからPeek操作を行える。
+\end{description}
+
+DataGearの呼び出しはTake操作が基本となる。
+Peek操作は特定のDGを参照し続けたい場合に用いるが、Peekアノテーションを単独で用いる場合、
+処理次第では無限ループが生じてしまう場合があるため気をつける必要がある。
+
+
+
+\section{Christieのプログラミング例}
+ソースコード\ref{src:SHW}\ref{src:HWCG}にChristieの簡単なプログラム例を示す。
+
+StartCodeGearを継承したソースコード\ref{src:SHW}、StartHelloWorldはCbCやC言語におけるmain部分に相当する。
+main部分ではCodeGearManagerをポート番号指定することで作成を行う。
+また、CGMに対して処理させたいCodeGearをsetupという処理でCGMが所持するThread Poolに追加、
+RemoteDGMの作成などを行う。
+
+CodeGearを継承したソースコード\ref{src:HWCG}、OddCodeGearはCodeGearとなる。
+CodeGearはCGMにsetupされ、また必要なDataGearが全て揃うことで初めてCGMに実行される。
+CodeGear内部で次に処理したいCodeGearをCGMにsetupすることもできる。
+
+\begin{lstlisting}[frame=lrbt,label=src:SHW,caption={StartOddEven}]
+package christie.example.OddEven;
+
+import christie.codegear.CodeGearManager;
+import christie.codegear.StartCodeGear;
+
+public class StartOddEven extends StartCodeGear {
+
+    public StartOddEven(CodeGearManager cgm) {
+        super(cgm);
+    }
+
+    public static void main(String[] args){
+        int finishCount = 10;
+        CodeGearManager odd = createCGM(10001);
+        CodeGearManager even = createCGM(10002);
+        odd.setup(new OddCodeGear());
+        even.setup(new EvenCodeGear());
+        odd.createRemoteDGM("even","localhost",10002);
+        even.createRemoteDGM("odd","localhost", 10001);
+        odd.getLocalDGM().put("odd", 1);
+        odd.getLocalDGM().put("finishCount",finishCount);
+        even.getLocalDGM().put("finishCount", finishCount);
+
+    }
+}
+\end{lstlisting}
+
+\begin{lstlisting}[frame=lrbt,label=src:HWCG,caption={OddCodeGear}]
+package christie.example.OddEven;
+
+import christie.annotation.Peek;
+import christie.annotation.Take;
+import christie.codegear.CodeGear;
+import christie.codegear.CodeGearManager;
+
+public class OddCodeGear extends CodeGear {
+    Take
+    int odd;
+
+    Peek
+    int finishCount;
+
+    Override
+    protected void run(CodeGearManager cgm) {
+        System.out.println(odd + " : odd");
+        if (finishCount + 1 != odd) {
+        getDGM("even").put("even", odd + 1);
+        cgm.setup(new OddCodeGear());
+        }
+    }
+}
+\end{lstlisting}
+
+
+\section{TopologyManager}
+Christieにはノード接続のTopologyを自動形成するための機能であるTopologyManagerが備わっている。
+通常の分散処理プログラムの記述の際にはノードどうしの接続形成は煩雑な記述が必要となってしまう。
+ChristieではこのTopologyManagerに通信接続を一任することにより、気軽に通信形成が行えるようになる。
+正確にはTopologyに参加を表明したノードに対して名前を与え、任意のTopologyの形に従って各ノードにRemoteDGMを作成させる。
+
+Chrisitieに存在しているTopologyManagerの形成方法として静的Topoplogyと動的Topologyがある。
+静的Topologyはプログラマが任意の形のTopoplogyとノードの配線をdotファイルに記述し、TopologyManagerに参照させることで
+自由な形のTopologyを形成する。
+現時点では静的TopologyでのTopology形成はdotファイルに記述した参加ノード数に実際に参加するノードの数が達していない場合、
+動作しないという制約が存在している。
+
+動的TopologyはTopologyManager内にすでに設計されたTopologyの形状を選択した上で
+参加を表明したノードに対して自動的にノードの配線を行う。
+例えばTreeを構成する場合、参加したノードから順番にrootから近い役割を与えていく。
Binary file Paper/fig/.DS_Store has changed
Binary file Paper/images/ChristieClass.pdf has changed
Binary file Paper/images/TopologyManager.graffle.graffle has changed
Binary file Paper/images/TopologyManager.pdf has changed
Binary file Paper/images/newGearsReletion.graffle.graffle has changed
Binary file Paper/images/newGearsReletion.pdf has changed
Binary file Paper/master_paper.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/HelloWorldCodeGear.java	Wed Jan 12 01:52:39 2022 +0900
@@ -0,0 +1,19 @@
+package christie.example.HelloWorld;
+
+import christie.annotation.Peek;
+import christie.annotation.Take;
+import christie.codegear.CodeGear;
+import christie.codegear.CodeGearManager;
+
+public class HelloWorldCodeGear extends CodeGear {
+
+    \@Take
+    String helloWorld;
+
+    @Override
+    protected void run(CodeGearManager cgm) {
+        System.out.print(helloWorld + " ");
+        cgm.setup(new HelloWorldCodeGear());
+        cgm.getLocalDGM().put(helloWorld,helloWorld);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/StartHelloWorld.java	Wed Jan 12 01:52:39 2022 +0900
@@ -0,0 +1,19 @@
+package christie.example.HelloWorld;
+
+import christie.codegear.CodeGearManager;
+import christie.codegear.StartCodeGear;
+
+public class StartHelloWorld extends StartCodeGear {
+
+    public StartHelloWorld(CodeGearManager cgm) {
+        super(cgm);
+    }
+
+    public static void main(String[] args){
+        CodeGearManager cgm = createCGM(10000);
+        cgm.setup(new HelloWorldCodeGear());
+        cgm.setup(new FinishHelloWorld());
+        cgm.getLocalDGM().put("helloWorld","hello");
+        cgm.getLocalDGM().put("helloWorld","world");
+    }
+}