15,471
社区成员
发帖
与我相关
我的任务
分享
MEMORYSTATUSEX MemoryInfo = {};
MemoryInfo.dwLength = sizeof MemoryInfo;
GlobalMemoryStatusEx(&MemoryInfo);
char buff[1024] = {};
sprintf_s(buff, "系统已使用的物理内存百分比:%d%%, 系统实际物理内存(字节):%lld, 系统实际可用内存(字节):%lld, 系统页文件大小(字节):%lld, 系统可用页文件大小(字节):%lld, "
"当前进程用户模式分区大小(字节):0x%llX, 当前进程虚拟地址空间中未保留和未提交的量(字节):%lld", MemoryInfo.dwMemoryLoad, MemoryInfo.ullTotalPhys, MemoryInfo.ullAvailPhys,
MemoryInfo.ullTotalPageFile, MemoryInfo.ullAvailPageFile, MemoryInfo.ullTotalVirtual, MemoryInfo.ullAvailVirtual);
/*
否 (/LARGEADDRESSAWARE:NO):
系统已使用的物理内存百分比:40%, 系统实际物理内存(字节):8524783616, 系统实际可用内存(字节):5046480896, 系统页文件大小(字节):17047678976, 系统可用页文件大小(字节):13249622016,
当前进程用户模式分区大小(字节):0x7FFE0000, 当前进程虚拟地址空间中未保留和未提交的量(字节):2134200320
是 (/LARGEADDRESSAWARE):
系统已使用的物理内存百分比:41%, 系统实际物理内存(字节):8524783616, 系统实际可用内存(字节):5017403392, 系统页文件大小(字节):17047678976, 系统可用页文件大小(字节):13203300352,
当前进程用户模式分区大小(字节):0xFFFE0000, 当前进程虚拟地址空间中未保留和未提交的量(字节):4281683968
*/
当开启了 /LARGEADDRESSAWARE 后,当前进程的用户模式分区大小确实达到了 0xFFFE0000 也差不多是4GB的大小了
[/quote]
内核对象内存布局安排方式只有微软知道,但可以肯定的是,设置/LARGEADDRESSAWARE的,肯定会限制了内核可用的地址空间,从而限制系统所能创建的线程等资源的数量,能创建的资源肯定比非大内存时的要少。我记得《Windows核心编程》上对此也进行了详细描述
MEMORYSTATUSEX MemoryInfo = {};
MemoryInfo.dwLength = sizeof MemoryInfo;
GlobalMemoryStatusEx(&MemoryInfo);
char buff[1024] = {};
sprintf_s(buff, "系统已使用的物理内存百分比:%d%%, 系统实际物理内存(字节):%lld, 系统实际可用内存(字节):%lld, 系统页文件大小(字节):%lld, 系统可用页文件大小(字节):%lld, "
"当前进程用户模式分区大小(字节):0x%llX, 当前进程虚拟地址空间中未保留和未提交的量(字节):%lld", MemoryInfo.dwMemoryLoad, MemoryInfo.ullTotalPhys, MemoryInfo.ullAvailPhys,
MemoryInfo.ullTotalPageFile, MemoryInfo.ullAvailPageFile, MemoryInfo.ullTotalVirtual, MemoryInfo.ullAvailVirtual);
/*
否 (/LARGEADDRESSAWARE:NO):
系统已使用的物理内存百分比:40%, 系统实际物理内存(字节):8524783616, 系统实际可用内存(字节):5046480896, 系统页文件大小(字节):17047678976, 系统可用页文件大小(字节):13249622016,
当前进程用户模式分区大小(字节):0x7FFE0000, 当前进程虚拟地址空间中未保留和未提交的量(字节):2134200320
是 (/LARGEADDRESSAWARE):
系统已使用的物理内存百分比:41%, 系统实际物理内存(字节):8524783616, 系统实际可用内存(字节):5017403392, 系统页文件大小(字节):17047678976, 系统可用页文件大小(字节):13203300352,
当前进程用户模式分区大小(字节):0xFFFE0000, 当前进程虚拟地址空间中未保留和未提交的量(字节):4281683968
*/
当开启了 /LARGEADDRESSAWARE 后,当前进程的用户模式分区大小确实达到了 0xFFFE0000 也差不多是4GB的大小了
[/quote]
内核对象内存布局安排方式只有微软知道,但可以肯定的是,设置/LARGEADDRESSAWARE的,肯定会限制了内核可用的地址空间,从而限制系统所能创建的线程等资源的数量,能创建的资源肯定比非大内存时的要少。我记得《Windows核心编程》上对此也进行了详细描述[/quote]
你说的没错, 我是看了 《Windows核心编程》 第十三章 才产生的问题, 设置了 那个 开关 确实限制了 内核可用的地址空间,但是从 GlobalMemoryStatusEx 返回的情况来看, 内核地址空间已经剩下 很小很小了,系统如何使用这么小的内核地址空间 来正常的维护我这个进程呢
MEMORYSTATUSEX MemoryInfo = {};
MemoryInfo.dwLength = sizeof MemoryInfo;
GlobalMemoryStatusEx(&MemoryInfo);
char buff[1024] = {};
sprintf_s(buff, "系统已使用的物理内存百分比:%d%%, 系统实际物理内存(字节):%lld, 系统实际可用内存(字节):%lld, 系统页文件大小(字节):%lld, 系统可用页文件大小(字节):%lld, "
"当前进程用户模式分区大小(字节):0x%llX, 当前进程虚拟地址空间中未保留和未提交的量(字节):%lld", MemoryInfo.dwMemoryLoad, MemoryInfo.ullTotalPhys, MemoryInfo.ullAvailPhys,
MemoryInfo.ullTotalPageFile, MemoryInfo.ullAvailPageFile, MemoryInfo.ullTotalVirtual, MemoryInfo.ullAvailVirtual);
/*
否 (/LARGEADDRESSAWARE:NO):
系统已使用的物理内存百分比:40%, 系统实际物理内存(字节):8524783616, 系统实际可用内存(字节):5046480896, 系统页文件大小(字节):17047678976, 系统可用页文件大小(字节):13249622016,
当前进程用户模式分区大小(字节):0x7FFE0000, 当前进程虚拟地址空间中未保留和未提交的量(字节):2134200320
是 (/LARGEADDRESSAWARE):
系统已使用的物理内存百分比:41%, 系统实际物理内存(字节):8524783616, 系统实际可用内存(字节):5017403392, 系统页文件大小(字节):17047678976, 系统可用页文件大小(字节):13203300352,
当前进程用户模式分区大小(字节):0xFFFE0000, 当前进程虚拟地址空间中未保留和未提交的量(字节):4281683968
*/
当开启了 /LARGEADDRESSAWARE 后,当前进程的用户模式分区大小确实达到了 0xFFFE0000 也差不多是4GB的大小了
FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000];
int B;
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999];
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B;
fclose(fA);
#include <Windows.h>
#include <new>
#include <process.h>
#include <vector>
using std::vector;
using std::nothrow;
DWORD __stdcall FunThread(void* pVoid)
{
return 0;
}
int main()
{
vector<char*> vecAlloc;
while(1)
{
auto pRe = (char*)malloc(1024 * 1024);
if (!pRe)
{
break;
}
vecAlloc.emplace_back(pRe);
if (vecAlloc.size() > 3800)
{
break;
}
}
std::reverse(vecAlloc.begin(), vecAlloc.end());
auto nPoint = *vecAlloc.begin();
size_t nMemorySize = vecAlloc.size();
vector<HANDLE> vecHandle;
while(1)
{
HANDLE hEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
if (hEvent == NULL || hEvent == INVALID_HANDLE_VALUE)
{
break;
}
vecHandle.emplace_back(hEvent);
if (vecHandle.size() > 1000000)
{
break;
}
}
size_t nHandleSize = vecHandle.size();
vector<HANDLE> vecThread;
while(1)
{
HANDLE hThread = CreateThread(NULL, 0, FunThread, NULL, CREATE_SUSPENDED, nullptr);
if (!hThread)
{
break;
}
vecThread.emplace_back(hThread);
if (vecThread.size() > 1000000)
{
break;
}
}
size_t nThreadSize = vecThread.size();
for (size_t i = 0; i < vecAlloc.size(); ++i)
{
memset(vecAlloc[i], 10, 1024 * 1024); //访问内存不会出错
}
for (size_t i = 0; i < vecHandle.size(); ++i)
{
SetEvent(vecHandle[i]); //内核对象均能触发成功
WaitForSingleObject(vecHandle[i], INFINITE);
}
/*
Win32开启 /LARGEADDRESSAWARE 开关
0xfe800040
nMemorySize = 3801
nHandleSize = 1000001
nThreadSize = 12
*/
printf("\n");
}