2012-07-04 9 views
16

私は、Cで書かれた単純なスタックマシンで、ほとんどの場合学習のために取り組んでいます。私のメモリ操作にmalloc/freeを使用した後、私は現代の仮想マシンからメモリ割り当ての特定のコードを読み込むことをお勧めします。最新のVMはどのようにメモリ割り当てを処理しますか?

私はLuaのソースコードをダウンロードして読み始めました。しばらくすると、マクロがたくさん含まれていることがわかりました。実際のメモリ割り当てが行われたコードは見つかりませんでした(つまり、malloc呼び出し)。

find . -exec grep -i "malloc" '{}' \; -print 

名前にmallocという単語を持つLuaマクロしか印刷されませんでした。 Lua VM(およびプログラミング言語)はmallocをまったく使用しません!

これは私には、現代のVMはどのようにしてメモリ割り当てを処理するのかという質問につながります。 Luaはヒープからどのようにメモリを割り当てますか? malloc以外の割り当て方法はありますか?他の方法の賛否両論は何ですか?

割り当てられたメモリに安全に取り組むためのベストプラクティス、デザインパターンなどについても不思議です。私は、Luaのソースで、メモリを割り当てる前に多くの間接参照があることを知っています。このことについてどこで知ることができますか?

+0

どのような種類のVMに興味がありますか?コンピュータ全体を仮想化するVMがあります。それらについても尋ねていますか? –

+0

@AlexeyFrunze、いいえ、私はプログラミング言語に使用されていたVMに興味があります。 – sinan

+0

OK、タイトルが混乱しています。 –

答えて

14

ルアはreallocの形式で(もっとも、カスタムアロケータも渡すことができます)、しかし、LuaはVMベースの言語の99%のようなGCを使用するため、マクロを使用して自動的にGCを追加しますヘッダーブロックを割り当てに追加します。

あなたはすべてのこれらのすべてが最初に(lauxlib.cから)l_allocに設定されているアロケータを、保存するためにVMのグローバルな状態を使用し、lmem.clmem.hLuaM_ルーチンによって処理のLuaのメモリを見つけることができますが、変更することができますlua_setallocf

は最近、LuaJITは、割り当て沈没し、LuaJIT Garbage Collectionこの記事にまで読むことができますいくつかの本当にクールなメモリ機能、計画を追加しました。この記事では、VM/JITのメモリ割り当て、沈み込み、集約、およびガベージコレクションを中心に、多くの戦略と設計を取り上げています。あなたが見ることができるように

、メモリの割り当てとシンクの戦略は非常に密接に1が採用GC(もしあれば)にリンクされています。標準mallocを使用して、プロのとCONの様々なメモリのアロケータの観点から

は、使用が簡単であるが、位置合わせ及び各アロケーション上にタグ付けされた種々の余分のブロックの速度及び消耗のコストで。

さらに高度なアリーナ、プール、スラブ、ブロックアロケータに移行することで、(特に固定サイズの内部VM割り当ての場合)劇的にスピードアップし、より一般的なアロケータで発生する断片化やオーバーヘッドを回避できます。 mallocが、これらのアロケータは、より複雑であり、実証済みのテストCRT malloc実装に並置として、あなたは、あなたが(VMのような大きなシステムでは、単に問題を求めて)ゼロから始める場合は、それらをデバッグする必要があり、もちろん、 。

+0

ありがとう、私が言ったように、私はそれを見つけることができないので、mallocを使ってどこに私を見せてもらえますか?内部の知識をよりよく理解するために使用されたmallocのコードをトレースする予定です。 – sinan

+0

@sinan:素早く掘り下げよう – Necrolis

+0

@sinan:私の更新を参照してください – Necrolis

5

ルアコアはmallocとお友達を使用していません。これはrealloc様意味を有する(しかしNULLポインタと0の大きさを治療する場合、より正確である)ユーザ提供のメモリ割り当て機能に依存しています。 lua_Allocを参照してください。

補助Luaのライブラリは、標準reallocfreeとに基づいて、メモリ割り当て機能を使用してコアlua_newstate機能を介してLuaの状態を作成し、利便luaL_newstate機能を提供します。他のクライアントは、自分のアプリに適したメモリ割り当てを使用することができます。

関連する問題