문제

많은 메모리 매핑 파일을 사용하는 프로세스가 있습니다.
문제는 기계가 메모리가 낮아서도 해당 파일이 물리적 메모리로 유지되며 다른 프로세스에는이 메모리가 필요하다는 것입니다.

사용해 보았습니다 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의 부분을 수동으로 커밋하지 않을 수 있습니다. 예를 들어, 곧 다시 액세스 할 것이라고 생각하지 않는 섹션.

이 동작은 MMF (메모리 매핑 파일) 작동 방식 때문이라고 생각합니다. 살펴보십시오 이것 블로그 기사. MMF 파일은 Windows 페이징 프로세스를 건너 뛰고 페이지 파일에 의해 뒷받침되지 않는다고 설명합니다. 대신, MMF는 데이터 백업 자체가됩니다. 즉, 페이지가 나오지 않기 때문에 더 많은 RAM이 필요합니다 (ER, 블로그를 읽는 것이 가장 좋습니다!).

여기에 있습니다 메모리 매핑 파일에 대한 MSDN 문서 여기에 있습니다 MMF와 관련된 또 다른 질문.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top