Lua GC 對資料型別的特殊處理

2021-09-05 12:41:24 字數 2239 閱讀 7972

luac_barrierback和luac_barrierf 區別

在gc過程中對新建的物件引用關係進行處理。

例如:o 引用 v

luac_barrierf : 掃瞄階段將v重新標記(v加入到當前gc),否則將o標記為white

luac_barrierback:將o加入到grayagain中。grayagain在原子操作中進行處理 

luac_barrierback用於監控table的key和value 變化。因為table是易變的,如果使用luac_barrierf ,那麼每次改變key或value都重新掃瞄新物件,導致標記時間的增長。

所以使用luac_barrierback當發生改變時,見其加入grayagain中,這就將table分為了兩種,一種是未改變,一種是改變的,再次發生改變時也不會重複加入到grayagain中。

等待amotic階段重新掃瞄真個table表

string:

字串儲存在開雜湊的hash表中,gcssweepstring 每次清理雜湊表中的一列。由於清理也是分步進行的,當在字串清理階段發生resize雜湊表,有可能未清理部分的字串會放置到以清理部分,

導致字串沒辦法在當前gc重置為white。

table:

weak table 只有在所有物件mart完才能確定哪些節點需要釋放,所以weak table 一直為gray(引用物件未遍歷),所以對weak table的修改不會觸發 barrier(只有black的節點才會觸發barrier)。

所以在mart 階段結束後,table中可能還會存在一些強引用。所以在atomic 階段對weak table 進行remart,所有的weak table在 mart階段都被放入到g->weak鍊錶中。

執行緒:

執行緒引用的是執行緒堆疊,在執行時整個堆疊都是一直變化的,如果加入luac_barrier監控變化,會導致執行效率降低,所以lua預設執行緒就是一直在變的,在mart是不會標記為black,而是像處理table一樣在amotic階段重新掃瞄。

upvalue:

新建的upvalue(開啟狀態)儲存在g->uvhead和l->openupval中,不連線在alloc鍊錶上。當close upvalue時將upvalue放回到alloc中並從openupvalue和uvhead中移除。所以處理gc處理upvalue時,如果是close upvalue 則像普通物件一樣處理。open upvalue則需要特殊處理。openupvalue 只有可能被執行緒和lua  closure引用,而只被執行緒引用而沒被lua  closure引用的upvalue 是無意義的,應該被清除掉。所以執行緒對upvalue是弱引用。當mart階段只會將open upvalue 從white 變為 gray,用於標記是否被lua  closure引用。在清理階段,執行緒物件遍歷自己的upvalue ,清理掉沒有被引用到的upvalue。當執行緒退出時也會清理open  upvalue。open upvalue 由於引用棧上的值,變化頻繁,所以也需要在atomic階段重新remart。

userdata處理:

由於userdata由_gc元方法存在,清理之前應該呼叫_gc元方法。所以需要遍歷所有的userdata,lua將userdata儲存在alloc鍊錶中,但是區別於其他物件頭插入到alloc中,userdata插入到執行緒物件之後,其他物件-->執行緒-->userdata。在atomic階段 通過luac_separateudata 查詢所有已經"dead",並將帶_gc 方法的userdata,將其從alloc鍊錶中移除,加入到tmudata雙向鍊錶中,並標記finalizedbit,防止_gc元方法重複呼叫。在gcsfinalize階段遍歷tmudata,呼叫_gc元方法並將其從tmudata中移除,重新加入到alloc鍊錶中。dead的userdata並不在本次gc中**,而是先做標記然後呼叫_gc元方法,然後在下一次的gc中**。

base type metatable:

基本型別的元表是共享的,而不是像table 等 是每個物件獨享的。所以 base type metatable 儲存在 g->mt中(也在alloc中)。當設定元表時,table 等會觸發barrier,但是base type metatable 由於儲存結構關係,barrier無法處理,所以並不會觸發barrier。所以在atomic階段會重新remart   base type metatable(mart 過程中引用關係的改變)。

特殊資料型別

1 結構型別 類似於c 中的struct 例如 patient.name xy patient.billing 130.12 patient.test 78 23 34 34 234 234 433 567 patient patient name xy billing 130.1200 test ...

對資料型別的操作

auther alex date 2020 12 26 12 26 23 28 description 測試使用proparedstatement操作blob型別的資料 verxion 1.0 public class blobtest1 test public void test2 throws ...

python特殊的資料型別

list 列表 是 python 中使用最頻繁的資料型別。列表可以完成大多數集合類的資料結構實現。它支援字元,數字,字串甚至可以包含列表 即巢狀 列表用 標識,是 python 最通用的復合資料型別。列表中值的切割也可以用到變數 頭下標 尾下標 就可以擷取相應的列表,從左到右索引預設 0 開始,從右...