lua 5.2 GCソース分析
2498 ワード
最近ずっとlua 5.2のGCを見ています。いつも自分の理解を書きたいです。 今日も読みました。もう書き始めてもいいです。 以前は公式の資料を見ましたが、紹介します。以下はURLです。 http://lua-users.org/wiki/GarbageCollection
lua 5.2には3つの回収メカニズムがあります。
インターフェースでlua_を通すことができます。gc(what=LUAUGCGEN)は現在のモードをセミコロン回収モードに設定していますが、作者は文書で説明しています。モデルチェンジモデルは実験バージョンであり、開発者は需要に応じてセミキサーモードを採用するかどうかを決定します。
本文は主に一般的な回収メカニズムについて説明する。
lua回収はtrace-mark-sweepアルゴリズムに従う。ノードManthread、L、l_を通じてregistryは、任意の到達可能なノードに追跡し、ノードの色を灰色または黒としてマークする。trace-markが終了した後、仮想マシンの中のすべてのノードは2つの色だけを含んでいます。一つは白で、一つは黒です。そして清掃中には、仮想マシンではまだ白いノードが回収されます。黒いノードとして到達可能なノードを表している。到着は参照されることを意味し、このクラスのノードは回収されない。
まとめてください。追跡、マーク、クリーンアップを通じて、この3つのプロセスは、仮想マシンの中でまだ白いノードを回収して、ゴミ回収の目的を達成します。
仮想マシンの回収の起点はluaC_です。fullgcは、このインターフェースでは主に以下の5つのインターフェースに関連している。 1、sweeplist 2、callpendingfinalizers 3、entersweep 4、luaC_runtilstate 5、シングルステップ 五つのインターフェースの中で何をしていますか?
1、sweeplist
主な用途は、死亡したノードを取り除き、当該死亡ノードの資源を回収することである。ノードが死亡する条件は、ノードが白色であり、仮想マシンの現在の白色とは異なる。ここで説明します。luaは2つのビットで白色を表しています。trace-markが終わるたびに、仮想マシンの現在の白いビットを切り替えます。具体的なコードはatomicインターフェースにあります。sweeplistを実行すると、ノードが死亡していない場合、ノードの色は現在の白に染まる。
2、callpendingfinalizers
このインターフェースは、tobefnzリンク上のノードを回収するために使用される。
3、entersweep
このインターフェースは、sweeplistインターフェースを呼び出して、finobjチェーンとallgcチェーンのノードを回収する。
4、luaC_runtilstate
singlestepを呼び出すたびに、ワンステップ回収を実現し、ある状態になるまで回収を停止します。
5、シングルステップ
このインターフェースでは主にsinglestepインターフェースが起動される。singlestepには、5つのブランチがあり、各ブランチは、実行終了後に状態値が次の分岐となる状態に置かれ、各singlestepが順序よく実行され、ノードリソースが段階的に回収されることを保証する。その一般的な実行順序は以下の通りです。 GCSsweepstring=>GCSsweepupta=>GCSsweep=>GCSpause=>GCSpropagate=>GCSatomic=>GCSSweepstring。 singlestepで重要な分岐はGCSpropagateであり、その中でatomicインターフェースとentersweepインターフェースを呼び出しました。entersweepは上記で述べました。ここではもう繰り返さないです。アトミックの役割を説明します。アトミック内でtrace-markの原子過程を実現しました。つまり、到達できるすべてのノードを判断して、それを黒と表記して、現在の仮想マシンの白を切り替えます。これにより、トレイ時にはノードによって色の値が変わる心配がありません。説明が必要なのは、仮想マシンの回収において、現在のチェーンはすべて一方通行です。回収中、注意すべき属性は二つあります。一つはCommunHeaderのnextポインタで、一つはgclistポインタです。この二つのポインタはそれぞれのチェーンに自分を掛けて、回収と変色に参与します。nextは主に回収に参加して、gclistは主に変色に参与して、弱い表の中の鍵盤と値の回収。
lua 5.2には3つの回収メカニズムがあります。
/* kinds of Garbage Collection */
#define KGC_NORMAL 0
#define KGC_EMERGENCY 1 /* gc was forced by an allocation failure */
#define KGC_GEN 2 /* generational collection */
1、レギュラーモード 2、緊急モード 3、サブモードインターフェースでlua_を通すことができます。gc(what=LUAUGCGEN)は現在のモードをセミコロン回収モードに設定していますが、作者は文書で説明しています。モデルチェンジモデルは実験バージョンであり、開発者は需要に応じてセミキサーモードを採用するかどうかを決定します。
本文は主に一般的な回収メカニズムについて説明する。
lua回収はtrace-mark-sweepアルゴリズムに従う。ノードManthread、L、l_を通じてregistryは、任意の到達可能なノードに追跡し、ノードの色を灰色または黒としてマークする。trace-markが終了した後、仮想マシンの中のすべてのノードは2つの色だけを含んでいます。一つは白で、一つは黒です。そして清掃中には、仮想マシンではまだ白いノードが回収されます。黒いノードとして到達可能なノードを表している。到着は参照されることを意味し、このクラスのノードは回収されない。
まとめてください。追跡、マーク、クリーンアップを通じて、この3つのプロセスは、仮想マシンの中でまだ白いノードを回収して、ゴミ回収の目的を達成します。
仮想マシンの回収の起点はluaC_です。fullgcは、このインターフェースでは主に以下の5つのインターフェースに関連している。 1、sweeplist 2、callpendingfinalizers 3、entersweep 4、luaC_runtilstate 5、シングルステップ 五つのインターフェースの中で何をしていますか?
1、sweeplist
主な用途は、死亡したノードを取り除き、当該死亡ノードの資源を回収することである。ノードが死亡する条件は、ノードが白色であり、仮想マシンの現在の白色とは異なる。ここで説明します。luaは2つのビットで白色を表しています。trace-markが終わるたびに、仮想マシンの現在の白いビットを切り替えます。具体的なコードはatomicインターフェースにあります。sweeplistを実行すると、ノードが死亡していない場合、ノードの色は現在の白に染まる。
2、callpendingfinalizers
このインターフェースは、tobefnzリンク上のノードを回収するために使用される。
3、entersweep
このインターフェースは、sweeplistインターフェースを呼び出して、finobjチェーンとallgcチェーンのノードを回収する。
4、luaC_runtilstate
singlestepを呼び出すたびに、ワンステップ回収を実現し、ある状態になるまで回収を停止します。
5、シングルステップ
このインターフェースでは主にsinglestepインターフェースが起動される。singlestepには、5つのブランチがあり、各ブランチは、実行終了後に状態値が次の分岐となる状態に置かれ、各singlestepが順序よく実行され、ノードリソースが段階的に回収されることを保証する。その一般的な実行順序は以下の通りです。 GCSsweepstring=>GCSsweepupta=>GCSsweep=>GCSpause=>GCSpropagate=>GCSatomic=>GCSSweepstring。 singlestepで重要な分岐はGCSpropagateであり、その中でatomicインターフェースとentersweepインターフェースを呼び出しました。entersweepは上記で述べました。ここではもう繰り返さないです。アトミックの役割を説明します。アトミック内でtrace-markの原子過程を実現しました。つまり、到達できるすべてのノードを判断して、それを黒と表記して、現在の仮想マシンの白を切り替えます。これにより、トレイ時にはノードによって色の値が変わる心配がありません。説明が必要なのは、仮想マシンの回収において、現在のチェーンはすべて一方通行です。回収中、注意すべき属性は二つあります。一つはCommunHeaderのnextポインタで、一つはgclistポインタです。この二つのポインタはそれぞれのチェーンに自分を掛けて、回収と変色に参与します。nextは主に回収に参加して、gclistは主に変色に参与して、弱い表の中の鍵盤と値の回収。