이론 정리

Heap and Stack

철매존 2022. 12. 27. 22:51
728x90

Heap and Stack

둘다 메모리를 저장하는 곳이다.

운영 체제에서는 프로그램의 실행을 위해 메모리 공간을 4부분으로 제공하는데

  • 코드영역
    • 실행할 프로그램 코드
  • 데이터영역
    • 전역변수, 정적 변수
    • 프로그램 시작시 할당, 프로그램 종료시 소멸
  • Heap영역
    • 사용자의 동적할당
    • 전역 변수
    • 런타임에 크기 결정
  • Stack영역
    • 메모리의 정적 할당
    • 지역 변수, 매개 변수, 함수
    • LIFO관리
    • 컴파일타임에 크기 결정

요건데, 사실상 코드영역이랑 데이터영역은 그냥 있는 애들이고, heap이랑 stack에 대해 한번 자세히 알아보자!

Stack

Stack은 정적으로 메모리가 할당된다.
그리고 지역변수와 매개변수, 그리고 함수여서 함수가 호출되면 쭈루룩 할당되고, 호출이 완료되면 소멸된다.

Stack은 이름 그대로(java에서의 스택마냥) 선입후출법으로 동작한다.

즉 데이터가 먼저 들어온 애부터 하나씩 쌓아가면서 저장한다.
-> 메모리가 연속적으로 존재하고, 낭비되는 공간이 없다.

정리하자면

  • 장점
    • 함수의 호출에 따라 할당/완료시 소멸
      • 따로 사용자가 할당하거나 소멸시켜줄 필요가 없음.
    • LIFO방식으로 데이터 저장
      • 메모리의 낭비가 적다.
      • 속도가 빠르다.
    • 높은 주소에서 낮은 주소 순서대로 할당시킨다.
  • 단점
    • 지역변수만 사용 가능하다.
    • 메모리 공간이 제한된다.
      • 크기가 정해져있다.

Heap

Heap은 동적으로 메모리를 할당할수 있다.
-> 이는 사용자가 메모리를 동적으로 할당/해제할 수 있다는 것으로... 사실 사용자가 직접 관리해야 한다.

이거는 크기가 정해져있지 않아서 유연하게 할당/해제가 가능하다.

Stack과 달리 pointer로 데이터를 관리하다보니 데이터에 전역적으로 접근이 가능하다.
다만 하나씩 쌓아주는 방식이 아니다보니까 단편화의 위험성이 있고, 할당 및 해제속도가 느리다.

정리하자면

  • 장점
    • pointer를 통한 데이터 관리
      • 전역변수 사용이 가능(어디서든 변수에 접근가능)
      • 메모리의 동적관리 가능
  • 단점
    • pointer를 통한 데이터 관리
      • 할당/해제가 느림
      • 단편화의 위험이 있음
      • 데이터 관리를 잘 해주어야 한다.