TIL

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

sunyong_01 2022. 11. 2. 23:30

메모리 구조

먼저, 프로그램이 실행되면 운영체제(OS)는 메모리(RAM)에 이 프로그램을 위한 공간을 할당해 준다

그 공간은 다음과 같이 총 4가지(Code, Data, Heap, Stack)으로 나뉘어져 있다

코드 (code)

  • 가장 낮은 수준의 메모리 영역으로, 실행할 프로그램의 코드가 저장되는 영역이다
  • CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다. 프로그램이 시작하고 끝날때까지 메모리에 계속 남아있다.
  • 텍스트 영역이라고도 한다.  

 

데이터(data)

  • 프로그램의 전역 변수, 정적 변수(상수, 리터럴, 전역변수, Static 등)가 저장된다.
  • 프로그램의 시작과 함께 할당되고 종료되면 소멸한다.

 

힙(heap)

  • 사용자가 직접 관리할 수 있는, 직접 관리해야하는 영역으로 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
  • 힙에 할당될 메모리 크기는 런타임에 결정된다. 
    • 할당해야할 메모리의 크기를 프로그램이 실행되는 동안 결정해야 할 경우 유용하게 사용되는 영역이다.
  • 메모리의 낮은 주소에서 높은 주소의 방향FIFO (First In First Out)으로 할당된다.
  • 자동으로 제거되지 않으며, 메모리 해제를 하지 않으면 메모리 누수(leak)라고 부른다.
  • 자바스크립트에서 객체, 배열, 함수와 같이 크기가 동적으로 변할 수 있는 참조타입 값을 저장한다.

 

스택(stack)

  • 함수의 호출과 관계되는 지역변수(함수 안에서 쓰는 변수), 매개변수(파라미터)가 저장된다.
  • 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임이라고 한다. 스택 영역에 할당될 메모리의 크기는 컴파일시에 결정된다.
  • 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향LIFO (Last In First Out)으로 할당된다.
  • 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
  • 자바스크립트에서 간단하게 값들만 할당된 변수도 저장이 된다.

 

런타임 : 프로그램 실행중

컴파일 타임 : 코드가 2진수로 변환되는 순간

 

스택과 힙의 차이점

스택
장점
 
CPU가 스택 메모리를 효율적으로 구성하기 때문에 속도가 매우 빠름
 메모리를 직접 해제를 해주지 않아도 됨

단점
 메모리 크기에 대한 제한 있음
 지역 변수만 액세스 가능
장점
 메모리 크기에 대한 제한 없음
 본질적인 범위가 전역이기 때문에, 프로그램의 모든 함수에서 액세스 할 수 있음

단점
 메모리를 직접 관리해야 함(해제해주지 않을 시 메모리 누수 발생)
 할당작업, 해제 작업으로 인한 속도 저하
 힙 손상(이중 해제, 해제 후 사용 등) 작업으로 인한 속도 저하
 힙 경합(두 개 이상 쓰레드가 동시에 접근하려 할 때 Lock이 걸림)으로 인한 속도 저하

 

힙과 스택의 메모리 관계

 

힙과 스택은 같은 메모리 영역을 공유한다.

 

같은 메모리 공간이지만

힙 영역 낮은 메모리 주소부터 할당 받는 것이고, 스택 영역 높은 메모리 주소부터 할당 받는다

따라서 자신의 영역 외로 확장하려다 보면, 오버 플로우라는 것이 발생한다

 

스택 오버플로우(stack overflow), 힙 오버플로우(Heap overflow)

  •  스택은 메모리의 끝에서부터, 힙은 메모리의 앞에서부터 주소를 채우는데 서로의 영역을 침범할 경우 오버플로우가 발생한다.
  • 스택이 힙을 침범하면 stack overflow, 힙이 스택을 침범하면 Heap overflow
참고자료
https://babbab2.tistory.com/25
https://novlog.tistory.com/123

 

'TIL' 카테고리의 다른 글

TIL DOM과 Virtual DOM  (0) 2022.11.05
TIL CSS display란 ?  (0) 2022.11.04
TIL 브라우저 랜더링 과정  (0) 2022.11.01
TIL React 재렌더링 조건 & 렌더링 성능 최적화  (0) 2022.10.31
TIL React와 Vue, Angular의 차이점  (0) 2022.10.30