[운영체제] 🧐 프로세스 메모리 구조 모델
프로세스는 각 메모리 공간을 시스템으로부터 할당 받는다.
=> 보면 프로세스 마다 코드/데이터/스택/힙 영역이 나뉘어 진다.
code(text), data, heap, stack 영역으로 구성된다.
Code(text) 영역
- 프로그램에 있는 함수 코드, 제어문, 상수 등을 포함한다.
- 일반적으로 한 번 로딩하면 바뀌지 않는다.
- JVM과 node, 브라우저는 따로 공부하기
Data ( GVAR/BSS ) 영역
- 범위(Scope)가 정해지지 않는 전역(Global 또는 Static) 변수를 포함한다.
- GVAR는 초기값을 0이 아닌 특정한 값으로 지정한 경우 사용.
=> GVAR에서는 초기화한 전역 변수, BSS는 초기화 하지 않은 전역 변수
HEAP 영역
- 동적으로 할당되는 메모리 공간으로 malloc이나 new 명령으로 할당
- 힙 영역에 할당한 메모리 공간에 대한 주소를 참조하는 경우가 많다.
- 스택보다 데이터를 찾는 과정이 더 복잡하기 때문에 느리다. 스택보다 더 많은 데이터를 저장할 수 있다.
- 애플리케이션의 스레드 간에 공유된다.
STACK 영역
- 함수를 호출할 때마다 지역 변수, 매개변수와 리턴값 등이 쌓인다.
- 보면, 스택 포인터가 있다. 내가 알고 있는 LIFO 형식의 스택으로 쌓이는 것 같다.
- 함수를 호출하면, 프로그램 카운터가 해당 함수가 있는 주소로 이동하는데 스택에 리턴 주소( 함수 호출 주소 ) 를 넣고 쌓는다. 그래서 주소를 만나면 해당 주소로 다시 돌아가는 것 같다.
- 멀티스레드 애플리케이션은 스레드당 스택을 갖는다.
영역 | stack | heap |
속도 | 빠르다 | 느리다 |
크기 | 제한 있음 | 제한 없음 ( 물리 메모리 가능한 내로) |
JS에서 힙 구조
가비지 콜렉션(GC)
* JVM이 이런거였어? -> 뭔지 조사 ㄱㄱ
JVM(JAVA/Scala/Grrovy/Kotlin), JavaScript, C#, Golang, OCaml, Ruby는 메모리 관리를 위한 가비지 콜레션을 사용하는 언어이다.
- Mark & Sweep GC : Tracing GC. 아직 참조되고 있는 객체를 먼저 "활성"으로 표시하고, 다음 단계에는 활성이 아닌 객체 메모리를 해제한다.
JVM에는 선택할 수 있는 다양한 GC 알고리즘이 있는 반면, V8과 같은 JS 엔진은 Mark & Sweep GC와 참조 계산 GC를 함께 사용해 이를 보완한다. 외부 라이브러리로 C, C++에서도 사용 가능. - 참조 계산 GC : 모든 객체는 참조가 변경될 때 증가하거나 감소하는 참조 카운트를 얻고, 카운트가 0이 되면 가비지 수집이 수행된다. 그다지 선호되진 않는 방법.
RAII(리소스 획득은 초기화)
이거 면접 때 질문도 받았었다. C++을 사용 언어에 넣어놧더니...
이 유형의 메모리 관리에서 객체의 메모리 할당은 생성부터 파괴까지인 수명에 묶여 있다. C++ 에서 도입되었으며 Ada 와 Rust 에서도 사용된다 .
https://velog.io/@cchloe2311/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0https://mina3215.tistory.com/manage/newpost/93?type=post&returnURL=ENTRY
Tistory
좀 아는 블로거들의 유용한 이야기
www.tistory.com
https://deepu.tech/memory-management-in-programming/
🚀 Demystifying memory management in modern programming languages
Let us take a look at how modern programming languages manage memory.
deepu.tech