Welcome! Everything is fine.

[CS 발표_01] 메모리의 힙 영역과 스택 영역 본문

CS 스터디/발표

[CS 발표_01] 메모리의 힙 영역과 스택 영역

개발곰발 2024. 5. 6.
728x90

첫 번째 CS 스터디 발표! 이번주는 운영체제에 대해 공부해보았다. 잘 이해가 되지 않거나 생소한 주제들을 공부해보고, 자신이 공부한 내용들을 발표식으로 설명해보기로 하였다. 내용은 책과 여러 블로그, 유튜브 강의 등을 참고하였다.


메모리의 힙 영역과 스택 영역의 차이에 대해 설명하고,
힙 영역을 너무 크게 잡으면 어떤 일이 벌어지는지 설명해보세요.

프로세스 메모리 구조

프로세스는 운영체제로부터 독립된 데이터 영역을 할당받으며, 다른 프로세스의 메모리 영역에 접근할 수 없다. 프로세스의 메모리 영역 구조는 코드, 데이터, 힙, 스택으로 구성된다.

  • 코드 영역 : 텍스트 영역이라고도 하며, 실행할 코드가 기계어로 컴파일되어 저장되는 영역. CPU가 해당 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.
  • 데이터 영역 : 전역 변수, 정적 변수, 배열, 구조체 등이 저장되는 영역. 프로그램이 시작되는 동시에 할당되며, 프로그램이 종료되면 소멸한다.
  • 힙 영역 : 사용자에 의해 동적 메모리 할당이 일어나는 영역. 자바를 예로 들면 new 키워드로 생성한 객체가 많아지면 그만큼 힙 영역의 크기도 늘어나게 된다.
  • 스택 영역 : 지역 변수, 함수의 매개 변수, 반환되는 주소 값 등이 저장되는 영역. 함수가 호출될 때마다 새로운 스택 프레임(스레드별로 하나의 실행 스택이 생성됨)이 스택에 추가되고, 함수가 반환되면 해당 프레임이 제거된다.

스택(stack) 영역

  • 지역 변수, 함수의 매개 변수, 반환되는 주소 값 등이 저장되는 영역.
  • LIFO 방식으로 높은 주소 값에서 낮은 주소값으로 메모리가 할당된다.
  • 함수가 호출되면 기록되고 함수가 종료되면 소멸된다. → 별다른 관리 필요X
  • 컴파일 때 영역의 크기가 결정되므로 스택 크기가 제한되어있다.
  • 힙에 비해 빠르다.
  • 높은 주소 : 메모리의 상단에 위치한 주소, 일반적으로 높은 주소는 상대적으로 큰 값을 가지며, 주로 시스템의 코드 섹션과 힙 섹션에 할당된다.
  • 낮은 주소 : 메모리의 하단에 위치한 주소. 일반적으로 낮은 주소는 상대적으로 작은 값을 가지며, 주로 시스템의 스택 섹션에 할당된다.
  • 물리적 메모리 주소의 경우, 낮은 주소는 메모리 모듈의 시작 부분(메모리의 위쪽)을 나타내고, 높은 주소는 메모리 모듈의 끝 부분(메모리의 아래쪽)을 나타낸다. 하지만 가상 메모리 주소의 경우, 높은 주소와 낮은 주소의 구분은 운영 체제와 프로그래밍 언어에 따라 다를 수 있다.

힙(heap) 영역

  • 사용자에 의해 동적 메모리 할당이 일어나는 영역.
  • FIFO 방식으로 낮은 주소 값에서 높은 주소값으로 메모리가 할당된다.
  • 런타임 때 영역의 크기가 결정된다.
  • 스택에 비해 느리고 직접 힙 영역을 관리해야한다.
  • 컴파일은 코드를 번역하고 준비하는 과정으로 소스 코드를 실행하기 전 미리 컴파일 한다. 런타임은 프로그램이 실제로 실행되고 작업을 수행하느 시간을 말한다.
  • 스택 영역과 힙 영역은 메모리 영역을 공유하기 때문에 서로의 영역을 침범하는 문제가 발생할 수 있다. 스택 영역이 힙 영역을 침범하는 경우를 스택 오버플로, 힙 영역이 스택 영역을 침범하는 경우를 힙 오버플로라고 한다.

힙 영역을 너무 크게 잡는다면?

위에서 말했듯이 힙 영역은 new 키워드로 객체를 생성하면 그 크기도 늘어나고, 제거하면 크기가 줄어든다. 만약 힙 영역을 너무 크게 잡으면 메모리가 낭비되면서 시스템의 전체적인 성능에 영향을 줄 수 있다. 또한 힙이 너무 크면 Garbage Collection의 오버헤드가 증가할 수 있다는 문제가 있다. Garbage Collect는 사용되지 않는 메모리를 정리하는 프로세스인데, 힙이 크면 이 Garbage Collection의 수행 시간이 너무 길어지게 된다. 따라서 Java의 JVM에서도 처음부터 힙 영역 크게 잡지않고, 힙 영역이 꽉 차면 그때 GC 진행 후 힙 영역을 확장한다.