Mercurial > hg > Papers > 2014 > masakoha-thesis > final
diff paper/chapter4.tex @ 50:22740fb4d522
write mmap
author | masa |
---|---|
date | Fri, 21 Feb 2014 00:26:56 +0900 |
parents | e8dd2f96d046 |
children | 06f75bca7a70 |
line wrap: on
line diff
--- a/paper/chapter4.tex Thu Feb 20 17:22:38 2014 +0900 +++ b/paper/chapter4.tex Fri Feb 21 00:26:56 2014 +0900 @@ -3,12 +3,55 @@ \section{map reduce} +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=1.0\textwidth]{fig/mapreduce.pdf} +\end{center} +\caption{map reduce image} +\label{fig:mmap} \end{figure} + \section{mmap での実装の問題点} -・mmap の仕様 +mmap とは、sys/mman.h に含まれている関数で、ファイルの読み込み等に使用される関数である。 +ファイルディスクリプタで指定したファイルを offset から len バイトの範囲を読み込む。 +この時にアドレス addr からメモリを確保するようにする。 +prot には、PROT\_READによるページの読み込み、PROT\_WRITEによるページへの書き込みなどを指定でき、 +flags にはメモリ確保する際のオプションを指定することができる。\ref{table:mmap} + +\begin{tiny} + \begin{table}[ht] + \begin{center} + \label{table:mmap} + \small + void * mmap(void *addr, size\_t len, int prot, int flags, int fd, off\_t offset); - mmap の細かい話をここで書く + \begin{tabular}[t]{c|l} + \hline + void *addr & メモリに確保するときの先頭のアドレス\\ + \hline + size\_t len & メモリを確保するサイズ\\ + \hline + int prot & ファイルモード選択\\ + \hline + int flags & 確保するときのオプション指定\\ + \hline + int fd & 読み込むファイルのファイルディスクリプタ\\ + \hline + off\_t offset & ファイル読み込みの先頭からの開始位置 \\ + \hline + \end{tabular} + \caption{mmap 関数の概要} + \end{center} + \end{table} +\end{tiny} -mmap でファイルを読み込むタイミングは、mmap 関数を使用したときではない。mmap した領域に対して何らかのアクセスをしたときに初めてファイルが読み込まれる。 +mmap でファイルを読み込むタイミングは、mmap 関数が呼ばれたときではなく、mmap した領域に対して何らかのアクセスをしたときに初めてファイルが読み込まれる。 + +図\ref{fig:mmap}では、読み込んだファイルを分割して、それらの領域に何らかの処理を加えるときの図である。これらの処理を Task と呼ぶ。 +Task 1 という1個目の Task が実行される。実行されたときに初めてそれらの領域にファイルが読み込まれ、その後何らかの処理が行われ、そして Task 2 も同様に読み込みを行ってから処理が行われる。 +これら Task は並列に実行されるべきであるが、ファイル読み込みの I/O 部分がネックとなり、本来並列実行される Task が読み込み待ちを起こしてしまう恐れがある。 +その上、読み込み方法が OS 依存となるために環境によって左右されやすく、プログラムの書き手が読み込みに関して制御しにくい。 + +それらを解決するためには、ファイル読み込みと Task を分離し、ファイルの読み込みも制御しやすくでき、なおかつ高速で動くのではないかと考えた。 \begin{figure}[htbp] \begin{center} @@ -17,24 +60,6 @@ \caption{mmap のイメージ} \label{fig:mmap} \end{figure} -mmap は kernel 部分での実装によるものなので、OS に依存されてしまう。 -・ mmap は kernel 部分の実装によるものなので、OS によってかわってしまう。 - -・ mmap が呼び出されているときにファイルを読み込むわけではない。仮想メモリに格納されているだけ。 - -・ mmap された領域に対してアクセスされたときに初めて実メモリに呼び出される。 - -図\ref{fig:mmap} - - -・ OS によってうごきが変わってしまうので、自分自身で制御できない - -・ 並列処理でファイル読み込みを行う Task を扱うと、1つ1つの Task が[読み込む → Task が走る] - -・ I/O 読み込みはネックになるが、そのネックが Task 1つ1つにふりかかる。 - -・ I/O と Task を完全に分けたほうがいいのでは。と考えた。 - \section{Broked Read の設計と実装} ・ I/O を mmap ではなく、pread 関数で実装した