헷갈렸던 부분인데 어디에도 명확하게 얘기해주지를 않네요. 얼마전 정확하게 정의해주는 곳을 찾아서 복사해 왔습니다. 



[ DLL 의 메모리 상주] 


흔히 얘기하기를 "DLL은 메모리에 한 번 올라가면, 이 DLL을 공유하는 프로세스가 모두 종료될 때까지 메모리에 존재한다" 고 한다.

상당히 애매하지 않나? 메모리라니? 가상 메모리? 물리 메모리? 명확하지 않네.

프로세스가 DLL을 로드한다는 것은 프로세스 가상 메모리에 DLL이 맵핑되었음을 의미하는 것이다.

위의 메모리 효율에서도 설명하였지만 이것이 물리 메모리 페이지에 어떠한 형식으로 남아 있는 것인지의 양상은 다르지만,

해당 프로세스가 종료되면 프로세스의 가상 메모리에서 라이브러리 또한 같이 소멸된다.

프로세스의 가상 메모리라는 것은 말 그대로 프로세스 소유의 가상 메모리이다. 즉, 프로세스별 독립적으로 존재하는 영역인 것이다.


다시 얘기해 "DLL은 물리 메모리에 한 번 올라가면, 이 DLL을 공유하는 프로세스가 모두 종료될 때까지 물리 메모리에 존재한다" 라고 해야 한다.


다음과 같은 단계를 거쳐 이해를 해 보자.

1. 프로세스 A가 실행되며 X.dll을 로드한다. 
    따라서 X.dll은 A의 가상 메모리 영역에 맵핑되면서 물리 메모리에 할당된다.

2. 프로세스 B가 실행되며 X.dll을 로드한다.
   이미 1단계에서 X.dll이 물리 메모리에 올라 있으므로 그대로 참조할 수 있도록 프로세스 B의 가상 메모리 영역에 맵핑만 한다.

   이 상황에서 유의할 것이 X.dll 이 할당된 가상 메모리 주소이다. 프로세스 A와 B가 동일한 주소에 할당한다.

 

   이것이 DLL 공유가 가능한 이유이다. 다시 말해서 두 프로세스가 동일한 DLL을 동일한 가상 주소에 맵핑했기 때문에,
   페이지 단위로 공유가 가능하다는 것이다.

3. 프로세스 A가 종료되었다. 그러나 B가 종료되지 않았기 때문에,
    X.dll은 여전히 물리 메모리에 남아있다.

4. 프로세스 B가 종료되었다. 이제 X.dll을 참조하는 프로세스가 하나도 존재하지 않기 때문에 X.dll도 할당된 물리 메모리에서 반환된다.


[ 중복 Loading] 

처음 DLL이 빌드될 때 DLL이 할당되어야 할 가상 메모리 주소가 Linker에 의해 결정된다.

 

만약 X.dll을 0x20000000 번지에 맵핑하기로 한다면, 모든 프로세스는 0x20000000 번지에 X.dll의 주소를 맵핑시킨다.

헌데 아래 상황을 한 번 살펴보자.

1. 프로세스 A가 X.dll을 로드하면서 가상 메모리 주소 0x10000000에 맵핑하였다.

2. 프로세스 B가 Y.dll을 로드하면서 가상 메모리 주소 0x10000000에 맵핑하였다.

3. 프로세스 B가 X.dll을 로드하게 되면, 이미 0x10000000에 Y.dll이 존재하고 있으므로,다른 주소의 메모리 영역에 X.dll을 올리게 된다. 

위와 같은 상황이 발생하면 두 개의 X.dll이 물리 메모리에 올라가게 된다. 즉, DLL도 물리 메모리에 중복적으로 올라갈 수 있음을

기억하자.

'OS > windows 여러가지' 카테고리의 다른 글

LG XTIC USB부팅영역만들기 도구  (0) 2011.08.03
[유틸] ShellcodeExec  (0) 2011.08.01
[유틸] exe to TXT  (0) 2011.08.01
[유틸]bat to exe  (0) 2011.08.01
VMware 아무나 모르는 인터페이스 연결방식의 원리  (0) 2011.06.03
AND