개발자 면접 공부/C-C++

정적 링킹 vs 동적 링킹

chogyujin 2024. 7. 4. 12:44
728x90

1. 개요

오늘은 정적 링킹 vs 동적 링킹에 대해 알아보겠습니다.

https://live-everyday.tistory.com/69


1. 정직 링킹

정적 링킹이란 실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하는 방식을 말하며 링커에 의해 이루어집니다.

즉, 자신이 작성한 프로그램에서 A라는 외부 함수를 사용했다면, A라는 외부 함수에 대한 정보를 자신이 작성한 프로그램의 실행파일을 만들 때 복사해옵니다.

5개의 프로그램에서 A라는 외부 함수를 이용하는데 이때 정적 링킹 방식을 사용하면 5개의 프로그램의 실행 가능한 목적파일 각각에 A의 정보가 담긴다.
즉, 중복이 발생한다.
따라서 정적 링킹으로 만들어진 프로그램은 크기가 크고 메모리 효율이 좋지않습니다.

또한, 정적 링킹을 이용하면, A라는 함수에 변화가 생길 경우 그 변화를 적용하기 위해서 다시 컴파일하여 다시 링킹을 해야만 합니다.

실행 가능한 목적파일을 만들 때 A에 관한 정보를 그냥 복사해왔기 때문에 A에 변화가 생겨도 다시 컴파일하지 않는 이상 변화가 적용되지 않습니다.

하지만 좋은 점도 있습니다.

정적링킹 라이브러리를 사용하는 프로그램은 동적 링킹 라이브러리를 사용하는 프로그램보다 빠릅니다.

뿐만 아니라 정적 링킹 프로그램에서 모든 코드는 하나의 실행 모듈에 담기기 때문에 Compatibility issues 즉 불일치에 대한 걱정을 하지 않아도 됩니다.


2. 동적 링킹

동적 링킹이란 실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하지 않고 해당 모듈의 주소만을 가지고 있다가, 런타임에 실행 파일과 라이브러리가 메모리에 위치될 때 해당 모듈의 주소로 가서 필요한 것을 들고 오는 방식입니다.

런타임에 운영체제에 의하여 이루어집니다.

동적 링킹 방식을 이용하면 5개의 프로그램에서 A라는 외부 함수를 이용한다고 해도 A라는 함수의 정보는 하나만 있으면 됩니다.

각각의 실행 가능한 목적파일에서는 A를 복사해서 A 그 자체를 가지고 있는 것이 아니라 A가 있는 곳의 주소만 가리키고 있기 때문입니다.

따라서 정적링킹 방식에 비해 실행 가능한 목적파일 크기가 작습니다.

즉, 메모리와 디스크 공간을 더 아낄 수 있습니다.

 

동적 링킹을 이용하면, A라는 함수에 변화가 생겨도 그 변화를 적용하기 위해 다시 컴파일하여 다시 링킹할 필요가 없습니다.

실행 가능한 목적파일을 만들 때 A에 관한 정보를 그냥 복사해온 것이 아니라 A가 있는 곳의 주소를 담았기 때문이다.
그저 가리키는 곳을 따라가면 변화된 A가 있다.

정적 링킹이 사용된 프로그램이 실행을 위해 메모리에 로드되는 데 일정한 시간이 걸리는 반면, 동적 링킹 방식이 사용된 프로그램은, 동적 라이브러리가 메모리에 이미 존재하는 경우 로드되는 시간을 단축시킬 수 있다.

하지만 동적 링킹 방식은 정적 링킹 방식보다 느리다.

매번 주소를 따라가야하는 오버헤드가 존재하기 때문이다.

또한, 동적 링킹 방식은 compatibility issues 즉, 불일치에 대한 문제를 고려해야 한다.

왜냐하면 동적 링킹 방식은 불일치가 존재할 수 있기 때문이다.

예를 들어 어떤 프로그램에서 A라는 함수를 동적 링킹 방식으로 사용하고 있을 때, A라는 함수가 시스템에서 제거되면 이는 불일치 상황이다.

해당 프로그램의 실행 가능 목적파일에는 A의 주소가 있어서 마치 A가 존재하는 것처럼 움직이지만 실제 A는 시스템에 더이상 존재하지 않기 때문이다.

따라서 이 프로그램은 제대로 실행될 수 없다.

 

이는 당연한 문제 같지만 정적 링킹 방식에서는 고려하지 않아도 되는 문제다.

정적 링킹 방식에서는 필요한 모듈을 모두 복사하여 하나의 실행 파일에 저장하기 때문에 사용하는 곳과 사용되는 것의 위치가 항상 일치하여 불일치가 발생할수 없다.


3. 요약

특징 정적 링크 동적 링크
파일 크기 실행 파일이 커짐 실행 파일이 작아지고, 라이브러리 파일이 별도로 존재
배포 간편성 단일 실행 파일만 배포하면 됨 실행 파일 외에도 필요한 모든 라이브러리를 배포해야 함
성능 런타임 오버헤드가 없음 런타임에 라이브러리를 로드하는 오버헤드가 있음
메모리 사용 효율 메모리 사용이 비효율적일 수 있음 여러 프로그램이 동일한 라이브러리를 사용할 경우 메모리 사용 효율적
호환성 라이브러리 버전 불일치 문제가 없음 라이브러리 버전 불일치 문제 발생 가능
업데이트 용이성 라이브러리 업데이트 시 전체 프로그램을 다시 빌드하고 배포해야 함 라이브러리만 업데이트 가능
사용 예 독립 실행형 애플리케이션, 임베디드 시스템 등 대규모 애플리케이션, 빈번한 업데이트가 필요한 경우, 공통 라이브러리 사용 시
런타임 의존성 없음 런타임에 라이브러리가 필요
링크 시간 링크 시간이 더 길 수 있음 링크 시간이 상대적으로 짧음
안정성 전체 프로그램이 하나의 파일로 되어 있어 더 안정적일 수 있음 런타임에 라이브러리가 손상되거나 누락될 수 있음

4. Ref

https://live-everyday.tistory.com/69

 

[Linking] 정적 링킹과 동적 링킹의 차이

이번 시간에는 정적 링킹과 동적 링킹의 차이에 대해 이해해보자. 아래의 그림에서 왼쪽은 정적 링킹 방식이고 오른쪽은 동적 링킹 방식이다. 먼저 글을 찬찬히 읽은 뒤 다시 그림을 살펴보는

live-everyday.tistory.com

 

'개발자 면접 공부 > C-C++' 카테고리의 다른 글

템플릿(Template)  (1) 2024.07.01
C++ 11 범위기반 for문 (for each)  (0) 2024.06.16
extern 쓰는법  (0) 2024.06.11
Volatile  (0) 2024.04.29
네임 맹글링  (0) 2024.04.14