LISTORY

[윈도우즈 시스템 프로그래밍] Dynamic Linking Library 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] Dynamic Linking Library

LiStoryTeller 2018. 11. 11. 02:18


뇌를 자극하는 윈도우즈 시스템 프로그래밍 책 관련 유투므 강의 내용 정리이다.


오늘 정리할 내용은  Dynamic Linking Library 이다.


YouTube 주소 :  Dynamic Linking Library



Dynamic Linking Library



C 런타임 라이브러리 설정




우리가 보통 c런타임에 사용하는 printf 등은 라이브러리에서 제공받는다.



⊙ Static Library vs DLL



- 정적 라이브러리


정적으로 라이브러리를 링크하면 실행  파일에 라이브러리가 들어가는 것이다. 


똑같은 라이브러리 임에도 불구하고 세개의 실행파일이 다르기 때문에 각각이 라이브러리를 저장하고 있다.


- DLL


라이브러리를 가지고 있지 않고, 하나의 라이브러리를 실행 파일이 공유하는 방식이다.


공유하려면 실행파일이 가지고 있으면 안된다. 실행 파일이 실행될 때 라이브러리를 링크한다.


원하는 시간에 링크하므로 DLL이라고 한다.



둘 중 무엇이 낫다고 말할 순 없다.


일반적인 어플리케이션을 배포할 때엔 정적 라이브러리 형태로 배포한다.


용량상의 문제가 있을 땐 DLL을 배포하기도 한다.


DLL의 경우, 내부적인 매커니즘을 수정할 수 있다는 장점도 지닌다.


DLL만 배포할 경우에는 실행파일을 바꿀 필요 없이 라이브러리만 변경하면 되기 때문이다.



⊙ DLL 특성 1.



AAA.exe 라는 실행파일이 있다. 정적 라이브러리는 영역에 포함되어 있다. 즉, 매핑되어 있다.


가상메모리가 있다고 가정했을 때에 이 부분은 가상메모리의 일부로서 존재한다.


즉 가상메모리가 메모리에 매핑이 되어야 올라가는 것이다.


가상메모리에 할당했지만 프로그램을 실행할 때엔 메인메모리에 올려야 한다.


실제 파일이 가지고 있는 일부를 그대로 메인 메모리에 올려야 한다.



만일 DLL일 경우, 가상메모리에 할당이 된다. 하지만 이는 AAA.exe의 일부가 아니라 별도의 dll파일로 존재한다.


쉽게 말하자면 가상메모리에 매핑은 되어있다. 하지만 실제로 AAA.exe가 가지고 있는 것은 아니다.


정적 라이브러리의 경우, AAA.exe에 포함, DLL은 그렇지 않은 것이다.



⊙ DLL의 특성 2.



AAA, BBB 실행 파일 모두 같은 정적 라이브러리를 가지고 있다. 


만일 AAA파일을 실행하다가 BBB 파일을 실행했다고 해보자. (컨텍스트 스위칭)


이 때 메인메모리는 같은 라이브러리임에도 불구하고 해당 메모리 영역을 반환하고 새롭게 로딩해야 한다.


반면에 DLL의 경우, 이미 메인메모리에 올라가 있는 메모리를 사용하면 된다.


이는 별도의 DLL 파일을 메인메모리에 매핑시켰기 때문에 가능하다.



⊙ DLL의 특성 3.


한번만 로드될 수 있는 DLL



물리메모리에 할당된 메모리이지 물리메모리 주소가 아니다.


물리메모리 주소는 보통 RAM의 주소를 말한다. 하지만 여기선 주소가 아니라 물리메모리 그 자체이다. 


RAM도 물리메모리지만, 캐쉬, 하드디스크도 물리메모리이다.


여기서 물리메모리는 하드디스크까지 확장한 메모리이다. 그렇지 않으면 위의 말은 성립될 수 없다.



가상메모리와 RAM이 있다. 물리메모리의 주소는 RAM의 주소를 말한다.


근데 H/W는 RAM에 올리는 대상이 DLL이건 뭐건 신경쓰지 않는다.


RAM 입장에선 DLL이던 프로세스건 필요로 하면 RAM위에 올리고, 필요없으면 다시 내린다.


DLL의 경우, RAM에 올라가면 내려갈 확률이 조금 적다. 왜냐면 특성상 활용의 빈도수가 높기 때문이다. 


하지만 RAM에 계속 남아있는 것은 아니다.


많이 쓰지않으면 페이지 교체 알고리즘을 통해 RAM에서 내려간다.


일단 DLL이 로딩된다는 것은 OS관점에서 보면 인식되는 것이다. DLL 메모리가 어디서 어디까진지 확장이 되는 것이다.


할당이 되면 DLL이 올라가지만 이를 잠시 안쓰면 RAM에서 떨어져 나간다. 


즉, DLL을 하드디스크에 저장할 수 있고, 이는 다시 RAM에 올릴 수 있다. 



위의 그림에서 말하는 주소는 가상메모리 주소이다. 


이때, AAA와 BBB의 가상메모리 주소를 일치시키는데, 이는 RAM에 있는 데이터를 내리지 않게 하기 위함이다.


이는 가급적 그렇게 하는 것이고, 운영체제가 해준다.








Comments