lua 5.2 GCソース分析

2498 ワード

最近ずっとlua 5.2のGCを見ています。いつも自分の理解を書きたいです。       今日も読みました。もう書き始めてもいいです。       以前は公式の資料を見ましたが、紹介します。以下はURLです。       http://lua-users.org/wiki/GarbageCollection
          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は主に変色に参与して、弱い表の中の鍵盤と値の回収。