c++ - Windows 堆管理器 - 前端和后端分配器

标签 c++ c windows internals

“重要的是要注意,在后端分配器的眼中,堆 block 可能被认为是繁忙的,但仍未被应用程序使用。这背后的原因是前端分配器上的任何堆 block 看看旁边的名单,他们的状态仍然设​​置为忙碌。” -- 高级 Windows 调试 p.267

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

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

最佳答案

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

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

如果前端分配器改变了 LAL 中 block 的繁忙状态,那将完全破坏 LAL 的意义。 LAL 上每次添加或删除 block 都需要与后端分配器通信(以更改繁忙状态),而 LAL 的全部意义在于防止前端分配器必须这样做。

关于c++ - Windows 堆管理器 - 前端和后端分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19753981/

相关文章:

c++ - 为什么同一个头文件要包含两次?

c++ - 错误 - 当前位置没有可用的源代码

windows - Sharepoint 工作流与 Windows 工作流

C++ - 将 HashMap 添加到结构

c++ - FizzBu​​zz.cpp 与 lambdas?

c++ - 对于这种情况,这是最优雅/安全/推荐的解决方案吗?

c - OpenMP 输出错误答案

创建一个全局字符指针

windows - 在 Windows 上运行 bash 脚本时,Git Bash 与 Slash '/' 混淆

C 编程 undefined reference `WinMain@16'