메모리 매핑 된 파일은 물리적 메모리에 남아 있습니까?
-
06-07-2019 - |
문제
많은 메모리 매핑 파일을 사용하는 프로세스가 있습니다.
문제는 기계가 메모리가 낮아서도 해당 파일이 물리적 메모리로 유지되며 다른 프로세스에는이 메모리가 필요하다는 것입니다.
사용해 보았습니다 SetProcessWorkingSetsize 프로세스 작업 세트를 제한하지만 도움이되지 않기 위해 프로세스 작업 세트는 최대 값보다 계속 증가합니다.
프로세스 작업 세트를 제한하는 더 좋은 방법이 있습니까?
페이징 메모리 매핑 파일을 위해 Windows 'Heuristcs를 변경할 수 있습니까?
해결책 2
Brute Force 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);
}
}
다른 팁
메모리 매핑 파일이있는 프로세스가 해당 페이지를 많이 보유하고 있음을 알게되면 OS는 다른 프로세스에 제공하기 위해 메모리 맵핑 된 영역을 버릴 필요가 없음을 의미합니다. 그렇다면 다른 프로세스가 실제로 매핑 된 파일에 사용되는 메모리가 실제로 필요한 것을 어떻게 알 수 있습니까? OS가 물리적 램이 적기 때문에 아무 의미가 없습니다. 다른 프로세스는 OS가 매핑 된 페이지를 떨어 뜨리고 RAM을 제공하기 위해 메모리를 요구해야합니다.
따라서 MMAP-I/O 프로세스는 RAM을 덜 자주 사용하는 다른 프로세스를 굶주림으로 보입니다. 한 가지 방법은 굶주린 과정에서 메모리를 신중하게 잠그는 것입니다. Win32의 VirtuAllock을보십시오.
내 대답을 확인하십시오 여기; virtualUnlock ()을 사용하면 MMFS의 부분을 수동으로 커밋하지 않을 수 있습니다. 예를 들어, 곧 다시 액세스 할 것이라고 생각하지 않는 섹션.