메모리 매핑 파일을 다음과 같이 마무리 할 수 있습니까?메모리 매핑 된 파일로 가상 메모리 구현
TVirtualMemoryManager = class
public
function AllocMem (Size : Integer) : Pointer;
procedure FreeMem (Ptr : Pointer);
end;
메모리 매핑 파일 API 함수는 모두 오프셋을 취하기 때문에 메모리 매핑 된 파일의 빈 영역을 관리하는 방법을 알지 못합니다. 내 유일한 아이디어는 기본 메모리 관리 (다른 블록 크기에 대한 무료 목록 유지) 일종의 구현하는 것입니다. 그러나 나는 이것이 얼마나 효율적인지 알지 못합니다.
편집 : 내가 정말 희망은 (다윗이 나에게 분명히으로) 이것이다 :
나는 가상 메모리의 바이트의 연속 블록 (각 상대적으로 작은) 저장해야IVirtualMemory = interface
function ReadMem (Addr : Int64) : TBytes;
function AllocateMem (Data : TBytes) : Int64;
procedure FreeMem (Addr : Int64);
end;
64 비트 주소를 사용하여 메모리로 다시 읽을 수 있습니다. 대부분의 경우 액세스는 읽기 전용입니다. 쓰기가 필요하다면 어쨌든 크기가 다를 것이므로 FreeMem
다음에 AllocMem
을 사용할 것입니다.
이 인터페이스를 사용하여 메모리 매핑 된 파일에 대한 래퍼를 원합니다. 내부적으로 메모리 매핑 파일에 대한 핸들을 가지고 있으며 각 ReadMem
요청에 MapViewOfFile
을 사용합니다. Addr
64 비트 정수는 메모리 매핑 파일에 대한 오프셋 일뿐입니다. 열린 질문은 그 주소를 할당하는 방법입니다 - 저는 현재 내가 유지하는 자유 블록 목록을 유지합니다.
"가상 메모리"란 무엇입니까? 이 시스템은 이미 당신을 위해 그것을 수행합니다. –
2/3/4 GB 메모리 제한을 우회하고 파일 (이 경우 페이지 파일)에 의해 백업 된 가상 메모리를 원합니다. – jpfollenius
이 경우와 다른 인터페이스가 필요합니다. 주소 공간 한도를 초과하는 인터페이스가 필요하며 그렇지 않습니다. –