my code to prove working set larger than virtual bytes 
January 17th, 2008, 02:25 PM
| | | |
Hello everyone,
From the definition of working set, it is a subset of virtual pages
resident in physical memory -- from book Windows Internals. It means
working set could not be larger than virtual memory (subset
relationship).
But the following simple code on Windows Server 2003 proves (if you
monitor virtual bytes counter and working set bytes conuter from
perfmon), if we do not unmap the page map file, the working set will
continue to increase (and much larger than virtual bytes) until we
unmap it.
Take a breakpoint before following code section,
<code>
<pre>
// close mapped files to avoid leak
for (sectionIndex = 0; sectionIndex < size/allocSize; sectionIndex+
+)
{
if (map [sectionIndex])
{
UnmapViewOfFile(map [sectionIndex]);
}
}
</pre>
</code>
Any ideas? Does my code break the definition of working set? Why
working set is much larger than virtual bytes?
<code>
<pre>
int main(int argc, char* argv[])
{
LARGE_INTEGER start,end;
LARGE_INTEGER freq;
QueryPerformanceCounter(&start);
QueryPerformanceFrequency(&freq);
MEMORYSTATUS memstat;
void** map;
int sectionIndex = 0;
memstat.dwLength = sizeof(memstat);
GlobalMemoryStatus(&memstat);
// basic file mapping test (512 MB)
long long size = 512*1024*1024;
HANDLE mapping =
CreateFileMapping(NULL,NULL,PAGE_READWRITE|SEC_COM MIT,(DWORD)(size <<
32),DWORD(size),NULL);
if (mapping)
{
// create and destroy temporary views
SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
const int allocSize = sysInfo.dwAllocationGranularity;
GlobalMemoryStatus(&memstat);
void *mem = new char[allocSize];
memset(mem,0x11,allocSize);
map = (void**) new char [sizeof(void*) * size / allocSize];
for (int i=0; i < 10; i++)
{
sectionIndex = 0;
for (long long offset=0; offset<=size-allocSize; offset
+=allocSize)
{
map [sectionIndex] =
MapViewOfFile(mapping,FILE_MAP_WRITE,(DWORD)(offse t<<32),
(DWORD)offset,allocSize);
if (map [sectionIndex])
{
memcpy(map [sectionIndex],mem,allocSize);
// UnmapViewOfFile(map);
}
sectionIndex++;
} // for (long long offset=0; offset<=size-allocSize; offset
+=allocSize)
// close mapped files to avoid leak
for (sectionIndex = 0; sectionIndex < size/allocSize; sectionIndex+
+)
{
if (map [sectionIndex])
{
UnmapViewOfFile(map [sectionIndex]);
}
}
GlobalMemoryStatus(&memstat);
sectionIndex = 0;
for (long long offset=0; offset <= size-allocSize; offset
+=allocSize)
{
map [sectionIndex] =
MapViewOfFile(mapping,FILE_MAP_READ,(DWORD)(offset << 32),
(DWORD)offset,allocSize);
if (map [sectionIndex])
{
for (int t=0; t < allocSize; t++)
{
if (((char *)(map [sectionIndex]))[t]!=0x11)
{
OutputDebugString("Memory read failed\n");
}
}
}
UnmapViewOfFile(map [sectionIndex]);
}
// close mapped files to avoid leak
/*
for (sectionIndex = 0; sectionIndex < size/allocSize; sectionIndex+
+)
{
if (map [sectionIndex])
{
UnmapViewOfFile(map [sectionIndex]);
}
}
*/
GlobalMemoryStatus(&memstat);
} // for (int i=0; i < 10; i++)
QueryPerformanceCounter(&end);
GlobalMemoryStatus(&memstat);
printf("Time %.3f\n",
double(end.QuadPart-start.QuadPart)/double(freq.QuadPart));
CloseHandle(mapping);
delete[] mem;
GlobalMemoryStatus(&memstat);
} //if (mapping)
return 0;
}
</pre>
</code>
thanks in advance,
George | 
January 17th, 2008, 08:15 PM
| | | | re: my code to prove working set larger than virtual bytes
George2 a écrit : Quote:
Hello everyone,
>
>
From the definition of working set, it is a subset of virtual pages
resident in physical memory -- from book Windows Internals. It means
working set could not be larger than virtual memory (subset
relationship).
>
But the following simple code on Windows Server 2003 proves (if you
monitor virtual bytes counter and working set bytes conuter from
perfmon), if we do not unmap the page map file, the working set will
continue to increase (and much larger than virtual bytes) until we
unmap it.
>
Take a breakpoint before following code section,
>
<code>
<pre>
// close mapped files to avoid leak
for (sectionIndex = 0; sectionIndex < size/allocSize; sectionIndex+
+)
{
if (map [sectionIndex])
{
UnmapViewOfFile(map [sectionIndex]);
}
}
</pre>
</code>
>
Any ideas? Does my code break the definition of working set? Why
working set is much larger than virtual bytes?
>
<code>
<pre>
>
int main(int argc, char* argv[])
{
LARGE_INTEGER start,end;
LARGE_INTEGER freq;
QueryPerformanceCounter(&start);
QueryPerformanceFrequency(&freq);
MEMORYSTATUS memstat;
void** map;
int sectionIndex = 0;
memstat.dwLength = sizeof(memstat);
GlobalMemoryStatus(&memstat);
>
// basic file mapping test (512 MB)
long long size = 512*1024*1024;
>
HANDLE mapping =
CreateFileMapping(NULL,NULL,PAGE_READWRITE|SEC_COM MIT,(DWORD)(size <<
32),DWORD(size),NULL);
if (mapping)
{
// create and destroy temporary views
SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
const int allocSize = sysInfo.dwAllocationGranularity;
>
GlobalMemoryStatus(&memstat);
>
void *mem = new char[allocSize];
memset(mem,0x11,allocSize);
>
map = (void**) new char [sizeof(void*) * size / allocSize];
>
for (int i=0; i < 10; i++)
{
>
sectionIndex = 0;
for (long long offset=0; offset<=size-allocSize; offset
+=allocSize)
{
map [sectionIndex] =
MapViewOfFile(mapping,FILE_MAP_WRITE,(DWORD)(offse t<<32),
(DWORD)offset,allocSize);
if (map [sectionIndex])
{
memcpy(map [sectionIndex],mem,allocSize);
// UnmapViewOfFile(map);
}
>
sectionIndex++;
} // for (long long offset=0; offset<=size-allocSize; offset
+=allocSize)
>
// close mapped files to avoid leak
for (sectionIndex = 0; sectionIndex < size/allocSize; sectionIndex+
+)
{
if (map [sectionIndex])
{
UnmapViewOfFile(map [sectionIndex]);
}
}
>
GlobalMemoryStatus(&memstat);
>
sectionIndex = 0;
for (long long offset=0; offset <= size-allocSize; offset
+=allocSize)
{
map [sectionIndex] =
MapViewOfFile(mapping,FILE_MAP_READ,(DWORD)(offset << 32),
(DWORD)offset,allocSize);
if (map [sectionIndex])
{
for (int t=0; t < allocSize; t++)
{
if (((char *)(map [sectionIndex]))[t]!=0x11)
{
OutputDebugString("Memory read failed\n");
}
}
}
>
UnmapViewOfFile(map [sectionIndex]);
}
>
// close mapped files to avoid leak
/*
for (sectionIndex = 0; sectionIndex < size/allocSize; sectionIndex+
+)
{
if (map [sectionIndex])
{
UnmapViewOfFile(map [sectionIndex]);
}
}
*/
>
GlobalMemoryStatus(&memstat);
} // for (int i=0; i < 10; i++)
>
QueryPerformanceCounter(&end);
>
GlobalMemoryStatus(&memstat);
>
printf("Time %.3f\n",
double(end.QuadPart-start.QuadPart)/double(freq.QuadPart));
CloseHandle(mapping);
delete[] mem;
GlobalMemoryStatus(&memstat);
} //if (mapping)
>
return 0;
}
</pre>
</code>
>
>
thanks in advance,
George
| |  | | | | /bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 225,689 network members.
|