【问题标题】:Windows heap manager - front end and back end allocatorWindows 堆管理器 - 前端和后端分配器
【发布时间】:2013-11-14 06:15:11
【问题描述】:

“重要的是要注意,堆块在后端分配器的眼中可能被认为是忙碌的,但仍然没有被应用程序使用。这背后的原因是前端分配器上的任何堆块备用列表仍将其状态设置为忙碌。” -- 高级 Windows 调试 p.267

我的问题是:如果堆块状态设置为忙,为什么前端分配器会将其添加到 LAL 以供使用?

换句话说,状态标志要么指示块是忙要么是空闲。那么为什么空闲块不在 LAL 中,如果这些块的状态标志设置为忙(如语句所说,它们可以是忙或不忙),如何将这些块分配给 LAL?

【问题讨论】:

  • 您正在询问有关已过时的未记录实施细节的问题。所有现代版本的 Windows 上的应用程序都使用低碎片堆。这也被广泛地逆向工程,只是不是你正在阅读的任何书。你在浪费你的时间,真的,也是我们的。
  • Microsoft 已决定默认切换为使用低碎片前端分配器,而不是 Windows Vista 中的 LAL。

标签: c++ c windows internals


【解决方案1】:

前端分配器会将其添加到 LAL 以供使用,因为它可供使用。该块被释放到前端分配器,这就是它首先获得块的方式。请求适当大小的块的前分配器的下一个调用者可以得到该块,因为从前端分配器的角度来看,它是免费的。它的客户都没有使用它。

LAL 的目的是尽量减少前端分配器使后端分配器所做的工作。所以前端分配器所做的是将释放给前端分配器的块保留在 LAL 中,而不是将它们返回给后端分配器。后端分配器将它们显示为忙碌,因为它们正在忙碌——前端分配器正在使用它们。但它们也是免费的,前端分配器可以分配它们,而无需更改它们在后端分配器中的状态。

如果前端分配器改变了 LAL 中块的忙碌状态,那将完全违背 LAL 的观点。每次在 LAL 上添加或删除块都需要与后端分配器对话(以更改忙碌状态),而 LAL 的全部目的是防止前端分配器必须这样做。

【讨论】:

  • 我现在完全明白了。我喜欢你说得这么清楚的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2018-09-22
  • 1970-01-01
相关资源
最近更新 更多