대범하게

[Malloc-lab] 메모리 영역(데이터 세그먼트) 본문

SW사관학교 정글/Malloc-lab

[Malloc-lab] 메모리 영역(데이터 세그먼트)

대범하게 2022. 10. 28. 20:20
반응형

코치님에게 csapp를 읽으면서 스택과 힙에 할당되는 부분에 관해 아직 헷갈리는 부분이 있다고 의도치 않은(?) 고백을 해버렸고 다시 질문이 날라왔다. '그럼 지역변수와 전역변수가 할당되는 곳은 어디에요?' 대답은 했지만 말끔하게 못한 것 같다.. 아직 머릿속에 정확하게 정리가 안 된 것 같아 정리하는 글이다. 메모리 영역은 어떻게 구성되어 있는가.

Q. 프로세스 메모리 영역은 어떻게 구성되어 있는가?

프로그램을 실행시키면 운영체제는 우리가 실행시킨 프로그램을 위해 메모리 공간을 할당해준다.

할당되는 메모리 공간은 크게 코드(Code), 데이터(Data), BSS, 힙(Heap), 스택(Stack)영역으로 나뉘어진다.

그림 출처 : www.tcpschool.com/c/c_memory_structure

코드(Code) 영역

- 실행할 프로그램의 코드가 저장되는 영역으로 Text 영역이라고도 함

- CPU는 이 영역에서 명령어를 하나씩 가져와 처리함

코드 영역은 소스코드가 저장되는 영역으로, 컴퓨터가 실행해야 할 명령어들이 순서대로 쌓이는 메모리 영역이다. 코딩한 것을 실행시키면 CPU가 알아서 코드 영역에 저장된 명령어들을 하나씩 가져가 처리하는 방식으로, 컴퓨터가 알아서 처리하기 때문에 따로 신경 쓸 필요가 없는 영역이다. 

 

데이터(Data) 영역

- 전역 변수(gloabl)정적 변수(static)가 할당되는 영역

- 프로그램이 시작될 때 할당되어, 프로그램이 종료하면 소멸됨

전역 변수(gloabl) => 함수 외부에 선언되어 있으므로 프로그램이 시작할 때 생성되고, 프로그램이 끝날 때 소멸

정적 변수(static)=> 선언한 위치에서 메모리가 생성되고, 프로그램이 끝날 때 소멸

이 변수들은 함수에 종속적이지 않고, 프로그램의 필요에 따라 언제든 호출이 가능해야 하기에 데이터 영역에 저장 & 사용

 

BSS(Block Started by Symbol) 영역

- 초기화 되지 않은 데이터(전역 변수)

 

힙(Heap) 영역

사용자에 의해 메모리가 할당(malloc)되고 해제(free)되는 영역

- 필요에 의해 동적으로 메모리를 할당할 때 사용

- 가상 메모리 영역을 관리함

- 프로그램 동작 시(런타임)에 크기가 결정됨

- 메모리 주소값에 의해서만 참조되고 사용되는 영역 

- 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됨.

 

CS:APP 스터디 도중 메모리 영역의 힙과 자료구조의 힙은 무슨 차이가 있는가? 에 대한 궁금증이 생겼다...
검색결과.. ! 
https://softwareengineering.stackexchange.com/questions/186705/why-is-the-main-memory-for-object-allocation-called-the-heapSeveral authors began about 1975 to call the pool of available memory a "heap." But in the present series of books, we will use that word only in its more traditional sense related to priority queues. (The Art of Computer Programming - Fundamental Algorithms, 3rd ed., p. 435)
궁금해서 찾아보니  별다른 이유는 없고 1975년에 그냥 일부 개발자들이 가용 메모리를 heap이라 부르기 시작한 것 같고,특별한 이유는 딱히 없는 것으로 보입니다.
결국 stack 메모리는 stack 자료구조로 된 것이 맞지만,heap 메모리는 heap (우선순위큐) 자료구조과 아무런 연관성이 없다고 볼 수 있겠네요.
From here

 

스택(Stack) 영역

- 함수의 호출과 관련되는 지역변수와 매개변수가 저장되는 영역

- 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸

- 스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출

- 메모리의 높은 주소에서 낮은 주소의 방향으로 할당

- 스택 사이즈는 각 프로세스마다 할당되지만 프로세스가 메모리에 로드될 때 스택 사이즈가 고정되어 있어, 런타임 시에 스택 사이즈를 바꿀 수는 없다. 

 

각각 자신에게 맞는 메모리 영역으로 할당되는 것을 확인할 수 있다.

#include <stdio.h>

int x = 1;              // Data 영역
int y;                  // BSS 영역: 초기화 되지 않은 데이터(전역 변수)

int main(){
    int z;                  // Stack 영역: 지역 변수
    static int st_a;        // BSS 영역
    static int st_b = 1;    // Data 영역: static
    char* c;                // Stack 영역
    c = malloc(10);         // Heap 영역
    y = 2;                  // Code 영역
 
    return 0;
}

 

Q. '그럼 지역변수와 전역변수가 할당되는 곳은 어디에요?' 

A. 지역변수는 스택 영역에 할당되고, 전역변수는 데이터 영역 혹은 BSS 영역에 할당됩니다. 🤗

 

 

Comments