메모리

HongBoogie·2024년 7월 21일
post-thumbnail

V8 메모리 구조

  • 힙 메모리에 객체나 동적 데이터를 저장. 이걸 동적 할당이라고 부름. 해제도 가능하다.
  • 메모리 영역에서 가장 큰 블록이면서 가비지 컬렉션(GC)이 발생하는 곳
  • 영역 중 유일하게 런타임시 크기가 결정된다.
  • 참조형 데이터 타입을 갖는 객체, 배열 등이 저장되는 공간이다.

스택

  • V8 프로세스마다 하나의 스택을 가짐 ( 자바스크립트가 단일 스레드이기 때문에 V8은 자바스크립트 컨텍스트 당 한 개의 프로세스를 사용)
  • 메서드와 함수 프레임, 원시 값, 객체 포인터를 포함한 정적 데이터가 저장되는 곳

힙 영역과 스택 영역은 사실 같은 공간을 공유한다. Heap은 메모리 위쪽 주소부터 할당되고, Stack은 아래쪽부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범할 수 있는데 이를 Heap Overflow, Stack overflow라고 한다.

BSS (Block Started by Symbol) 영역

  • 초기화되지 않은 전역 변수와 정적 변수가 저장되는 영역
  • 프로그램 시작 시 0으로 초기화됨

코드(Code) 영역

  • 작성한 소스코드가 저장되는 영역으로 텍스트 영역이라고도 부른다.
  • 기계어 형태(0,1)로 저장한다.
  • 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다.
  • CPU는 코드 영역에 저장된 명령어들을 하나씩 가져가서 실행한다.

DATA 영역

  • 초기화된 전역 변수와 정적 변수가 저장되는 영역
  • 프로그램 시작 시 초기화되며, 프로그램 실행 중 변경 가능

CPU가 프로그램을 실행하면서 메모리를 활용하는 방식

  1. 프로그램 로딩:
    • 운영체제가 프로그램을 메모리에 로드하고 프로세스 생성
    • TEXT, DATA, BSS 영역이 초기화됨
  2. 코드 실행:
    • CPU가 TEXT 영역의 명령어를 순차적으로 실행
    • 프로그램 카운터(PC)가 다음 실행할 명령어의 주소를 가리킴
  3. 변수 접근:
    • 전역/정적 변수: DATA나 BSS 영역에서 직접 접근
    • 지역 변수: STACK 영역에서 접근
  4. 함수 호출:
    • STACK에 새로운 스택 프레임 생성
    • 매개변수, 지역 변수, 반환 주소 등이 스택에 푸시됨
    • 함수 종료 시 스택 프레임 제거
  5. 동적 메모리 할당:
    • HEAP 영역에서 필요한 만큼의 메모리를 할당
    • 포인터를 통해 할당된 메모리에 접근
  6. 레지스터 사용:
    • CPU 레지스터를 사용하여 빠른 데이터 접근 및 연산 수행
    • 레지스터와 메모리 간 데이터 이동
  7. 메모리 보호:
    • 운영체제가 각 프로세스의 메모리 영역을 보호
    • 다른 프로세스의 메모리에 접근 시도 시 세그먼테이션 폴트 발생
  8. 가상 메모리:
    • 물리적 메모리보다 큰 주소 공간 제공
    • 페이징이나 세그먼테이션을 통해 물리 메모리와 매핑

이러한 메모리 관리 체계를 통해 CPU는 효율적으로 프로그램을 실행하고, 운영체제는 여러 프로세스를 안전하게 관리할 수 있다.

profile
개발이 즐겁고 노는게 즐거워요

0개의 댓글