# HG changeset patch # User riono # Date 1620295268 -32400 # Node ID 0cc59d15f2e5530a0f1fa7b5412c08ce4c0c1c68 # Parent 9be93a8605952ab9d66babd3a0fc256f858f56c3 fix diff -r 9be93a860595 -r 0cc59d15f2e5 Paper/riono-sigos.pdf Binary file Paper/riono-sigos.pdf has changed diff -r 9be93a860595 -r 0cc59d15f2e5 Paper/riono-sigos.tex --- a/Paper/riono-sigos.tex Thu May 06 15:58:36 2021 +0900 +++ b/Paper/riono-sigos.tex Thu May 06 19:01:08 2021 +0900 @@ -138,33 +138,37 @@ \begin{itemize} %箇条書き \item CodeGear \item DataGear -\item CodeGearManager -\item DataGearManager +\item CodeGearManager (以下CGM) +\item DataGearManager (以下DGM) \end{itemize} 以下はjava版のChristieについて解説を行う。 CodeGearはクラスやスレッドに相当する。 DataGearは変数データに相当し、CodeGear内でannotationを用いて変数データを取得する。CodeGear内に記述した全てのDataGearの中にデータが格納された際に、初めてそのCodeGearが実行されるという仕組みになっている。 -CodeGearManagerはノードであり、CodeGear、DataGear、DataGearManagerを管理する。 -DataGearManagerはDataGearを管理するものであり、putという操作により変数データ、つまりDataGearを格納できる。DataGearManagerのput操作を行う際にはLocalとRemoteのどちらかを選び、変数のkeyとデータを引数として渡す。 -Localであれば、LocalのCodeGearManagerが管理しているDataGearManagerに対しDataGearを格納していく。Remoteであれば、接続したRemote先のCodeGearManagerが管理しているDataGearManagerにDataGearを格納できる。 +CGM はノードであり、CodeGear、DataGear、DGMを管理する。 +DGMはDataGearを管理するものであり、putという操作により変数データ、つまりDataGearを格納できる。DGMのput操作を行う際にはLocalとRemoteのどちらかを選び、変数のkeyとデータを引数として渡す。 +Localであれば、LocalのCGMが管理しているDGMに対しDataGearを格納していく。Remoteであれば、接続したRemote先のCGMが管理しているDGMにDataGearを格納できる。 + +図 \ref{fig:christieclass} は、Christie を同一プロセスで複数のインスタンスを立ち上げた際のDGM やCGM の接続の構造を示している。 +全てのCodeGearManger はThreadPool と他のCGM をList として共有している。ThreadPool とはCPU に合わせた並列度でqueue に入ったThread を順次実行していく実行機構である。ThreadPool が増えると、CPU コア数に合わない量のThread を管理することになり並列度が下がるため、1つのThreadPool で全てのCGM を管理している。 +また、CGM のList を共有することでメタレベルで全てのCodeGear/DataGear にアクセス可能となっている。 \begin{figure}[h] %PDF \begin{center} -\includegraphics[width=8cm]{fig/ChristieClass.pdf} +\includegraphics[width=10cm]{fig/ChristieClass.pdf} \caption{Christie の複数インスタンスの立ち上げ} -\label{fig:ring} +\label{fig:christieclass} \end{center} \end{figure} -put操作を行った後は、対象のDataGearManagerの中にqueueとして保管される。DataGearを取り出す際には、CodeGearm内で宣言した変数データにannotationをつける。DataGearのannotationにはTake、Peek、TakeFrom、PeekFromの4つがある。 +put操作を行った後は、対象のDGMの中にqueueとして保管される。DataGearを取り出す際には、CodeGearm内で宣言した変数データにannotationをつける。DataGearのannotationにはTake、Peek、TakeFrom、PeekFromの4つがある。 \begin{description} \item[Take] 先頭のDataGear を読み込み、そのDataGear を削除する。DataGearが複数ある場合、この動作を用いる \item[Peek] 先頭のDataGear を読み込むが、DataGear が削除されない。そのため、特に操作をしない場合は同じデータを参照し続ける。 -\item[TakeFrom (Remote DGM name)] Take と似ているが、Remote DGM nameを指定することで、その接続先(Remote) のDataGearManager からTake 操作を行える。 -\item[PeekFrom (Remote DGM name)] Peek と似ているが、Remote DGM name を指定することで、その接続先(Remote) のDataGearManager からPeek 操作を行える。 +\item[TakeFrom (Remote DGM name)] Take と似ているが、Remote DGM nameを指定することで、その接続先(Remote) のDGM からTake 操作を行える。 +\item[PeekFrom (Remote DGM name)] Peek と似ているが、Remote DGM name を指定することで、その接続先(Remote) のDGM からPeek 操作を行える。 \end{description} @@ -188,20 +192,20 @@ \lstinputlisting[caption=java HelloWorldCodeGear, label=code:javaHWC]{src/HelloWorldCodeGear.java} \lstinputlisting[caption=java FinishHelloWorld, label=code:javaFHW]{src/FinishHelloWorld.java} -Code \ref{code:javaSHW} ではCodeGearManager を作り、setup(new CodeGear) を行うことで各CodeGear に記述されたDataGear の待ち合わせを行う。全てのDataGear が揃った場合にCodeGear が実行される。CodeGearaManager の作成方法はStartCodeGear を継承したものから、createCGM(port) を実行することにより、CodeGearManager が作成できる。 +Code \ref{code:javaSHW} ではCGM を作り、setup(new CodeGear) を行うことで各CodeGear に記述されたDataGear の待ち合わせを行う。全てのDataGear が揃った場合にCodeGear が実行される。CodeGearaManager の作成方法はStartCodeGear を継承したものから、createCGM(port) を実行することにより、CGM が作成できる。 -Code \ref{code:javaSHW} の11、12行目はput(key, data) を行うことでDataGearManager のqueue にデータを格納することができる。key はstring 型のみで格納したい変数名を指定する。11、12行目のput ではCode \ref{code:javaHWC} のフィールド変数helloWorld を指定し、データは"hello" と"world" を逐次的に格納している。 +Code \ref{code:javaSHW} の11、12行目はput(key, data) を行うことでDGM のqueue にデータを格納することができる。key はstring 型のみで格納したい変数名を指定する。11、12行目のput ではCode \ref{code:javaHWC} のフィールド変数helloWorld を指定し、データは"hello" と"world" を逐次的に格納している。 -Code \ref{code:javaHWC} 、Code \ref{code:javaFHW} がCodeGearにあたる。それぞれのフィールド変数には@Take annotation が付いており、DataGearManager に格納されたkey を参照してデータを取得する。その後DataGearManger に格納されたデータは破棄される。 +Code \ref{code:javaHWC} 、Code \ref{code:javaFHW} がCodeGearにあたる。それぞれのフィールド変数には@Take annotation が付いており、DGM に格納されたkey を参照してデータを取得する。その後DataGearManger に格納されたデータは破棄される。 -Code \ref{code:javaHWC} では最初にフィールド変数 helloWorld にstring 型の"hellow"を取得、print を行い、再びkey hello、data "hello" をDataGearManager にput している。また8行目で自らをsetpuしているため、再帰的にHelloWorldCodeGear が再実行される。2回目の実行ではフィールド変数 helloWorld に"world" が格納と出力がされ、key world、data "world" がDataGearManager に格納される。Code \ref{code:javaHWC} でput した"hello" と"world" は最終的に、Code \ref{code:javaFHW} の同名のフィールド変数に格納される。 -2回目の実行でもsetup しているが、DataGearManagerにはkey helloWorld のデータが無いため、3回目以降は実行されない。 +Code \ref{code:javaHWC} では最初にフィールド変数 helloWorld にstring 型の"hellow"を取得、print を行い、再びkey hello、data "hello" をDGM にput している。また8行目で自らをsetpuしているため、再帰的にHelloWorldCodeGear が再実行される。2回目の実行ではフィールド変数 helloWorld に"world" が格納と出力がされ、key world、data "world" がDGM に格納される。Code \ref{code:javaHWC} でput した"hello" と"world" は最終的に、Code \ref{code:javaFHW} の同名のフィールド変数に格納される。 +2回目の実行でもsetup しているが、DGMにはkey helloWorld のデータが無いため、3回目以降は実行されない。 Code \ref{code:javaHWC} の2回の実行後、Code \ref{code:javaHWC} のローカル変数hello とworld が全て揃ったことによりCode \ref{code:javaHWC} が実行されプログラムは終了する。 -\section{C\# でのChristie} +\section{Christie \#} Code \ref{code:csSHW}、Code \ref{code:csHWC}、Code \ref{code:csFHW}、はCode \ref{code:javaSHW} 、Code \ref{code:javaHWC} 、Code \ref{code:javaFHW} の例題をC\# に書き換えたものである。 \lstinputlisting[caption=C\# StartHelloWorld, label=code:csSHW]{src/StartHelloWorld.cs} @@ -220,7 +224,7 @@ -\section{annotation の書き換え} +\section{Take annotation の実装} java 版ではDataGear を取得する際に、annotation という java の機能を用いて行った。C\#には annotation はなく、代わりにattribute を利用して DataGear の取得を行っている。 以下のCode \ref{code:javaTake}、Code \ref{code:csTake}はjava とC\# におけるTakeの実装である。 @@ -271,6 +275,13 @@ \section{チート対策について} +オンラインネットワークゲーム開発にはチート対策が必須になっている。チートの種類には、サーバへ送信するデータをクライアント側で改竄を行うもの、メモリ上の値を書き換えるものなど多岐にわたる。 + +通常のオンラインゲームでのチート対策としては、クライアントをモニタリングする、ダメージ計算などを全てサーバ側で処理する、ゲームをプレイしている他のプレイヤーからの通報などがある。 +しかし、チート開発とチート対策はいたちごっこになっているというのが現状である。 + +Christie では従来の通信ライブラリとは異なり、型があるDataGear をタプル空間であるDGM にkey を持つストリームとして格納する方式をとっている。他のノードとの通信には +そのため、 \section{実装の現状}