Mercurial > hg > Papers > 2014 > toma-master
changeset 65:d15c924e9089
fix
author | Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 12 Feb 2014 21:08:01 +0900 |
parents | 13535fc08357 |
children | 7c7afe38c9d6 |
files | paper/abstract_eng.tex paper/chapter1.tex paper/chapter2.tex paper/chapter3.tex paper/chapter4.tex paper/introduciton.tex paper/master_paper.pdf paper/thanx.tex |
diffstat | 8 files changed, 45 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/abstract_eng.tex Wed Feb 12 20:00:15 2014 +0900 +++ b/paper/abstract_eng.tex Wed Feb 12 21:08:01 2014 +0900 @@ -7,7 +7,7 @@ It is use non-destructive tree structure. Haskell compatible with non-destructive tree, because Haskell has no destructive updates does not exist -We measures the performance for reading and writing of parallel database. +We measure the performance for reading and writing of parallel database. We achieve to sufficient performance on the multi-core processor. -Further, in order to indicate the availability of practical applications, we measures our database against top of database. +Further, in order to indicate the availability of practical applications, we measure our database against top of database. \end{abstract_eng}
--- a/paper/chapter1.tex Wed Feb 12 20:00:15 2014 +0900 +++ b/paper/chapter1.tex Wed Feb 12 21:08:01 2014 +0900 @@ -53,7 +53,10 @@ パターンマッチをするためには値が同じかどうかテストできる必要があり, また計算するために数値でなければいけないといった制約を Haskell は推論し実行時に型の不整合が起きないようにしている. -型の定義を手動で行いたい場合は, 関数の前に型の定義を書くとよい(ソースコード\ref{src:fib3}). +型の定義を手動で行いたい場合は, 関数の前に型の定義を書くとよい. +整数の型である Int 型を受け取り Int 型を返すソースコード\ref{src:fib3}のように記述する. +Int は Eq 型クラスおよび Num 型クラスに属している. + \begin{lstlisting}[label=src:fib3, caption=フィボナッチ関数の型の定義] fib :: Int -> Int fib 0 = 0 @@ -128,6 +131,7 @@ リストとは, 角括弧で包まれた同じ型の要素の並びである. [1,2,3] や ['a','b','c'] などと表現する. [1,2,3] というのは, シンタックスシュガーであり, 内部では 1 : 2 : 3 : [] のように表現される(図\ref{fig:list}). +: は, リスト構成子でリストを構築するときに使う関数であり, リストに新たな要素を追加するときに使う. \begin{figure}[!htbp] \begin{center} @@ -251,10 +255,12 @@ モナドでは, return と $>>=$ (bind) を, Maybeではどう振る舞うかを考え定義していく. return および $>>=$ (bind) はソースコード\ref{monad}のような型をもつ関数である. +ソースコード\ref{monad}はモナド型クラスの定義で, インスタンスとするために必要な関数が列挙されている. \begin{lstlisting}[label=monad, caption=モナドに属する関数の型] -return :: Monad m => a -> m a -(>>=) :: Monad m => m a -> (a -> m b) -> m b +class Monad m where + (>>=) :: m a -> (a -> m b) -> m b + return :: a -> m a \end{lstlisting} return は値を持ち上げてコンテナに包む機能を実装すればよい(図\ref{fig:monad_return}). @@ -440,7 +446,9 @@ Eval モナドを用いた並列化について説明する. Eval モナドは並列処理を行うためのモナドである. Eval モナドで並列処理を行う使用例を示す(ソースコード\ref{src:evalmonad}). -%% 完全に動くプログラム +このプログラムは, sum'という処理を並列に実行するものである. +test では, sum' が並列に実行可能であることを指示しており, main で runEval の引数とすることで実行される. + \begin{lstlisting}[label=src:evalmonad, caption=Evalモナドの使用例] import Control.Parallel.Strategies @@ -461,15 +469,16 @@ else begin \end{lstlisting} -まず, Eval モナドが定義された, Control.Parallel.Strategies をロードし, Eval モナドを利用できるようにしている. +まずプログラムでは, Eval モナドが定義された Control.Parallel.Strategies をロードし, Eval モナドを利用できるようにしている. Haskell のプログラムはmainという名前と実行したい関数を関連付けることで実行される. 今回は, print (runEval test)が実行される. 並列処理を行いたい箇所には, rpar を使う. -rpar の引数とした関数は並列に実行可能であることを示すことができる. -Eval モナドの関数の型をみると, rpar は, a を モナドに包み, 逆にrunEval はモナドから a を取り出している(ソースコード\ref{eval}). +rpar の引数とした関数は並列に実行可能であることを表す. +Eval モナドの関数の型をみると rpar は, a を モナドに包み, 逆にrunEval はモナドから a を取り出している(ソースコード\ref{eval}). rpar で並列化可能計算を示したあと, runEvalで実行するという流れになる. +\newpage \begin{lstlisting}[label=eval, caption=Eval モナドの型] data Eval a @@ -519,7 +528,9 @@ また, rpar を使用する際, 別の計算の値に依存する計算がある場合, その2つの計算は並列実行できない. 例えば, ソースコード\ref{src:rpar}の場合は並列実行ができない. +4 行目の b を計算するためには, 3行目の a の結果が必要となるためである. +\newpage \begin{lstlisting}[label=src:rpar, caption=前の計算に依存した計算] test2 :: Eval (Integer, Integer) test2 = do
--- a/paper/chapter2.tex Wed Feb 12 20:00:15 2014 +0900 +++ b/paper/chapter2.tex Wed Feb 12 21:08:01 2014 +0900 @@ -71,7 +71,20 @@ STM を利用することでロック忘れによる競合状態や, デッドロックといった問題から解放される. STM は, STM モナドという特殊なモナドの中でのみ変更できる. -STM モナドの中で変更したアクションのブロックを atomically コンビネータを使ってトランザクションとして実行する(atomically コンビネータを用いることで IO モナドとして返されるため, I/O操作が可能となる). +STMの関数が持つ型をソースコード\ref{src:stm}に示す. + +\begin{lstlisting}[label=src:stm, caption=STMの関数] +newTVar :: a -> STM (TVar a) +readTVar :: TVar a -> STM a +writeTVar :: TVar a -> a -> STM () + +atomically :: STM a -> IO a +\end{lstlisting} + +TVar というのは, Transactional variablesの略で, STM で管理する変数に対して利用する. + +新たにSTMで管理する変数を作成するnewTVar, 変数から値を読み込むreadTVar, 変数へ値を書き込むwriteTVarが存在する. +これらの関数をSTM モナドの中で使い単一のアクションのブロックとしてまとめ, atomically コンビネータを使ってトランザクションとして実行する(atomically コンビネータを用いることで IO モナドとして返されるため, I/O操作が可能となる). いったんブロック内に入るとそこから出るまでは, そのブロック内の変更は他のスレッドから見ることはできない. こちら側のスレッドからも他のスレッドによる変更はみることはできず, 実行は完全に孤立して行われる. トランザクションから出る時に, 以下のことが1つだけ起こる.
--- a/paper/chapter3.tex Wed Feb 12 20:00:15 2014 +0900 +++ b/paper/chapter3.tex Wed Feb 12 21:08:01 2014 +0900 @@ -17,7 +17,6 @@ \subsubsection{Jungle が持つデータ型} 非破壊的木構造データベース Jungle が持つのデータ型を表\ref{tab:components}に表す. - \begin{table}[htbp] \begin{center} \begin{tabular}{|c|c|c|} \hline @@ -31,6 +30,8 @@ \caption{Jungle が持つデータ型} \end{table} +TVar というのは, Transactional variablesの略で, STM で管理する変数に対して利用する. + 木構造の集まりを表現する Jungle, 単体の木構造を表現する Tree がある. Node は子と属性を任意の数持てる. データ型として定義することで, 内部の型の整合性が保たれる. @@ -94,7 +95,6 @@ 木と木の名前の Map は Haskell のソフトウェア・トランザクショナル・メモリ (STM) を利用して状態を持たせ, スレッド間で共有できるようにしてある. これは, 各スレッドから木構造を新たに作成できるようにするためである. -Jungle のデータ構造の Map の前に付いている TVar というのは, Transactional variablesの略で, STM で管理する変数に対して利用する. \subsubsection{Jungle と木の作成} Jungle は, 複数の非破壊的木構造を持つため, Map で木を管理している(図\ref{fig:jungle}). @@ -124,16 +124,6 @@ createJungleは, 新たにSTMの変数を作成する newTVar を実行する. newTVar などの STM の操作は STM モナド内で行う. 最後にatomicallyを行うことで, do 構文内がトランザクションとして実行される. -STMの関数が持つ型をソースコード\ref{src:stm}に示す. - -\newpage -\begin{lstlisting}[label=src:stm, caption=STMの関数] -newTVar :: a -> STM (TVar a) -readTVar :: TVar a -> STM a -writeTVar :: TVar a -> a -> STM () - -atomically :: STM a -> IO a -\end{lstlisting} ソースコード\ref{src:createJungle}の atomically の隣にある \$ は関数適用演算子である. \$ 関数は最も低い優先順位を持っており, 右結合である. @@ -388,9 +378,9 @@ \subsubsection{木の参照} 木の参照にも参照対象となる木構造の Node を用いる. -参照関数の定義をソースコード\ref{src:reffunc}に示す. +木構造の参照関数の定義をソースコード\ref{src:reffunc}に示す. -\begin{lstlisting}[label=src:reffunc, caption=参照関数] +\begin{lstlisting}[label=src:reffunc, caption=木構造の参照関数] getNode :: Node -> Path -> Node getNode node [] = node getNode node (x:xs) = getNode child xs @@ -436,12 +426,12 @@ pos = size map \end{lstlisting} -参照関数の基本的な流れは, getNode関数を使って参照したいPathのノードを取ってくることである. +木構造の参照関数の基本的な流れは, getNode関数を使って参照したいPathのノードを取ってくることである. そのノードにはwhereキーワードを利用して, targetという名前をつけている. targetに対して, 子のMapや属性のMapを取得した後, lookup関数などを適用する. elems, assocs, sizeなどはData.Mapの参照関数で, Jungle ではその関数をそのまま利用している. -参照関数の基本的な機能をまとめて説明する. +木構造の参照関数の基本的な機能をまとめて説明する. \paragraph*{getAttributes} 対象の Path に存在する属性を Key を用いて参照できる.
--- a/paper/chapter4.tex Wed Feb 12 20:00:15 2014 +0900 +++ b/paper/chapter4.tex Wed Feb 12 21:08:01 2014 +0900 @@ -203,7 +203,9 @@ weighttpの設定は, リクエストの総数 100 万, 同時に接続するコネクションの数 1,000, 実行時のスレッド数 3, HTTP Keep-Alivesを有効とする. -また, 現在の安定版である 7.6.3 は IO マネージャーに問題があるが, どの程度影響があるか調べるためにGHC 7.6.3 でコンパイルし, ネットワークを介さない状態での測定も行う. +また, 現在の安定版である 7.6.3 の IO マネージャーは並列実行時に性能が向上という問題がある. +どの程度影響があるか調べるためにGHC 7.6.3 でコンパイルし, ネットワークを介さない状態での測定も行う. + 結果を表\ref{tab:warp}に示す. \begin{table}[!htbp]
--- a/paper/introduciton.tex Wed Feb 12 20:00:15 2014 +0900 +++ b/paper/introduciton.tex Wed Feb 12 21:08:01 2014 +0900 @@ -20,7 +20,7 @@ また, Web 掲示板サービスを開発し, 既存の Java の非破壊的木構造データベースを用いた掲示板実装との比較をおこない, 読み込みで 3.25 倍, 書き込みで 3.78 倍の性能が確認できた. 本研究は JST/CREST 「実用化を目指した組み込みシステム用ディペンダブル・オペレーティングシステム」研究領域 (DEOSプロジェクト) として実施した. -本研究ではDEOSプロジェクト内の DEOS Agreement Description Database 信頼性を持って構築ができる非破壊的木構造データベースの実装を示した. +本研究ではDEOSプロジェクト内の D-ADD (DEOS Agreement Description Database) を, 信頼性を持って構築ができる非破壊的木構造データベースの実装を示した. DEOSプロジェクトはITシステムにおけるディペンダビリティを担保する技術体系をまとめ, 制度化, さらには事業化を目指している. DEOSプロジェクトは2006年に独立行政法人科学技術機構(JST)はCRESTプログラムの1つとして始まったプロジェクトである.
--- a/paper/thanx.tex Wed Feb 12 20:00:15 2014 +0900 +++ b/paper/thanx.tex Wed Feb 12 21:08:01 2014 +0900 @@ -1,7 +1,7 @@ \chapter*{謝辞} \addcontentsline{toc}{chapter}{謝辞} -本研究を行うにあたり, 日頃より多くの助言, ご指導いただきました河野真治助教授に心より感謝申し上げます. +本研究を行うにあたり, 日頃より多くの助言, ご指導いただきました河野真治准教授に心より感謝申し上げます. 本研究は, JST/CREST 研究領域「実用化を目指した組み込みシステム用ディペンダブル・オペレーティングシステム」D-ADD 研究チームとして実施しました. 研究の機会を与えてくださった, 株式会社 Symphony の永山辰巳さんに感謝します.