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의 특징.
'C > [서적] 뇌를 자극하는 윈도우즈 시프' 카테고리의 다른 글
Chapter 20. 메모리 관리(Virtual Memory, Heap, MMF) (0) | 2022.02.14 |
---|---|
Chapter 19. 비동기 I/O와 APC (0) | 2022.02.14 |
Chapter 18. 파일 I/O와 디렉터리 컨트롤 (0) | 2022.02.14 |
Chapter 17. 구조적 예외처리(Structured Exception Handling) (0) | 2022.02.13 |
Chapter 16. 컴퓨터 구조에 대한 네 번째 이야기 (0) | 2022.02.13 |
댓글