ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스택(stack)과 힙(heap) 메모리
    cs 2023. 6. 18. 19:16

    메모리의 구조

    프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간에는 코드(code), 데이터(data), 스택(stack), 힙(heap) 영역이 있다.

    메모리 공간(출처. TCP School)

    1. 코드(code) 영역(= 텍스트 영역)
      실행할 프로그램의 코드가 저장되는 영역. CPU가 명령어를 처리함.
    2. 데이터(data) 영역
      프로그램의 전역변수, 정적변수가 저장되는 영역. 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸함.
    3. 스택(stack) 영역
      지역변수, 매개변수가 저장되는 영역. 운영체제에 의해 관리됨.
      함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸함. 함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역변수 등이 저장됨.
      후입선출(Last-In First-Out) 방식에 따라 동작하므로 가장 늦게 저장된 데이터가 가장 먼저 인출됨.(메모리의 높은 주소 → 낮은주소 방향으로 할당)

    스택 프레임(stack frame)
    : 스택 영역에 저장되는 함수의 호출정보.(매개변수, 반환 주소값, 지역변수 등)
    스택 오버플로우(stack overflow)
    : 함수의 재귀호출이 무한히 반복되면, 스택 오버플로우에 의해 종료됨. 스택의 모든 공간을 차지하여 여유 공간이 없을 때, 또 다시 스택 프레임을 저장하면 해당 데이터는 스택영역을 넘어 저장하게 됨. 때문에 C언어는 스택오버플로우가 발생하면 에러를 발생시켜 강제 종료시킴.

    1. 힙(Heap) 영역
      메모리 공간이 동적으로 할당되고 해제됨. 사용자에 의해 관리되며 필요에 따라 확장 또는 축소됨. 선입선출방식(낮은주소 → 높은주소 방향으로 할당됨.)
      동적 메모리 할당(dynamic allocation)
      프로그램이 실행되는 도중인 런 타임에 사용자가 직접 결정한 메모리를 할당받음.(데이터, 스택영역은 컴파일 타임에 메모리 크기가 결정됨)
      - malloc()함수: 힙 영역에 메모리를 동적으로 할당
      - free()함수: 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환. 메모리 누수 방지.
      - calloc()함수: 힙 영역에 메모리를 동적으로 할당. 메모리의 크기를 두 개의 인수로 나누어 전달받음. 메모리 할당 후 모든 비트값을 전부 0으로 초기화 해줌.
      - realloc()함수: 이미 할당된 메모리의 크기를 바꾸어 재할당.
    #include <stdlib.h>
    //void *realloc(크기를 바꾸려는 메모리 공간을 가리키는 포인터, 재할당 크기);
    void *realloc(void *ptr, size_t size);

    스택(stack)과 힙(heap) 장점

    스택의 장점

    • 빠른 액세스
    • 변수를 명시적으로 할당, 해제 할 필요가 없음
    • 메모리 공간은 운영체제에 의해 효율적으로 관리됨
    • 스택 크기 제한(*스택오버플로우)

    힙의 장점

    • (상대적으로)느린 액세스
    • 변수 전역적으로 사용가능
    • 메모리 크기 제한 없음
    • 사용자가 메모리 공간을 관리함(메모리공간을 효율적으로 관리하지 못하면 메모리 부족, 누수 등의 문제가 발생할 수 있음)

    출처 : http://www.tcpschool.com/c/c_memory_structure

Designed by Tistory.