gpt4 book ai didi

windows-vista - Vista/Win2008 上的临界区会泄漏内存吗?

转载 作者:行者123 更新时间:2023-12-04 17:29:13 26 4
gpt4 key购买 nike

似乎在 Vista/Windows Server 2008 中大量使用临界区会导致操作系统无法完全恢复内存。
我们在 Delphi 应用程序中发现了这个问题,这显然是因为使用了 CS API。 (见此 SO question)

有没有其他人在用其他语言(C++,...)开发的应用程序中看到过它?

示例代码只是初始化 10000000 CS,然后删除它们。这在 XP/Win2003 中工作正常,但在应用程序结束之前不会释放 Vista/Win2008 中的所有峰值内存。
您使用 CS 的次数越多,您的应用程序就会越多地保留内存。

最佳答案

微软确实改变了方式InitializeCriticalSection适用于 Vista、Windows Server 2008,也可能适用于 Windows 7。
他们添加了一个“功能”,以在您分配一堆 CS 时保留一些用于调试信息的内存。分配的越多,保留的内存就越多。它可能是渐近的并最终变平(没有完全购买到这个)。
为了避免这个“特性”,你必须使用新的 API InitalizeCriticalSectionEx并传递旗帜CRITICAL_SECTION_NO_DEBUG_INFO .
这样做的好处是它可能更快,因为通常只使用自旋计数而无需实际等待。
缺点是您的旧应用程序可能不兼容 ,您需要更改您的代码,它现在依赖于平台(您必须检查版本以确定使用哪个版本)。如果需要,您也会失去调试的能力。

卡住 Windows Server 2008 的测试套件:
- 将此 C++ 示例构建为 CSTest.exe

#include "stdafx.h" 
#include "windows.h"
#include <iostream>

using namespace std;

void TestCriticalSections()
{
const unsigned int CS_MAX = 5000000;
CRITICAL_SECTION* csArray = new CRITICAL_SECTION[CS_MAX];

for (unsigned int i = 0; i < CS_MAX; ++i)
InitializeCriticalSection(&csArray[i]);

for (unsigned int i = 0; i < CS_MAX; ++i)
EnterCriticalSection(&csArray[i]);

for (unsigned int i = 0; i < CS_MAX; ++i)
LeaveCriticalSection(&csArray[i]);

for (unsigned int i = 0; i < CS_MAX; ++i)
DeleteCriticalSection(&csArray[i]);

delete [] csArray;
}

int _tmain(int argc, _TCHAR* argv[])
{
TestCriticalSections();

cout << "just hanging around...";
cin.get();

return 0;
}

-...运行这个批处理文件(需要来自服务器 SDK 的 sleep.exe)
@rem you may adapt the sleep delay depending on speed and # of CPUs 
@rem sleep 2 on a duo-core 4GB. sleep 1 on a 4CPU 8GB.

@for /L %%i in (1,1,300) do @echo %%i & @start /min CSTest.exe & @sleep 1
@echo still alive?
@pause
@taskkill /im cstest.* /f

-...并在启动的 300 个实例之前看到具有 8GB 和四核 CPU 内核的 Win2008 服务器。
-...在 Windows 2003 服务器上重复,看看它像魅力一样处理它。

关于windows-vista - Vista/Win2008 上的临界区会泄漏内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/804848/

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