본문 바로가기
CS 지식/운영체제

[운영체제] 메모리 구조

by CSEGR 2024. 9. 3.
728x90

이번 포스팅에서는 메모리 구조에 대해서 상세하게 알아보자 !

 

▸ 메모리의 구조를 영역에 따라서 설명
▸ 힙(Heap) 영역과 스택(Stack) 영역 차이
▸ 메모리의 힙 영역을 너무 크게 잡으면?

 

✔️ 메모리 구조

먼저, 프로세스가 실행되기 위해서는 먼저 프로그램이 메모리에 적재되어야 한다. 

출처 : https://lxxyeon.tistory.com/70

프로그램을 실행하게 되면, 하드 드라이브(저장장치)에 저장되어 있는 프로그램을 메모리(RAM)으로 옮긴다. 

이때, 운영체제는 각 프로그램이 필요한 만큼의 메모리(RAM) 공간을 할당해준다. 

 

이때 할당된 메모리 공간(RAM)은 크게 코드(Code), 데이터(Data), 스택(Stack), 힙(Heap) 영역으로 나뉜다. 

출처 : https://medium.com/jinshine-%EA%B8%B0%EC%88%A0-%EB%B8%94%EB%A1%9C%EA%B7%B8

➕ 코드(Code) 영역

  • 실행될 프로그램의 실제 코드가 저장되는 영역이다. 텍스트 영역이라고도 부른다. 
  • 실제 코드를 기계어 형태(0,1)로 저장한다. 
  • 프로그램 실행을 위해 필요한 모든 명령어들(함수, 제어문, 상수 등)이 여기에 지정된다. 
  • CPU는 코드 영역에 저장된 명령어들을 하나씩 가져가서 실행한다. 

➕ 데이터(Data) 영역

  • 전역 변수와 정적 변수(static)가 할당되는 영역이다. 
  • main 함수 전에 선언되어 프로그램의 시작과 동시에 할당되고 프로그램이 종료되어야 메모리에서 소멸한다. 

➕ 힙(Heap) 영역

  • 동적으로 할당된 변수가 할당되는 영역이다. - 'new' 연산자
  • 사용자에 의해 메모리 공간이 동적으로 할당(malloc)되고 해제(free)된다.
  • 힙 영역(메모리) 관리가 필요하며, 잘못된 메모리 관리로 인해 메모리 누수(Memory Leak)나 메모리 파편화(Memory Fragmentation)이 발생할 수 있다. 
  • 4가지 영역 중 유일하게 런타임시 크기가 결정된다. 
  • 메모리의 낮은 주소부터 할당되는 선입선출(FIFO) 구조

➕ 스택(Stack) 영역

  • 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역이다. 
  • 함수 호출 시 생성되고, 함수가 끝나면 반환된다. 
  • 스택(stack) 크기는 각 프로세스마다 할당되지만, 프로세스가 메모리에 로드될 때 stack 크기가 고정되어 있기 때문에 런타임 시에 크기를 바꿀 수 없다. 
  • 메모리의 높은 주소부터 할당되는 후입선출(LIFO) 구조

✔️ 힙(Heap) 영역 vs 스택(Stack) 영역

  힙(Heap) 영역 스택(Stack) 영역
저장하는 데이터 동적으로 생성된 변수(new 연산자) 지역 변수, 매개 변수 
크기가 결정되는 타이밍 런타임(Runtime) 컴파일(Compile)
크기 제한 크기가 제한되어 있지 않다.(늘어남) 크기가 정해져있다. 
주소 할당 방향  낮은 주소 → 높은 주소 높은 주소 → 낮은 주소
비교  • 스택에 비해 느리다. 
• 직접 힙 영역 관리 필요 
힙에 비해 빠르다. 
• 함수의 종료에 따라 소멸되므로 별다른 관리가 필요 없다. 

 

 

✔️ 같은 공간을 쓰는 힙 영역과 스택 영역의 문제

출처 : https://velog.io/@shindoyeon

Heap 영역과 Stack 영역은 사실상 같은 공간을 공유한다. 힙(Heap)은 낮은 주소 부터, 스택(Stack)은 높은 주소부터 채워지기 때문에 서로의 영역을 침범하는 일이 발생할 수 있다. 이를 각각 Heap Overflow, Stack Overflow 라고 한다. 

 

💡 메모리의 위쪽에 위치할 수록 낮은 주소, 아래쪽에 위치할 수록 높은 주소이다. 

 

✔️ 힙(Heap) 영역을 크게 잡으면 어떤 일이 생길까?

위에서 언급했듯이, 힙 영역은 스택 영역과 달리 할당된 메모리 공간을 직접 해제(free)하는 등의 메모리 관리가 필요하다. 

만약 메모리의 힙 영역이 너무 크다면,

  • 넓은 힙 영역에 존재하는 동적 변수에 대해 참조 여부를 확인해야 하기 때문에 Garbage Collection의 수행시간이 너무 길어진다. 
  • 메모리가 낭비로 인해 시스템의 전체적인 성능에 영향을 줄 수 있다.

 

728x90