컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공한다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같다.
-
코드 영역
- 메모리의 코드 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부른다. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.
-
데이터 영역
- 메모리의 데이터 영역은 프로그램의 전역 변수와 정적(static) 변수가 정장되는 영역이다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
#include <stdio.h> int a = 10; // 데이터 영역에 할당 int b = 20; // 데이터 영역에 할당 int main() { return 0; }
- 메모리의 데이터 영역은 프로그램의 전역 변수와 정적(static) 변수가 정장되는 영역이다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
-
스택 영역
- 메모리의 스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다. 스택영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다. 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
#include <stdio.h> void fct1(int); void fct2(int); int a = 10; // 데이터 영역에 할당 int b = 20; // 데이터 영역에 할당 int main() { int i = 100; // 지역변수 i가 스택 영역에 할당 fct1(i); fct2(i); return 0; } void fct1(int c) { int d = 30; // 매개변수 c와 지역변수 d가 스택영역에 할당 } void fct2(int e) { int f = 40; // 매개변수 e와 지역변수 f가 스택영역에 할당 }
- 메모리의 스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다. 스택영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다. 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
-
힙 영역
- 메모리의 힙 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역이다. 힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
- 힙 영역 : 할당해야 할 메모리의 크기를 프로그램이 실행되는 동안 결정해야 하는 경우(런 타임때) 유용하게 사용되는 공간
-
**정적 링크(Static Linking)**와 **동적 링크(Dynamic Linking)**는 프로그램에서 사용되는 라이브러리 파일을 어떻게 포함시키는지에 대한 차이가 있습니다.
-
정적 링크는 라이브러리 코드를 프로그램의 실행 파일에 직접 포함시키는 방식입니다. 컴파일 시에 라이브러리 코드를 프로그램에 링크하고, 실행 파일에 포함시켜 배포합니다.
- 장점 : 라이브러리 파일이 따로 필요하지 않기 때문에, 프로그램을 다른 시스템에서 실행시킬 때도 동작이 보장됩니다.
- 단점 : 프로그램 실행 파일의 크기가 커지고, 여러 프로그램에서 동일한 라이브러리 코드를 중복하여 사용하는 문제가 있습니다.
-
반면에, 동적 링크는 프로그램 실행 시 필요한 라이브러리 코드를 라이브러리 파일에서 읽어와 메모리에 동적으로 링크하는 방식입니다.
- 장점 : 프로그램 실행 파일에서 라이브러리 코드를 제외하므로, 프로그램의 크기가 작아집니다. 또한, 여러 프로그램이 동일한 라이브러리 코드를 공유할 수 있기 때문에 메모리 사용량도 줄어듭니다.
- 단점 : 라이브러리 파일이 필요하므로, 프로그램을 다른 시스템에서 실행시킬 때는 해당 라이브러리 파일이 존재해야 합니다.
-
따라서, 정적 링크는 프로그램의 크기가 크고, 여러 프로그램에서 중복된 라이브러리 코드를 사용하게 되지만, 다른 시스템에서도 실행이 가능하다는 장점이 있습니다. 반면에, 동적 링크는 프로그램의 크기가 작아지고, 메모리 사용량도 줄어들지만, 라이브러리 파일이 필요하고, 해당 라이브러리 파일이 존재해야만 실행이 가능하다는 단점이 있습니다.
-
확장자별 라이브러리 종류
.a
: 리눅스/정적 라이브러리.so
: 리눅스/동적라이브러리.lib
: 윈도우/정적라이브러리.dll
: 윈도우/동적라이브러리