2016-06-25 2 views
1

꽤 오래된 C++ 코드를 다시 작성하고 메모리 관리 부분을 발견했습니다. "필요"VirtualFree가 VirtualLock을 잠금 해제합니까?

더 구체적인, 메모리 먼저 그러나

int* Buffer; 
int numPoints=80000; 
Buffer = (int*)VirtualAlloc(NULL, numPoints* sizeof(int), MEM_COMMIT, PAGE_READWRITE); 
VirtualLock(Buffer,numPoints * sizeof(int)); 

에 유사한 방식으로 할당 된 버퍼 만 VirtualFree하지 VirtualUnlock 사용하여 출시되었습니다.

첫 번째 질문 :VirtualFree는 VirtualUnlock을 호출합니까?

VirtualLock에 대해 읽었습니다. 필자의 코드에서는 퍼포먼스를 높이기 위해 분명히 사용됩니다. 매우 큰 배열을 많이 사용하고 액세스하는 경우가 꽤 많습니다. 부분적으로는 2fps 정도의 그래프로 그려지기도하기 때문에 ... 그러나, 나는 그것을 읽었습니다. 1. Virtuallock 결국 시스템 성능이 저하되어 결국 모든 것을 느리게 할 수 있습니다. 2. Virtuallock은 대형 버퍼의 성능을 실제로 향상시키지 않습니다. 후자의 진술은 strassen HBC (https://software.intel.com/de-de/forums/intel-threading-building-blocks/topic/276995)로 테스트되었습니다.

그래서, 나는, VirtualLock에 대해 결정 VirtualLock입니다 이 지역에 대한 후속 액세스는 페이지 폴트이 발생하지 않을 것이라는 보장 것을 그러나 https://msdn.microsoft.com/de-de/library/windows/desktop/aa366895(v=vs.85).aspx 상태 것이다 결론. 즉, VirtualLock을 주석 처리하면 *(buffer+10)=1과 같은 액세스가 실패하거나 페이지 오류가 발생합니다 (제공된 버퍼에 11 개가 넘는 할당 된 포인트가 있음)?

두 번째 질문은 다음과 같습니다.페이지 폴트 또는 충돌 위험에 대한 배열 액세스없이 안전하게 메모리를 버릴 수 있습니까?

+1

자신이 어떻게 해결할 수 없었는지 추측하기가 어렵습니다. 제대로 한 일은 결코 잘못이 아니며, 올바르게 실행하면 알아낼 필요가 없습니다. 그리고 VirtualLock()은 기가 바이트의 RAM을 가진 최신 기계에서는 무의미합니다. –

+0

@HansPassant 글쎄, 아직도 나를 보지 못해주세요. ^^ virtualFree가 virtualLock을 호출하지 않는다는 의견을 바로 해석합니까? 또한 실제로 1-2 기가 바이트 RAM과 같은 것을 할당 했으므로 최신 기계의 RAM을 잠그는 데 여전히 문제가되지 않습니까? – Julian

+1

@HansPassant, 내 강한 불일치를 표현하는 단어를 찾을 수 없습니다. 물론 VirtualLock은 대단히 유효합니다. – SergeyA

답변

2

예입니다. VirtualFree (MEM_RELEASE/MEM_DECOMMIT)는 VirtualLock()으로 잠근 경우 해당 영역의 잠금을 해제합니다.

그리고 VirtualLock()은 더 빠른 액세스를하기 때문에 여전히 유용합니다. (일부 작업에는 겹친 IO와 같이 페이징되지 않은 메모리가 필요함) VirtualLock()이 없으면 OS가 작동하기 때문에 실제 메모리 크기와 상관없이 hundres megs 바이트 버퍼가 비 페이징되지 않을 수 있습니다 커널의 비 페이징 풀 & IO 캐시의 실제 메모리를 보존합니다.

그런데 SetProcessWorkingSetSize()를 사용하여 자신의 프로세스에 대한 물리적 메모리를 확보해야합니다. VirtualLock()은 프로세스 작업 집합이 충분하지 않아 실패 할 수 있습니다.

IMHO 시스템 메모리 크기가 알려지지 않은 다양한 시스템에서 실행되는 범용 소프트웨어의 거대한 메모리 영역을 잠 그게하는 것은 좋지 않습니다. O.S.의 중요한 부분에서 물리적 메모리를 훔치기 때문입니다. 전용 시스템 또는 전용 인코딩 PC와 같이 전용 시스템에서 실행중인 소프트웨어에 사용하십시오.

관련 문제