分散フレームワークAliceのPC画面配信システムへの応用

照屋のぞみ 河野真治 琉球大学 工学部 情報工学科

研究目的(1/3)

研究目的(2/3)

研究目的(3/3)

Data Segment と Code Segment

CodeSegmentの依存関係

Data Segment と CodeSegment

Data Segment Manager

Data Segment Manager

Data Segment API

Computation と Meta Computation

Computation と Meta Computation

Computation と Meta Computation

TreeVNC

AliceVNC

TreeVNCで必要な機能

TreeVNCのComputation(VNCサーバからデータを受け取り表示)を支える機能をMeta Computationとして実装する

Dynamic Topology Manager

Dynamic Topology Manager

Dynamic Topology Manager

Meta Computationの追加

転送機能の追加

圧縮表現(Meta DS)の追加

1. 一般的なJavaのオブジェクト
    LocalDSMにputしたときの形式
2. MessagePackでシリアライズ化されたバイナリオブジェクト
    RemoteDSMにputしたときの形式
3. 2をさらに圧縮したバイナリオブジェクト
    今回追加した形式

MessagePackとは

圧縮表現を扱うDSMとAPIの追加

	put("Remote", "Key", val);  
	put("compressedRemote", "Key", val);  

圧縮表現がオンデマンドに作られる

圧縮表現がオンデマンドに作られる

圧縮表現がオンデマンドに作られる

圧縮表現がオンデマンドに作られる

圧縮表現がオンデマンドに作られる

圧縮表現がオンデマンドに作られる

圧縮表現がオンデマンドに作られる

Meta Computationの評価

TreeVNCとAliceVNCを比較した

性能比較 - 実験内容

性能比較 - 実験結果

TreeVNC AliceVNC

コード量比較

行数 単語数 TightVNCからの変更行数
TreeVNC 19502 73646 7351
AliceVNC 14647 59217 1129
減少率 (%) 25 20 75

コード複雑度比較

平均値 最高値
TightVNC 13.63 97
TreeVNC 15.33 141
AliceVNC 10.95 99

Meta Computationの評価結果

Aliceと他言語等との比較(1) - Erlang

Aliceと他言語等との比較(2) - Akka

まとめ

今後の課題

今後の課題

Dynamic Topology Manager

CodeSegment の 例

CodeSegment の 例

StartCodeSegmentの例

public class RemoteStartCodeSegment extends CodeSegment {

    @Override
    public void run() {
        RemoteIncrement cs = new RemoteIncrement();//CSを生成
		ods.put("local", "num", 0);
    }

}

StartCodeSegmentの例

public class RemoteStartCodeSegment extends CodeSegment {

    @Override
    public void run() {
        RemoteIncrement cs = new RemoteIncrement();
		ods.put("local", "num", 0);//DSをLocalDSMにput
    }

}

CodeSegment の 例

public class RemoteIncrement extends CodeSegment {

    public Receiver num = ids.create(CommandType.TAKE);//DSの受け皿を作る

    public RemoteIncrement(){
		num.setKey("remote", "num");
    }

    @Override
    public void run() {
        int n = num.asClass(Integer.class);
        if (n == 10) System.exit(0);
        RemoteIncrement cs = new RemoteIncrement();
        ods.put("local", "num", ++n);
    }

}

CodeSegment の 例

public class RemoteIncrement extends CodeSegment {

    public Receiver num = ids.create(CommandType.TAKE);

    public RemoteIncrement(){
		num.setKey("remote", "num");//CSにInputDSをセット。待ち合わせが発生。
    }

    @Override
    public void run() {
        int n = num.asClass(Integer.class);
        if (n == 10) System.exit(0);
        RemoteIncrement cs = new RemoteIncrement();
        ods.put("local", "num", ++n);
    }

}

CodeSegment の 例

public class RemoteIncrement extends CodeSegment {

    public Receiver num = ids.create(CommandType.TAKE);

    public RemoteIncrement(){
		num.setKey("remote", "num");
    }

    @Override
    public void run() {
        int n = num.asClass(Integer.class);//InputDSをキャストして取得
        if (n == 10) System.exit(0);
        RemoteIncrement cs = new RemoteIncrement();
        ods.put("local", "num", ++n);
    }

}

CodeSegment の 例

public class RemoteIncrement extends CodeSegment {

    public Receiver num = ids.create(CommandType.TAKE);

    public RemoteIncrement(){
		num.setKey("remote", "num");
    }

    @Override
    public void run() {
        int n = num.asClass(Integer.class);
        if (n == 10) System.exit(0);//num=10なら終了
        RemoteIncrement cs = new RemoteIncrement();
        ods.put("local", "num", ++n);
    }

}

CodeSegment の 例

public class RemoteIncrement extends CodeSegment {

    public Receiver num = ids.create(CommandType.TAKE);

    public RemoteIncrement(){
		num.setKey("remote", "num");
    }

    @Override
    public void run() {
        int n = num.asClass(Integer.class);
        if (n == 10) System.exit(0);
        RemoteIncrement cs = new RemoteIncrement();//次のCSを生成
        ods.put("local", "num", ++n);
    }

}

CodeSegment の 例

public class RemoteIncrement extends CodeSegment {

    public Receiver num = ids.create(CommandType.TAKE);

    public RemoteIncrement(){
		num.setKey("remote", "num");
    }

    @Override
    public void run() {
        int n = num.asClass(Integer.class);
        if (n == 10) System.exit(0);
        RemoteIncrement cs = new RemoteIncrement();
        ods.put("local", "num", ++n);//インクリメントしたDSをput
    }

}