16

私は主に学習目的で、Cで書かれた単純なスタックマシンに取り組んでいます。メモリ操作に使用malloc/freeした後、最新の仮想マシンからメモリ割り当て固有のコードを読み取ることをお勧めします。

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

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

malloc名前に単語が含まれている一部のLuaマクロのみを出力しました。Lua VM(およびプログラミング言語)はまったく使用mallocしません!

それで、これは私に質問につながります:現代のVMはどのようにメモリ割り当てを処理しますか?Luaはどのようにヒープからメモリを割り当てますか?割り当て以外の方法はありますmallocか?他の方法の長所/短所は何ですか?

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

4

2 に答える 2

15

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

LuaのメモリはすべてとのLuaM_ルーチンによって処理されます。これらはすべてVMのグローバル状態を使用してアロケータを格納します。アロケータは、最初は(から)に設定されていますが、によって変更できます。lmem.clmem.hl_alloclauxlib.clua_setallocf

最近、LuaJITは、割り当てのシンクといくつかの非常に優れたメモリ機能の計画を追加しました。これは、 LuaJITガベージコレクションに関するこの記事で読むことができます。この記事では、VM / JITメモリの割り当て、シンク、集約、およびガベージコレクションを中心とした多くの戦略と設計について説明します。

ご覧のとおり、メモリの割り当てとシンクの戦略は、採用しているGC(存在する場合)と非常に密接に関連しています。

さまざまなメモリアロケータの長所と短所の観点から、標準のmalloc使用は簡単に使用できますが、速度と調整の無駄、および各割り当てにタグ付けされたさまざまな追加ブロックが犠牲になります。

より高度なアリーナ、プール、スラブ、ブロックアロケータに移行すると、(特に固定サイズの内部VM割り当ての場合)物事を劇的にスピードアップし、などのより一般的なアロケータで発生する可能性のある多くの断片化とオーバーヘッドを回避できますmallocが、もちろんこれらのアロケータはより複雑であり、試行錯誤されたCRTmalloc実装とは対照的に、最初から開始する場合(VMのような大規模なシステムでは問題を要求しているだけです)、それらをデバッグする必要があります。

于 2012-07-04T07:23:00.353 に答える
5

mallocLuaコアはと友達を使用しません。これは、-のようなセマンティクスを持つユーザー提供のメモリ割り当て関数に依存しています(ただし、ポインターとサイズが0のrealloc場合はより正確です)。lua_AllocNULLを参照してください。

補助Luaライブラリは、標準およびに基づくメモリ割り当て関数を使用し luaL_newstateて、コア関数を介してLua状態を作成する便利な関数を提供します。他のクライアントは、アプリに適したメモリ割り当てを使用できます。lua_newstatereallocfree

于 2012-07-04T10:42:14.977 に答える