gpt4 book ai didi

windows - 可以回收地址空间以多次调用 MapViewOfFileEx 而不会失败吗?

转载 作者:可可西里 更新时间:2023-11-01 09:35:57 25 4
gpt4 key购买 nike

考虑一个在 Windows XP 上的 32 位地址空间内运行的复杂、需要大量内存的多线程应用程序。

某些操作需要 n 个固定大小的大缓冲区,其中一次只需要访问一个缓冲区。

应用程序使用一种模式,其中一个缓冲区大小的地址空间被提前保留并用于包含当前需要的缓冲区。

顺序如下:(初始运行)VirtualAlloc -> VirtualFree -> MapViewOfFileEx(缓冲区更改)UnMapViewOfFile -> MapViewOfFileEx

此处指向缓冲区位置的指针由对 VirtualAlloc 的调用提供,然后在每次调用 MapViewOfFileEx 时使用相同的位置。

问题是 Windows 没有(据我所知)提供任何握手类型的操作来在不同用户之间传递内存空间。

因此有一个小机会(在我上面的序列中的每个 -> 处)内存未被锁定并且另一个线程可以跳入并在缓冲区内执行分配。

对 MapViewOfFileEx 的下一次调用中断,系统无法再保证地址空间中有足够大的空间用于缓冲区。

显然,重构以使用较小的缓冲区可以降低重新分配空间的失败率。

一些使用 HeapLock 的方法取得了一些成功,但这仍然存在问题 - 有些东西仍然设法从地址空间中窃取一些内存。(我们尝试调用 GetProcessHeaps 然后使用 HeapLock 锁定所有堆)

我想知道是否有锁定与 MapViewOfFileEx 兼容的特定地址空间 block ?

编辑:我应该补充一点,最终这段代码存在于一个库中,该库被我无法控制的应用程序调用

最佳答案

你可以暴力破解它;挂起进程中不是执行映射的线程中的每个线程,取消映射/重新映射,取消挂起的线程。它并不优雅,但这是我能立即想到的提供您需要的那种互斥的唯一方法。

关于windows - 可以回收地址空间以多次调用 MapViewOfFileEx 而不会失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1770115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com