changeset 13:e40d7a603b3f

update Christie chapter
author riono <e165729@ie.u-ryukyu.ac.jp>
date Wed, 26 Jan 2022 23:07:23 +0900
parents 6116a8fe4a53
children d76af2a472b9
files Paper/chapter/1-Christie.tex Paper/images/LocalRemoteCommunication.graffle Paper/images/LocalRemoteCommunication.pdf Paper/images/TreeConfig.graffle Paper/images/TreeConfig.pdf Paper/master_paper.pdf Paper/src/CodeGearExample.java Paper/src/CountObject.java Paper/src/InputDG.java Paper/src/RemoteDGMCommunication.java Paper/src/StartCGExample.java
diffstat 11 files changed, 131 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/Paper/chapter/1-Christie.tex	Sun Jan 09 22:45:03 2022 +0900
+++ b/Paper/chapter/1-Christie.tex	Wed Jan 26 23:07:23 2022 +0900
@@ -7,7 +7,7 @@
 データを受け取る際にObject型で受け取っているため、送信元を辿らない限り何の型が送信されているか不明瞭である。
 
 
-それらの問題点を解消するためにAliceを再設計され、作成されたものがChristieである。
+それらの問題点を解消するためにAliceを再設計し、作成されたものがChristieである。
 ChristieではAliceの機能や概念を維持しつつ、Aliceで発生していた問題点やプログラムを煩雑さなどを解消している。
 
 
@@ -66,10 +66,15 @@
 通常のRunnableクラスでは引数を受け取ることができないが、
 CodeGearExecutorというRunnableのMeta Computationを挟んだことでCGMを受け渡しながらの記述を可能にしている。
 
-
 DGMに対してput操作を行うことでDGM内のqueueにDGを保管できる。
 DGを取り出す際には、CG内で宣言した変数データにannotationを付ける。
-DGのannotationには以下の4種類がある。
+
+
+\section{annotationを使用したデータの記述}
+
+ChristieではDGの指定にannotationを使用する。 annotationとはクラスやメソッド、パッケージに対して付加情報を記述できる
+Java のMeta Computationである。先頭に@を付けることで記述でき、オリジナルのannotationを定義することもできる。
+Christieのannotationには以下の4種類がある。
 
 \begin{description}
   \item[Take] 先頭のDGを読み込み、そのDGを削除する。
@@ -78,10 +83,7 @@
   \item[PeekFrom(Remote DGM name)] Peekと処理動作は同じであるが、 Remote DGM nameを指定することで、その接続先(Remote)のDGMからPeek操作を行うことができる。 
 \end{description}
 
-\section{annotationを使用したデータの記述}
 
-ChristieではDGの指定にannotationを使用する。 annotationとはクラスやメソッド、パッケージに対して付加情報を記述できる
-Java のMeta Computationである。先頭に@を付けることで記述でき、オリジナルのアノテーションを定義することもできる。
 DGの宣言には型と変数を直接宣言し、変数名としてkeyを記述する。 そして、その宣言の上にannotationでTakeまたはPeekを指定する(ソースコード\ref{src:TakeExample})。
 
 
@@ -99,6 +101,72 @@
 \lstinputlisting[label=src:TakeFromExample, caption=TakeFromの例]{src/TakeFrom.java}
 
 
+\section{データの型整合性}
+Aliceでは送受信するデータはReceive型という専用の型を使用していた。
+内部のデータ自体はobject型だったため、元データの型を知るためには送信元を確認する必要があった。
+ChristieではannotationでDGの宣言を行っているため、直接変数の型を宣言することが可能となっている。
+ソースコード\ref{src:InputDGExample}はDGのデータを扱う例である。
+
+\lstinputlisting[label=src:InputDGExample, caption=DGのデータを扱う例]{src/InputDG.java}
+
+DGとして宣言した変数の型は、JavaのreflectionAPIを用いてCGMで保存され、LocalやRemoteノードと通信する際に適切な変換が行われれる。
+この様にプログラマが指定せずとも正しい型でデータを取得できるため、プログラマの負担を減らし信頼性を保証することができる。
+
+\newpage
+
+\section{CodeGearの記述方法}
+以下のソースコード\ref{src:StartCGExample}、\ref{src:CGExample}、\ref{src:CounteObj}はLocalDGMにputしたDGを取り出して表示し、
+インクリメントして10回繰り返す例題である。
+
+\lstinputlisting[label=src:StartCGExample, caption=StartCodeGearの記述例]{src/StartCGExample.java}
+\lstinputlisting[label=src:CGExample, caption=CodeGearの記述例]{src/CodeGearExample.java}
+\lstinputlisting[label=src:CounteObj, caption=DGとして送信されるオブジェクトのクラス]{src/CountObject.java}
+
+Chrisiteでは、StartCodeGear(以下StartCG)から処理を開始する。
+StartCGはStartCodeGear.javaを継承することで記述可能である。
+
+StartCGを記述する際には、createCGMメソッドによりCGMを生成する必要がある(ソースコード\ref{src:StartCGExample} 5行目)。
+createCGMの引数にはremoteノードとソケット通信をする際に使用するポート番号を指定する。
+CGMを生成した際にLocalDGMやremoteと通信を行うためのDaemonも生成される。
+
+
+CGに対してannotationから待ち合わせを実行する処理はsetupメソッドが行う。
+そのためソースコード\ref{src:StartCGExample}の6行目、ソースコード\ref{src:CGExample}の10行目のように、
+CGのインスタンスをCGMのsetupメソッドに渡す必要がある。
+そのためどこでもCGの待ち合わせを行うことができず、必ずCGMの生成を行う必要がある。
+その制約により、複雑になりがちな分散プログラミングのコードの可読性を高めている。
+実行されたCGを再度実行する場合にも、CGのインスタンスを生成してsetupメソッドに渡す。
+
+
+\section{DataGearManagerの複数立ち上げ}
+AliceではLocalDGMと同じ機能のLocalDataSegmentManagaer(以下LocalDSM)がstaticで実装されていたため、複数のLocalDSMを立ち上げることができなかった。
+しかしChristieではCGMの生成に伴いLocalDGMも生成されるため、複数作成が可能である。
+複数のLocalDGM同士のやり取りも、Remoteへの接続と同じ様に相手をRemoteDGMとしてproxyとして立ち上げることでアクセス可能である(図\ref{fig:LocalRemoteCommunication})。
+
+\begin{figure}[htb]
+  \begin{center}
+      \includegraphics[width=150mm]{images/LocalRemoteCommunication.pdf}
+  \end{center}
+  \caption{RemoteDGMを介したCGM間の通信}
+  \label{fig:LocalRemoteCommunication}
+\end{figure}
+
+\newpage
+
+ソースコード\ref{src:2LocalDGM}はLocalDGMを2つ立ち上げ、お互いをremoteに見立てて通信する例である。
+6行目にあるように、RemoteDGMを立ち上げるにはCGMが持つcreateRemoteDGMメソッドを用いる。
+引数にはRemoteDGM名と接続するremoteノードhost名、ポート番号を指定している。
+
+\lstinputlisting[label=src:2LocalDGM, caption=LocalDGMを2つ作る例]{src/RemoteDGMCommunication.java}
+
+remoteへの接続と同じ様にアクセスが可能になっており、コードを変更せずに同一マシン上の1つのアプリケーション内で分散アプリケーションのテストが可能となっている。
+
+
+また、CGMは内部に同一プロセス全てのCGMリストをstaticで持っており、複数生成したCGMを全て管理している。
+つまり、メタレベルではRemoteDGMを介さずに各LocalDGMに相互アクセス可能である。
 
 
 
+\section{通信フロー}
+
+
Binary file Paper/images/LocalRemoteCommunication.graffle has changed
Binary file Paper/images/LocalRemoteCommunication.pdf has changed
Binary file Paper/images/TreeConfig.graffle has changed
Binary file Paper/images/TreeConfig.pdf has changed
Binary file Paper/master_paper.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/CodeGearExample.java	Wed Jan 26 23:07:23 2022 +0900
@@ -0,0 +1,17 @@
+public class CodeGearExample extends CodeGear {
+    @Take
+    public CountObject count;
+
+    @Override
+    protected void run(CodeGearManager cgm) {
+        System.out.println(count);
+        
+        if (count < 10) {
+            cgm.setup(new CodeGearExample());
+            count.number += 1;
+            put("count", count);
+        } else {
+            cgm.getLocalDGM().finish();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/CountObject.java	Wed Jan 26 23:07:23 2022 +0900
@@ -0,0 +1,8 @@
+@Message
+public class CountObject {
+    public int number;
+
+    public CountObject(int number) {
+        this.number = number;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/InputDG.java	Wed Jan 26 23:07:23 2022 +0900
@@ -0,0 +1,9 @@
+public class GetData extends CodeGear {
+    @Take
+    public String name;
+
+    @Override
+    protected void run(CodeGearManager cgm) {
+        System.out.println("This name is:" + name);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/RemoteDGMCommunication.java	Wed Jan 26 23:07:23 2022 +0900
@@ -0,0 +1,13 @@
+public class StartRemoteTake {
+    public StartRemoteTake(CodeGearManager cgm) { super(cgm); }
+    
+    public static void main(String args[]) {
+        CodeGearManager cgm1 = createCGM(10001);
+        cgm1.createRemoteDGM("cgm2", "localhost", 10002);
+        cgm1.setup(new RemoteTakeTest());
+
+        CodeGearManager cgm2 = createCGM(10002);
+        cgm2.createRemoteDGM("cgm1", "localhost", 10001);
+        cgm2.setpu(new RemoteTakeTest());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/StartCGExample.java	Wed Jan 26 23:07:23 2022 +0900
@@ -0,0 +1,10 @@
+public class StartCGExample extends StartCodeGear {
+    public StartCGExample(CodeGearManager cgm) { super(cgm); }
+
+    public static void main(String args[]) {
+        CodeGearManager cgm = createCGM(10001);
+        cgm.setup(new CodeGearExample());
+        CountObject count = new CountObject(1);
+        cgm.getLocalDGM().put("count", count);
+    }
+}
\ No newline at end of file