2009-10-25 5 views
4

У меня есть процесс, который использует много файлов с отображением памяти.
Проблема в том, что эти файлы хранятся в физической памяти, даже если машина находится в режиме низкой памяти, а для других процессов требуется эта память.Файлы с отображением памяти остаются в физической памяти?

Я попытался использовать SetProcessWorkingSetSize, чтобы ограничить рабочий набор процесса, но это не помогает, рабочий набор процесса продолжает расти над максимальным значением.

Есть ли лучший способ ограничить рабочий набор процесса?
Могу ли я изменить эвристики Windows для отображаемых файлов подкачки?

ответ

2

Закончено с использованием грубой силы VirtualUnlock.

PROCESS_MEMORY_COUNTERS pmc; 
if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc))) 
{ 
     if (pmc.WorkingSetSize > MaxWorkingSetSize) 
     { 
       VirtualUnlock(FilePtr.pData, MaxWorkingSetSize); 
       UnmapViewOfFile(FilePtr.pData); 
       CloseHandle(FilePtr.hFileMap); 
       CloseHandle(FilePtr.hFile); 
     } 
} 
+0

Интересно. Где вы выполняете этот код, из любопытства? – Noldorin

+0

При каждом доступе к отображаемым файлам. –

0

Я думаю, что это поведение связано с тем, как работают MMF (файлы с памятью). Взгляните на статью this. В нем объясняется, что файлы MMF пропускают процесс подкачки Windows и, таким образом, не поддерживаются файлом страницы. Вместо этого MMF становится резервной копией данных сама по себе, а это означает, что в конечном итоге она занимает больше памяти, так как она не является страницами (Er, я не уверен, что сама это сделаю), лучше всего читать блог!)

Here's документация MSDN для файлов с отображением памяти и here's еще один вопрос, относящийся к MMF.

+0

В статье MSDN ясно показано, что MMF API находится над VMM, поэтому он должен иметь возможность листать диск и очищать неиспользуемые страницы. –

2

Если вы обнаружите, что ваш процесс с файлами с отображением памяти хранится на многих этих страницах, то это означает, что ОС не нужно было отбрасывать какие-либо из ваших областей с отображением памяти для передачи другим процессам. Итак, как вы знаете, что другим процессам на самом деле нужна память, используемая в настоящее время для сопоставленных файлов? Просто потому, что ОС на физическом ОЗУ невелика, ничего не значит. В других процессах требуется память, чтобы заставить ОС отказаться от отображаемых страниц и предоставить им RAM.

Итак, кажется, что ваш процесс mmap-I/O голодает на ваш другой процесс, который использует RAM менее часто. Один из подходов состоит в том, чтобы разумно блокировать память в процессе голодания. Посмотрите на VirtualLock для win32.

+0

Я знаю это, потому что у меня тоже есть другой процесс, я вижу, что он имеет множество ошибок страницы и не использует столько памяти, сколько требуется. –

+0

Но как влияет производительность? Ошибка страницы может быть очень дешевой, когда ОС не нужно фиксировать грязные страницы на диск. Если ваши другие процессы используют меньше памяти, чем вы думаете, то это явно не требует этого. – karunski

+0

Я должен был упомянуть об этом, производительность (другого процесса) на несколько порядков ниже. –

0

Проверка ответа here; с VirtualUnlock() вы можете вручную отключить части MMF; например, разделы, которые вы не думаете, что скоро получите доступ к ним.

Смежные вопросы