Git & CS

메모리 구조(Code, Data, Heap, Stack)

승민아 2022. 9. 19. 21:59

코드(Code) 영역

  • 텍스트 영역이라고도 부름.
  • 실행할 프로그램의 코드를 저장(우리가 작성한 소스코드)
  • 읽기 전용
  • 실행파일을 구성하는 명령어들을 가져감(함수, 제어문, 상수)
  • CPU가 코드 영역에 저장된 명령어를 하나씩 처리함.(이미 작성된 코드가 기계어로 컴파일되어 있음)
  • 프로그램 시작하고 끝날 때까지 메모리에 존재함.

데이터(Date) 영역

  • 전역 변수와 정적(static) 변수가 저장되는 영역.
  • 프로그램 시작하고 끝날때까지 메모리에 존재함.
  • 영역이 2가지(초기화 되지 않은 전역 변수는 BSS(Block started by Symbol)영역, 초기화된 데이터는 data영역)

힙(Heap) 영역

  • 프로그래머가 동적 할당/해제하는 메모리 공간
  • malloc, new로 할당하고 free, delete로 해제한다.
  • 자바는 가비지 컬렉터가 자동으로 해제해준다.
  • 런 타임에 크기가 결정됨.
  • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됨.

스택(Stack) 영역

  • 함수 호출때 쓰이는 지역 변수와 매개변수가 저장되는 임시 메모리 영역
  • 함수의 호출과 함께 할당되고, 함수 종료 시 소멸한다.
  • 데이터를 푸쉬(Push)로 저장, 팝(Pop)으로 인출한다. (LIFO)
  • 컴파일 타임에 크기가 결정됨.
  • 메모리의 높은 주소에서 낮은 방향으로 할당된다.

 

스택과 힙은 같은 영역을 공유하기에 한쪽 영역이 크면 한쪽은 작아짐.

힙은 위에서 아래로, 스택은 아래에서 위로 저장하기에 저장하다 보면 서로 충돌하는 오버플로우 발생.

stack의 영역은 지역변수가 생기고 지워지고하기 때문에 오버플로우가 생길 수 있다.

이때 스택 오버 플로우라고 부름.

힙이 넘쳐 생기는 것은 힙 오버 플로우이다.