Mercurial > hg > Members > yuuhi > slide
changeset 2:105ba499ae40
commit
author | Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 24 Jun 2014 18:07:06 +0900 |
parents | 3488934d6d23 |
children | 3d5fd010131d |
files | s6/.DS_Store s6/blank.css.less s6/blank.html |
diffstat | 3 files changed, 105 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/s6/blank.css.less Fri May 09 11:17:10 2014 +0900 +++ b/s6/blank.css.less Tue Jun 24 18:07:06 2014 +0900 @@ -71,7 +71,7 @@ p, li, dt, dd, td{ font-size: @font-size-text; } -th { font-size: @font-small-size;} +th { font-size: @font-small-size; font-weight:normal; align:left} pre {font-size: @font-size-code; }
--- a/s6/blank.html Fri May 09 11:17:10 2014 +0900 +++ b/s6/blank.html Tue Jun 24 18:07:06 2014 +0900 @@ -137,7 +137,7 @@ <div class='slide'> <h2>進捗</h2> <dl> - <dt>s6 Slide整えて遊んでた</dt> + <dt>Scalaで遊んでた</dt> <dt>mallocのお勉強</dt> <dd>kernel reading party(小崎さん)</dd> <dd><a href="http://shelby.tv/video/youtube/0-vWT-t0UHg/the-67th-yokohama-kernel-reading-party">動画</a></dd> @@ -146,9 +146,9 @@ <div class='slide'> <h2>mallocってなんだっけ……?</h2> - <img src="images/malloc.png" width="500"> <pre class="code"> void *malloc(size_t size);</pre> + <img src="images/malloc.png" width="500"> <ul> <li>mallocはsizeバイト分のメモリを割り当て、ポインタを返す</li> <li>返ってくるのはvoidのポインタなので、戻り値を型でキャストする必要がある</li> @@ -160,7 +160,7 @@ </div> <div class='slide'> - <h2>古典的malloc</h2> + <h2>古典的malloc(K&R malloc)</h2> <img src="images/heap.png" width="700"> <ul> <li>使用可能なブロックを繋げたリスト構造、free list (freeされているブロックのlist?) @@ -228,7 +228,7 @@ <div class='slide'> <h2>free</h2> - <img src="images/free3.png" width="700"> + <img src="images/free_after.png" width="700"> <p>チェックに引っかかったところをマージする。</p> </div> @@ -236,12 +236,12 @@ <h2>古典的malloc & freeまとめ</h2> <p>フラグメンテーションが頻発する。</p> <ul> - <li><p>このmallocが主流だった時は「メモリはプログラムの最初に一気に確保するもの」だった</p></li> - <li><p>メモリが充分に空いている状態で、 - 必要なメモリを一気に確保するならフラグメンテーションは起きにくい</p></li> - <li><p>今はJava・C++のようなオブジェクト指向言語、 - Rubyのようなスクリプト言語等、小さいmallocが頻発する</p></li> - <li><p>それをfirst fitでやるのはよくない</p></li> + <li>このmallocが主流だった時は「メモリはプログラムの最初に一気に確保するもの」だった</li> + <li>メモリが充分に空いている状態で、 + 必要なメモリを一気に確保するならフラグメンテーションは起きにくい</li> + <li>今はJava・C++のようなオブジェクト指向言語、 + Rubyのようなスクリプト言語等、小さいmallocが頻発するものが多い</li> + <li>それをfirst fitでやるのはよくない</li> </ul> </div> @@ -250,8 +250,100 @@ <div class='slide'> <h2>mallocの改良</h2> <p>そもそも、一つのfree listで管理することが無理がある</p> - <p>サイズ16用のリスト、サイズ24用のリスト……というようにリストを複数作ってやる</p> - </div> + <p>サイズ16Byte用のリスト、サイズ24Byte用のリスト……というようにリストを複数作ってやる</p> + <table border="0"> + <tr> + <th> + <img src="images/free_list_list.png" width="400"> + </th> + <th valign="top" align="left"> + <ul> + <li>mallocで要求されたsizeを8で割れば自分が使用するindexとなる</li> + <li>無限にリストを増やすわけにはいかないので、このリストを使うのは512バイト以下の場合のみ</li> + <li>512バイト以上の大きいデータの場合は、特殊な管理を行う</li> + <li>大きいデータと小さいデータを一緒に管理するからフラグメンテーションが進むんだ<br> + →大きいデータ用の領域がもう一個欲しい<br>→そうだ、mmapを使おう</li> + </th> + </tr> + </table> + </div> + + + <div class='slide'> + <h2>mmapってなんだっけ……?</h2> + <ul> + <li>ファイル(fdで指定したもの)をメモリにマップする</li> + <li>fdで"/dev/zero"を指定することでmmapをメモリ確保APIとして使用</li> + <li>このAPIを使ってHuge Blockはmmapで直接kernelから取得する</li> + </ul> + <pre class="code"> + void *alloc_mmap(size_t size) { + int fd = open("/dev/zero", O_RDONLY); + void *ret = mmap(addr, length, prot, flags, fd, offset); + return ret; + }</pre> + <table border="1" > + <tr bgcolor="dbffa3"> + <th align="left" style="margin:10px 10px 10px;">addr</th><th align="left">mapするメモリアドレス。NULLを渡せばkernelがアドレスを選択する。</th> + </tr> + + <tr bgcolor="palegreen"> + <th align="left">length</th><th align="left">addrから何バイトマッピングするか。</th> + </tr> + + <tr bgcolor="dbffa3"> + <th align="left" >prot</th><th align="left">マッピングのメモリ保護の指定。Read Write Exec None等がある。</th> + </tr> + <tr bgcolor="palegreen"> + <th align="left">flags</th><th align="left">マップを要求された時、共有するかコピーを渡すか。</th> + </tr> + <tr bgcolor="dbffa3"> + <th align="left">offset</th><th align="left">ファイルの何バイト目からをメモリにマップするか。</th> + </tr> + </table> + </div> + + <div class='slide'> + <h2>Huge Block</h2> + <p>mmapで確保するので、free listからは独立している。 + <table> + <tr> + <th> + <img src="images/huge_block.png" width="500"> + </th> + <th valign="top" align="left"> + <p> + listを使って管理しているわけではないので、listをたどったりしなくて良い。</p> + <p> + ほしかったらmmapして、いらなくなったらmunmapすればよい。 + </p> + </th> + </tr> + </table> + <ul> + <li>free list上でフラグメンテーションが起きにくくなった(当たり前)</li> + <li>メモリの無駄が少ない<br> + 大きなメモリは同じサイズでもう一度mallocされる可能性は低いので、 + 使わなくなったらすぐOSに返却するのは正しい</li> + </ul> + </div> + + <div class='slide'> + <h2>まとめ</h2> + <ul> + <li>一見危なそうに見える処理が……</li> + <li>HugeBlockをmmapで管理すれば確かに手っ取り早いではあるが、何バイトからをHugeBlockとするかをちゃんと考えないとだめ</li> + </ul> + <h2>次やること?</h2> + <ul> + <li>AVLTree</li> + <li>2-2n allocator</li> + <li>mallocのソースを読む</li> + </ul> + </div> + + + </div> <!-- presentation --> </body> </html>