-
저번 포스트에서 사용자가 작성한 C 프로그램이 어떤 과정을 통해서 실행파일이 되는지 다루었다. 또한 이렇게 만들어진 실행파일은 실행 될 때 Load 과정을 통해 메모리 영역에 담긴다고 하였다. 이번 포스트에서는 이렇게 생성된 실행파일이 어떻게 메모리에 들어가게 되는지에 대해 다룰것이다.
그전에 C언어로 작성한 파일을 실행 파일로 바꾸는 과정을 잠깐 살펴보자
1. C 언어 프로그램 작성
2. 선처리 과정을 통한 프로그램의 실질적 동작을 나타내는 코드와, 추가적인 정보를 나타내는 부분을 분류
3. 컴파일 과정을 통해 해당 코드가 바이너리 형태로 생성 즉 바이너리 파일이 생성
4. 링크 과정을 통해 해당 바이너리 파일과 외부에서 가져온 기능이 있는 바이너리 파일을 합쳐서 실행파일 생성
위와 같은 과정을 통해 실행파일이 생성되며 이렇게 생성된 실행파일을 Load 하고 해당 실행 파일의 내용 (바이너리 형태) 이 메모리에 적재가 된다. 메모리에 적재된 바이너리 코드를 가지고 CPU가 읽어보며 프로그램을 동작시킨다. 이때 메모리에 적재되는 과정은 코드를 분류하여 메모리에 적재하게 된다. 메모리는 총 5가지의 영역으로 나누어 관리하며 따라서 메모리에 적재되는 바이너리 코드는 분류되어 5가지 영역의 메모리에 나뉘어서 적재된다.
+ 용어
segment : 현재 포스트에서 사용하는 세그먼트라는 용어는 메모리의 한 부분으로 해석
출처: http://www.geeksforgeeks.org/memory-layout-of-c-program
위의 자료는 사용자가 작성한 프로그램이 (바이너리 형태) 메모리에 어떻게 적재 되는지를 나타내주는 메모리의 구조이다.
Complie Time 에 결정
1. text segment : 작성자가 작성한 코드중 Text 코드 한줄 한줄이 text segment에 들어가게 된다. 즉 CPU는 텍스트 영역에 있는 메모리의 내용을 읽어와 프로그램을 처리하며 따라서 작성한 코드의 크기에 따라 컴파일 과정에 text segment 의 크기는 결정 된다. (당연히 읽기만 가능) + 함수, 상수 (문자열 상수) 와 같은 내용도 포함한다.
EX )
A에 "Hello"를 넣어라
A : 코드의 Data를 저장할 공간 에 해당한다. 즉 해당 프로그램의 변수에 해당한다. Data (자료)는 작성자의 코드에 의해 Hello 라는 의미 있는 문자열 상수를 의미하며 A 라는 것은 해당 상수가 들어갈 공간이다.
에 "Hello"를 넣어라 : 코드의 Text에 해당 즉 프로그램에서 ~ 해와 같이 ' 말 ' 을 의미하는 부분이다. " A 라는 공간에 상수를 넣어줘 " 라는 실질적 명령에 해당하며 CPU는 해당 구문을 읽어 처리한다.
2. data segment : 데이터 세그먼트는 말 그대로 코드 작성시 해당 코드의 데이터 (의미있는 값) 이 들어가는 영역이다. 따라서 해당 영역은 사용자가 지정한 의미있는 값이 위치한 메모리이다. 즉 사용자가 초기화 해 준 의미 있는값이 들어가게 된다. 이때 초기화의 기준에서 0 초기화는 포함되지 않는다. 해당 영역의 메모리 데이터 세그먼트 영역은 코드 작성시 이미 크기가 결정 되기 때문에 컴파일 과정에서 데이터 세그먼트 크기가 결정된다.
3. bss segment : 해당 메모리 영역은 데이터 세그먼트 영역과는 반대로 초기화 하지 않은 값 즉 메모리를 선언 하였지만 의미있는 값이 없는 경우에 값을 넣는 메모리 영역이다. 따라서 0 초기화 역시 포함 된다. 코드에 작성시 이미 값을 넣는 메모리의 크기가 결정 즉 컴파일 과정에 데이터 세그먼트의 크기 결정
위의 설명대로 text, data, bss segment 는 컴파일 과정에 이미 적재되는 메모리의 크기가 결정 된다. 만약 실행파일을 Load 한다면 해당 바이너리 파일의 내용이 메모리에 적재되고 이때 text, data, bss segment 에 적재된 내용은 프로그램이 종료 될 때 까지 계속 메모리에 남아있는 상태가 된다. 이는 정적 변수, 전역 변수 할당 후 해당 내용을 모든 함수에서 접근 가능하도록 하는 것과 같은 이치이다. 즉 모든 함수에서 접근 가능하려면 프로그램 종료시 까지 해당 메모리는 계속 유지 되어야 하기 때문이다.
Run Time 에 결정
4. heap segment : 동적 할당 메모리 영역 사용자가 따로 할당, 해제 하여야 한다.
5. stack segment : 자동 변수 영역 따라서 OS 에서 자동으로 해당 메모리의 영역을 스코프 블럭에 따라 할당, 해제 한다.
text, data, bss segment 와 같이 프로그램이 시작하는 순간 부터 끝나는 순간 까지 계속 메모리에 적재된 내용이 남아있는 경우와는 다르게 프로그램이 실행하는 중에 즉 동작 중에 계속 메모리의 내용이 변화하는 경우이다.
'C언어' 카테고리의 다른 글
컴파일 전 처리 (전처리기) (0) 2020.03.28 컴파일 최적화 (0) 2020.03.27 C 프로그램의 동작 과정 (0) 2020.03.16 스택 프레임 & 재귀함수 (0) 2020.03.13 포인터의 이해 (0) 2020.03.07