꽤 오래된 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 개가 넘는 할당 된 포인트가 있음)?
두 번째 질문은 다음과 같습니다.페이지 폴트 또는 충돌 위험에 대한 배열 액세스없이 안전하게 메모리를 버릴 수 있습니까?
자신이 어떻게 해결할 수 없었는지 추측하기가 어렵습니다. 제대로 한 일은 결코 잘못이 아니며, 올바르게 실행하면 알아낼 필요가 없습니다. 그리고 VirtualLock()은 기가 바이트의 RAM을 가진 최신 기계에서는 무의미합니다. –
@HansPassant 글쎄, 아직도 나를 보지 못해주세요. ^^ virtualFree가 virtualLock을 호출하지 않는다는 의견을 바로 해석합니까? 또한 실제로 1-2 기가 바이트 RAM과 같은 것을 할당 했으므로 최신 기계의 RAM을 잠그는 데 여전히 문제가되지 않습니까? – Julian
@HansPassant, 내 강한 불일치를 표현하는 단어를 찾을 수 없습니다. 물론 VirtualLock은 대단히 유효합니다. – SergeyA