# HG changeset patch # User sugi # Date 1420516069 -32400 # Node ID 3c415702fab0f6d4bf69d7c89e02e50e604bf925 # Parent c8f50c3ead48d63797096ffe897590bb98998f0c modify chapter3 diff -r c8f50c3ead48 -r 3c415702fab0 paper/chapter3.tex --- 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 diff -r c8f50c3ead48 -r 3c415702fab0 paper/source/CatchClosedEvent.java --- 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() { diff -r c8f50c3ead48 -r 3c415702fab0 paper/source/MulticastIncrement.java --- /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); + } + +} diff -r c8f50c3ead48 -r 3c415702fab0 paper/source/MulticastStartCodeSegment.java --- /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); + } + +} diff -r c8f50c3ead48 -r 3c415702fab0 paper/source/RegisterEvent.java --- /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