개요
정적 링크와 동적 링크에 대해 이해하기 위해서는 컴파일 과정에 대한 이해가 필요합니다.
아래 링크의 글을 읽고 오는 것을 추천합니다.
https://growth-coder.tistory.com/339
[컴파일러] 컴파일, Tokenizer, lexer, parser
컴파일컴파일이란 인간이 이해할 수 있는 고수준 언어로 구성된 소스 코드를 컴퓨터가 이해할 수 있는 저수준 언어로 바꾸는 과정이다. 컴파일 과정은 언어마다 다르지만 보통 전처리 → 컴파
growth-coder.tistory.com
위 포스팅을 보면 컴파일 과정 중 링킹에 대한 부분이 있습니다.
이 링킹 과정을 간단히 설명하면 여러 개의 오브젝트 파일과 외부 라이브러리를 합쳐서 라이브러리 코드를 사용할 수 있도록 해주는 과정입니다.
이 링킹 과정에서 정적 라이브러리를 링킹하면 정적 링크, 동적 라이브러리를 링킹하면 동적 링크라고 부릅니다.
그러면 먼저 정적 링크에 대해서 알아봅시다.
정적 링크 (static link)
정적 링크는 정적 라이브러리를 링크하는 과정으로 정적 라이브러리는 컴파일 타임에 연결됩니다.
링킹하는 과정에서 정적 라이브러리의 경우 실행 파일로 복사되고 런타임 시점에 메모리에 로드됩니다.
이러한 특성 때문에 만약 같은 정적 라이브러리를 사용하는 실행 파일이 여러 개 있다고 해도 각 실행 파일마다 정적 라이브러리 코드를 갖게 됩니다.
실행 파일이 실행될 때, 정적 라이브러리를 메모리에 로드한 상태로 시작하기 때문에 바로 접근할 수 있다는 장점이 있지만 같은 라이브러리를 공유하지 못 해 메모리 용량이 많이 필요하다는 단점이 있습니다.
StaticLibrary라는 정적 라이브러리를 A, B, C 실행 파일에서 사용한다면 아래와 같은 형태가 됩니다.

그러면 A와 B 실행 파일을 실행할 때, 메모리 공간에 대해 알아봅시다.
아래 그림에서 A.exe와 B.exe에서 5, 6, 7번 페이지는 정적 라이브러리 StaticLibrary이고 현재 A.exe가 메인 메모리에 올라가 있다고 합시다.

이 상태에서 context switching이 발생하여 B.exe가 메인 메모리에 올라가고 B.exe도 StaticLibrary의 5번 페이지가 필요하다고 합시다.
같은 정적 라이브러리를 사용하기 때문에 사실상 5번 페이지는 동일하지만 정적 링크를 통해 연결되었기 때문에 A에게 5번 페이지를 반환하고 B로부터 같은 5번 페이지를 다시 로드하게 됩니다.

동적 링크 (dynamic link)
동적 링크는 동적 라이브러리를 링크하는 과정으로 정적 라이브러리는 런타임에 연결됩니다.
즉, 프로그램이 메모리에 올라가서 실행될 때, 동적 라이브러리가 필요하면 그 때 동적 라이브러리와 연결됩니다.
이러한 특성 때문에 만약 같은 동적 라이브러리를 사용하는 실행 파일이 여러 개 있다고 해도 동적 라이브러리를 공유하기 때문에 메모리 공간을 절약할 수 있습니다.
실행 파일이 실행될 때, 동적 라이브러리를 메모리에 로드하지 않고 런타임에 동적 라이브러리에 접근하기 때문에 메모리 공간을 절약할 수 있다는 장점이 있지만 동적 라이브러리가 필요할 때, 해당 공간에 접근해야 하기 때문에 시간이 조금 더 걸린다는 단점이 있습니다.
DynamicLibrary라는 동적 라이브러리를 A, B, C 실행 파일에서 사용한다면 아래와 같은 형태가 됩니다.

그러면 A와 B 실행 파일을 실행할 때, 메모리 공간에 대해 알아봅시다.
아래 그림에서 A.exe와 B.exe에서 5, 6, 7번 페이지는 동적 라이브러리 DynamicLibrary이고 현재 A.exe가 메인 메모리에 올라가 있다고 합시다.
동적 라이브러리를 공유하기 때문에 A와 B의 가상 메모리 5, 6, 7번은 동적 라이브러리를 매핑하고 있는 상황입니다.

이 상태에서 context switching이 발생하여 B.exe가 메인 메모리에 올라가고 B.exe도 DynamicLibrary의 5번 페이지가 필요하다고 합시다.
정적 라이브러리와 다르게 A의 5번 페이지와 B의 5번 페이지는 동적 링크를 통해 연결되었기 때문에 5번 페이지를 반환할 필요가 없게 됩니다.

정리
| 정적 라이브러리 | 동적 라이브러리 | |
| 실행 속도 | 비교적 빠름 | 비교적 느림 |
| 메모리 사용량 | 중복됨 | 공유됨 |
| 런타임 유연성 | 낮음 | 높음 (버전 교체에 유리) |
출처
https://www.youtube.com/watch?v=JK6U91t7mgY