make of MiniGC

2,025 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,025
On SlideShare
0
From Embeds
0
Number of Embeds
131
Actions
Shares
0
Downloads
7
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

make of MiniGC

  1. 1. ミニGCの作り方 中村 成洋 ネットワーク応用通信研究所 Powered by Rabbit 0.5.9
  2. 2. 今日の 話
  3. 3. 今日の話 簡単なGCの仕組み GC 分かれ道 MiniGC の紹介 malloc&free の実装 省メモリ化の話 mark&sweep の実装 高速化の話 2/36
  4. 4. 簡単なGC の仕組み
  5. 5. Mark&Sweep
  6. 6. ルート 5/36
  7. 7. Mark 6/36
  8. 8. Sweep 7/36
  9. 9. GC分 かれ道
  10. 10. GC分かれ道 GC対象領域の見つけ方 メモリ領域の管理 9/36
  11. 11. GC対象領 域の見つ け方
  12. 12. GC対象領域の見つけ方 ConservativeGC 茨の道 PreciseGC GCを作るのは簡単 11/36
  13. 13. ConservativeGC ユーザプログラムが現在直接さわれるメモリ 領域(レジスタ、スタック、大域変数)をルート にする a = [] <- こんなのがルートに入る 泥臭い事をやらないといけない レジスタの値を取るためにsetjump使うとか レジスタウィンドウ(SPARCとか)があったんだった とか 12/36
  14. 14. PreciseGC ルートは自分で完全に管理 地道に追加 a = [] <- この時にaをルートへ追加 ルートにはオブジェクトを指すポインタしかな くなる precise(正確)なGC 13/36
  15. 15. GCを作るのは簡単 不明瞭なルートがない(ambiguous roots) CopyingGCが作れる 空間効率もいい 泥臭い事をしなくてもいい 14/36
  16. 16. メモリ領 域の管理
  17. 17. メモリ領域の管理 既存のmalloc使う 簡単 自作malloc使う 茨の道 16/36
  18. 18. 既存のmallocを使う Rubyがやっている mallocでがばっと確保 確保したメモリ領域をGC対象に ゴミを見つけたらfree 17/36
  19. 19. この場合 ライブラリのmalloc&freeの性能を信頼 GCでもメモリ管理をするので二重管理 glibcでのフリーリスト gc上でのフリーリスト GC屋は嫌うそうです(え,そうだったのか) 簡単でそこそこの性能 18/36
  20. 20. 自作mallocを使う bdw-gc(boehm gc)他多くのGCライブラリ が実装 GC_MALLOCでは内部の自作mallocが動 いてメモリ確保 GCでは上記で確保した領域が対象となる 19/36
  21. 21. この場合 mallocで管理している領域とGCで管理して いる領域が同じ 二重管理ではない 性能は自作malloc次第 GC用に特別にチューンする事が可能 20/36
  22. 22. でも茨の道すぎ ライブラリのmallocはとても性能がいい 太刀打ちできない 無理無理 環境依存関係の処理が膨大に CPU OS ifdef地獄 21/36
  23. 23. MiniGC の紹介
  24. 24. MiniGCとは とても小さいGC ソースコード350行くらい 一応ConservativeなGC mallocも自作 GC茨道 mark&sweepアルゴリズム 23/36
  25. 25. 用途 読んで貰うためのGC 24/36
  26. 26. あと 私が作りました! 25/36
  27. 27. malloc&free の実装 K&R malloc の焼き直し Headerにマークフラグを追加 26/36
  28. 28. K&R mallocの復習 前の発表の別のスライドへ 27/36
  29. 29. GC対象メモリ領域(GCヒー プ)の作成 sbrkしたものをリンクリストで保持 28/36
  30. 30. 今後出来る省メモリ化 Headerを小さく マークフラグをsizeの下位3bitに入れてしま う 1Headerあたり4バイト削減 free_listのリンクは割り当てたものから消し てしまう コードが死ぬほど読みにくくなるのでやりま せんが! 29/36
  31. 31. ヘッダを潰すのは良くやる手 法 minixのmallocはヘッダを潰しています 実質のヘッダはポインタが一つだけ 30/36
  32. 32. mark and sweep の実装 特徴 関数スタックだけを走査 大域変数とかレジスタはやりません やりたかったら add_rootsで指定 31/36
  33. 33. 関数スタック上位と下位の取 得 プログラムを使う前にmini_gc_init()を呼び 出す. gc前にスタックの一番上を取得 スタックがどっちに伸びてるかは完全に環境 依存 適宜入れ替え 32/36
  34. 34. mark 以下の領域をルートとする 関数スタック add_rootsで定義した領域 33/36
  35. 35. sweep GCヒープ内を走査 Headerを見ながらmini_gc_freeで解放し ていく 34/36
  36. 36. 高速化 マークの際のヘッダ探索 今はリニアサーチ O(n) 改善方法 treeを組む ポインタで探索 O(1)でいける 35/36
  37. 37. 終わり

×