Mercurial > hg > Papers > 2022 > riono-master
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{通信フロー} + +
--- /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