메모리 상의 데이터 배치
정적 메모리/ 동적 메모리
메모리에는 명령어만 담기는 게 아니라 데이터도 담긴다. 이 경우 데이터는 정적(static)인 데이터다. 정적이라는 말은 프로그램 작성 시 얼마나 많은 메모리가 필요한지 알고 있어야 한다는 뜻이다.
따라서 이런 데이터 영역을 충돌하지 않도록 배치할 수 있어야 한다.
프로그램이 메모리를 사용하는 방식은 대부분의 프로그램이 다루는 동적 데이터이다. 동적 데이터는 프로그램을 실행하기 전에는 크기를 알 수 없는 데이터를 말한다.
메모리 배치
메모리 상의 프로세스는 그림과 같이 표현된다.
- 텍스트 영역 : 프로그램 카운터의 값, 처리기 레지스터의 내용 등 CPU가 실행하는 기계어 명령들의 자료를 가진다.
- 스택 영역 : 함수의 매개변수, 복귀 주소, 지역 변수, 지역 함수 등의 임시적인 자료를 가진다.
- 데이터 영역 : 전역 및 정적 변수를 가지며 초기화된 자료 구역과 초기화되지 않은 자료 구역으로 나뉜다.
- 초기화된 자료 구역은 초기화된 전역 및 정적 변수를 가진다.
- 초기화되지 않은 자료구역은 초기화되지 않은 전역 및 정적 변수들을 가지며 이 구역의 자료는 프로그램 실행 전에 커널이 0 또는 널 포인터로 초기화 한다.
- 힙(heap) 영역 : 동적으로 할당되는 데이터를 가지며 주로 정적 데이터가 차지하는 영역의 바로 위 영역에 쌓인다.
더 많은 데이터를 저장해야 할 경우 스택은 아래로 자라나고 힙은 위로 자라난다. 따라서 스택과 힙이 충돌하지 않게 하는 것이 중요하다.
실제 메모리 배치
- 마이크로컴퓨터에서는 MMU가 없는 경우가 많으므로 위의 메모리 배치를 주로 사용한다.
- MMU가 사용되는 경우에는 텍스트, 데이터, 스택이 각자 다른 물리적 메모리에 매핑되고 필요에 따라 할당된 크기를 변경할 수 있다. 그러나 프로그램이 바라보는 메모리는 가상메모리로 위의 메모리 배치와 같다.
프로그램 실행
라이브러리
라이브러리는 함수와 클래스 등의 기능의 집합이다.
- 정적 라이브러리 : 정적 라이브러리는 컴파일러가 소스 파일을 컴파일할 때 참조되는 프로그램 모듈이다.
- 공유 라이브러리 : 프로그램 실행 파일에 연결 되지 않고 동적으로 프로그램이 실행될 때 연결하거나 런타임 중에 연결하여 사용할 수 있는 라이브러리이다.
- 런타임 라이브러리 : 프로그램이 실제 환경에서 실행되기 위해 필요한 모듈들이다. 따라서 런타임 라이브러리의 명령어가 가장 먼저 실행된다. 런타임 라이브러리는 메모리의 설정을 책임지므로 스택과 힙의 영역, 정적 데이터의 초기값을 설정한다.
링크
프로그램은 라이브러리와 여러 조각으로 이루어진다. 이 방식의 장점은 여러 사람의 한 프로그램의 여러 부분을 동시에 개발할 수 있다는 점이다. 그래서 각 조각을 연결할 방법이 필요한데 이 역할을 하는 것이 링커라는 프로그램이다.
- 정적 링크
- 정적 링커는 정적 링크 시 소스코드를 컴파일해서 나온 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리를 복사한다.
- 여러 프로그램이 같은 라이브러리를 사용하는 경우 중복이 발생하여 메모리를 낭비한다.
- 이 방식은 실행 파일이 커지는 단점이 있으나 라이브러리가 포함되어있어 단독으로 실행이 가능하고 불일치에 대한 걱정을 하지 않아도 된다.
- 라이브러리에 변화가 생길 시 변화를 적용하기 위해 다시 컴파일해야한다.
- 동적 링크
- 동적 링크는 프로그램이 실행될 때 실행파일과 사용되는 라이브러리의 주소만을 가지고 공유 라이브러리는 따로 메모리에 올린다.
- 여러 프로그램이 같은 라이브러리를 사용해도 라이브러리 정보는 하나만 있으면 된다.
- 라이브러리에 변화가 생길 시 다시 컴파일 할 필요가 없다.
- 동적 링크는 실행 파일이 작아지는 장점이 있으나 불일치에 대한 문제를 고려해야 한다.
메모리 전력 소비
데이터를 메모리에서 옮기려면 전력이 소비된다. 데스크톱 컴퓨터에서는 이런 전력소비가 중요하지는 않으나 모바일 장치에서는 매우 중요하다.