Mercurial > hg > Papers > 2018 > nozomi-master
comparison paper/nozomi-master.tex @ 156:bc9be2d40d0d
add requiremants
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 30 Jan 2018 23:41:54 +0900 |
parents | 573db146fa93 |
children | d620f126a383 |
comparison
equal
deleted
inserted
replaced
155:573db146fa93 | 156:bc9be2d40d0d |
---|---|
359 %TopologyNodeとnodenameの説明もう少し | 359 %TopologyNodeとnodenameの説明もう少し |
360 | 360 |
361 | 361 |
362 | 362 |
363 | 363 |
364 | |
365 | |
366 \chapter{Aliceの問題点} | 364 \chapter{Aliceの問題点} |
367 Aliceを拡張していく中でいくつかの問題点が明らかになり、これらを解決するにはAlice自体を再設計する必要があるとわかった。 | 365 Aliceを拡張していく中でいくつかの問題点が明らかになり、これらを解決するにはAlice自体を再設計する必要があるとわかった。 |
368 | 366 |
369 | 367 |
370 \section{直感的でないAPI} | 368 \section{直感的でないAPI} |
378 | 376 |
379 このような書き方をされると、CSだけを見てどのkeyに対して待ち合わせを行っているのかわからないため、setKeyを呼び出しているコードを辿る必要がある。 | 377 このような書き方をされると、CSだけを見てどのkeyに対して待ち合わせを行っているのかわからないため、setKeyを呼び出しているコードを辿る必要がある。 |
380 可読性の低いコードはプログラマの負担となるため、CSが何を待ち合わせているのかそのCSを見ただけで理解できるようにAPIを改善すべきである。 | 378 可読性の低いコードはプログラマの負担となるため、CSが何を待ち合わせているのかそのCSを見ただけで理解できるようにAPIを改善すべきである。 |
381 | 379 |
382 | 380 |
383 \newpage | 381 \section{setKeyは最後に呼ばなければならない} |
382 setKeyメソッドをコンストラクタで呼ぶ際、setKeyメソッドを必ず最後に呼ばなければならない。 | |
383 | |
384 CSは内部で実行に必要なDSを数えている。DSの取得に成功するとこの値が、デクリメントされ、0になると必要なDSが全て揃ったことと判断されThread poolへ送られる。 | |
385 | |
386 setKey移行に処理を記述した場合、その処理が行われない可能性がありThread poolへと送られNullPointerExceptionを引き起こす。 | |
387 | |
388 \lstinputlisting[label=src:NullPointerException,caption=NullPointerExceptionになる可能性がある]{source/ShowDataFailed.java} | |
389 | |
390 ソースコード\ref{src:NullPointerException}は、for文でsetKeyとids.createをcntの回数呼び、動的にDSの取得数を決めようとしている。しかし、setKeyが最初に呼ばれた際に、DSの取得に成功すると実行可能と判断されてしまう。runの中でinfoの配列の要素だけ中身を表示させようとしてるが、2回目のasClassでNullPointExceptionを引き起こす。 | |
391 | |
392 \newpage | |
393 | |
394 今回の場合、コンストラクタ内をソースコード\ref{src:success}のように記述する必要がある。 | |
395 | |
396 \lstinputlisting[label=src:success,caption=NullPointerExceptionにならない記述]{source/ShowData.java} | |
397 | |
398 このように記述の順序を考えながらプログラミングしなければならない設計では、バグを引き起こし信頼性を損なうことに繋がる。より自然に扱えるAPI設計にするべきだと考える。 | |
399 | |
384 | 400 |
385 \section{動的なsetKey} | 401 \section{動的なsetKey} |
386 setKeyはCSのコンストラクタで指定することが多い。 | 402 setKeyはCSのコンストラクタで指定することが多い。 |
387 このとき、指定するkeyは引数などから動的に受け取り、セットすることができる。 | 403 このとき、指定するkeyは引数などから動的に受け取り、セットすることができる。 |
388 しかし、その使い方では、putする部分など、該当するkeyを扱う全てコードを変更しなければならない。 | 404 しかし、その使い方では、putする部分など、該当するkeyを扱う全てコードを変更しなければならない。 |
395 しかし、inputDSで指定するのはkeyのみであり、そのデータの型までは分からない。 | 411 しかし、inputDSで指定するのはkeyのみであり、そのデータの型までは分からない。 |
396 そのため、DSの型を知るにはputしている部分まで辿る必要がある。 | 412 そのため、DSの型を知るにはputしている部分まで辿る必要がある。 |
397 辿ってもflipされている可能性もあるため、最初にそのDSをputしている部分を見つけるのは困難である。 | 413 辿ってもflipされている可能性もあるため、最初にそのDSをputしている部分を見つけるのは困難である。 |
398 従って、待ち合わせているkeyにどのような型のデータが対応しているのかをそのCSを見ただけで分かるようにするべきと考える。 | 414 従って、待ち合わせているkeyにどのような型のデータが対応しているのかをそのCSを見ただけで分かるようにするべきと考える。 |
399 | 415 |
416 \newpage | |
400 | 417 |
401 \section{key名と変数名の不一致} | 418 \section{key名と変数名の不一致} |
402 2.4のCodeSegmentの例題である通り、key名とそのkeyで待ち合わせたDSを受け取るReceiver名は異なることがある。 | 419 2.4のCodeSegmentの例題である通り、key名とそのkeyで待ち合わせたDSを受け取るReceiver名は異なることがある。 |
403 もしプログラマが適当に命名してしまえば後々混乱を招くため、待ち合わせるkey名とinput DS の変数名一致を強制させたい。 | 420 もしプログラマが適当に命名してしまえば後々混乱を招くため、待ち合わせるkey名とinput DS の変数名一致を強制させたい。 |
404 | 421 |
412 今後DSにより多様な形式を同時に持たせることになれば、さらにその判別の処理が増えることになる。 | 429 今後DSにより多様な形式を同時に持たせることになれば、さらにその判別の処理が増えることになる。 |
413 | 430 |
414 | 431 |
415 Alice自体の拡張・デバッグをしやすくするためにも、DSがどの型を持っているのかをひと目で分かるようにしたい。 | 432 Alice自体の拡張・デバッグをしやすくするためにも、DSがどの型を持っているのかをひと目で分かるようにしたい。 |
416 | 433 |
417 \newpage | |
418 | 434 |
419 \section{LocalDataSegmentManagerを複数持てない} | 435 \section{LocalDataSegmentManagerを複数持てない} |
420 Aliceでは1つのノードにつき1つしかLocalDSMを立ち上げられない作りになっている。 | 436 Aliceでは1つのノードにつき1つしかLocalDSMを立ち上げられない作りになっている。 |
421 そのために以下のような問題が発生した。 | 437 そのために以下のような問題が発生した。 |
422 | 438 |
429 | 445 |
430 \subsection{TopologyManagerの拡張が困難} | 446 \subsection{TopologyManagerの拡張が困難} |
431 Aliceではより自由度の高い通信を行うために、TopologyManagerに幾つかの機能を追加すること考えていた。 | 447 Aliceではより自由度の高い通信を行うために、TopologyManagerに幾つかの機能を追加すること考えていた。 |
432 | 448 |
433 その一つがNAT越えの機能である。NAT越えは分散アプリケーション構築における課題の1つでもあるが、プログラマにとってその実装は容易ではない。Topology ManagerにNATを越えたノード間通信機能をつけることにより、ネットワークを気にせずに通信が行えるようにしたい。 | 449 その一つがNAT越えの機能である。NAT越えは分散アプリケーション構築における課題の1つでもあるが、プログラマにとってその実装は容易ではない。Topology ManagerにNATを越えたノード間通信機能をつけることにより、ネットワークを気にせずに通信が行えるようにしたい。 |
434 | |
435 \newpage | |
436 | 450 |
437 図 \ref{fig:nat}はTopologyManagerを用いてNAT越えをするための設計である。 | 451 図 \ref{fig:nat}はTopologyManagerを用いてNAT越えをするための設計である。 |
438 | 452 |
439 \begin{figure}[h] | 453 \begin{figure}[h] |
440 \begin{center} | 454 \begin{center} |
442 \end{center} | 456 \end{center} |
443 \caption{複数のTopologyManagerによるNAT越えの実現} | 457 \caption{複数のTopologyManagerによるNAT越えの実現} |
444 \label{fig:nat} | 458 \label{fig:nat} |
445 \end{figure} | 459 \end{figure} |
446 | 460 |
461 \newpage | |
447 | 462 |
448 また、別トポロジーで立ち上げたアプリケーション同士を接続する機能も追加したいと考えていた。 | 463 また、別トポロジーで立ち上げたアプリケーション同士を接続する機能も追加したいと考えていた。 |
449 TreeTopologyのVNCアプリとStarTopologyのチャットアプリを連携したいという要望が生まれたためである。 | 464 TreeTopologyのVNCアプリとStarTopologyのチャットアプリを連携したいという要望が生まれたためである。 |
450 別トポロジーのアプリケーションが接続可能になれば、VNC画面のスナップショットをChat上に載せたり、VNC上にChatの内容をコメントとして流すといった拡張が容易になる(図 \ref{fig:vncandchat})。 | 465 別トポロジーのアプリケーションが接続可能になれば、VNC画面のスナップショットをChat上に載せたり、VNC上にChatの内容をコメントとして流すといった拡張が容易になる(図 \ref{fig:vncandchat})。 |
451 | 466 |
452 \newpage | |
453 \begin{figure}[h] | 467 \begin{figure}[h] |
454 \begin{center} | 468 \begin{center} |
455 \includegraphics[width=180mm]{images/vncandchat.pdf} | 469 \includegraphics[width=180mm]{images/vncandchat.pdf} |
456 \end{center} | 470 \end{center} |
457 \caption{別トポロジーのアプリケーションの接続} | 471 \caption{別トポロジーのアプリケーションの接続} |
466 そしてTopology NodeはTopology Managerから割り当てられたnodeNameを"hostname"というKeyに保存する。 | 480 そしてTopology NodeはTopology Managerから割り当てられたnodeNameを"hostname"というKeyに保存する。 |
467 つまり、接続するTopology Managerが増えればTopoloyNodeに割り当てられるnodeNameも増えるため、今までのように"hostname"という1つのKeyだけでは対応できない。 | 481 つまり、接続するTopology Managerが増えればTopoloyNodeに割り当てられるnodeNameも増えるため、今までのように"hostname"という1つのKeyだけでは対応できない。 |
468 1つのノードに複数のTopologyManagerを対応させるには、TopologyNodeが複数のnodeNameを持つ必要がある。 | 482 1つのノードに複数のTopologyManagerを対応させるには、TopologyNodeが複数のnodeNameを持つ必要がある。 |
469 TopologyNodeが複数のTopologyManagerに対応できるようにしなければならない。 | 483 TopologyNodeが複数のTopologyManagerに対応できるようにしなければならない。 |
470 | 484 |
471 \newpage | |
472 | 485 |
473 そこで、Meta Computationとして、通常のLocal DSMとは別にTopology ManagerごとのMeta Local DSMを立ち上げる方法が考えられる(図 \ref{fig:somehostname})。 | 486 そこで、Meta Computationとして、通常のLocal DSMとは別にTopology ManagerごとのMeta Local DSMを立ち上げる方法が考えられる(図 \ref{fig:somehostname})。 |
474 \begin{figure}[h] | 487 \begin{figure}[h] |
475 \begin{center} | 488 \begin{center} |
476 \includegraphics[width=100mm]{images/somehostname.pdf} | 489 \includegraphics[width=120mm]{images/somehostname.pdf} |
477 \end{center} | 490 \end{center} |
478 \caption{複数のTopologyManagerに複数のLocalDSMが対応} | 491 \caption{複数のTopologyManagerに複数のLocalDSMが対応} |
479 \label{fig:somehostname} | 492 \label{fig:somehostname} |
480 \end{figure} | 493 \end{figure} |
481 | 494 |
495 \newpage | |
496 | |
482 それぞれのTopology Managerに対応するLocalDSMを作り、それぞれに対応したnodeNameを格納することで、DSMを切り替えるだけでTopologyNodeの仕様は変えずに複数のTopology Managerに対応できるという設計である。 | 497 それぞれのTopology Managerに対応するLocalDSMを作り、それぞれに対応したnodeNameを格納することで、DSMを切り替えるだけでTopologyNodeの仕様は変えずに複数のTopology Managerに対応できるという設計である。 |
483 | 498 |
484 しかし、現在のAliceのコードではDSMを管理するclassがstatic classであったため、複数のLocal DSMを持つことはできなかった。 | 499 しかし、現在のAliceのコードではDSMを管理するclassがstatic classであったため、複数のLocal DSMを持つことはできなかった。 |
485 staticを取り除こうとしたところ、Aliceの大部分のコードを修正する必要があることがわかった。 | 500 staticを取り除こうとしたところ、Aliceの大部分のコードを修正する必要があることがわかった。 |
486 よって、再設計の際にはstatic classのない実装を行い、DSM切り替えによる方式を実現したい。 | 501 よって、再設計の際にはstatic classのない実装を行い、DSM切り替えによる方式を実現したい。 |
489 | 504 |
490 | 505 |
491 | 506 |
492 | 507 |
493 \chapter{分散フレームワークChristieの設計} | 508 \chapter{分散フレームワークChristieの設計} |
509 | |
510 \section{Christieの必要条件} | |
494 3章でのAliceの問題点を踏まえ、新たにフレームワークを作り直すべきだと考えた。 | 511 3章でのAliceの問題点を踏まえ、新たにフレームワークを作り直すべきだと考えた。 |
495 本章では、新たに作った分散フレームワークChristieの設計を説明する。 | 512 本章では、新たに作った分散フレームワークChristieの設計を説明する。 |
513 Christieに必要な要件は以下のように考える。 | |
514 | |
515 \begin{itemize} | |
516 \item {\ttfamily create/setKeyのような煩雑なAPIをシンプルにし可読性を上げる} | |
517 \end{itemize} | |
518 | |
519 \begin{itemize} | |
520 \item {\ttfamily プログラマが型を推測しなくとも整合性がとれるように型を解決し、信頼性を上げる} | |
521 \end{itemize} | |
522 | |
523 \begin{itemize} | |
524 \item {\ttfamily staticなLocalDSMをなくし、複数のインスタンスを同時に立ち上げられるようにすることで拡張性を上げる} | |
525 \end{itemize} | |
526 | |
527 | |
496 | 528 |
497 \section{Christieの基本設計} | 529 \section{Christieの基本設計} |
498 基本的にはAliceと同じ、タスクとデータを細かい単位に分割して依存関係を記述し、入力が揃った順から並列実行するというプログラミング手法を用いる。 | 530 基本的にはAliceと同じ、タスクとデータを細かい単位に分割して依存関係を記述し、入力が揃った順から並列実行するというプログラミング手法を用いる。 |
499 | 531 |
500 | 532 |
506 | 538 |
507 | 539 |
508 DGはAliceと同様にDataGearManager(以下DGM)が管理する。 | 540 DGはAliceと同様にDataGearManager(以下DGM)が管理する。 |
509 DGMはLocalとRemoteがあり、全てのDGMはCodeGearManager(以下CGM)で管理される。 | 541 DGMはLocalとRemoteがあり、全てのDGMはCodeGearManager(以下CGM)で管理される。 |
510 GearsOSではContextという全てのCG/DGを一括管理するプロセスがあり、AliceのCGMもこのContextに相当する。 | 542 GearsOSではContextという全てのCG/DGを一括管理するプロセスがあり、AliceのCGMもこのContextに相当する。 |
511 | 543 全てのCGMはThreadPoolと他のCGM全てのリストを共有しているため、全てのCG/DGにアクセス可能である。 |
512 | 544 |
513 CGを記述する際はAlice同様CodeGear.classを継承する。 | 545 CGを記述する際はAlice同様CodeGear.classを継承する。 |
514 CodeGearは | 546 CodeGearは |
515 | 547 |
516 void run(CodeGearManager cgm)を持つclassであり、プログラマはrunメソッド内に処理を記述する。 | 548 void run(CodeGearManager cgm)を持つclassであり、プログラマはrunメソッド内に処理を記述する。 |
517 インプットで指定したkeyに対応したDGが全て揃ったとき、runに書かれた処理が実行される。 | 549 インプットで指定したkeyに対応したDGが全て揃ったとき、runに書かれた処理が実行される。 |
518 ChristieのAPIにはrunの引数で受け取ったCGMを経由しアクセスする。 | 550 ChristieのAPIにはrunの引数で受け取ったCGMを経由しアクセスする。 |
519 GearsOSではCG間でContextを受け渡すことによってCGはDGにアクセスするため、Christieでもその記述方法を採用した。 | 551 GearsOSではCG間でContextを受け渡すことによってCGはDGにアクセスするため、Christieでもその記述方法を採用した。 |
520 | 552 |
553 %Clas図 | |
554 | |
521 \newpage | 555 \newpage |
522 | 556 |
523 \section{APIの改善} | 557 \section{APIの改善} |
524 \subsection{TAKE/PEEK} | 558 \subsection{TAKE/PEEK} |
525 InputAPIにはAliceと同じくTakeとPeekを用意した。 | 559 InputAPIにはAliceと同じくTakeとPeekを用意した。 |
526 ChristieではInput DG の指定にはAnnotationを使う。 | 560 ChristieではInput DG の指定にはアノテーションを使う。 |
527 Annotationとは、Javaのクラスやメソッド、パッケージに対して付加情報を記述できる機能である。 | 561 アノテーションとは、クラスやメソッド、パッケージに対して付加情報を記述できるJavaのMeta Computationである。 |
528 先頭に@をつけることで記述でき、オリジナルのAnnotationを定義することもできる。 | 562 先頭に@をつけることで記述でき、オリジナルのアノテーションを定義することもできる。 |
529 | 563 |
530 AliceではInputの受け皿であるReceiverを作り後からkeyをセットしていたが、 | 564 AliceではInputの受け皿であるReceiverを作り後からkeyをセットしていたが、 |
531 ChristieではInputのためのDGを作り、その上にAnnotationでKeyを指定する(\ref{src:take})。 | 565 ChristieではInputのためのDGを作り、その上にアノテーションでKeyを指定する(\ref{src:take})。 |
532 | 566 |
533 \lstinputlisting[label=src:take, caption=Takeの例]{source/christie/InputDG.java} | 567 \lstinputlisting[label=src:take, caption=Takeの例]{source/christie/InputDG.java} |
534 | 568 |
535 | 569 |
536 Annotationで指定したInputDGは、CGを生成した際にCodeGear.class内で待ち合わせの処理が行われる。 | 570 アノテーションで指定したInputDGは、CGを生成した際にCodeGear.class内で待ち合わせの処理が行われる。 |
537 これにはJavaのreflectionAPIを利用している。 | 571 これにはJavaのreflectionAPIを利用している。 |
538 Annotationの指定はRUNTIMEではできないため、動的なkeyの指定も防ぐことができる。 | 572 アノテーションの指定はRUNTIMEではできないため、動的なkeyの指定も防ぐことができる。 |
539 | 573 |
540 \ref{src:take}の2行目にあるように、InputDGを宣言する際には必ず型の指定が必要となる。 | 574 \ref{src:take}の2行目にあるように、InputDGを宣言する際には必ず型の指定が必要となる。 |
541 DataGearは様々な型のデータを扱うためにJavaの総称型で受け取るようにしており、<>内に指定した型でデータの型を限定できる。 | 575 DataGearは様々な型のデータを扱うためにJavaの総称型で受け取るようにしており、\textless \textgreater 内に指定した型でデータの型を限定できる。 |
542 このように記述することで、Christieでは他の部分を辿らなくてもCGを見るだけでインプットされるデータの型が分かるように可読性を向上させた。 | 576 このように記述することで、Christieでは他の部分を辿らなくてもCGを見るだけでインプットされるデータの型が分かるように可読性を向上させた。 |
543 また、取得してきたDGが指定と違う型であった場合はエラーとなるため、型の整合性を保ちながら信頼性の高いプログラミングが可能となった。 | 577 また、取得してきたDGが指定と違う型であった場合はエラーとなるため、型の整合性を保ちながら信頼性の高いプログラミングが可能となった。 |
544 | 578 |
545 また、Aliceではkeyと変数名の不一致から可読性が低くなっていた。 | 579 また、Aliceではkeyと変数名の不一致から可読性が低くなっていた。 |
546 しかしChristieではkeyと変数名が一致しないとエラーとなるため、自然と読みやすいコードが書けるようになっている。 | 580 しかしChristieではkeyと変数名が一致しないとエラーとなるため、自然と読みやすいコードが書けるようになっている。 |
547 この部分に関しては、JavaのメタプログラミングAPIであるjavassist\cite{}を用いてAnnotationから変数の自動生成も試みたが、javassistでは変数生成の前に他のどのクラスも生成してはならないという制限があったため、Christieでは実現できなかった。 | 581 この部分に関しては、JavaのメタプログラミングAPIであるjavassist\cite{}を用いてアノテーションから変数の自動生成も試みたが、javassistでは変数生成の前に他のどのクラスも生成してはならないという制限があったため、Christieでは実現できなかった。 |
548 | 582 |
549 | 583 |
550 リモートノードに対してTake/Peekする際は、RemoteTake/RemotePeekのAnnotationを用いる(\ref{src:remotetake})。 | 584 リモートノードに対してTake/Peekする際は、RemoteTake/RemotePeekのアノテーションを用いる(\ref{src:remotetake})。 |
551 そのため待ち合わせ先がLocalかRemoteかはAnnotationの違いからひと目でわかるようになった。 | 585 そのため待ち合わせ先がLocalかRemoteかはアノテーションの違いからひと目でわかるようになった。 |
552 | 586 |
553 \lstinputlisting[label=src:remotetake, caption=RemoteTakeの例]{source/christie/RemoteInputDG.java} | 587 \lstinputlisting[label=src:remotetake, caption=RemoteTakeの例]{source/christie/RemoteInputDG.java} |
554 | 588 |
555 \newpage | 589 \newpage |
556 | 590 |
610 StartCGを記述する際にはcreateCGMメソッドでCGMを生成してコンストラクタに渡す必要がある。 | 644 StartCGを記述する際にはcreateCGMメソッドでCGMを生成してコンストラクタに渡す必要がある。 |
611 ソースコード\ref{src:StartCodeGear}の8行目でそれが行われている。 | 645 ソースコード\ref{src:StartCodeGear}の8行目でそれが行われている。 |
612 createCGMの引数にはリモートノードとソケット通信する際使うポート番号を指定する。 | 646 createCGMの引数にはリモートノードとソケット通信する際使うポート番号を指定する。 |
613 CGMを生成した際にLocalDGMやリモートと通信を行うためのDaemonも作られる。 | 647 CGMを生成した際にLocalDGMやリモートと通信を行うためのDaemonも作られる。 |
614 | 648 |
615 CGの待ち合わせ処理はsetupメソッドが行う。 | 649 CGに対してアノテーションから待ち合わせを実行する処理はsetupメソッドが行う。 |
616 そのためソースコード\ref{src:StartCodeGear}の13行目、\ref{src:TestCodeGear}の10行目のように、newしたCGをCGMのsetupメソッドに渡す必要がある。 | 650 そのためソースコード\ref{src:StartCodeGear}の13行目、\ref{src:TestCodeGear}の10行目のように、newしたCGをCGMのsetupメソッドに渡す必要がある。 |
617 AliceではnewすればCGが待ちに入ったが、Christieでは一度CGをnewしないとAnnotationから待ち合わせを行う処理ができないため、newの後にsetupを行う。 | 651 AliceではnewすればCGが待ちに入ったが、Christieでは一度CGをnewしないとアノテーションから待ち合わせを行う処理ができないため、newの後にsetupを行う。 |
618 そのため、CGの生成には必ずCGMが必要になる。 | 652 そのため、CGの生成には必ずCGMが必要になる。 |
619 runでCGMを受け渡すのはこのためである。 | 653 runでCGMを受け渡すのはこのためである。 |
654 なお、StartCGはインプットを持たないため、setupを行う必要がなく、newされた時点でrunが実行されuる。 | |
655 | |
656 %ここにCG/DGのフロー? | |
620 | 657 |
621 \newpage | 658 \newpage |
622 | 659 |
623 | 660 |
624 \section{DataGearManagerの複数立ち上げ} | 661 \section{DataGearManagerの複数立ち上げ} |
657 | 694 |
658 | 695 |
659 | 696 |
660 | 697 |
661 \chapter{Christieの評価} | 698 \chapter{Christieの評価} |
662 \section{Akka} | 699 \section{Aliceとの分散性能測定} |
663 \section{Corba} | 700 |
664 \section{Erlang} | 701 \section{他フレームワークとの比較} |
665 \section{Hazelcast} | 702 \subsection{Akka} |
703 \subsection{Corba} | |
704 \subsection{Erlang} | |
705 \subsection{Hazelcast} | |
666 | 706 |
667 \chapter{まとめ} | 707 \chapter{まとめ} |
668 | 708 |
709 | |
669 \chapter{今後の課題} | 710 \chapter{今後の課題} |
711 \section{TopologyManagerの実装} | |
712 Aliceと同じく、静的・動的なトポロジー管理のできるTopologyManagerの実装が必要である。 | |
713 Christieでは複数のLocalDSMが立ち上げ可能なため、TopologyManagerでのNAT超えも実装し実用性があるかを検証する | |
714 また、通信の信頼性を保証するために、TopologyManagerがダウンした際に新たなTopologyManagerを立ち上げる機能もあるべきだと考える。 | |
715 | |
716 \section{検証機構の導入?} | |
717 | |
718 \section{GearsOSへの移行} | |
719 GearsOSはまだ開発途中であったため、本論文の作成時点ではChristieのような分散機能を実装することが叶わなかった。 | |
720 GearsOSにChristieを移行するには、GearsOSにJavaのアノテーションに相当するMeta Computationを実装する必要がある。 | |
721 そしてChristieでは実現できなかったアノテーションからの変数の自動生成が行えれば更にプログラミングしやすいAPIになると考えられる。 | |
722 | |
723 \chapter{付録} | |
724 \section{独自のアノテーション定義} | |
725 Christieのアノテーションの実装方法と、そのアノテーションからtakeを実行する部分を解説する。 | |
726 | |
727 ソースコード\ref{src:take}、\ref{src:remotetake}がChristie独自のアノテーションの定義である。 | |
728 | |
729 \lstinputlisting[label=src:take, caption=Takeの実装]{source/christie/TakeAnnotation.java} | |
730 \lstinputlisting[label=src:remotetake, caption=RemoteTakeの実装]{source/christie/RemoteTakeAnnotation.java} | |
731 | |
732 @Targetや@Retentionはアノテーション定義のためのアノテーション、メタアノテーションである。 | |
733 @Targetには、フィールドやメソッド、コンストラクタなど、このアノテーションの付加対象となる構文要素が何かを記述する。 | |
734 @Retentionには、SOURCE・CLASS・RUNTIMEが選択でき、アノテーションで付加された情報がどの段階まで保持されるかを定義する。reflectionAPIを利用するにはRUNTIMEでなければならないため、Christieのアノテーションの@Retentionは全てRUNTIMEである。 | |
735 | |
736 定義したアノテーションの仕様例がソースコード\ref{src:takeAno}、\ref{src:remotetakeAno}である。 | |
737 | |
738 \lstinputlisting[label=src:takeAno, caption=Takeアノテーションの使用例]{source/christie/InputDG.java} | |
739 \lstinputlisting[label=src:remotetakeAno, caption=RemoteTakeアノテーションの使用例]{source/christie/RemoteInputDG.java} | |
740 | |
741 アノテーションを使う際、()内に記述する値が\ref{src:take}のvalueや\ref{src:remotetake}のdsmNameといったキーに保存される。 | |
742 通常キーに対して値を入れる場合は、ソースコード\ref{src:remotetakeAno}のようにkey=の形で記述しなければならないが、Takeのようにキーが1つの場合、キー名をvalueにすることでその記述を省略することができる。 | |
743 | |
744 setupメソッド内では生成されたフィールドに対してアノテーションを含めた情報を処理している(ソースコード\ref{src:setup})。 | |
745 | |
746 \lstinputlisting[label=src:setup, caption=reflectionAPIでフィールドの情報を取得]{source/christie/Setup.java} | |
747 | |
748 これにはJavaのreflectionAPIが使用されている。 | |
749 reflectionAPIでは対象となるクラスのフィールドやメソッド、それに対するアノテーションも取得できる。 | |
750 フィールドから取得したDGとアノテーションから取得したkeyからインプットコマンド(TAKE/PEEK)を生成し、DGMへ送って実行する。 | |
751 | |
752 このとき要求したデータがDGM内にない場合はwaitListに入る。 | |
753 PUTコマンドが実行された際、もしwaitListに同じkeyのDGを待っているコマンドがあれば実行される。 | |
754 CGは生成したインプットコマンドの総数を初期値としたカウンタを持っており、コマンドが解決されるたびにカウンタは減っていき、0になった時、CGがThreadPoolへ送られる。 | |
670 | 755 |
671 | 756 |
672 \chapter{謝辞} | 757 \chapter{謝辞} |
673 本研究の遂行、また本論文の作成にあたり、ご多忙にも関わらず終始懇切なる御指導と御 | 758 本研究の遂行、また本論文の作成にあたり、ご多忙にも関わらず終始懇切なる御指導と御 |
674 教授を賜わりました河野真治准教授に深く感謝したします。 | 759 教授を賜わりました河野真治准教授に深く感謝したします。 |
675 | 760 |
676 そして、数々の貴重な御助言と技術的指導を戴いた伊波立樹さん、並びに並列信頼研究室 | 761 そして、数々の貴重な御助言と技術的指導を戴いた伊波立樹さん、他フレームワークの調査に協力してくださった清水隆博さん、赤堀貴一さん、浜瀬裕暉さん、大城由也さん、並びに信頼研究室の皆様に感謝いたします。 |
677 の皆様、本研究を遂行するにあたり参考にさせていただいた先行研究のAlice, Federated | 762 先行研究であるAlice, Federated Linda, Jungle, TreeVNCがなければ本研究はありませんでした。 これら先行研究の設計や実装に関わった全ての先輩方に感謝いたします。 |
678 Linda, Jungle, TreeVNC の設計・実装に関わった全ての方々に感謝いたします。 | 763 |
679 | 764 また、本フレームワークの名前の由来となったクリスティー式戦車の生みの親、ジョン・W・クリスティーに敬意を評します。 |
680 また、本フレームワークの名前の由来となったクリスティー式戦車の生みの親、ジョン・ | 765 |
681 W・クリスティーに敬意を評します。 | 766 最後に、日々の研究生活を支えてくださった米須智子さん、菱田正和さん、情報工学科の方々、そして家族に心より感謝いたします。 |
682 | 767 |
683 最後に、日々の研究生活を支えてくださった米須智子さん、情報工学科の方々、そし | |
684 て家族に心より感謝いたします。 | |
685 | |
686 | 768 |
687 %参考文献 | 769 %参考文献 |
688 \nocite{*} | 770 \nocite{*} |
689 \bibliographystyle{junsrt} | 771 \bibliographystyle{junsrt} |
690 \bibliography{reference} | 772 %\bibliography{reference} |
691 | 773 |
692 %発表履歴 | 774 %発表履歴 |
693 \addcontentsline{toc}{chapter}{発表履歴} | 775 \addcontentsline{toc}{chapter}{発表履歴} |
694 %\input{history.tex} | 776 %\input{history.tex} |
695 | 777 |