Connecting Tech Pros Worldwide Help | Site Map

my code to prove working set larger than virtual bytes

 
LinkBack Thread Tools Search this Thread
  #1  
Old January 17th, 2008, 01:25 PM
George2
Guest
 
Posts: n/a
Default my code to prove working set larger than virtual bytes

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&lt;=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

  #2  
Old January 17th, 2008, 07:15 PM
jalina
Guest
 
Posts: n/a
Default SPAM was 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&lt;=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
 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

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 220,989 network members.