본문 바로가기
C/[서적] 뇌를 자극하는 윈도우즈 시프

Chapter 21. Dynamic Linking Library

by GameStudy 2022. 2. 14.

21.1-1 C Runtime Library 설정

  Note) 이 장에서는 DLL이 메모리 상에서 어떤 의미를 지니는지만 알아 볼 예정.

    C언어 개발시에 printf() 함수와 같은 것들도 결국 Library에 의해 제공 받음.

    테스트 할때는 (debug)가 달린 걸로 테스트하면 되고,

    개발 완료 후 배포할 때는 안 달린 걸로 빌드하면 됨.

출처. 윤성우, "뇌를 자극하는 윈도우즈 시스템 프로그래밍"

 

  Note) VS 6.0 버전 이후부터 Multi-threaded debug library로 설정됨.

출처. 윤성우, "뇌를 자극하는 윈도우즈 시스템 프로그래밍"

 

21.1-2 Static Library Vs. Dynamic Linking Library

  Note) 정적 라이브러리의 경우에는, 실행 파일안에 정적 라이브러리가 그대로 무겁게 통째로 들어감.

    즉, 똑같은 정적 라이브러리임에도 불구하고 세 개의 실행 파일안에 각각 들어가 있음을 볼 수 있음.

    실행파일 별로 나혼자 쓰겠다는 의미.

출처. 윤성우, "뇌를 자극하는 윈도우즈 시스템 프로그래밍"

 

  Note) 반대로 DLL의 경우에는, 실행 파일이 라이브러리를 갖고 있지 않음.

    하나의 라이브러리를 공유하게됨. 내가 갖고 있음 안됨.

    프로그램이 메모리에 올라가서 런타임이 되었을때, 링크를 걸어야함. 

    즉, 내가 원하는 시간에 링크를 건다해서 Dynamic Linking Library

    DLL이 꼭 정적 라이브러리보다 더 좋다고 할 순 없음.

    일반적으론 정적 라이브러리 방식으로 배포하지만, 너무 큰 라이브러리라면

    동적 라이브러리 방식으로 배포하기도 함.

 

  Note) DLL은 또한 내부적인 기능을 수정할 수도 있는 장점이 있음.

    DLL만 배포를 할 경우에는, 실행 파일 전체를 접근할 필요가 없음.

    보통 실무에선 작은 DLL이 여러 개 있음. 그럼 하나의 실행 파일이

    여러 DLL을 하나로 구성해서 활용하는 방식.

    이런 경우에 이 중 하나의 DLL을 바꿔야한다면 그 하나만 교체하면 됨.

    문제가 된 DLL을 패치 즉 교체할 수 있는 장점.

출처. 윤성우, "뇌를 자극하는 윈도우즈 시스템 프로그래밍"

 

21.1-3 DLL의 특성 1

  Note) 정적 라이브러리의 경우에는 가상 메모리에 전부 올라가게 됨.

출처. 윤성우, "뇌를 자극하는 윈도우즈 시스템 프로그래밍"

 

  Note) 동적 라이브러리의 경우에는 가상 메모리에 전부 올라가진 않고,

    필요할때 매핑 시키는 구조. AAA.exe가 가지고 있는 것은 아님.

출처. 윤성우, "뇌를 자극하는 윈도우즈 시스템 프로그래밍"

 

21.1-4 DLL의 특성 2

  Note) 정적 라이브러리의 경우, 새로운 실행 파일이 실행될때

    새로운 실행 파일도 같은 정적 라이브러리 영역을 필요로 한다 할지라도

    다 반환하고 새롭게 같인 정적 라이브러리 영역을 로딩함.

출처. 윤성우, "뇌를 자극하는 윈도우즈 시스템 프로그래밍"

 

  Note) 동적 라이브러리의 경우, 새로운 실행 파일이 실행 될때

    이전 실행 파일도, 새로운 실행 파일도 자신의 가상 메모리에

    동적 라이브러리를 갖고 있진 않음. DLL 파일에서 매핑 시켜서 쓰고 있음.

    그렇기 때문에 CS가 이뤄지면 이전 실행 파일에 해당하는 메인 메모리 부분만

    반환이 이뤄지고 DLL 파일은 반환이 이뤄지지 않음. 당연하게도 다른 파일이기 때문.

    

출처. 윤성우, "뇌를 자극하는 윈도우즈 시스템 프로그래밍"

 

21.1-4 DLL의 특성 3

  Note) 한 번만 로드 될 수 있는 DLL

    - "물리 메모리 주소 ~= RAM의 주소"

      "물리 메모리 == RAM + HDD"

      아래 그림에서 물리 메모리라는 단어를 가상 메모리와 물리 메모리로 국한하면 

      잘못된 말이 되어버림에 주의.

    - 가상 메모리가 있고, RAM이 있다고 해보자.

      HW관점에서 보면 RAM에 올라온게 DLL이건 프로세스건 상관 안함.

      페이지 교체 알고리듬에 의해서 현재 안쓰는거다 하면 내려버림.

      다만 엄밀하게 말하면 DLL의 경우에는 둘 이상의 프로세스가 동시에 활용할 수 있어서

      내려올 확률이 좀 더 적긴 하지만, 계속 남아 있는건 아님.

    - 어찌되엇든 잘 안쓰면 Swap 파일로부터 올리고 내리고를 반복함. DLL도 마찬가지.

      DLL은 한 번 가상메모리 주소에 할당이 되면, 이젠 고정이 됨. 왜?

      아래 그림과 같이 AAA와 BBB를 위한 가상 메모리가 있다고 하면

      둘 다 DLL을 위한 가상 메모리 주소가 같게끔 설계함.

      그래서 CS가 이뤄져도 DLL은 내려가지 않아도 되게끔 함. 따라서 고정되어 버림.

      가급적이면 일치하도록 OS가 노력해줌. 이런 것들이 DLL의 특징.

출처. 윤성우, "뇌를 자극하는 윈도우즈 시스템 프로그래밍"

댓글