changeset 6:3c415702fab0

modify chapter3
author sugi
date Tue, 06 Jan 2015 12:47:49 +0900
parents c8f50c3ead48
children a9a8f37945d4
files paper/chapter3.tex paper/source/CatchClosedEvent.java paper/source/MulticastIncrement.java paper/source/MulticastStartCodeSegment.java paper/source/RegisterEvent.java
diffstat 5 files changed, 70 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/paper/chapter3.tex	Mon Jan 05 21:16:36 2015 +0900
+++ b/paper/chapter3.tex	Tue Jan 06 12:47:49 2015 +0900
@@ -85,7 +85,11 @@
 だが、I/O の処理はCode Segmentを実行するThreadで行われない。専用のI/O Threadによって行われるため、Code Segment内でExceptionを捕まえられず、例外として処理することができない。
 
 そこで、Aliceが切断を検知した際に、任意のCode Segmentを実行できる機能 (ClosedEventManager)を追加した。
-ユーザはClosedEventManagerにCode Segmentを登録することで、切断時に例外処理として実行するCode Segmentを指定できる。
+ユーザはClosedEventManagerにCode Segmentを登録することで、切断時の処理として実行するCode Segmentを指定できる。
+\begin{table}[htbp]
+\lstinputlisting[label=src:registerEvent, caption=切断時に実行されるCode Segmentの登録方法]{source/RegisterEvent.java}
+\end{table}
+
 また、切断したRemote Data Segmentの情報を利用したい場合は、Code Segmentをextends する代わりにClosed Event Code Segmentをextendsし、用意されているMethodを使うことで取得可能である(ソースコード \ref{src:CatchClosedEvent})。
 
 \begin{table}[htbp]
@@ -101,7 +105,7 @@
 
 現在のAliceは起動時にTopology ManagerのIPアドレスを入力する必要があり、TreeVNCの接続先自動検索機能が必要と考えられる。
 その機能を実現するためにはMulticastに対応する必要がある。そこで、同じマルチキャストアドレスを持つ端末を1つのData Segmentとして扱うMuticast Data Segmentを追加した。
-Multicast Data Segmentは、Remote Data Segmentと同様のAPIを用いて扱うことができる。
+Multicast Data Segmentも他のData Segment同様、Data Segment APIを用いて扱う。
 
 \begin{figure}[htbp]
 \begin{center}
@@ -112,8 +116,10 @@
 \end{figure}
 
 図 \ref{fig:multicast}はMulticast Data Segmentを図で表したものである。Multicast Data Segmentに対してputを行うとnode D、node E、node Fの3つのnodeに対してデータがputされる。同様にTakeを行うと3つのnodeからreplyが来る。
-
-\subsection{Multicast Data Segmentの作り方}
+\subsection{Multicast Data Segmentの制限}
+Multicast Data SegmentはUDPを用いて実装されている。1つのUDPのパケットで運ぶことのできるデータが、65507bytes(65535bytesからIPヘッダの最低サイズ20bytesとUDPのヘッダのサイズ8bytesを引いた大きさ)である。
+現状、分割して送る処理をMulticast Data Segmentが持たない。従って、Multicast Data Segmentを利用する際には、データのサイズを65507bytes以下にしなければならない。
+\subsection{Multicast Data Segment Manager}
 Multicast Data SegmentもRemote Data Segment同様Managerを経由して操作を行う。Multicast DSMを作成するとMulticast Data Segmentに対する送受信用のスレッドが作成される。
 
 \begin{itemize}
@@ -125,4 +131,15 @@
 第1引数はMulticast DSMへのアクセスするためのkeyを指定できる。第2引数はマルチキャストアドレスを、第3引数はポート番号を、第4引数はネットワークインターフェイスを指定する。第5引数はSocketTypeを指定する。
 SocketTypeには、{\tt Sender}と{\tt Receiver}と{\tt Both}が存在する。{\tt Sender}を指定した場合は、第2引数で指定したマルチキャストアドレスに対して送信処理を行うスレッドを作成する。{\tt Receiver}を指定した場合は、第2引数で指定したマルチキャストアドレスに対して送信されたデータを受信するスレッドを作成する。{\tt Both}は、送受信両方のスレッドを作成する。
 
-Multicast Data Segmentとして扱いたい
\ No newline at end of file
+現在、Multicast Data Segmentは自動では作成されないため、ユーザー自身で作成する必要がある。
+
+ソースコード \ref {src:MulticastStartCodeSegment}と\ref {src:MulticastIncrement}は実際にMulticast Data Segmentを利用した例題である。例題の内容はmulticast Data Segmentに対してtakeを行い、取得したデータをインクリメントして再びputを行うものである。
+
+Multicast DSMを作成する際のSocketTypeの引数はBothであるため、ReceiverとSender両方作成される。そのため、"multicast"というkeyに対してputを行うと、自分自身に対してもData Segmentがputされる。takeもまた同様に自分自身に対してもtakeが要求され、要求に対してreplyを返すことになる。
+\begin{table}[htbp]
+\lstinputlisting[label=src:MulticastStartCodeSegment, caption=multicast DSMの作成例]{source/MulticastStartCodeSegment.java}
+\end{table}
+
+\begin{table}[htbp]
+\lstinputlisting[label=src:MulticastIncrement, caption=multicast Data Segmentの使用例]{source/MulticastIncrement.java}
+\end{table}
\ No newline at end of file
--- a/paper/source/CatchClosedEvent.java	Mon Jan 05 21:16:36 2015 +0900
+++ b/paper/source/CatchClosedEvent.java	Tue Jan 06 12:47:49 2015 +0900
@@ -1,4 +1,4 @@
-public class CatchClosedEvent extends CloseEventCodeSegment{
+public class ShowClosedNode extends CloseEventCodeSegment{
 
     @Override
     public void run() {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/source/MulticastIncrement.java	Tue Jan 06 12:47:49 2015 +0900
@@ -0,0 +1,20 @@
+public class MulticastIncrement extends CodeSegment {
+    
+    private Receiver num = ids.create(CommandType.TAKE);
+    
+    public MutlicastIncrement() {
+        num.setKey("multicast", "num");
+    }
+    
+    @Override
+    public void run() {
+        int num = this.num.asInteger();
+        System.out.println("[CodeSegment] " + num);
+        if (num == 10) System.exit(0);
+        
+        new MulticastIncrement();
+        
+        ods.put("multicast", "num", ++num);
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/source/MulticastStartCodeSegment.java	Tue Jan 06 12:47:49 2015 +0900
@@ -0,0 +1,15 @@
+public class MulticastStartCodeSegment extends CodeSegment {
+    
+    @Override
+    public void run() {
+        DataSegment.connectMulticast("multicast",
+                                     "224.0.0.1",
+                                     10000,
+                                     "en1",
+                                     SokcetType.Both);
+        
+        new MulticastIncrement();
+        ods.put("multicast", "num", 0);
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/source/RegisterEvent.java	Tue Jan 06 12:47:49 2015 +0900
@@ -0,0 +1,12 @@
+public class StartCodeSegment extends CodeSegment {
+
+    @Override
+    public void run() {
+        ClosedEventManager manager = ClosedEventManager.getInstance();
+        manager.register(ShowClosedNode.class);
+        
+        new TestCodeSegment();
+        ods.update("local", "key1", "String data");
+    }
+
+}
\ No newline at end of file