Mercurial > hg > Papers > 2019 > oshiro-thesis
changeset 4:af4258f10312
add final_main
author | e155702 |
---|---|
date | Sat, 16 Feb 2019 19:45:35 +0900 |
parents | c85944b88fdf |
children | 28fe5c231624 |
files | .hgignore final_main/Makefile final_main/appendix.tex final_main/main.pdf final_main/main.tex |
diffstat | 5 files changed, 378 insertions(+), 64 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Sat Feb 16 19:45:35 2019 +0900 @@ -0,0 +1,16 @@ +syntax: glob +.DS_Store +*.swp +*.*~ +*.bbl +*.blg +*.lof +*.lol +*.lot +*.log +*.aux +*.dvi +*.toc +*.cpt +*.swo +*.out
--- a/final_main/Makefile Sat Feb 16 18:42:31 2019 +0900 +++ b/final_main/Makefile Sat Feb 16 19:45:35 2019 +0900 @@ -12,14 +12,14 @@ # dependent document files TEX_FILES = \ - chapter*.tex \ - thanks.tex + appendix.tex \ + thanks.tex \ # dependent image files SVG_FILES = # use bibtex or not (yes|no) -BIBTEX_ENABLED = yes +BIBTEX_ENABLED = no # commands to compile document LATEX = platex @@ -51,7 +51,7 @@ .PHONY : pdf pdf : $(PDF_FILE) - open $(TARGET).pdf + open $(TARGET).pdf $(PDF_FILE) : $(DVI_FILE) $(TEX_FILES) $(EPS_FILES) $(CLASS_FILE) $(DVIPDF) $(TARGET) @@ -64,9 +64,7 @@ dvi : $(DVI_FILE) $(DVI_FILE) : $(TEX_FILES) $(EPS_FILES) $(CLASS_FILE) $(LATEX) -halt-on-error $(TARGET) -ifeq ($(BIBTEX_ENABLED),yes) - $(BIBTEX) $(TARGET) -endif +# $(BIBTEX) $(TARGET) $(LATEX) -halt-on-error $(TARGET) $(LATEX) -halt-on-error $(TARGET)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/final_main/appendix.tex Sat Feb 16 19:45:35 2019 +0900 @@ -0,0 +1,236 @@ +\chapter{conv1 のソースコード} +\begin{lstlisting}[frame=lrbt,label=conv1,caption={}] +#include <stdio.h> +#include <stdlib.h> +static int loop; + +#if 1 // def __micro_c__ +#define CC_ONLY 0 +#else +#define CC_ONLY 1 +#endif + +#ifdef CLANG // for clang/LLVM +#define _CbC_return __return +#define _CbC_environment __environment +#endif + +typedef char *stack; +#include "conv1.h" + +/* classical function call case (0) */ +int f0(int i) { + int k,j; + k = 3+i; + j = g0(i+3); + return k+4+j; +} + +int g0(int i) { + return h0(i+4)+i; +} + +int h0(int i) { + return i+4; +} + +#if !CC_ONLY + +/* straight conversion case (1) */ + + +struct cont_interface { // General Return Continuation + __code (*ret)(int,stack); +}; + +__code f(int i,stack sp) { + int k,j; + k = 3+i; + goto f_g0(i,k,sp); +} + +struct f_g0_interface { // Specialized Return Continuation + __code (*ret)(int,stack); + int i_,k_,j_; +}; + +__code f_g1(int j,stack sp); + +__code f_g0(int i,int k,stack sp) { // Caller + struct f_g0_interface *c = + (struct f_g0_interface *)(sp -= sizeof(struct f_g0_interface)); + + c->ret = f_g1; + c->k_ = k; + c->i_ = i; + + goto g(i+3,sp); +} + +__code f_g1(int j,stack sp) { // Continuation + struct f_g0_interface *c = (struct f_g0_interface *)sp; + int k = c->k_; + sp+=sizeof(struct f_g0_interface); + c = (struct f_g0_interface *)sp; + goto (c->ret)(k+4+j,sp); +} + +__code g_h1(int j,stack sp); + +__code g(int i,stack sp) { // Caller + struct f_g0_interface *c = + (struct f_g0_interface *)(sp -= sizeof(struct f_g0_interface)); + + c->ret = g_h1; + c->i_ = i; + + goto h(i+3,sp); +} + +__code g_h1(int j,stack sp) { // Continuation + struct f_g0_interface *c = (struct f_g0_interface *)sp; + int i = c->i_; + sp+=sizeof(struct f_g0_interface); + c = (struct f_g0_interface *)sp; + goto (c->ret)(j+i,sp); +} + +__code h(int i,stack sp) { + struct f_g0_interface *c = (struct f_g0_interface *)sp; + goto (c->ret)(i+4,sp); +} + +struct main_continuation { // General Return Continuation + __code (*ret)(int,stack); + __code (*main_ret)(int,void*); + void *env; +}; + +__code main_return(int i,stack sp) { + if (loop-->0) + goto f(233,sp); + printf("#0103:%d\n",i); + goto (( (struct main_continuation *)sp)->main_ret)(0, + ((struct main_continuation *)sp)->env); +} + +/* little optimzation without stack continuation (2) */ + +__code f2(int i,char *sp) { + int k,j; + k = 3+i; + goto g2(i,k,i+3,sp); +} + +__code g2(int i,int k,int j,char *sp) { + j = j+4; + goto h2(i,k+4+j,sp); +} + +__code h2_1(int i,int k,int j,char *sp) { + goto main_return2(i+j,sp); +} + +__code h2(int i,int k,char *sp) { + goto h2_1(i,k,i+4,sp); +} + +__code main_return2(int i,stack sp) { + if (loop-->0) + goto f2(233,sp); + printf("#0132:%d\n",i); + goto (( (struct main_continuation *)sp)->main_ret)(0, + ((struct main_continuation *)sp)->env); +} + +/* little optimizaed case (3) */ + +__code f2_1(int i,char *sp) { + int k,j; + k = 3+i; + goto g2_1(k,i+3,sp); +} + +__code g2_1(int k,int i,char *sp) { + goto h2_11(k,i+4,sp); +} + +__code f2_0_1(int k,int j,char *sp); +__code h2_1_1(int i,int k,int j,char *sp) { + goto f2_0_1(k,i+j,sp); +} + +__code h2_11(int i,int k,char *sp) { + goto h2_1_1(i,k,i+4,sp); +} + +__code f2_0_1(int k,int j,char *sp) { + goto (( (struct cont_interface *)sp)->ret)(k+4+j,sp); +} + +__code main_return2_1(int i,stack sp) { + if (loop-->0) + goto f2_1(233,sp); + printf("#0165:%d\n",i); + exit(0); + //goto (( (struct main_continuation *)sp)->main_ret)(0, + //((struct main_continuation *)sp)->env); +} + +#define STACK_SIZE 2048 +char main_stack[STACK_SIZE]; +#define stack_last (main_stack+STACK_SIZE) + +#endif + +#define LOOP_COUNT 500000000 +int +main(int ac,char *av[]) +{ +#if !CC_ONLY + struct main_continuation *cont; + stack sp = stack_last; +#endif + int sw; + int j; + if (ac==2) sw = atoi(av[1]); + else sw=3; + + if (sw==0) { + for(loop=0;loop<LOOP_COUNT;loop++) { + j = f0(loop); + } + printf("#0193:%d\n",j); +#if !CC_ONLY + } else if (sw==1) { + loop = LOOP_COUNT; + sp -= sizeof(*cont); + cont = (struct main_continuation *)sp; + cont->ret = main_return; + cont->main_ret = _CbC_return; + cont->env = _CbC_environment; + goto f(loop,sp); + } else if (sw==2) { + loop = LOOP_COUNT; + sp -= sizeof(*cont); + cont = (struct main_continuation *)sp; + cont->ret = main_return2; + cont->main_ret = _CbC_return; + cont->env = _CbC_environment; + goto f2(loop,sp); + } else if (sw==3) { + loop = LOOP_COUNT; + sp -= sizeof(*cont); + cont = (struct main_continuation *)sp; + cont->ret = main_return2_1; + cont->main_ret = _CbC_return; + cont->env = _CbC_environment; + goto f2_1(loop,sp); +#endif + } + return 0; +} + +/* end */ +\end{lstlisting} +
--- a/final_main/main.tex Sat Feb 16 18:42:31 2019 +0900 +++ b/final_main/main.tex Sat Feb 16 19:45:35 2019 +0900 @@ -1,77 +1,56 @@ \documentclass[a4j,12pt]{jreport} \usepackage[dvipdfmx]{graphicx} +\usepackage[dvipdfm, + colorlinks=false, + bookmarks=true, + bookmarksnumbered=false, + pdfborder={0 0 0}, + bookmarkstype=toc]{hyperref} +\AtBeginDvi{\special{pdf:tounicode EUC-UCS2}} \usepackage{mythesis} -\usepackage{bussproofs} \usepackage{multirow} \usepackage{here} \usepackage{listings} -\usepackage{url} -\usepackage{cite} -\usepackage{listings} -\usepackage{amssymb} -\usepackage{amsmath} -\usepackage[utf8]{inputenc} - \lstset{ - basicstyle={\ttfamily}, + language={C}, + basicstyle={\footnotesize\ttfamily}, + identifierstyle={\footnotesize}, + commentstyle={\footnotesize\itshape}, + keywordstyle={\footnotesize\bfseries}, + ndkeywordstyle={\footnotesize}, + stringstyle={\footnotesize\ttfamily}, + frame={tb}, breaklines=true, columns=[l]{fullflexible}, - commentstyle={\ttfamily}, - escapechar={@}, - frame=single, - framerule=.5pt, - identifierstyle={\ttfamily}, - keepspaces=true, - keywordstyle={\ttfamily}, - language={}, - lineskip=-0.1zw, numbers=left, - numbersep=1em, + xrightmargin=0zw, + xleftmargin=3zw, numberstyle={\scriptsize}, stepnumber=1, - stringstyle={\ttfamily}, - tabsize=4, - xleftmargin=0zw, - xrightmargin=0zw, + numbersep=1zw, + lineskip=-0.5ex } - -% \lstset{ -% language={C}, -% basicstyle={\footnotesize\ttfamily}, -% identifierstyle={\footnotesize}, -% commentstyle={\footnotesize\itshape}, -% keywordstyle={\footnotesize\bfseries}, -% ndkeywordstyle={\footnotesize}, -% stringstyle={\footnotesize\ttfamily}, -% frame={tb}, -% breaklines=true, -% columns=[l]{fullflexible}, -% numbers=left, -% xrightmargin=0zw, -% xleftmargin=3zw, -% numberstyle={\scriptsize}, -% stepnumber=1, -% numbersep=1zw, -% lineskip=-0.5ex -% } -\def\lstlistingname{ソースコード} -\def\lstlistlistingname{ソースコード目次} +\def\lstlistingname{リスト} +\def\lstlistlistingname{リスト目次} \setlength{\itemsep}{-1zh} -\title{画面共有システム TreeVNC の拡張} +\title{TreeVNC} \icon{ \includegraphics[width=80mm,bb=0 0 595 642]{fig/ryukyu.pdf} %%元は 642じゃなくて842 } -\year{平成31年度 卒業論文} +\year{平成30年度 卒業論文} \belongto{琉球大学工学部情報工学科} -\author{155702F 大城 由也 \\ 指導教員 {河野 真治} } +\author{155702F 大城由也\\ 指導教員 {河野 真治} } %% %% プリアンブルに記述 %% Figure 環境中で Table 環境の見出しを表示・カウンタの操作に必要 %% \makeatletter +\renewcommand{\lstlistingname}{ソースコード} +\renewcommand{\lstlistlistingname}{ソースコード目次} +\usepackage{caption} +\usepackage{url} \newcommand{\figcaption}[1]{\def\@captype{figure}\caption{#1}} \newcommand{\tblcaption}[1]{\def\@captype{table}\caption{#1}} -\newcommand{\coderef}[1]{ソースコード \ref{code:#1}} \makeatother \setlength\abovecaptionskip{0pt} @@ -94,29 +73,114 @@ %章分けは個人で違うので下のフォーマットを参考にして下さい。 % はじめに -\input{chapter1.tex} +\chapter{画面配信ソフトウェア TreeVNC の活用} +\label{chap:introduction} +%\pagenumbering{arabic} + +% 序論の目安としては1枚半ぐらい. +% 英語発表者は,最終予稿の「はじめに」の英訳などを載せてもいいかも. + + + + 現代の講義や発表、プレゼンなどは、用意された資料や PC 画面を見ながら進行することが多い。ゼミなどでは発表者を切り替えながら発表を行う場合もある。通常このような場面では、資料やスライドを表示するためにプロジェクタが使用されている。ゼミの際には発表者を切り替えるたびにプロジェクタにケーブルを差し替える必要がある。ケーブルの差し替えの際に発表者の PC によってはアダプターの種類や解像度の設定により、正常に PC 画面を表示できない場合がある。また、参加者もプロジェクタに集中を割く必要があり、手元の PC と交互に参照する場合、負担になる可能性がある。 + +当研究室で開発している画面配信システム TreeVNC は、発表者の画面を参加者の PC に表示するソフトウェアである。そのため TreeVNC を使用することで、参加者は不自由なく手元の PC を使用しながら講義を受ける事が可能になる。更に発表者の切り替えの際も、ケーブルの差し替えを行わずに共有する画面の切替を可能としている。 + +TreeVNC は VNC(Virtual Network Computing) を使用した画面配信を行っている。通常の VNC では配信側の PC に全ての参加者が接続するため、多人数が接続した際処理しきれず、最悪の場合ソフトウェアが落ちてしまう。TreeVNC ではネットワークに接続した参加者をバイナリツリー状に接続し、 配信コストをクライアントに分散させる仕組みをとっている。そのため、講義で発表者の画面を表示する際、多人数の生徒が参加しても処理性能が下がらない。また、ツリーのルートが参照している VNC サーバーを変更することで、共有する画面の切替が可能となっている。 + +しかし、画面共有は送信するデータ量が多いため、現在の TreeVNC では無線 LAN 接続の場合、画面の配信に遅延が生じてしまう場合がある。そこで本研究では、multicast でのデータ通信の実装やデータの分割・圧縮方法の評価を行うことにより、無線 LAN での配信環境の向上を目指し、TreeVNC の有用性を評価することで講義やゼミを円滑に行えることを目標とする。 + + + +%% TreeVNC を 有線・無線接続の両方で快適に使用できるようにしたい + +%% そのため当研究室では無線接続の際、multicast で通信を行う手法を提案する + +%% multicast 接続で、TreeVNC の実用性を向上させたい + +%%% +% やってること、やりたいことは TreeVNC 上で multicast を実装し、無線接続でも問題なく使用できるようにすること +%%% + +% なんで multicast で実装するの ? +% 現在の TreeVNC は無線接続だと多人数での接続や動画配信を行なった際、画面共有が遅くなる場合があるので、multicast でデータの通信を行えば、クライアント側の負担が軽減され、通信速度の改善が見られやすいと考えるから + + +%\section{論文の構成} + +%\section{Introduction} + % 基礎概念 -\input{chapter2.tex} +\chapter{TreeVNC の基本概念} +% VNCとはなにか?どのようなものか?どのようにしてなりたっているか? + + TreeVNC は当研究室で開発している画面配信ソフトウェアである。 + +本章は TreeVNC の基本概念となっている技術について説明する。 + +% どういう概念? どうしてそうするの? どうやってつかうの? +\section{Virtual Network Computing} + +TreeVNC の名前にも用いられている VNC (Virtual Network Computing) は、RFB プロトコルを用いて PC の遠隔操作を行うことを目的としたリモートデスクトップソフトウェアである。 + +サーバー側とクライアント側に分かれており、起動したサーバーにクライアントが接続することで遠隔操作を可能にしている。 + + +\section{RFB プロトコル} + +RFB (Remote Frame Buffer) プロトコルは、自身の画面をネットワークを通じて送信し他者の画面に表示するプロトコルである。 + +ユーザがいる(画面を表示される)側と FrameBuffer への更新が行われる(自身の画面を送信する)側に分かれ、それぞれを RFB クライアント、RFB サーバと呼ぶ。FrameBuffer は、メモリ上に置かれた画像データのことである。 + +RFB プロトコルでは、始めにプロトコルバージョンの確認、認証を行う。その後クライアントに向けて FrameBuffer の大きさやデスクトップに付けられた名前などが含まれている初期メッセージが送信される。RFB サーバ側は FrameBuffer の更新が行われるたびに RFB クライアントに対して FrameBuffer の変更部分だけを送信する。更に、RFB クライアントの FramebufferUpdateRequest が来るとそれに答え返信する。変更部分だけを送信する理由は、更新がある度に全画面を送信していると、送信するデータ面、更新にかかる時間面において効率が悪いからである。 + + +\section{TreeStructure} +TreeVNC はサーバーに接続してきたクライアントをバイナリツリー状に接続している。また、接続してきたクライアントをノードとし、その下に新たなクライアントを接続していくことでサーバーが画面のデータを配信する回数を抑えることで負荷分散している(図)。バイナリツリー状に接続することで、画像データのコピーを各ノードに負担させることができ、従来の VNC ではクライアントが N 台接続するとサーバー側が N 回コピーを行なって配信していたが、この接続方法であれば各ノードが 2 回ずつコピーすることで配信を可能にしている。 + +\begin{figure}[htpb] + \begin{center} + \scalebox{0.55}{\includegraphics{fig/vnc.pdf}} + \end{center} + \caption{従来の VNC の接続方法} + \label{fig:vnc} +\end{figure} + +\begin{figure}[htpb] + \begin{center} + \scalebox{0.55}{\includegraphics{fig/treevnc.pdf}} + \end{center} + \caption{TreeVNC の接続方法} + \label{fig:treevnc} +\end{figure} + + +\section{画面配信の切り替え} +従来の VNC では、配信者が切り替わるたびに VNC の再起動、サーバー、クライアント間の再接続を行う必要がある。TreeVNC では、画面上にある ShareScreen ボタンを押すことで配信者の切り替えを実行できるように設定し、この問題に対処している。 + +ShareScreen 実行後、 Root Node に対し SERVER\_CHANGE\_REQUEST というメッセージが送信される。このメッセージには ShereScreen ボタンを押した Node の番号やディスプレイの情報が付加されている。メッセージを受け取った Root Node は配信を希望している Node の VNC サーバーと通信を行い、切り替え作業に入る。 + +%切り替え実行時の図 % 実験 -\input{chapter3.tex} + % 実装 -\input{chapter4.tex} + % 評価 -\input{chapter5.tex} + % 結論 -\input{chapter6.tex} + % 参考文献 %% こっちで書きたいよね \nocite{*} -\bibliographystyle{junsrt} -\bibliography{reference} +%\bibliographystyle{junsrt} +%\bibliography{reference} % \input{bibliography.tex}