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で&quot;/dev/zero&quot;を指定することで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>