- 참고자료 : 전에 정리해둔 내용 참고
- 프로그램 : 명령어 리스트를 내용으로 가진, 디스트에 저장된 파일이다.
- 프로세스 : 프로그램이 메모리에 적재될 때 프로그램은 프로세스가 된다.
프로세스 메모리 구조
프로세스 메모리 배치
크기 동적
|
- 그림 왼쪽에 0, 최대가 있다. 낮은 주소에서 높은 주소라는 의미다.
- 힙과 스택 사이는 unused 공간으로 늘어났다 줄어들었다 한다.
Stack Overflow, Out of Memory
그림에서 Stack과 Heap 영역 사이에 사용하지 않는 공간이 있는데, 스택과 메모리가 이 공간을 같이 사용한다.
이 둘이 동적으로 메모리에 적재할 때 이 공간들을 사용하는 것이다.
이때, 지정된 공간 이상을 사용하게 되면 Error가 발생한다.
- Stack이 넘치면 Stack Overflow (ex. 재귀 무한반복)
- Heap이 넘치면 Out of Memory (ex. 자바나 코틀린은 모든 객체를 heap에 만들어 나는 경우가 있다. )
- 이걸 도와주는게 Garbage Collector
DATA 영역
- 좀 더 구체적으로 크게 두 가지로 나뉜다.
- 초기화된 변수 영역 (Initialized data segment), BSS(Block Started by Symbol) 이라고도 한다.
- 초기화되지 않은 변수 영역 (uninitialized data segment)
메모리 주소 (Memory Address)
메모리 한 칸의 크기는 1Byte다.
프로그램을 다운받을 때 '32bit'용, '64bit용'을 볼 수 있는데, 이는 데이터 처리 단위라고 생각하면 된다.
- 2^32 = 4,294,967,296 (약 43억) 개의 주소를 표현할 수 있다.
- 2^64 = 18,446,744,073,709,551,616 (약 1844경) 개의 주소를 표현할 수 있다.
그런데, 2진수로 표현하긴 너무 길어서 편의상 16진수로 표현한다.
- 32bit에서는 0x00000000 ~ 0xFFFFFFFF
- 64bit에서는 0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF
+++ C언어의 포인터는 메모리 주소 공간을 가리키는 변수다.
- 주소를 표현하기 위해 32bit의 운영체제에선 4byte의 크기를 가지지만, 64bit 운영체제에선 8byte 크기를 가져야 한다.
- 이처럼 운영체제에 따라 달라질 수 있다.
Stack Pointer (SP, Stack Frame)
CPU는 메모리의 특정영역을 스택 영역으로 지정해서 운영한다.
이 때, Stack Pointer가 이동하며 사용중인 영역과 사용 가능한 빈 영역을 구분해준다.
Program Counter (PC)
프로그램 카운터는 CPU의 레지스터 중 하나를 지칭하는데, 메모리로부터 다음 실행할 명령의 주소를 저장하는 역할을 한다.
JS 메모리 관리
- 앞의 내용과 겹치는건 제외했다.
JS 엔진
자바스크립트 코드를 실행하는 프로그램 또는 인터프리터다.
- 인터프리터 방식으로, 별도의 컴파일 과정 없이 웹 브라우저에서 즉시 해석되어 실행된다.
- JS 엔진은 인터프리터일 수도 있고, 특정한 방식으로 바이트코드로 JIT 컴파일 한다.
- JIT 컴파일 : 동적 번역이라고도 하는데, 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법
- Garbage Collection
JS 엔진 동작 원리
JS는 아래 메모리 구조를 통해 데이터 및 코드 실행을 관리한다.
- 변수 및 value -> stack
- 함수 -> Heap
- Object -> 이름과 주소는 Stack, Value는 Heap
- Memory Heap : 메모리 할당이 일어나는 곳
- 함수도 Heap에 저장한다.
- Call Stack : 코드 실행에 따라, 호출 스택이 쌓이는 곳
- 콜스택에 할당되는 변수 식별자 자체는 콜스택 상의 '실행 컨텍스트(Execution Context)의 렉시컬 환경(Lexical Environment) 라는 곳에 저장된다.
- 코드를 읽어내려가면서, 수행할 작업들을 밑에서부터 하나씩 쌓고,
메모리 힙에서 작업 수행에 필요한 것들을 찾아 작업을 수행하는 공간이다. - JS는 기본적으로 싱글 쓰레드 기반 언어로, 호출 스택이 한 개이기 때문에 한 번에 한 작업만 처리 가능하다.
- 전역 -> 지역 순으로 쌓인다.
- 함수 실행이 끝나면, 해당 함수를 호출 스택에서 제거한다.
Scope chain
일종의 리스트로, 전역 객체와 중첩된 함수의 스코프 레퍼런스를 차례대로 저장하고, 각각의 스코프가 어떻게 연결(chain)되고 있는지 보여주는 것이다.
실행 컨텍스트 (Excution Context)
실행할 코드에 제공할 환경 정보들을 모아놓은 객체로, 자바스크립트 코드가 실행되는 환경이다.
모든 자바스크립트 코드는 실행 컨텍스트 내부에서 실행된다고 생각하면 된다.
- 함수 실행 -> 해당하는 실행 컨텍스트 생성 -> 자바 스크립트 엔진의 콜스택에 차곡차곡 쌓기
- 콜스택은 LIFO 구조로, 가장 위에 쌓여있는 컨텍스트와 관련 있는 코드를 실행하며 전체 코드의 환경과 순서를 보장한다.
- scope, hoisting, this, function, closure등의 동작 원리를 담고 있는 자바 스크립트의 핵심 원리다.
- 전역 컨텍스트 생성
- 함수 호출마다 컨텍스트가 생기고, 순차적으로 쌓인다.
- 컨텍스트 생성 시, 컨텍스트 안에 변수 객체, scope chain, this가 생성된다.
- 컨텍스트 생성 후 함수가 실행된다.
사용되는 변수들은 변수 객체 안에서 값을 찾고, 없으면 scope chain을 따라 올라가며 찾는다. - 함수 실행이 마무리되면, 해당 컨텍스트는 사라진다..
- 페이지가 종료되면 전역 컨텍스트가 사라진다.
JS 데이터 타입 종료
1. Primitive data Type
- 변경 불가능한 값이며, pass by-value 다.
- String, Boolean, null, undefined, symbol이 해당한다.
2. Reference Type
- Object가 해당한다.
Node.js 가상메모리 및 GC
V8엔진은 JS를 크롬브라우저에서 돌려주는 엔진이다.
V* 엔진은 메모리를 3개의 section으로 구분한다.
- Code : 컴파일된 코드가 실행되는 공간
- stack : 실행을 위한 데이터 및 포인터가 쌓이는 공간으로, 실행 후에는 사라진다.
- Heap : 함수, 변수, 클래스의 선언들이 들어가는 곳이다.
GarbageCollection
- 힙은 할당이 필요한 곳이고, 객체들이 라이프 사이클 동안 같은 세대(generation)을 공유한다.
- 여기엔 young generation과 old generation이 있는데, young은 nursery(유아)와 intermediate(중간) 세대로 나뉜다.
이 객체들이 GC에서 살아남으면, older generation에 합류한다.
힙 메모리 영역이 가득 차게 되어, 물리 메모리가 부족하면, 프로세스는 가상 메모리를 통해 디스크 공간을 확보하기 시작한다.
좀 더 알아보쟈
Fragmentation
Heap을 탐색해 빈 공간을 찾아 할당하고, 해제하는 것을 반복하다 보면, 사용하지 못 하는 작은 단위의 공간들이 여기저기 흩어져 있을 수 있다. 이러한 현상이 발생할 때 외부단편화 라고 한다.
오 아는 것 같으니 전에 정리했던 내용 첨부
참고자료
'boostcamp' 카테고리의 다른 글
Day07 학습정리 (0) | 2023.07.18 |
---|---|
Day06 학습 정리 (0) | 2023.07.18 |
Day03 학습정리 (0) | 2023.07.12 |
Day02 학습 정리 (0) | 2023.07.11 |
Day01 학습정리 (0) | 2023.07.10 |