# HG changeset patch # User Yuhi TOMARI # Date 1403600826 -32400 # Node ID 105ba499ae4012a320307865a336c36cc62818c2 # Parent 3488934d6d2312e1a702d5185183c21f7d3e1f34 commit diff -r 3488934d6d23 -r 105ba499ae40 s6/.DS_Store Binary file s6/.DS_Store has changed diff -r 3488934d6d23 -r 105ba499ae40 s6/blank.css.less --- 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; } diff -r 3488934d6d23 -r 105ba499ae40 s6/blank.html --- 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 @@

進捗

-
s6 Slide整えて遊んでた
+
Scalaで遊んでた
mallocのお勉強
kernel reading party(小崎さん)
動画
@@ -146,9 +146,9 @@

mallocってなんだっけ……?

-
           void *malloc(size_t size);
+
  • mallocはsizeバイト分のメモリを割り当て、ポインタを返す
  • 返ってくるのはvoidのポインタなので、戻り値を型でキャストする必要がある
  • @@ -160,7 +160,7 @@
-

古典的malloc

+

古典的malloc(K&R malloc)

  • 使用可能なブロックを繋げたリスト構造、free list (freeされているブロックのlist?) @@ -228,7 +228,7 @@

    free

    - +

    チェックに引っかかったところをマージする。

    @@ -236,12 +236,12 @@

    古典的malloc & freeまとめ

    フラグメンテーションが頻発する。

      -
    • このmallocが主流だった時は「メモリはプログラムの最初に一気に確保するもの」だった

    • -
    • メモリが充分に空いている状態で、 - 必要なメモリを一気に確保するならフラグメンテーションは起きにくい

    • -
    • 今はJava・C++のようなオブジェクト指向言語、 - Rubyのようなスクリプト言語等、小さいmallocが頻発する

    • -
    • それをfirst fitでやるのはよくない

    • +
    • このmallocが主流だった時は「メモリはプログラムの最初に一気に確保するもの」だった
    • +
    • メモリが充分に空いている状態で、 + 必要なメモリを一気に確保するならフラグメンテーションは起きにくい
    • +
    • 今はJava・C++のようなオブジェクト指向言語、 + Rubyのようなスクリプト言語等、小さいmallocが頻発するものが多い
    • +
    • それをfirst fitでやるのはよくない
@@ -250,8 +250,100 @@

mallocの改良

そもそも、一つのfree listで管理することが無理がある

-

サイズ16用のリスト、サイズ24用のリスト……というようにリストを複数作ってやる

-
+

サイズ16Byte用のリスト、サイズ24Byte用のリスト……というようにリストを複数作ってやる

+ + + + + +
+ + +
    +
  • mallocで要求されたsizeを8で割れば自分が使用するindexとなる
  • +
  • 無限にリストを増やすわけにはいかないので、このリストを使うのは512バイト以下の場合のみ
  • +
  • 512バイト以上の大きいデータの場合は、特殊な管理を行う
  • +
  • 大きいデータと小さいデータを一緒に管理するからフラグメンテーションが進むんだ
    + →大きいデータ用の領域がもう一個欲しい
    →そうだ、mmapを使おう
  • +
+
+ + +
+

mmapってなんだっけ……?

+ +
+          void *alloc_mmap(size_t size) {
+              int fd    = open("/dev/zero", O_RDONLY);
+              void *ret = mmap(addr, length, prot, flags, fd, offset); 
+              return ret;
+          }
+ + + + + + + + + + + + + + + + + + +
addrmapするメモリアドレス。NULLを渡せばkernelがアドレスを選択する。
lengthaddrから何バイトマッピングするか。
protマッピングのメモリ保護の指定。Read Write Exec None等がある。
flagsマップを要求された時、共有するかコピーを渡すか。
offsetファイルの何バイト目からをメモリにマップするか。
+
+ +
+

Huge Block

+

mmapで確保するので、free listからは独立している。 + + + + + +
+ + +

+ listを使って管理しているわけではないので、listをたどったりしなくて良い。

+

+ ほしかったらmmapして、いらなくなったらmunmapすればよい。 +

+
+

+
+ +
+

まとめ

+ +

次やること?

+ +
+ + +