윈도우 메모리맵파일

6
Memory-Mapped Files 1 박박박

Transcript of 윈도우 메모리맵파일

Page 1: 윈도우 메모리맵파일

1

Memory-Mapped Files

박동진

Page 2: 윈도우 메모리맵파일

2

목차

어플리케이션 실행 구도Memory-Mapped files 소개

API 함수 메모리 매핑 하기

01 02

0403

PRESENTATION

Page 3: 윈도우 메모리맵파일

3

Memory-Mapped files 소개N Chpater 01 Chpater 02 Chpater 03 Chpater 04

파일 ( 장치 , 데이터 등 ) 을 가상주소방식을 이용하여 페이지로 처리하는것

실행 파일이나 DLL 을 실행할때

하드디스크의 파일에 접근할떄

다중 프로세스끼리 데이터를 공유할떄

대용량 파일처리

포인터로 사용

Page 4: 윈도우 메모리맵파일

4

어플리케이션 실행 구도

Chpater 01 Chpater 02 Chpater 03 Chpater 04

프로세스 생성

메모장 .exe실행

• 핸들• 커널 오브젝트• 전용 가상공간

가상공간 예약

 x32->0x00400000 

하드디스크의 메모장 ,exe 를

물리메모리가아닌 가상주소에 매핑 (

로드 )

DLL 파일은 옆의 2 과정만 거친다

Page 5: 윈도우 메모리맵파일

5

API 함수Chpater 01 Chpater 02 Chpater 03 Chpater 04

•플래그 R/W 지정 -> 핸들얻은 함수랑 R/W 동일해야함•최소 , 최대 크기 지정가능•성공시 시작번지리턴 실패시 NULL•매핑오브젝트를 만드는것

CreateFileMapping

•만들어진 오브젝트를 주소공간에 매핑 •인자가 앞의 함수와 핸들반환한 함수랑 호환이 되야됨 R/W•시작번지수소를 리턴 포인터로 받아서 사용가능MapViewOfFile

•위의함수로 리턴받은 시작주소를 넘겨주면서 뷰를닫는다 즉 매핑을해제한다•사용된 핸들은 closehandle 로 닫아주어야한다

UnmapViewOfFile

Page 6: 윈도우 메모리맵파일

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);}