分配最大可用内存
Allocate maximum memory available
我目前正在尝试编写一个应该分配最大可用内存的程序。我找到了一个解决方案,它限制了潜在可用内存的区域,直到两个边界相等(见列表)
void enforceMemoryLeakage(void** arrayOfAllocMemory)
{
unsigned int maxMemory = 0x80000000;
unsigned int minMemory = 0x50000000;
unsigned int attempAllocatedMemory = minMemory + (maxMemory - minMemory) / 2;
void* pAllocMemory;
while((maxMemory - minMemory) > 1)
{
pAllocMemory = malloc(attempAllocatedMemory);
if (pAllocMemory != NULL)
{
minMemory = attempAllocatedMemory;
attempAllocatedMemory += (maxMemory - minMemory) / 2;
free(pAllocMemory);
}
else
{
maxMemory = attempAllocatedMemory;
attempAllocatedMemory = minMemory + (maxMemory - minMemory) / 2;
}
}
arrayOfAllocMemory[0] = malloc(maxMemory);
void* pAllocAdditionalMemory = malloc(100);
if (pAllocAdditionalMemory == NULL)
std::cout << "Maximum memory: " << minMemory << "\n";
}
上面显示的代码工作正常。但是如果执行命令
void* pAllocAdditionalMemory = malloc(100);
if (pAllocAdditionalMemory == NULL)
std::cout << "Maximum memory: " << minMemory << "\n";
我原以为没有更多可用内存。但是它不起作用,这让我想到了我的实际问题,为什么上面显示的方法不起作用。
此致
秃头
您没有指定 OS 也没有指定平台,所以我完全是猜测,所以请带着极端偏见阅读...
假设您的二进制搜索代码中没有错误...我敢打赌您在执行期间成功 allocate/free 内存时会遇到 内存碎片 问题其他进程可以做同样的事情,所以你可能会碎片化你的记忆。示例:
- OS 有 2 兆字节的连续可用内存块
- 您分配了 1.5 MByte 的内存(
0.5 MByte
免费)
- 一些其他进程分配 1 KB(
0.499 MByte
空闲)
- 您释放了 1 MByte(
1.0 + 0.499 MByte
释放了两个片段)
- 并尝试分配 1.25 MByte
但是 OS 在单个连续块中没有 1.25 内存,因此失败,因此您再次分配 1MByte(
0.499 MByte
空闲)
- 您成功分配了 1 KB(
0.498 MByte
免费)
根据 OS 内存管理策略,您有时甚至不需要另一个进程干扰内存碎片...
然而,还有另一种与碎片无关的可能性。在仿真或 WOW64 的情况下,OS 不会分配整个可用 RAM,而且单个连续块大小也有限制。例如,Win32 不允许超过 ~1.25 GByte,但这并不意味着只有 1.25 GByte 的可用 RAM ...
我目前正在尝试编写一个应该分配最大可用内存的程序。我找到了一个解决方案,它限制了潜在可用内存的区域,直到两个边界相等(见列表)
void enforceMemoryLeakage(void** arrayOfAllocMemory)
{
unsigned int maxMemory = 0x80000000;
unsigned int minMemory = 0x50000000;
unsigned int attempAllocatedMemory = minMemory + (maxMemory - minMemory) / 2;
void* pAllocMemory;
while((maxMemory - minMemory) > 1)
{
pAllocMemory = malloc(attempAllocatedMemory);
if (pAllocMemory != NULL)
{
minMemory = attempAllocatedMemory;
attempAllocatedMemory += (maxMemory - minMemory) / 2;
free(pAllocMemory);
}
else
{
maxMemory = attempAllocatedMemory;
attempAllocatedMemory = minMemory + (maxMemory - minMemory) / 2;
}
}
arrayOfAllocMemory[0] = malloc(maxMemory);
void* pAllocAdditionalMemory = malloc(100);
if (pAllocAdditionalMemory == NULL)
std::cout << "Maximum memory: " << minMemory << "\n";
}
上面显示的代码工作正常。但是如果执行命令
void* pAllocAdditionalMemory = malloc(100);
if (pAllocAdditionalMemory == NULL)
std::cout << "Maximum memory: " << minMemory << "\n";
我原以为没有更多可用内存。但是它不起作用,这让我想到了我的实际问题,为什么上面显示的方法不起作用。
此致
秃头
您没有指定 OS 也没有指定平台,所以我完全是猜测,所以请带着极端偏见阅读...
假设您的二进制搜索代码中没有错误...我敢打赌您在执行期间成功 allocate/free 内存时会遇到 内存碎片 问题其他进程可以做同样的事情,所以你可能会碎片化你的记忆。示例:
- OS 有 2 兆字节的连续可用内存块
- 您分配了 1.5 MByte 的内存(
0.5 MByte
免费) - 一些其他进程分配 1 KB(
0.499 MByte
空闲) - 您释放了 1 MByte(
1.0 + 0.499 MByte
释放了两个片段) - 并尝试分配 1.25 MByte
但是 OS 在单个连续块中没有 1.25 内存,因此失败,因此您再次分配 1MByte(
0.499 MByte
空闲) - 您成功分配了 1 KB(
0.498 MByte
免费)
根据 OS 内存管理策略,您有时甚至不需要另一个进程干扰内存碎片...
然而,还有另一种与碎片无关的可能性。在仿真或 WOW64 的情况下,OS 不会分配整个可用 RAM,而且单个连续块大小也有限制。例如,Win32 不允许超过 ~1.25 GByte,但这并不意味着只有 1.25 GByte 的可用 RAM ...