SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
ミニGCの作り方
                             中村 成洋
                          ネットワーク応用通信研究所




Powered by Rabbit 0.5.9
今日の
 話
今日の話
 簡単なGCの仕組み
 GC 分かれ道
 MiniGC の紹介
 malloc&free の実装
   省メモリ化の話

 mark&sweep の実装
   高速化の話
                   2/36
簡単なGC
の仕組み
Mark&Sweep
ルート




      5/36
Mark




       6/36
Sweep




        7/36
GC分
かれ道
GC分かれ道
 GC対象領域の見つけ方
 メモリ領域の管理




               9/36
GC対象領
域の見つ
  け方
GC対象領域の見つけ方
 ConservativeGC
   茨の道

 PreciseGC
   GCを作るのは簡単




                  11/36
ConservativeGC
  ユーザプログラムが現在直接さわれるメモリ
  領域(レジスタ、スタック、大域変数)をルート
  にする
   a = [] <- こんなのがルートに入る

  泥臭い事をやらないといけない
   レジスタの値を取るためにsetjump使うとか
   レジスタウィンドウ(SPARCとか)があったんだった
   とか

                             12/36
PreciseGC
  ルートは自分で完全に管理
    地道に追加
    a = [] <- この時にaをルートへ追加

  ルートにはオブジェクトを指すポインタしかな
  くなる
  precise(正確)なGC


                             13/36
GCを作るのは簡単
 不明瞭なルートがない(ambiguous roots)
   CopyingGCが作れる
   空間効率もいい

 泥臭い事をしなくてもいい




                          14/36
メモリ領
域の管理
メモリ領域の管理
 既存のmalloc使う
  簡単

 自作malloc使う
  茨の道




               16/36
既存のmallocを使う
 Rubyがやっている
 mallocでがばっと確保
 確保したメモリ領域をGC対象に
 ゴミを見つけたらfree




                   17/36
この場合
 ライブラリのmalloc&freeの性能を信頼
 GCでもメモリ管理をするので二重管理
  glibcでのフリーリスト
  gc上でのフリーリスト

 GC屋は嫌うそうです(え,そうだったのか)
 簡単でそこそこの性能

                           18/36
自作mallocを使う
 bdw-gc(boehm gc)他多くのGCライブラリ
 が実装
 GC_MALLOCでは内部の自作mallocが動
 いてメモリ確保
 GCでは上記で確保した領域が対象となる




                          19/36
この場合
 mallocで管理している領域とGCで管理して
 いる領域が同じ
  二重管理ではない

 性能は自作malloc次第
  GC用に特別にチューンする事が可能




                      20/36
でも茨の道すぎ
 ライブラリのmallocはとても性能がいい
 太刀打ちできない
  無理無理

 環境依存関係の処理が膨大に
  CPU
  OS
  ifdef地獄
                         21/36
MiniGC
の紹介
MiniGCとは
 とても小さいGC
 ソースコード350行くらい
 一応ConservativeなGC
 mallocも自作
   GC茨道

 mark&sweepアルゴリズム
                     23/36
用途
 読んで貰うためのGC




              24/36
あと
 私が作りました!




            25/36
malloc&free の実装
  K&R malloc の焼き直し
  Headerにマークフラグを追加




                     26/36
K&R mallocの復習
 前の発表の別のスライドへ




                27/36
GC対象メモリ領域(GCヒー
プ)の作成
 sbrkしたものをリンクリストで保持




                      28/36
今後出来る省メモリ化
 Headerを小さく
 マークフラグをsizeの下位3bitに入れてしま
 う
  1Headerあたり4バイト削減

 free_listのリンクは割り当てたものから消し
 てしまう
 コードが死ぬほど読みにくくなるのでやりま
 せんが!
                        29/36
ヘッダを潰すのは良くやる手
法
 minixのmallocはヘッダを潰しています
  実質のヘッダはポインタが一つだけ




                           30/36
mark and sweep の実装
特徴
 関数スタックだけを走査
 大域変数とかレジスタはやりません
     やりたかったら add_rootsで指定




                            31/36
関数スタック上位と下位の取
得
 プログラムを使う前にmini_gc_init()を呼び
 出す.
 gc前にスタックの一番上を取得
 スタックがどっちに伸びてるかは完全に環境
 依存
   適宜入れ替え

                          32/36
mark
  以下の領域をルートとする
   関数スタック
   add_rootsで定義した領域




                      33/36
sweep
  GCヒープ内を走査
  Headerを見ながらmini_gc_freeで解放し
  ていく




                           34/36
高速化
 マークの際のヘッダ探索
  今はリニアサーチ
  O(n)

 改善方法
  treeを組む
  ポインタで探索
  O(1)でいける
               35/36
終わり

Weitere ähnliche Inhalte

Was ist angesagt?

Rsgt2021 exploratory testing
Rsgt2021 exploratory testingRsgt2021 exploratory testing
Rsgt2021 exploratory testingNoriyuki Nemoto
 
20201209_chatwork資料_Kiizankiizan
20201209_chatwork資料_Kiizankiizan20201209_chatwork資料_Kiizankiizan
20201209_chatwork資料_Kiizankiizankiizan kiizan
 
効果的な例会プログラム
効果的な例会プログラム効果的な例会プログラム
効果的な例会プログラムMatcha_md
 
ECサイトのメディア事業戦略
ECサイトのメディア事業戦略ECサイトのメディア事業戦略
ECサイトのメディア事業戦略武 河野
 
テーブルトピックス策謀書
テーブルトピックス策謀書テーブルトピックス策謀書
テーブルトピックス策謀書Matcha_md
 
金融業界における人工知能
金融業界における人工知能金融業界における人工知能
金融業界における人工知能Takanobu Mizuta
 
組織的なウィキ(wiki)の導入
組織的なウィキ(wiki)の導入組織的なウィキ(wiki)の導入
組織的なウィキ(wiki)の導入Makio Tsukamoto
 
Requirement Development Chronicle
Requirement Development ChronicleRequirement Development Chronicle
Requirement Development ChronicleKent Ishizawa
 
漢朝廷、大いに乱れる
漢朝廷、大いに乱れる漢朝廷、大いに乱れる
漢朝廷、大いに乱れるgunyouak
 
アジャイルってなんだろう
アジャイルってなんだろうアジャイルってなんだろう
アジャイルってなんだろうhiroyuki Yamamoto
 
山行記録共有データベース「ヤマレコ」
山行記録共有データベース「ヤマレコ」山行記録共有データベース「ヤマレコ」
山行記録共有データベース「ヤマレコ」Kazumine Matoba
 
Web Content Marketing Case Study
Web Content  Marketing Case StudyWeb Content  Marketing Case Study
Web Content Marketing Case Studydram roll
 
私がチャレンジしたSBMデータマイニング
私がチャレンジしたSBMデータマイニング私がチャレンジしたSBMデータマイニング
私がチャレンジしたSBMデータマイニングHiroshi Ono
 
テスト駆動開発のエッセンス
テスト駆動開発のエッセンステスト駆動開発のエッセンス
テスト駆動開発のエッセンスhiroyuki Yamamoto
 
정품 비아그라 구입 HXM55,COM 시알리스 판매비아그라판매처in4
정품 비아그라 구입 HXM55,COM 시알리스 판매비아그라판매처in4 정품 비아그라 구입 HXM55,COM 시알리스 판매비아그라판매처in4
정품 비아그라 구입 HXM55,COM 시알리스 판매비아그라판매처in4 민우 현
 

Was ist angesagt? (18)

Rsgt2021 exploratory testing
Rsgt2021 exploratory testingRsgt2021 exploratory testing
Rsgt2021 exploratory testing
 
FAnn Info 2/2006
FAnn Info 2/2006FAnn Info 2/2006
FAnn Info 2/2006
 
20201209_chatwork資料_Kiizankiizan
20201209_chatwork資料_Kiizankiizan20201209_chatwork資料_Kiizankiizan
20201209_chatwork資料_Kiizankiizan
 
効果的な例会プログラム
効果的な例会プログラム効果的な例会プログラム
効果的な例会プログラム
 
ECサイトのメディア事業戦略
ECサイトのメディア事業戦略ECサイトのメディア事業戦略
ECサイトのメディア事業戦略
 
テーブルトピックス策謀書
テーブルトピックス策謀書テーブルトピックス策謀書
テーブルトピックス策謀書
 
金融業界における人工知能
金融業界における人工知能金融業界における人工知能
金融業界における人工知能
 
組織的なウィキ(wiki)の導入
組織的なウィキ(wiki)の導入組織的なウィキ(wiki)の導入
組織的なウィキ(wiki)の導入
 
Requirement Development Chronicle
Requirement Development ChronicleRequirement Development Chronicle
Requirement Development Chronicle
 
漢朝廷、大いに乱れる
漢朝廷、大いに乱れる漢朝廷、大いに乱れる
漢朝廷、大いに乱れる
 
アジャイルってなんだろう
アジャイルってなんだろうアジャイルってなんだろう
アジャイルってなんだろう
 
yet another TDD
yet another TDDyet another TDD
yet another TDD
 
山行記録共有データベース「ヤマレコ」
山行記録共有データベース「ヤマレコ」山行記録共有データベース「ヤマレコ」
山行記録共有データベース「ヤマレコ」
 
Web Content Marketing Case Study
Web Content  Marketing Case StudyWeb Content  Marketing Case Study
Web Content Marketing Case Study
 
私がチャレンジしたSBMデータマイニング
私がチャレンジしたSBMデータマイニング私がチャレンジしたSBMデータマイニング
私がチャレンジしたSBMデータマイニング
 
テスト駆動開発のエッセンス
テスト駆動開発のエッセンステスト駆動開発のエッセンス
テスト駆動開発のエッセンス
 
Git_guide
Git_guideGit_guide
Git_guide
 
정품 비아그라 구입 HXM55,COM 시알리스 판매비아그라판매처in4
정품 비아그라 구입 HXM55,COM 시알리스 판매비아그라판매처in4 정품 비아그라 구입 HXM55,COM 시알리스 판매비아그라판매처in4
정품 비아그라 구입 HXM55,COM 시알리스 판매비아그라판매처in4
 

Andere mochten auch

USENIX ATC '15 輪読会 Memory Session
USENIX ATC '15 輪読会 Memory SessionUSENIX ATC '15 輪読会 Memory Session
USENIX ATC '15 輪読会 Memory SessionRyo Matsumiya
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門sandai
 
C-HelperでC言語を効率的に学習しよう
C-HelperでC言語を効率的に学習しようC-HelperでC言語を効率的に学習しよう
C-HelperでC言語を効率的に学習しようKota Uchida
 
人が神姫ん感(原文ママ)を感じるコンピュータ
人が神姫ん感(原文ママ)を感じるコンピュータ人が神姫ん感(原文ママ)を感じるコンピュータ
人が神姫ん感(原文ママ)を感じるコンピュータharu2036
 
プログラミング言語 Julia の紹介
プログラミング言語 Julia の紹介プログラミング言語 Julia の紹介
プログラミング言語 Julia の紹介Kentaro Iizuka
 
高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャDADA246
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理DADA246
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてalwei
 
Vimを学びたい初心者のための5つの豆知識
Vimを学びたい初心者のための5つの豆知識Vimを学びたい初心者のための5つの豆知識
Vimを学びたい初心者のための5つの豆知識alwei
 
neobundle.vimについて+おまけ
neobundle.vimについて+おまけneobundle.vimについて+おまけ
neobundle.vimについて+おまけShougo
 
Vimから見たemacs
Vimから見たemacsVimから見たemacs
Vimから見たemacsShougo
 
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)kikuchan98
 
Allocators@C++11
Allocators@C++11Allocators@C++11
Allocators@C++11Cryolite
 

Andere mochten auch (13)

USENIX ATC '15 輪読会 Memory Session
USENIX ATC '15 輪読会 Memory SessionUSENIX ATC '15 輪読会 Memory Session
USENIX ATC '15 輪読会 Memory Session
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
C-HelperでC言語を効率的に学習しよう
C-HelperでC言語を効率的に学習しようC-HelperでC言語を効率的に学習しよう
C-HelperでC言語を効率的に学習しよう
 
人が神姫ん感(原文ママ)を感じるコンピュータ
人が神姫ん感(原文ママ)を感じるコンピュータ人が神姫ん感(原文ママ)を感じるコンピュータ
人が神姫ん感(原文ママ)を感じるコンピュータ
 
プログラミング言語 Julia の紹介
プログラミング言語 Julia の紹介プログラミング言語 Julia の紹介
プログラミング言語 Julia の紹介
 
高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
 
Vimを学びたい初心者のための5つの豆知識
Vimを学びたい初心者のための5つの豆知識Vimを学びたい初心者のための5つの豆知識
Vimを学びたい初心者のための5つの豆知識
 
neobundle.vimについて+おまけ
neobundle.vimについて+おまけneobundle.vimについて+おまけ
neobundle.vimについて+おまけ
 
Vimから見たemacs
Vimから見たemacsVimから見たemacs
Vimから見たemacs
 
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)
 
Allocators@C++11
Allocators@C++11Allocators@C++11
Allocators@C++11
 

Mehr von Narihiro Nakamura

Mehr von Narihiro Nakamura (20)

Symbol GC
Symbol GCSymbol GC
Symbol GC
 
RUBYLAND
RUBYLANDRUBYLAND
RUBYLAND
 
Ruby's GC 20
Ruby's GC 20Ruby's GC 20
Ruby's GC 20
 
桐島、Rubyやめるってよ
桐島、Rubyやめるってよ桐島、Rubyやめるってよ
桐島、Rubyやめるってよ
 
Rubyによる本気のGC
Rubyによる本気のGCRubyによる本気のGC
Rubyによる本気のGC
 
Fxxking gc.c
Fxxking gc.cFxxking gc.c
Fxxking gc.c
 
Parallel worlds of CRuby's GC
Parallel worlds of CRuby's GCParallel worlds of CRuby's GC
Parallel worlds of CRuby's GC
 
Parallel worlds of CRuby's GC
Parallel worlds of CRuby's GCParallel worlds of CRuby's GC
Parallel worlds of CRuby's GC
 
GC FAQ
GC FAQGC FAQ
GC FAQ
 
G1GCへ伸びていた「いばらの道」
G1GCへ伸びていた「いばらの道」G1GCへ伸びていた「いばらの道」
G1GCへ伸びていた「いばらの道」
 
CRubyGCの並列世界
CRubyGCの並列世界CRubyGCの並列世界
CRubyGCの並列世界
 
円環の理(Garbage Collection)
円環の理(Garbage Collection)円環の理(Garbage Collection)
円環の理(Garbage Collection)
 
地獄のGC本スピンオフ
地獄のGC本スピンオフ地獄のGC本スピンオフ
地獄のGC本スピンオフ
 
シャイなRubyistがRubyKaigiでできること
シャイなRubyistがRubyKaigiでできることシャイなRubyistがRubyKaigiでできること
シャイなRubyistがRubyKaigiでできること
 
われわれは、GCをX倍遅くできる
われわれは、GCをX倍遅くできるわれわれは、GCをX倍遅くできる
われわれは、GCをX倍遅くできる
 
GCが止まらない
GCが止まらないGCが止まらない
GCが止まらない
 
GC本をGCしないための100の方法
GC本をGCしないための100の方法GC本をGCしないための100の方法
GC本をGCしないための100の方法
 
GC生誕50周年を祝って
GC生誕50周年を祝ってGC生誕50周年を祝って
GC生誕50周年を祝って
 
GC本のツクリカタ
GC本のツクリカタGC本のツクリカタ
GC本のツクリカタ
 
シャイなRubyistにできること
シャイなRubyistにできることシャイなRubyistにできること
シャイなRubyistにできること
 

make of MiniGC