본문 바로가기
프로그래밍

dll과 메모리 맵 파일(memory-mapped file)의 관계.

by 안플루언서 2011. 3. 7.
dll과 메모리 맵 파일(memory-mapped file)의 관계.

메모리 맵 파일, 혹은 메모리 맵드 파일 
영어명칭 memory-mapped file..

이것은 크게 3가지의 목적으로 사용 된다고 한다.
1. exe 나 dll 등의 파일을 읽고 수행하기위해 메모리 맵 파일을 사용한다.
2. 디스크에 있는 데이터에 접근하기위해 메모리 맵파일을 사용한다.
3. 동일한 머신에서 수행중인 다수의 프로세스간의 데이터를 공유하기위해 메모리 맵 파일을 사용한다.
   윈도우즈에서 제공하는 프로세스간의 데이터 공유 기능은 내부적으로 메모리 맵 파일을 사용한다.


우선 윈도우즈 시스템에서 애플리케이션이 실행되는 순서를 간단히 살펴보자
test.exe 파일을 실행한다고 가정한다.
1. 시스템에 test.exe 을 실행하라고 메세지를 전달한다.
2. 시스템이 실행파일을 찾는다.
3. 새로운 프로세스 커널 오브젝트를 생성한다.
4. 새로운 프로세스를 위한 전용의 가상공간을 생성한다.
   (32비트에서는 4GB 만큼 생성하고 2GB를 유저모드로 파티션을 나눈다, 
   64비트에서는 16EB(엑사바이트)만큼 생성을 하지만 유저 모드로 8TB(테라바이트)만큼 파티션을 나눈다 )
5. 시스템은 exe 파일을 로드하기위한 충분한 공간을 가상공간에 예약한다.
   exe 파일을 로드하는 위치는 exe이 컴파일 되어 생성될때 선호되는 주소가 표시되어있다.
   주로 32비트 에서는 0x00400000 주소가 기본으로 설정된다.
6. 시스템은 exe파일에 접근하기위한 물리적 저장소를 페이징파일로 지정하지않고
   디스크의 exe 파일이 존재하는 위치를 매핑한다.

위와 같은 순서로 exe파일이 로드가 완료된다..
이후 dll 과 같은 파일을 로드하게된다.
dll을 로드 하는 방식은 위의 5,6 번 비슷한 과정을 반복하여 로드하게된다.


추가사항
dll 파일도 exe 파일과 마찬가지로 생성되는 순간 자신이 선호하는 주소를 포함하게된다.
하지만 로드시 선호하는 주소를 사용할수 없는 상황이된다면
시스템은 dll을 재배치 작업을 수행하게되고
애플리케이션의 가상메모리에 매핑을 할때 시스템의 페이징 파일로 매핑을 하게된다..

이처럼 dll 파일 로드시 선호하는 주소에 로드가 않으면
시스템 페이징 파일에 추가적인 저장소를 필요로하게되며
dll 재배치 작업에 대한 많은 시간이 소요되게된다.


댓글