SlideShare a Scribd company logo
Windows via C/C++

 Chapter 17. 메모리 맵 파일


                 주영찬
메모리 맵 파일이란?
   가상 메모리처럼 주소 공간을 예약
   예약된 영역에 물리적 저장소를 커밋

   가상 메모리와의 차이점
       시스템 페이징 파일 대신 디스크 상에 존재하는 파일을 물
        리적 저장소로 사용
메모리 맵 파일의 사용 목적
   Exe 나 DLL 파일을 실행

   디스크에 있는 데이터에 접근

   동일 머신 상의 다수의 프로세스간 데이터 공유
메모리 맵의 장점




                http://msdn.microsoft.com/en-
                us/library/ms810613.aspx
   프로세스가 파일 데이터를 메모리로서 바라보기 때문에 시스템 콜을 할 필요가 없음
   큰 파일을 다룰 시 필요한 부분만을 실제 메모리에 올려놓으므로 많은 양의 메모리를 소
    비하지 않아도 됨
실행 & DLL 파일과 메모리 맵
   CreateProcess 절차
       CreateProcess 함수의 매개변수로 전달된 EXE 파일 검색
       새로운 프로세스 커널 오브젝트 생성
       새 프로세스를 위한 전용 주소공간 할당
       EXE 파일을 수용할 수 있을 정도의 충분한 영역을 주소 공
        간 내에 예약
       예약된 영역에 사용할 물리적 저장소로 EXE 파일 자체를
        지정 (페이징 파일 X)
   EXE 파일 내에서 사용되는 DLL 로드 절차
       DLL 파일을 위한 충분한 영역을 주소 공간 내에 예약
       DLL이 선호하는 시작 주소에 이미 다른 DLL이나 EXE 파
        일이 로드되어 있다면 다른 영역을 찾음
           재배치 관련 정보가 없다면 Fail
           재배치 작업을 위해선 시스템 페이징 파일에 추가적인 저장소를
            필요로 하게 되고, 더 많은 시간을 소모하게 됨
       예약된 영역에 매핑할 물리적 저장소로 디스크 상의 DLL
        파일 자체를 지정 (재배치 시에는 페이징 파일에 매핑)
매핑 작업 완료 이후…
   시스템이 페이징, 버퍼링, 캐싱과 관련된 모든 작업을
    직접 관리
       아직 로드되지 않은 주소 공간으로 점프를 수행하면 폴트
        발생
       시스템이 폴트를 인지하고 자동으로 파일 이미지를 램의
        페이지로 로드
       해당 램 페이지를 적절한 프로세스 주소 공간에 매핑
       이후 스레드 수행 재개
하나의 실행 이미지에 대한 여러 인스턴스 생성

EXE 파일 :
코드 + 데이터
Copy-on-Write
여러 인스턴스 사이의 정적 데이터 공유
   모든 EXE와 DLL의 인스턴스는 섹션들의 집합이다
       .text : .exe나 DLL 코드 (execute / read)
       .data : 초기화된 데이터 (read / write)
       .bss : 초기화되지 않은 데이터
       .debug : 디버깅 정보
        …

   섹션 특성
       READ / WRITE / EXECUTE / SHARED(카피 온 라이트
        X)
사용자 정의 섹션
#pragma data_seg(“SectionName”)

Ex)
#pragma data_seg(“Shared”)
LONG g_lInstanceCount = 0;
LONG g_lInstanceCount2;

__declspec(allocate(“Shared”)) ind d;
#pragma data_seg()

- 기본적으로는 초기화된 변수만 섹션 내에 추가됨
- 링크 단계에서 링커 스위치를 이용하여 특정 섹션을 공유시킬 수 있음
  /SECTION:name, attributes (EX : /SECTION:Shared, RWS)
   임의 공유 섹션의 문제점
       잠재적으로 보안에 취약
           다른 프로그램이 DLL을 로드하는 것을 막을 수 없음


       특정 애플리케이션에서 발생한 에러가 다른 애플리케이션
        에 직접적인 영향을 줄 수 있음
공유 섹션 예제




     #pragma data_seg(“Shared”)
     Volatile LONG g_lApplicationInstances = 0;
     #pragma data_seg()

     // 코드 내에 링커 스위치를 포함시키는 방법
     #pragma comment(linker,
     “/Section:Shared,RWS”)

  InterlockedExchangeAdd(&g_lApplicationInstances, 1); // 프로그램 진입 시
  InterlockedExchangeAdd(&g_lApplicationInstances, -1); // 프로그램 종료
  시
메모리 맵 데이터 파일
   파일의 내용을 바이트 단위로 뒤집는 4가지 방법
       한 개의 파일, 한 개의 버퍼
           파일 크기 만큼의 메모리 공간 필요
           파일 저장 시 수행이 중단 되면 기존 파일 내용 손상


       두 개의 파일, 한 개의 버퍼
           기존 파일을 열고, 동시에 새로운 파일을 생성
           작은 버퍼를 할당하여 기존 파일의 끝에서부터 특정 바이트만큼
            읽어서 뒤집은 후 새로운 파일에 저장
           이러한 작업을 기존 파일의 시작에 다다를 때까지 반복
           단점 : 기존 파일 만큼의 디스크 공간이 추가로 필요, 작업 수행
            속도 저하(파일 포인터 이동/읽기/뒤집기/쓰기)
   한 개의 파일, 두 개의 버퍼
       두 개의 작은 버퍼를 할당하고 하나는 앞, 다른 하나는 뒤에서부터
        차례로 특정 바이트 만큼 읽어들인다.
       앞의 내용을 저장한 버퍼의 데이터를 뒤쪽에 덮어쓰고, 뒤의 내용을
        저장한 버퍼의 데이터는 앞쪽에 덮어쓴다.


   한 개의 파일, 버퍼 X
       메모리 맵 파일을 이용하여 파일을 열고 가상 주소 공간 상에 영역
        을 예약
       파일의 첫번째 바이트와 예약된 영역의 첫번째 위치를 매핑
       C 런타임 라이브러리의 _tcsrev 함수 호출
       단점 : 갑작스럽게 중단될 시 데이터 소실 가능성이 있음
메모리 맵 파일 사용하기
   사용 시
       메모리 맵 파일을 사용할 디스크 상의 파일을 나타내는 파
        일 커널 오브젝트 생성
       파일의 크기와 접근 방식을 고려하여 파일 매핑 커널 오브
        젝트 생성
       프로세스의 주소 공간 상에 파일 매핑 오브젝트의 전체나
        일부를 매핑

   해제 시
       프로세스의 주소 공간으로부터 파일 매핑 오브젝트 매핑
        해제
       파일 매핑 커널 오브젝트를 닫음
       파일 커널 오브젝트를 닫음
파일 커널 오브젝트 생성
   CreateFile 사용
       391쪽 “CreateFile에 대한 세부사항 검토” 참조


   GENERIC_READ
   GENERIC_READ | GENERIC_WRITE

   시스템에게 파일 매핑을 수행할 파일의 물리적 저장
    소의 위치를 알려줌
파일 매핑 오브젝트 생성
   CreateFileMapping 사용

   파일의 핸들
   페이지 보호특성
       PAGE_READONLY / PAGE_READWRITE /
        PAGE_WRITECOPY / PAGE_EXECUTE_READ /
        PAGE_EXECUTE_READWRITE
   섹션 특성
       SEC_NOCACHE | SEC_IMAGE | SEC_RESERVE |
        SEC_COMMIT | SEC_LARGE_PAGES
   파일 크기
   파일 사이즈(최대 16EB)
   파일 매핑 오브젝트명
       다른 프로세스에서 공유 가능(3장 커널 오브젝트 참고)
파일 데이터를 프로세스의 주소 공간에 매핑
   MapViewOfFile 사용

   파일 매핑 오브젝트의 핸들
   접근 권한
       FILE_MAP_WRITE / FILE_MAP_READ /
        FILE_MAP_ALL_ACCESS / FILE_MAP_COPY /
        FILE_MAP_EXECUTE
   오프셋(시스템 할당단위의 배수, Windows는 64kb)
   매핑할 데이터의 양

* FILE_MAP_COPY 플래그 사용 시 시스템 페이징 파일로
  부터 물리적 저장소를 커밋하고, 뷰의 내용에 대한 수정 시
  도 시 copy-on-write 기능 수행
프로세스의 주소 공간으로부터 파일 데이터에 대
한 매핑 해제
   UnmapviewOfFile 사용

   파일 매핑 오브젝트의 핸들



* 파일 데이터의 페이지를 버퍼링하기 때문에 매핑된 뷰
   의 내용을 변경 시 즉각 파일에 반영되지는 않음
  - FlushViewOfFile 함수를 사용하여 강제 저장 가능
    (p.624 참조 – 리모트 서버 저장소 관련 문제,
               FILE_MAP_COPY 플래그 처리)
파일 뒤집기 예제
메모리 맵 파일을 이용하여 큰 파일 처리
   16EB 파일 전체를 주소 공간에 매핑하는 것은 불가능

   파일 데이터의 일부분을 나타내는 뷰를 주소 공간에
    매핑 -> 해제 -> 다음 부분 매핑하는 방식으로 처리 가
    능
메모리 맵 파일과 일관성
   단일 파일 매핑 오브젝트에 여러 개의 뷰를 이용하여
    매핑하는 경우 파일 데이터에 대한 일관성이 유지됨
       서로 다른 프로세스에서 동일 파일 매핑 오브젝트를 이용
        하여 뷰를 매핑하였을 경우 데이터 공유 가능


   단일 데이터에 대한 여러 개의 파일 매핑 오브젝트를
    생성한 경우에는 일관성 유지 X
메모리 맵 파일의 시작 주소 지정하기
   MapViewOfFileEx 사용

   마지막 인자로 pvBaseAddress(파일을 매핑하고자 하
    는 메모리의 시작 주소)를 전달하는 것을 제외하면
    MapViewOfFile과 동일

   EX) 메모리 맵 파일에 링크드 리스트를 구성하고, 이
    를 다른 프로세스와 공유하는 경우
페이징 파일을 이용하는 메모리 맵 파일
   CreateFileMapping 함수에서 첫번째 인자로
    INVALID_HANDLE_VALUE를 전달

   페이징 파일 내에 메모리 맵 파일 생성

   주의)
    HANDLE hFile = CreateFile(…):
    HANDLE hMap = CreateFileMapping(hFile, …);
    - hFile이 NULL일 경우 의도하지 않은 결과를 초래
메모리 맵 파일 공유 예제
스파스 메모리 맵 파일
   CreateFileMapping 함수를 호출할 때
    SEC_RESERVE 플래그를 사용

   프로세스의 주소 공간 상에 영역을 예약(Commit X)

   공유된 영역에 대한 물리적 저장소 커밋은
    VirtualAlloc를 이용
스파스 메모리 맵 파일 예제
감사합니다

More Related Content

Viewers also liked

Competitve Analysis Presentation
Competitve Analysis PresentationCompetitve Analysis Presentation
Competitve Analysis Presentationlovebaby193
 
Union budget 2017 speech by FM
Union budget 2017 speech by FMUnion budget 2017 speech by FM
Union budget 2017 speech by FM
Zaheen Ahmed
 
History of Navigation
History of NavigationHistory of Navigation
History of Navigationgautamanurag
 
Extreme Personas – Innovate through User Experience
Extreme Personas – Innovate through User ExperienceExtreme Personas – Innovate through User Experience
Extreme Personas – Innovate through User Experience
Pavel Dabrytski
 
Op-Amp Basics Part II (Parameters)
Op-Amp Basics Part II  (Parameters)Op-Amp Basics Part II  (Parameters)
Op-Amp Basics Part II (Parameters)
Premier Farnell
 

Viewers also liked (6)

Competitve Analysis Presentation
Competitve Analysis PresentationCompetitve Analysis Presentation
Competitve Analysis Presentation
 
Union budget 2017 speech by FM
Union budget 2017 speech by FMUnion budget 2017 speech by FM
Union budget 2017 speech by FM
 
History of Navigation
History of NavigationHistory of Navigation
History of Navigation
 
Extreme Personas – Innovate through User Experience
Extreme Personas – Innovate through User ExperienceExtreme Personas – Innovate through User Experience
Extreme Personas – Innovate through User Experience
 
Op-Amp Basics Part II (Parameters)
Op-Amp Basics Part II  (Parameters)Op-Amp Basics Part II  (Parameters)
Op-Amp Basics Part II (Parameters)
 
The Hydrosphere
The HydrosphereThe Hydrosphere
The Hydrosphere
 

Similar to Chapter 17

10 동기및비동기장치io
10 동기및비동기장치io10 동기및비동기장치io
10 동기및비동기장치io
ssuser3fb17c
 
Hadoop Overview 1
Hadoop Overview 1Hadoop Overview 1
Hadoop Overview 1
Kay Kim
 
Git의 개념과 사용
Git의 개념과 사용Git의 개념과 사용
Git의 개념과 사용
환민 홍
 
16 데이터 저장과 사용
16 데이터 저장과 사용16 데이터 저장과 사용
16 데이터 저장과 사용운용 최
 
Hadoop Overview 2
Hadoop Overview 2Hadoop Overview 2
Hadoop Overview 2
Kay Kim
 
Pe+file+format
Pe+file+formatPe+file+format
Pe+file+format
Jongseok Choi
 
리스펙토링 5월 세미나, git과 github
리스펙토링 5월 세미나, git과 github리스펙토링 5월 세미나, git과 github
리스펙토링 5월 세미나, git과 github
JungHoon Lee
 
Web server page_ed10
Web server page_ed10Web server page_ed10
Web server page_ed10
hungrok
 
파이썬 파일처리 이해하기
파이썬 파일처리 이해하기파이썬 파일처리 이해하기
파이썬 파일처리 이해하기
Yong Joon Moon
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리
Seungyong Lee
 
(130316) #fitalk trends in d forensics (feb, 2013)
(130316) #fitalk   trends in d forensics (feb, 2013)(130316) #fitalk   trends in d forensics (feb, 2013)
(130316) #fitalk trends in d forensics (feb, 2013)
INSIGHT FORENSIC
 
명세부터 깨우치는 FILEAPI
명세부터 깨우치는 FILEAPI명세부터 깨우치는 FILEAPI
명세부터 깨우치는 FILEAPI우영 주
 
Object storage의 이해와 활용
Object storage의 이해와 활용Object storage의 이해와 활용
Object storage의 이해와 활용
Seoro Kim
 
Hadoop distributed file system rev3
Hadoop distributed file system rev3Hadoop distributed file system rev3
Hadoop distributed file system rev3
Sung-jae Park
 
I/O '19 Extended in Korea Android : What's New in Shared Storage
I/O '19 Extended in Korea Android : What's New in Shared StorageI/O '19 Extended in Korea Android : What's New in Shared Storage
I/O '19 Extended in Korea Android : What's New in Shared Storage
Myungwook Ahn
 
Linux 강의자료 ed10
Linux 강의자료 ed10Linux 강의자료 ed10
Linux 강의자료 ed10
hungrok
 

Similar to Chapter 17 (20)

10 동기및비동기장치io
10 동기및비동기장치io10 동기및비동기장치io
10 동기및비동기장치io
 
Hadoop Overview 1
Hadoop Overview 1Hadoop Overview 1
Hadoop Overview 1
 
Git
Git Git
Git
 
Hadoop overview
Hadoop overviewHadoop overview
Hadoop overview
 
Git의 개념과 사용
Git의 개념과 사용Git의 개념과 사용
Git의 개념과 사용
 
16 데이터 저장과 사용
16 데이터 저장과 사용16 데이터 저장과 사용
16 데이터 저장과 사용
 
Hadoop Overview 2
Hadoop Overview 2Hadoop Overview 2
Hadoop Overview 2
 
Pe+file+format
Pe+file+formatPe+file+format
Pe+file+format
 
Gfs Kyu
Gfs KyuGfs Kyu
Gfs Kyu
 
리스펙토링 5월 세미나, git과 github
리스펙토링 5월 세미나, git과 github리스펙토링 5월 세미나, git과 github
리스펙토링 5월 세미나, git과 github
 
Web server page_ed10
Web server page_ed10Web server page_ed10
Web server page_ed10
 
파이썬 파일처리 이해하기
파이썬 파일처리 이해하기파이썬 파일처리 이해하기
파이썬 파일처리 이해하기
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리
 
(130316) #fitalk trends in d forensics (feb, 2013)
(130316) #fitalk   trends in d forensics (feb, 2013)(130316) #fitalk   trends in d forensics (feb, 2013)
(130316) #fitalk trends in d forensics (feb, 2013)
 
명세부터 깨우치는 FILEAPI
명세부터 깨우치는 FILEAPI명세부터 깨우치는 FILEAPI
명세부터 깨우치는 FILEAPI
 
Object storage의 이해와 활용
Object storage의 이해와 활용Object storage의 이해와 활용
Object storage의 이해와 활용
 
7. html5 api
7. html5 api7. html5 api
7. html5 api
 
Hadoop distributed file system rev3
Hadoop distributed file system rev3Hadoop distributed file system rev3
Hadoop distributed file system rev3
 
I/O '19 Extended in Korea Android : What's New in Shared Storage
I/O '19 Extended in Korea Android : What's New in Shared StorageI/O '19 Extended in Korea Android : What's New in Shared Storage
I/O '19 Extended in Korea Android : What's New in Shared Storage
 
Linux 강의자료 ed10
Linux 강의자료 ed10Linux 강의자료 ed10
Linux 강의자료 ed10
 

Chapter 17

  • 1. Windows via C/C++ Chapter 17. 메모리 맵 파일 주영찬
  • 2. 메모리 맵 파일이란?  가상 메모리처럼 주소 공간을 예약  예약된 영역에 물리적 저장소를 커밋  가상 메모리와의 차이점  시스템 페이징 파일 대신 디스크 상에 존재하는 파일을 물 리적 저장소로 사용
  • 3. 메모리 맵 파일의 사용 목적  Exe 나 DLL 파일을 실행  디스크에 있는 데이터에 접근  동일 머신 상의 다수의 프로세스간 데이터 공유
  • 4. 메모리 맵의 장점 http://msdn.microsoft.com/en- us/library/ms810613.aspx  프로세스가 파일 데이터를 메모리로서 바라보기 때문에 시스템 콜을 할 필요가 없음  큰 파일을 다룰 시 필요한 부분만을 실제 메모리에 올려놓으므로 많은 양의 메모리를 소 비하지 않아도 됨
  • 5. 실행 & DLL 파일과 메모리 맵  CreateProcess 절차  CreateProcess 함수의 매개변수로 전달된 EXE 파일 검색  새로운 프로세스 커널 오브젝트 생성  새 프로세스를 위한 전용 주소공간 할당  EXE 파일을 수용할 수 있을 정도의 충분한 영역을 주소 공 간 내에 예약  예약된 영역에 사용할 물리적 저장소로 EXE 파일 자체를 지정 (페이징 파일 X)
  • 6. EXE 파일 내에서 사용되는 DLL 로드 절차  DLL 파일을 위한 충분한 영역을 주소 공간 내에 예약  DLL이 선호하는 시작 주소에 이미 다른 DLL이나 EXE 파 일이 로드되어 있다면 다른 영역을 찾음  재배치 관련 정보가 없다면 Fail  재배치 작업을 위해선 시스템 페이징 파일에 추가적인 저장소를 필요로 하게 되고, 더 많은 시간을 소모하게 됨  예약된 영역에 매핑할 물리적 저장소로 디스크 상의 DLL 파일 자체를 지정 (재배치 시에는 페이징 파일에 매핑)
  • 7. 매핑 작업 완료 이후…  시스템이 페이징, 버퍼링, 캐싱과 관련된 모든 작업을 직접 관리  아직 로드되지 않은 주소 공간으로 점프를 수행하면 폴트 발생  시스템이 폴트를 인지하고 자동으로 파일 이미지를 램의 페이지로 로드  해당 램 페이지를 적절한 프로세스 주소 공간에 매핑  이후 스레드 수행 재개
  • 8. 하나의 실행 이미지에 대한 여러 인스턴스 생성 EXE 파일 : 코드 + 데이터
  • 10. 여러 인스턴스 사이의 정적 데이터 공유  모든 EXE와 DLL의 인스턴스는 섹션들의 집합이다  .text : .exe나 DLL 코드 (execute / read)  .data : 초기화된 데이터 (read / write)  .bss : 초기화되지 않은 데이터  .debug : 디버깅 정보 …  섹션 특성  READ / WRITE / EXECUTE / SHARED(카피 온 라이트 X)
  • 11. 사용자 정의 섹션 #pragma data_seg(“SectionName”) Ex) #pragma data_seg(“Shared”) LONG g_lInstanceCount = 0; LONG g_lInstanceCount2; __declspec(allocate(“Shared”)) ind d; #pragma data_seg() - 기본적으로는 초기화된 변수만 섹션 내에 추가됨 - 링크 단계에서 링커 스위치를 이용하여 특정 섹션을 공유시킬 수 있음 /SECTION:name, attributes (EX : /SECTION:Shared, RWS)
  • 12. 임의 공유 섹션의 문제점  잠재적으로 보안에 취약  다른 프로그램이 DLL을 로드하는 것을 막을 수 없음  특정 애플리케이션에서 발생한 에러가 다른 애플리케이션 에 직접적인 영향을 줄 수 있음
  • 13. 공유 섹션 예제 #pragma data_seg(“Shared”) Volatile LONG g_lApplicationInstances = 0; #pragma data_seg() // 코드 내에 링커 스위치를 포함시키는 방법 #pragma comment(linker, “/Section:Shared,RWS”) InterlockedExchangeAdd(&g_lApplicationInstances, 1); // 프로그램 진입 시 InterlockedExchangeAdd(&g_lApplicationInstances, -1); // 프로그램 종료 시
  • 14. 메모리 맵 데이터 파일  파일의 내용을 바이트 단위로 뒤집는 4가지 방법  한 개의 파일, 한 개의 버퍼  파일 크기 만큼의 메모리 공간 필요  파일 저장 시 수행이 중단 되면 기존 파일 내용 손상  두 개의 파일, 한 개의 버퍼  기존 파일을 열고, 동시에 새로운 파일을 생성  작은 버퍼를 할당하여 기존 파일의 끝에서부터 특정 바이트만큼 읽어서 뒤집은 후 새로운 파일에 저장  이러한 작업을 기존 파일의 시작에 다다를 때까지 반복  단점 : 기존 파일 만큼의 디스크 공간이 추가로 필요, 작업 수행 속도 저하(파일 포인터 이동/읽기/뒤집기/쓰기)
  • 15. 한 개의 파일, 두 개의 버퍼  두 개의 작은 버퍼를 할당하고 하나는 앞, 다른 하나는 뒤에서부터 차례로 특정 바이트 만큼 읽어들인다.  앞의 내용을 저장한 버퍼의 데이터를 뒤쪽에 덮어쓰고, 뒤의 내용을 저장한 버퍼의 데이터는 앞쪽에 덮어쓴다.  한 개의 파일, 버퍼 X  메모리 맵 파일을 이용하여 파일을 열고 가상 주소 공간 상에 영역 을 예약  파일의 첫번째 바이트와 예약된 영역의 첫번째 위치를 매핑  C 런타임 라이브러리의 _tcsrev 함수 호출  단점 : 갑작스럽게 중단될 시 데이터 소실 가능성이 있음
  • 16. 메모리 맵 파일 사용하기  사용 시  메모리 맵 파일을 사용할 디스크 상의 파일을 나타내는 파 일 커널 오브젝트 생성  파일의 크기와 접근 방식을 고려하여 파일 매핑 커널 오브 젝트 생성  프로세스의 주소 공간 상에 파일 매핑 오브젝트의 전체나 일부를 매핑  해제 시  프로세스의 주소 공간으로부터 파일 매핑 오브젝트 매핑 해제  파일 매핑 커널 오브젝트를 닫음  파일 커널 오브젝트를 닫음
  • 17. 파일 커널 오브젝트 생성  CreateFile 사용  391쪽 “CreateFile에 대한 세부사항 검토” 참조  GENERIC_READ  GENERIC_READ | GENERIC_WRITE  시스템에게 파일 매핑을 수행할 파일의 물리적 저장 소의 위치를 알려줌
  • 18. 파일 매핑 오브젝트 생성  CreateFileMapping 사용  파일의 핸들  페이지 보호특성  PAGE_READONLY / PAGE_READWRITE / PAGE_WRITECOPY / PAGE_EXECUTE_READ / PAGE_EXECUTE_READWRITE  섹션 특성  SEC_NOCACHE | SEC_IMAGE | SEC_RESERVE | SEC_COMMIT | SEC_LARGE_PAGES  파일 크기  파일 사이즈(최대 16EB)  파일 매핑 오브젝트명  다른 프로세스에서 공유 가능(3장 커널 오브젝트 참고)
  • 19. 파일 데이터를 프로세스의 주소 공간에 매핑  MapViewOfFile 사용  파일 매핑 오브젝트의 핸들  접근 권한  FILE_MAP_WRITE / FILE_MAP_READ / FILE_MAP_ALL_ACCESS / FILE_MAP_COPY / FILE_MAP_EXECUTE  오프셋(시스템 할당단위의 배수, Windows는 64kb)  매핑할 데이터의 양 * FILE_MAP_COPY 플래그 사용 시 시스템 페이징 파일로 부터 물리적 저장소를 커밋하고, 뷰의 내용에 대한 수정 시 도 시 copy-on-write 기능 수행
  • 20. 프로세스의 주소 공간으로부터 파일 데이터에 대 한 매핑 해제  UnmapviewOfFile 사용  파일 매핑 오브젝트의 핸들 * 파일 데이터의 페이지를 버퍼링하기 때문에 매핑된 뷰 의 내용을 변경 시 즉각 파일에 반영되지는 않음 - FlushViewOfFile 함수를 사용하여 강제 저장 가능 (p.624 참조 – 리모트 서버 저장소 관련 문제, FILE_MAP_COPY 플래그 처리)
  • 22. 메모리 맵 파일을 이용하여 큰 파일 처리  16EB 파일 전체를 주소 공간에 매핑하는 것은 불가능  파일 데이터의 일부분을 나타내는 뷰를 주소 공간에 매핑 -> 해제 -> 다음 부분 매핑하는 방식으로 처리 가 능
  • 23. 메모리 맵 파일과 일관성  단일 파일 매핑 오브젝트에 여러 개의 뷰를 이용하여 매핑하는 경우 파일 데이터에 대한 일관성이 유지됨  서로 다른 프로세스에서 동일 파일 매핑 오브젝트를 이용 하여 뷰를 매핑하였을 경우 데이터 공유 가능  단일 데이터에 대한 여러 개의 파일 매핑 오브젝트를 생성한 경우에는 일관성 유지 X
  • 24. 메모리 맵 파일의 시작 주소 지정하기  MapViewOfFileEx 사용  마지막 인자로 pvBaseAddress(파일을 매핑하고자 하 는 메모리의 시작 주소)를 전달하는 것을 제외하면 MapViewOfFile과 동일  EX) 메모리 맵 파일에 링크드 리스트를 구성하고, 이 를 다른 프로세스와 공유하는 경우
  • 25. 페이징 파일을 이용하는 메모리 맵 파일  CreateFileMapping 함수에서 첫번째 인자로 INVALID_HANDLE_VALUE를 전달  페이징 파일 내에 메모리 맵 파일 생성  주의) HANDLE hFile = CreateFile(…): HANDLE hMap = CreateFileMapping(hFile, …); - hFile이 NULL일 경우 의도하지 않은 결과를 초래
  • 26. 메모리 맵 파일 공유 예제
  • 27. 스파스 메모리 맵 파일  CreateFileMapping 함수를 호출할 때 SEC_RESERVE 플래그를 사용  프로세스의 주소 공간 상에 영역을 예약(Commit X)  공유된 영역에 대한 물리적 저장소 커밋은 VirtualAlloc를 이용
  • 28. 스파스 메모리 맵 파일 예제