changeset 64:bc17d71e22eb

backup 2021-05-23
author autobackup
date Sun, 23 May 2021 00:10:03 +0900
parents f440c8f6f66f
children 937323467f4d
files user/riono210/sigos2021.md
diffstat 1 files changed, 203 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/user/riono210/sigos2021.md	Sat May 22 00:10:03 2021 +0900
+++ b/user/riono210/sigos2021.md	Sun May 23 00:10:03 2021 +0900
@@ -1,23 +1,220 @@
 ## 継続を使用する並列分散フレームワークのUnity実装
 
+---
 
 ### オンラインゲームにおけるデータ通信
+* オンラインゲームは複数のプレイヤーが関与する分散プログラムである
+	* 分散プログラムを正しく書くことは難しい
+	* 攻撃の標的になる場合が多い
+* クライアントの負荷軽減やチート対策のため、クライアントサーバ方式が主流である
+	* データの同期にはサーバを経由するため低速である
 
-* クライアントサーバ方式が主流である
-* 
+---
+
+### オンラインゲームにおけるデータ通信
+* 当研究室では並列分散通信フレームワークChristie を開発中である
+	* 型のあるDataGear をKey を持つストリーム、DataGearManager として格納している
+	* 他のノードはDGM のproxyを持っており、proxy に書き込むことで通信を実現している
+	* DGM はトポロジーマネージャーによって自動的に構築される
+		* プログラム自体はDGM の名前を知っていれば良い
+		* 他のノードのIP addressなどを知る必要はない
+	
+* ネットワークが切断されてもゲームは継続可能
+* ノードが接続している対象を直接知ることはできない
+	* チートに対する耐性がある
 
 
-### Christie
+* 本研究ではJava で書かれたChristieとC# で書かれたもの説明し、その機能と実装の差について考察を行う
+
+---
+
+### Christie の基礎概念
 * Christie は当研究室で開発をしている並列分散通信フレームワークである
-* 
+	* 同じく当研究室で開発しているGearsOS に導入予定のため次のような概念を持っている
+	
+* CodeGear  (クラスやスレッド)
+* DataGear  (変数データ)
+* CodeGearManager  (CG,DG,DGMを管理)
+* DataGearManager  (DGを管理,localとremoteの2種類がある, put操作によりDGを格納)  
+
+---
+
+### Christie の基礎概念
+<center><img src="https://i.imgur.com/D2MqSHi.png" alt="message" width="450" height="300"></center>
+<center>
+Christie を同一プロセスで複数インスタンス立ち上げた際の接続の構造図
+</center>
+
+* 全てのCGM はThreadPool と他のCGM をList として共有している
+* ThreadPool はCPU に合わせた並列度でqueue に入ったThread を逐次実行していく
+	* 1つのThreadPool で処理を行うことでCPU のコア数に適したThread を管理でき、並列度を下げ流ことを防ぐ
+* ThreadPoolを共有することメタレベルで全てのCG/DG にアクセス可能 
+
+---
+
+### Christie の基礎概念 annotationについて
+DG を取り出すためにCG内に宣言した変数データにannotation をつける。annotationには以下の4つがある。
+
+* Take
+	* 先頭のDG を読み込み、そのDG を削除する
+	* DG が複数ある場合Take を使用する
+* Peek
+	* 先頭のDG を読み込むがDG を削除しない
+	* 操作をしない場合は同じデータを参照し続ける
+* TakeFrom
+	* Take と同じ動作だが、remote 先のDGMを指定できる
+* PeekFrom
+	* Peek と同じ動作だが、remote 先のDGMを指定できる
+
+---
+
+### Topology Manager
+* Christie 場でNetwork Topology を形成する
+	* 参加を表明したノードに名前を与える
+	* 必要があればノード同士の配線を自動で行う
+
+* 静的Topology と動的Topology 2種類がある
+
+---
+
+### Christie のコード例
+
+``` java:StartHelloWorld.java
+public class StartHelloWorld extends StartCodeGear {
+
+    public StartHelloWorld(CodeGearManager cgm) {
+        super(cgm);
+    }
+
+    public static void main(String[] args){
+        CodeGearManager cgm = createCGM(10000);
+        cgm.setup(new HelloWorldCodeGear());
+        cgm.setup(new FinishHelloWorld());
+        cgm.getLocalDGM().put("helloWorld","hello");
+        cgm.getLocalDGM().put("helloWorld","world");
+    }
+}
+```
 
-### Christie \#のコード例
+```java:HelloWorldCodeGear.java
+public class HelloWorldCodeGear extends CodeGear {
+
+    @Take String helloWorld;
+
+    @Override
+    protected void run(CodeGearManager cgm) {
+        System.out.print(helloWorld + " ");
+        cgm.setup(new HelloWorldCodeGear());
+        cgm.getLocalDGM().put(helloWorld,helloWorld);
+    }
+}
+```
+
+```java:FinishHelloWorld.java
+public class FinishHelloWorld extends CodeGear {
+    @Take String hello;
+    @Take String world;
+
+    @Override
+    protected void run(CodeGearManager cgm) {
+        cgm.getLocalDGM().finish();
+    }
+}
+```
+
+---
+
+### Christie \# のコード例
+```cs:StartHelloWorld.cs
+public class StartHelloWorld : StartCodeGear {
+    
+    public StartHelloWorld(CodeGearManager cgm) : base(cgm) { }
+
+    public static void Main(string[] args) {
+        CodeGearManager cgm = CreateCgm(10000);
+        cgm.Setup(new HelloWorldCodeGear());
+        cgm.Setup(new FinishHelloWorld());
+        cgm.GetLocalDGM().Put("helloWorld", "hello");
+        cgm.GetLocalDGM().Put("helloWorld", "world");        
+    }
+}
+```
+
+```cs:HelloWorldCodeGear.cs
+public class HelloWorldCodeGear : CodeGear {
+    [Take] string helloWorld;
+    
+    public override void Run(CodeGearManager cgm) {
+        Console.Write(helloWorld + " ");
+        cgm.Setup(new HelloWorldCodeGear());
+        cgm.GetLocalDGM().Put(helloWorld, helloWorld);
+    }
+}
+```
+
+```cs:FinishHelloWorld.cs
+public class FinishHelloWorld : CodeGear {
+    [Take] private string hello;
+    [Take] private string world;
+
+    public override void Run(CodeGearManager cgm) {
+        cgm.GetLocalDGM().Finish();
+    }
+}
+```
 
 ### Unity
+* UnityはUnity Technologies が開発を行っているゲームエンジンである
+	* 世界で最も使用されているゲームエンジン
+	* 非常に軽く、スペックが低いノートPCでもゲーム開発が可能
+* プログラミング言語にはC# が採用されている
+	* C# のAPIやUnity向けに拡張されたAPIも使用可能
+	* 開発した機能をUnityに組み込むことも可能
+
+---
 
 ### Christie on Unityのコード例
+```cs:UnityStartHelloWorld.cs
+public class StartHelloWorld : StartCodeGear {
+    
+    public StartHelloWorld(CodeGearManager cgm) : base(cgm) { }
 
-### annotationの実装例
+    public  void RunCodeGear(CodeGearManager cgm) {
+        cgm.Setup(new HelloWorldCodeGear());
+        cgm.Setup(new FinishHelloWorld());
+        cgm.GetLocalDGM().Put("helloWorld", "hello");
+        cgm.GetLocalDGM().Put("helloWorld", "world");
+    }
+}
+```
+
+```cs:UnityHelloWorld.cs
+public class HelloWorld : MonoBehaviour {
+    void Start() {
+        CodeGearManager cgm = StartCodeGear.CreateCgm(10000);
+        var helloWorld = new StartHelloWorld(cgm);
+        helloWorld.RunCodeGear(cgm);
+    }
+}
+```
+
+---
+
+### Take annotationの実装
+* Christie ではDGを取得するためにannotation を使用している
+	* C# ではannotation と同様の機能にattribute がある
+	* Take annotationの実装と比較を行う
+	
+```java:Take.java
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Take { }
+```
+
+```cs:Take.cs
+[AttributeUsage(AttributeTargets.Field)]
+public class Take : Attribute { }
+```
 
 ### MessagePackの相違点