2013-11-03 37 views
1

「重要的是要注意,在後端分配器的眼中,堆塊可能被認爲是忙碌的,但仍然沒有被應用程序使用,其原因是前端分配器的旁邊列表中的任何堆塊仍將其狀態設置爲繁忙狀態。「 - 高級Windows調試p.267Windows堆管理器 - 前端和後端分配器

我的問題是,如果堆塊狀態設置爲繁忙,爲什麼前端分配器將它添加到LAL中以供使用?

換句話說,狀態標誌要麼指示該塊是忙還是空閒的。那麼爲什麼空閒塊不在LAL中,並且如果這些塊的狀態標誌設置爲繁忙(它們可能很忙或不像語句所述),那麼這些塊如何分配給LAL?

+2

您在詢問有關未過時的未公開實施細節的問題。所有現代版本的Windows上的應用程序都使用低碎片堆。這也被廣泛地反向工程,而不是你看到的任何書。你在浪費你的時間,真的,我們也是。 –

+1

從Windows Vista開始,微軟決定默認使用低碎片前端分配器,而不是LAL。 – vincentleest

回答

3

前端分配器會將其添加到LAL中以供使用,因爲它的可供使用。該塊被釋放到前端分配器,這就是它首先得到塊的方式。前端分配器的下一個調用者請求一個合適大小的塊可以被賦予該塊,因爲從前端分配器的角度來看,它是免費的。沒有一個客戶正在使用它。

LAL的要點是儘量減少前端分配器使後端分配器所做的工作。因此,前端分配器所做的就是將塊釋放到LAL中的前端分配器,而不是將其返回到後端分配器。後端分配器顯示它們很忙,因爲它們的忙 - 前端分配器正在使用它們。但它們也是免費的,前端分配器可以分配它們而不必在後端分配器中更改它們的狀態。

如果前端分配器改變了LAL中塊的忙狀態,那將完全擊敗LAL的點。每個在LAL上添加或刪除塊都需要與後端分配器交談(以改變繁忙狀態),並且LAL的整個點是防止前端分配器必須這樣做。

+1

我現在完全明白這一點。我喜歡你讓它如此清晰的方式。 – JohnnyCat