스택과 큐

ujin·2022년 11월 20일
0

테크톡

목록 보기
2/2

메모리 구조

프로그램 실행 순서

위 그림과 같이 프로그램이 실행되기 위해서는 운영체제(OS)가 프로그램의 정보를 메모리에 로드 해야 한다. 또한 프로그램이 실행되는 동안 CPU가 코드를 처리하기 위해서는, 메모리가 명령어와 데이터들을 저장해야 한다.

할당해주는 메모리 공간은 4가지 Code, Data, Stack, Heap이 있다.

코드 영역

우리가 작성한 소스 코드가 들어 가는 부분. 즉, 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부른다.

CPU는 코드 영역에 저장된 명령을 하나씩 가져가서 처리한다. (함수, 제어문, 상수등이 저장됨)

프로그램이 시작하고 종료될 때 까지 메모리에 계속 남아있는다.

데이터 영역

전역변수와 static변수가 저장되는 영역

프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리가 소멸되는 영역이다.

#include <stdio.h>

int a = 10; // 데이터 영역에 할당
int b = 20; // 데이터 영역에 할당

int main() {
    return 0;
}
// int형 변수 a,b는 프로그램 실행시, main 함수가 호출되기 전에 데이터 영역에 할당된다.
// 그렇기 때문에 프로그램이 종료될 때까지 메모리상에 존재한다.
// 이 때문에 전역변수가 프로그램이 종료될 때까지 존재하는 이유이다.

스택 영역

프로그램이 자동으로 사용하는 임시 메모리 영역이다.

함수 호출 시 실행되는 지역 변수와 매개변수가 저장되는 영역이고, 함수 호출이 완료되면 사라진다.

이때 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임이라고 한다.

스택 영역에서 푸쉬로 데이터를 저장하고, 팝으로 데이터를 인출한다.

스택 영역은 후입 선출의 방식(LIFO)으로 가장 나중에 들어온 데이터가 가장 먼저 인출된다.

이는 스택 영역이 메모리의 높은 주소에서 낮은 방향으로 할당 되기 때문이다.

아래 그림으로 설명하면, 가장 아래부터 차곡차곡 위의 방향으로 데이터가 쌓인다고 생각하면 되다.

#include <stdio.h>

void fct(int);
void fct(int);

int a = 10; // 데이터 영역에 할당
int b = 20; // 데이터 영역에 할당

int main() {
    int i = 100; // 지역변수 i가 스택 영역에 할당
    
    fct(i);
    fct(i);
    
    return 0;
}

void fct(int c) {
    int d = 30; // 매개변수 c와 지역변수 d가 스택영역에 할당
}

void fct(int e) {
    int f = 40; // 매개변수 e와 지역벼수 f가 스택영역에 할당
}
// main함수와 fct1, fct2라는 함수를 추가. a, b를 데이터 영역에 할당한 뒤에 main함수를 호출하며
// int형 변수 i는 지역변수로서 스택영역에 할당된다. 

힙 영역

프로그래머가 필요에 의해 동적으로 직접 공간을 할당/해제하는 메모리 공간이다.

힙 영역은 선입선출(FIFO)의 방식으로 가장 먼저 들어온 데이터가 가장 먼저 인출된다.

힙 영역이 메모리의 낮은 주소에서 높은 주소의 방향으로 할당되기 때문이다.

그림으로 설명하면, 위부터 차곡차곡 아래 방향으로 데이터가 쌓인다.

#include <stdio.h>

int main() {
    // 정상적인 배열 선언
    int arr[10];
    
    // 비정상적인 배열 선언
    int i = 0;
    scanf("%d", &i);
    int arr[i];
    
    return 0;
}
// 배열로 예를 들면 배열로 선언할 때 상수로 선언한다. 배열의 길이를 사용자가 입력한 숫자로 잡아주는 건
// 비정상적인 배열 선언이다.
// 제일 처음 그림을 보면 스택 영역에 할당될 메모리의 크기는 컴파일 타임에 결정된다.
// 그렇다면 arr의 배열 크기는 40바이트인 것을 알 수 있다.
// 하지만 비정상적인 배열선언의 경우 i의 크기가 4바이트라는 것을 알 수는 있으나. arr이라는 배열의 크기는 알 수 없다

사용자의 요구에 맞게 메모리를 할당해 주기 위해선(런타임에 메모리 크기를 결정하고 싶을 때) 메모리 동적 할당을 통해 힙 영역에 메모리를 할당해야한다.

힙 영역: 할당해야 할 메모리의 크기를 프로그램이 실행되는 동안 결정해야 하는 경우 유용하게 사용되는 공간

오버 플로우

오버 플로우란 영어로 넘쳐흐른다는 뜻이다.

말 그래도, 한정된 메모리 공간이 부족하여 메모리 안에 있는 데이터가 넘쳐 흐르는 현상이다.

오버 플로우 종류 중에 힙 오버 플로우스택 오버 플로우가 있다.

힙은 메모리 위쪽 주소부터 할당되고, 스택은 메모리 아래쪽 주소부터 할당되기 때문에 각 영역이 상대 공간을 침범하는 일이 발생할 수 있다.

이때 힙이 스택을 침범하는 경우를 힙 오버 플로우라 하고, 스택이 힙을 침범하는 경우를 스택 오버 플로우라고 한다.

profile
개발공부일기

0개의 댓글