윈도우 메모리맵파일
Transcript of 윈도우 메모리맵파일
1
Memory-Mapped Files
박동진
2
목차
어플리케이션 실행 구도Memory-Mapped files 소개
API 함수 메모리 매핑 하기
01 02
0403
PRESENTATION
3
Memory-Mapped files 소개N Chpater 01 Chpater 02 Chpater 03 Chpater 04
파일 ( 장치 , 데이터 등 ) 을 가상주소방식을 이용하여 페이지로 처리하는것
실행 파일이나 DLL 을 실행할때
하드디스크의 파일에 접근할떄
다중 프로세스끼리 데이터를 공유할떄
대용량 파일처리
포인터로 사용
4
어플리케이션 실행 구도
Chpater 01 Chpater 02 Chpater 03 Chpater 04
프로세스 생성
메모장 .exe실행
• 핸들• 커널 오브젝트• 전용 가상공간
가상공간 예약
x32->0x00400000
하드디스크의 메모장 ,exe 를
물리메모리가아닌 가상주소에 매핑 (
로드 )
DLL 파일은 옆의 2 과정만 거친다
5
API 함수Chpater 01 Chpater 02 Chpater 03 Chpater 04
•플래그 R/W 지정 -> 핸들얻은 함수랑 R/W 동일해야함•최소 , 최대 크기 지정가능•성공시 시작번지리턴 실패시 NULL•매핑오브젝트를 만드는것
CreateFileMapping
•만들어진 오브젝트를 주소공간에 매핑 •인자가 앞의 함수와 핸들반환한 함수랑 호환이 되야됨 R/W•시작번지수소를 리턴 포인터로 받아서 사용가능MapViewOfFile
•위의함수로 리턴받은 시작주소를 넘겨주면서 뷰를닫는다 즉 매핑을해제한다•사용된 핸들은 closehandle 로 닫아주어야한다
UnmapViewOfFile
6
메모리 매핑하기
Chpater 01 Chpater 02 Chpater 03 Chpater 04
void HandleBigFile(){ SYSTEM_INFO si; GetSystemInfo(&si); // 메모리 할당단위알기위해 -> 모든 윈도우는 64KB(region) HANDLE hFile = CreateFile(TEXT("C:\\BigFile.dat"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READ_ONLY, 0, 0, 0); // 매핑 오브젝트생성 __int64 qwFileSize = GetFileSize(hFile, 0); //64 비트형 변수에 바이트단위로 계산 qwFileSize += ( ((__int64)dwFileSize) << 32 ); __int64 qwFileOffset = 0; while (qwFileSize > 0) { DWORD dwBytesInBlock = si.dwAllocationGranularity * 16; //64kb * 16 if (qwFileSize < si.dwAllocationGranularity * 16) // 즉 2^16 * 2^4 =1mb { dwBytesInBlock = qwFileSize; } PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_READ, (DWORD)(qwFileOffset >> 32), // 상위 오프셋 start 로우파트를 or 연산 (DWORD)(qwFileOffset & 0xFFFFFFFF), // stop-> 파일크기만큼 dwBytesInBlock); //1MB 만큼 UnmapViewOfFile(hFileMapping); // 뷰해제 qwFileOffset += dwBytesInBlock; // 오프셋 갱신 qwFileSize -= dwBytesInBlock; // 남은 크기 갱신 } CloseHandle(hFileMapping); CloseHandle(hFile);}