Your SlideShare is downloading. ×
高度に最適化された移植可能なメモリマネージャ
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

高度に最適化された移植可能なメモリマネージャ

3,872
views

Published on

Published in: Technology

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

No Downloads
Views
Total Views
3,872
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
31
Comments
0
Likes
8
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 高度に最適化された移植可能 なメモリマネージャ @DADA246
  • 2. 自己紹介• ゲームプログラマやってます• 得意分野 C++,C#,GPU,javascript,PHP• 低レベル係とか描画関係とかCIとかwebと か• Steam、Origin、iPhoneで海外ゲームを遊ん でいます
  • 3. はじめに• 元ネタはGame Engine Gems2のA Highly Optimized Portable Memory Managerです• Kindle Editionが$55.92で買えます
  • 4. アジェンダ• ゲームでのメモリマネージャについて• Small Block Allocator• Medium Block Allocator• Large Block Allocator
  • 5. メモリマネージャ• メモリマネージャは重要• 悪いメモリマネージャは処理速度の低下 や、フラグメンテーションによるクラッ シュを引き起こす→枯れたコードを参考にする→dlmalloc
  • 6. dlmalloc• Doug Lea’s malloc• http://g.oswego.edu/dl/html/malloc.html• 非常に良い実装だが、汎用的である→ゲーム用にカスタマイズする
  • 7. dlmalloc• 確保サイズごとにリストが用意されてい る 確保サイズ(byte) チャンク 16 24 32 40 … 2^31
  • 8. ゲーム用メモリマネージャ• キャッシュラインを意識する• 空き領域を検索しない• 高速なアロケート• デバッグの容易性• バッファオーバーフローしても管理領域 が壊れにくい• フラグメンテーションが起きにくい
  • 9. 管理領域✕ ○ 確保領域A 確保領域A 管理領域A 確保領域B 確保領域B 管理領域A 管理領域B 管理領域B確保領域Aがバッファオー 確保領域Aがバッファオーバーフローすると、管理領 バーフローしても、管理領域を破壊してしまう 域は破壊されない→バグの追跡が困難になる
  • 10. フラグメンテーション• 大きなメモリアロケーションの中に小さ なメモリアロケーションが混ざると発生 する 使用 空き alloc x2 free 空き 使用 使用 空き 空き
  • 11. フラグメンテーション対策• ページングを活用するWindowsのVirtualAlloc()• VirtualAllocは処理が重いので、多発する小さなメモリ確保には適さない→メモリ確保量によってアロケータを分ける
  • 12. 複数のアロケータメモリ確保量(byte) メモリ確保頻度 0 少ない Small Block Allocator 256 Medium Block Allocator 4096 Large Block Allocator 多い
  • 13. 基本設計• 各種アロケータはページ単位で動作する→x86を考えて4kbyte単位にする• ページ同士はリンクリストで管理する
  • 14. Small Block Allocator• 4kbyte/ページで構成• 32byte/block• 1ページごとに管理領域として1ブロック使用→127ブロックの空き
  • 15. Small Block Allocator• 確保サイズごとにページを用意する 確保サイズ(byte) 16 24 32 40 … 256
  • 16. 管理領域• 32byte=1ブロック• ブロックの空き状態をビット列で管理す る struct Header { uint32_t emptyBlockBit[4];//空きブロックのビットマスク uint32_t emptyBlockCount;//空きブロック数(ベリファイ用) uint32_t blockSize;//ブロックサイズ uint32_t* pPrePage;//前ページへのポインタ uint32_t* pNextPage; //次ページへのポインタ }
  • 17. alloc• 空きブロックのあるページを探す• 空きブロックがあるページが見つかったら、 空きブロックのビットマスクをスキャンして 確保アドレスを確定する→ x86ならbsf命令が使える• 空きブロックが無かったらOSからページアロ ケーションする
  • 18. ページ管理• 空き領域の有無でページのリンクリストを分 ける→空き領域を検索しない 空き領域無し 空き領域あり 16 16 24 24 32 32 … …
  • 19. free• freeするアドレスからページを算出する→管理領域を見つけられる int32_t pageAddress=(address/4096)*4096;• 空きブロックがなくなったらOSにページ を返す
  • 20. パフォーマンス• x86のキャッシュラインは64byte→ Small Block Allocatorの管理領域は32byteなので、キャッシュラインをまたがない• 1ページ 4kbyteなので、今時のL1キャッ シュに載る
  • 21. Medium Block Allocator• 16kbyte/ページで構成• 128byte/block• 1ページごとに管理領域として1ブロック使用
  • 22. Medium Block Allocator• 1ページで複数の確保サイズを扱う→メモリの利用効率を上げるため 確保サイズ(byte) 384 512 640 768 … 4096
  • 23. allocとfree• Small Block Allocatorとほぼ同じ• allocは可変長のメモリサイズを扱っている ため、Small Block Allocatorよりは処理が重 め• freeは空きブロックがなくなったらOSに ページを返す
  • 24. ページ管理• どれだけ空き領域があるかをリンクリス トで管理する→空き領域のあるページを高速に探す 空き領域(byte) 0 128 256 384 …
  • 25. Large Block Allocator• allocごとにページアロケーションする→大きなメモリ確保なので発生頻度が低い• シンプルなリンクリストで実装できる
  • 26. 応用• Small Block Allocatorのアプローチで Mediumサイズのメモリ確保も行えるの では?• 1ブロックサイズをメモリ確保サイズに よって変えても良いのでは?
  • 27. まとめ• dlmallocなどの枯れたコードを参考にす る• ページアロケーションでフラグメンテー ションを抑える• アロケーションサイズによってアルゴリ ズムを分けることで高速化する
  • 28. まとめ• メモリマネージャを扱ってみました• 良いメモリマネージャがあれば高レベル ライブラリも使いやすくなります
  • 29. 次のステップ• マルチスレッド化http://www.gdcvault.com/play/1014602/Multicore-Memory-Management-Technology-in• メモリデバッグツール
  • 30. Question?
  • 31. ご清聴ありがとうございました