DLL 의 Memory Mapping 에 대하여.
글쓴이: superdma / 작성시간: 월, 2009/08/24 - 10:00오후
WinNT에서
A.exe, B.exe 두 개의 실행파일이 동일한 DLL 인 same.dll 을 Import한다고 가정할때,
A.exe 가 먼저 same.dll 을 자신의 가상메모리상에 매핑시키고 물리메모리에 올린 후,
B.exe를 실행하면 B.exe는 same.dll을 물리메모리에 올리지 않고,
자신의 가상메모리(B.exe)에 방금 전 A.exe가 올린 same.dll 의 물리메모리에 매핑시킨다고 알고 있습니다.
이는 결국 A.exe 프로세스와 B.exe 프로세스의 가상메모리가 같은 주소를 할당 한다고 생각해 볼수 있는데요.
이떄 B.exe 프로세스는 A.exe의 same.dll 관련 page를 카피하는 건가요?
만일 page를 카피하는 거라면, A.exe 프로세스의 Linear Address를 얻기위해 A.exe 프로세스의 세그먼트에 접근한다는 것인데
보호메커니즘으로 태스크간 세그먼트가 보호되는 상황에서 이것이 가능한 일인가요?..
Forums:
_
두 가상 메모리를 같은 물리 메모리로 매핑하는 것이 가장 일반적인 방식입니다. 예를 들어 페이징 방식이라면 A 프로세스의 a 페이지와 B 프로세스의 b 페이지가 같은 물리 페이지 x를 가리키고 있는 것이죠.
물론 이렇게 할 때 A나 B가 서로의 페이지를 변경할 수 있으면 안 되겠고, 그래서 이를 방지하기 위한 구현이 몇 가지 있습니다. 가장 간단하게는 페이지 테이블에서 공유 라이브러리 영역에는 모두 읽기 전용 속성을 걸어 두거나, 아니면 공유된 페이지에 변경을 하려는 경우 그 페이지를 그 때 복사하는 방법(copy-on-write)이 있습니다. (fork()같은 경우 프로세스 메모리를 모두 복사하는 게 비싸기 때문에 많은 구현에 copy-on-write를 사용합니다.)
윈도에서의 구체적인 동작은 저도 모르고 있었는데, 검색해 보니까 라이브러리 로딩 시에 필요한 경우 copy on write를 쓰네요. http://support.microsoft.com/?scid=kb%3Ben-us%3B103858&x=16&y=16
다른 address가 됩니다.
http://msdn.microsoft.com/en-us/library/ms682594(VS.85).aspx
DLL text의 physical memory는 공유할 지언정,
virtual memory상에서의 mapping이 각 process마다 될 것이고,
data도 각 process 상에서 mapping이 되기 때문에
기본적으로 공유는 안됩니다. 따로 놉니다.
하지만,
위의 URL에서 말하듯이, 방법이 있을수 있겠죠.
댓글 달기