【问题标题】:Getting the lowest free virtual memory address in windows获取windows中最低的空闲虚拟内存地址
【发布时间】:2011-03-13 12:24:58
【问题描述】:

标题几乎说明了一切:有没有办法在 windows 下获得最低的空闲虚拟内存地址?我应该补充一点,我在程序开始时对这些信息很感兴趣(在任何动态内存分配完成之前)。

我为什么需要它:尝试在 Windows 下构建 malloc 实现。如果不可能,我将不得不在将 NULL 作为第一个参数时返回任何 VirtualAlloc()。虽然您希望它做一些明智的事情,例如在可用的底部分配内存,但不能保证。

【问题讨论】:

  • 为什么 malloc 实现需要这些信息?
  • 如果在某一时刻我必须进行非常大的分配,最好将先前的分配分配到地址空间的低端而不是中间。此外,它最大限度地提高了通过 VirtualAlloc() 调用获得的页面之后的页面也是空闲的概率,并且可以通过将来调用 VirtualAlloc() 来获得,从而有助于防止碎片。

标签: memory-management dynamic-memory-allocation virtual-memory virtualalloc


【解决方案1】:

这可以通过使用 VirtualQuery 查找标记为免费的页面来实现。不过会比较慢。 (您还需要考虑与页面大小不同的分配粒度。)

我会说,除非您需要连续的内存块,否则尝试将所有内容保持在一起几乎是没有意义的,因为如果两个虚拟内存页在地址空间中可能彼此相邻,则没有理由假设它们是在物理内存中彼此接近。事实上,即使它们在某个时间点彼此靠近,如果这些页面被移动到后备存储然后故障返回内存,则该页面不会故障到相同的物理地址页面。

【讨论】:

    【解决方案2】:

    操作系统使用的指标比可用的“最低”内存地址更复杂。具体来说,VirtualAlloc 分配内存页面,因此根据您的要求,至少一页未使用的地址空间必须在起始地址可用。因此,即使您认为应该使用“较低”地址,该地址也可能与您请求的操作不兼容。

    【讨论】:

    • 我都知道。最低的空闲地址实际上是最低的空闲页面地址,但是由于没有分配动态内存,因此以下页面也应该是空闲的(DLL 除外,但那些往往位于地址空间 IIRC 的顶部)。跨度>
    猜你喜欢
    • 2023-03-17
    • 2018-07-09
    • 2016-09-26
    • 1970-01-01
    • 2021-07-25
    • 2014-01-16
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    相关资源
    最近更新 更多