Mercurial > hg > Members > yuuhi > slide
comparison s6/blank.html @ 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 |
comparison
equal
deleted
inserted
replaced
1:3488934d6d23 | 2:105ba499ae40 |
---|---|
135 | 135 |
136 <!-- h1.hidden => use heading just for table of contents (toc) --> | 136 <!-- h1.hidden => use heading just for table of contents (toc) --> |
137 <div class='slide'> | 137 <div class='slide'> |
138 <h2>進捗</h2> | 138 <h2>進捗</h2> |
139 <dl> | 139 <dl> |
140 <dt>s6 Slide整えて遊んでた</dt> | 140 <dt>Scalaで遊んでた</dt> |
141 <dt>mallocのお勉強</dt> | 141 <dt>mallocのお勉強</dt> |
142 <dd>kernel reading party(小崎さん)</dd> | 142 <dd>kernel reading party(小崎さん)</dd> |
143 <dd><a href="http://shelby.tv/video/youtube/0-vWT-t0UHg/the-67th-yokohama-kernel-reading-party">動画</a></dd> | 143 <dd><a href="http://shelby.tv/video/youtube/0-vWT-t0UHg/the-67th-yokohama-kernel-reading-party">動画</a></dd> |
144 <dd><a href="http://www.slideshare.net/kosaki55tea/glibc-malloc">資料</a></dd> | 144 <dd><a href="http://www.slideshare.net/kosaki55tea/glibc-malloc">資料</a></dd> |
145 </div> | 145 </div> |
146 | 146 |
147 <div class='slide'> | 147 <div class='slide'> |
148 <h2>mallocってなんだっけ……?</h2> | 148 <h2>mallocってなんだっけ……?</h2> |
149 <pre class="code"> | |
150 void *malloc(size_t size);</pre> | |
149 <img src="images/malloc.png" width="500"> | 151 <img src="images/malloc.png" width="500"> |
150 <pre class="code"> | |
151 void *malloc(size_t size);</pre> | |
152 <ul> | 152 <ul> |
153 <li>mallocはsizeバイト分のメモリを割り当て、ポインタを返す</li> | 153 <li>mallocはsizeバイト分のメモリを割り当て、ポインタを返す</li> |
154 <li>返ってくるのはvoidのポインタなので、戻り値を型でキャストする必要がある</li> | 154 <li>返ってくるのはvoidのポインタなので、戻り値を型でキャストする必要がある</li> |
155 <li>中身は初期化されていない</li> | 155 <li>中身は初期化されていない</li> |
156 <li>確保した領域はfreeを忘れずに</li> | 156 <li>確保した領域はfreeを忘れずに</li> |
158 <pre class="code"> | 158 <pre class="code"> |
159 char *str = (char*)malloc(length); // 使う型でキャストする</pre> | 159 char *str = (char*)malloc(length); // 使う型でキャストする</pre> |
160 </div> | 160 </div> |
161 | 161 |
162 <div class='slide'> | 162 <div class='slide'> |
163 <h2>古典的malloc</h2> | 163 <h2>古典的malloc(K&R malloc)</h2> |
164 <img src="images/heap.png" width="700"> | 164 <img src="images/heap.png" width="700"> |
165 <ul> | 165 <ul> |
166 <li>使用可能なブロックを繋げたリスト構造、free list (freeされているブロックのlist?) | 166 <li>使用可能なブロックを繋げたリスト構造、free list (freeされているブロックのlist?) |
167 <li>listを使ってメモリを管理 | 167 <li>listを使ってメモリを管理 |
168 <li>管理領域(header)分だけ多くallocateして、先頭に管理領域を付加 | 168 <li>管理領域(header)分だけ多くallocateして、先頭に管理領域を付加 |
226 <p>ブロックが隣接している場合は併合する。</p> | 226 <p>ブロックが隣接している場合は併合する。</p> |
227 </div> | 227 </div> |
228 | 228 |
229 <div class='slide'> | 229 <div class='slide'> |
230 <h2>free</h2> | 230 <h2>free</h2> |
231 <img src="images/free3.png" width="700"> | 231 <img src="images/free_after.png" width="700"> |
232 <p>チェックに引っかかったところをマージする。</p> | 232 <p>チェックに引っかかったところをマージする。</p> |
233 </div> | 233 </div> |
234 | 234 |
235 <div class='slide'> | 235 <div class='slide'> |
236 <h2>古典的malloc & freeまとめ</h2> | 236 <h2>古典的malloc & freeまとめ</h2> |
237 <p>フラグメンテーションが頻発する。</p> | 237 <p>フラグメンテーションが頻発する。</p> |
238 <ul> | 238 <ul> |
239 <li><p>このmallocが主流だった時は「メモリはプログラムの最初に一気に確保するもの」だった</p></li> | 239 <li>このmallocが主流だった時は「メモリはプログラムの最初に一気に確保するもの」だった</li> |
240 <li><p>メモリが充分に空いている状態で、 | 240 <li>メモリが充分に空いている状態で、 |
241 必要なメモリを一気に確保するならフラグメンテーションは起きにくい</p></li> | 241 必要なメモリを一気に確保するならフラグメンテーションは起きにくい</li> |
242 <li><p>今はJava・C++のようなオブジェクト指向言語、 | 242 <li>今はJava・C++のようなオブジェクト指向言語、 |
243 Rubyのようなスクリプト言語等、小さいmallocが頻発する</p></li> | 243 Rubyのようなスクリプト言語等、小さいmallocが頻発するものが多い</li> |
244 <li><p>それをfirst fitでやるのはよくない</p></li> | 244 <li>それをfirst fitでやるのはよくない</li> |
245 </ul> | 245 </ul> |
246 | 246 |
247 </div> | 247 </div> |
248 | 248 |
249 | 249 |
250 <div class='slide'> | 250 <div class='slide'> |
251 <h2>mallocの改良</h2> | 251 <h2>mallocの改良</h2> |
252 <p>そもそも、一つのfree listで管理することが無理がある</p> | 252 <p>そもそも、一つのfree listで管理することが無理がある</p> |
253 <p>サイズ16用のリスト、サイズ24用のリスト……というようにリストを複数作ってやる</p> | 253 <p>サイズ16Byte用のリスト、サイズ24Byte用のリスト……というようにリストを複数作ってやる</p> |
254 </div> | 254 <table border="0"> |
255 <tr> | |
256 <th> | |
257 <img src="images/free_list_list.png" width="400"> | |
258 </th> | |
259 <th valign="top" align="left"> | |
260 <ul> | |
261 <li>mallocで要求されたsizeを8で割れば自分が使用するindexとなる</li> | |
262 <li>無限にリストを増やすわけにはいかないので、このリストを使うのは512バイト以下の場合のみ</li> | |
263 <li>512バイト以上の大きいデータの場合は、特殊な管理を行う</li> | |
264 <li>大きいデータと小さいデータを一緒に管理するからフラグメンテーションが進むんだ<br> | |
265 →大きいデータ用の領域がもう一個欲しい<br>→そうだ、mmapを使おう</li> | |
266 </th> | |
267 </tr> | |
268 </table> | |
269 </div> | |
270 | |
271 | |
272 <div class='slide'> | |
273 <h2>mmapってなんだっけ……?</h2> | |
274 <ul> | |
275 <li>ファイル(fdで指定したもの)をメモリにマップする</li> | |
276 <li>fdで"/dev/zero"を指定することでmmapをメモリ確保APIとして使用</li> | |
277 <li>このAPIを使ってHuge Blockはmmapで直接kernelから取得する</li> | |
278 </ul> | |
279 <pre class="code"> | |
280 void *alloc_mmap(size_t size) { | |
281 int fd = open("/dev/zero", O_RDONLY); | |
282 void *ret = mmap(addr, length, prot, flags, fd, offset); | |
283 return ret; | |
284 }</pre> | |
285 <table border="1" > | |
286 <tr bgcolor="dbffa3"> | |
287 <th align="left" style="margin:10px 10px 10px;">addr</th><th align="left">mapするメモリアドレス。NULLを渡せばkernelがアドレスを選択する。</th> | |
288 </tr> | |
289 | |
290 <tr bgcolor="palegreen"> | |
291 <th align="left">length</th><th align="left">addrから何バイトマッピングするか。</th> | |
292 </tr> | |
293 | |
294 <tr bgcolor="dbffa3"> | |
295 <th align="left" >prot</th><th align="left">マッピングのメモリ保護の指定。Read Write Exec None等がある。</th> | |
296 </tr> | |
297 <tr bgcolor="palegreen"> | |
298 <th align="left">flags</th><th align="left">マップを要求された時、共有するかコピーを渡すか。</th> | |
299 </tr> | |
300 <tr bgcolor="dbffa3"> | |
301 <th align="left">offset</th><th align="left">ファイルの何バイト目からをメモリにマップするか。</th> | |
302 </tr> | |
303 </table> | |
304 </div> | |
305 | |
306 <div class='slide'> | |
307 <h2>Huge Block</h2> | |
308 <p>mmapで確保するので、free listからは独立している。 | |
309 <table> | |
310 <tr> | |
311 <th> | |
312 <img src="images/huge_block.png" width="500"> | |
313 </th> | |
314 <th valign="top" align="left"> | |
315 <p> | |
316 listを使って管理しているわけではないので、listをたどったりしなくて良い。</p> | |
317 <p> | |
318 ほしかったらmmapして、いらなくなったらmunmapすればよい。 | |
319 </p> | |
320 </th> | |
321 </tr> | |
322 </table> | |
323 <ul> | |
324 <li>free list上でフラグメンテーションが起きにくくなった(当たり前)</li> | |
325 <li>メモリの無駄が少ない<br> | |
326 大きなメモリは同じサイズでもう一度mallocされる可能性は低いので、 | |
327 使わなくなったらすぐOSに返却するのは正しい</li> | |
328 </ul> | |
329 </div> | |
330 | |
331 <div class='slide'> | |
332 <h2>まとめ</h2> | |
333 <ul> | |
334 <li>一見危なそうに見える処理が……</li> | |
335 <li>HugeBlockをmmapで管理すれば確かに手っ取り早いではあるが、何バイトからをHugeBlockとするかをちゃんと考えないとだめ</li> | |
336 </ul> | |
337 <h2>次やること?</h2> | |
338 <ul> | |
339 <li>AVLTree</li> | |
340 <li>2-2n allocator</li> | |
341 <li>mallocのソースを読む</li> | |
342 </ul> | |
343 </div> | |
344 | |
345 | |
346 | |
255 </div> <!-- presentation --> | 347 </div> <!-- presentation --> |
256 </body> | 348 </body> |
257 </html> | 349 </html> |