메모리 구조

  • 프로그램이 실행되기 위해서는 운영체제(OS)가 프로그램의 정보를 메모리에 로드해야 한다.
  • 또한 프로그램이 실행되는 동안 CPU가 코드를 처리하기 위해서는, 메모리가 명령어와 데이터들을 저장해야 한다.
  • 프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은
    코드(Code), 데이터(Data), 힙(Heap), 스택(Stack) 영역으로 나뉜다.

코드(Code) 영역

  • 실행할 프로그램의 코드가 저장되는 영역으로, 텍스트 영역이라고도 한다.
  • CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.
  • 프로그램이 시작하고 종료될 때까지 메모리에 계속 남아있는다.

데이터(Data) 영역

  • 전역 변수정적(static) 변수저장되는 영역
  • 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리에서 소멸한다.
# include <studio.h>
int a = 10;    // 데이터 영역에 할당
int b = 20;    // 데이터 영역에 할당

int main() {
    . . .
    return 0;
}

힙(Heap) 영역

  • 필요에 의해 동적으로 메모리를 할당할 때 사용
  • 사용자가 직접 관리할 수 있는, 해야만 하는 메모리 영역
    • 변수를 할당하고 해제하는 책임이 있다.
    • 가비지 컬렉터가 없으면 프로그래머가 직접 관리(할당/해제)해줘야 한다.
  • 선입선출(FIFO, First-In-First-Out)
  • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
  • 스택보다 큰 메모리를 할당받기 위해 사용
  • 메모리 크기 제한이 없다.
  • 런타임에 크기 결정

장점

  • 변수를 전역적으로 액세스할 수 있다.
  • 메모리 크기 제한이 없다.

단점

  • 상대적으로 느린 액세스 (할당/해제가 느리다.)
  • 운영체제마다 메모리 관리가 다르기 때문에 어렵다.
int main{
    // 정상적인 배열선언
    int arr[10];

    // 비정상적인 배열 선언
    int i = 0;
    scanf("%d", &i);
    int arr[i];

    return 0;

스택(Stack) 영역

  • 함수 호출 시 생성되는 지역 변수매개 변수가 저장되는 영역
  • 함수 호출이 완료되면 소멸한다.
  • 후입 선출(LIFO, Last-In First-Out)
  • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
  • 컴파일 타임에 크기 결정

장점

  • 매우 빠른 액세스 (할당, 해제가 빠르다, 힙보다 빠르다.)
  • 변수를 명시적으로 할당/해제할 필요가 없다.

단점

  • 메모리 크기 제한이 있다.
  • 지역변수만
#include <studio.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가 스택영역에 할당
}


오버플로우

  • 한정된 메모리 공간이 부족하여 메모리 안에 있는 데이터가 넘쳐 흐르는 현상
  • 메모리 위쪽 주소부터 할당되고,
    스택메모리 아래쪽 주소부터 할당되기 때문에
    각 영역이 상대 공간을 침범하는 일이 발생할 수 있다.

힙 오버 플로우

  • 힙이 스택을 침범하는 경우

스택 오버 플로우

  • 스택이 힙을 침범하는 경우

참고
https://hooun.tistory.com/193
https://all-young.tistory.com/17
https://velog.io/@tonic523/힙-영역-vs-스택-영역
https://helloworld-japan.tistory.com/33

0개의 댓글

Powered by GraphCDN, the GraphQL CDN