Memory(RAM:Random Access Memory)
: 컴퓨터가 켜지는 순간부터 CPU는 연산을 시작하고, 동작에 필요한 모든 내용이 전원이 유지되는 내내 이 기억장치에 저장된다. '주기억장치'로 분류된다.

프로그램 메모리의 구조
메모리의 구조는 기본적으로 아래 네 영역으로 나뉘어져있다.
1. 코드 영역: 실행할 기계어 코드가 저장됨.
2. 데이터 영역: 전역 변수 및 static 변수가 저장됨.
3. 힙 영역: 동적 메모리 할당을 위한 영역.
4. 스택 영역: 함수 호출 시 생성되는 직여 변수, 매개변수 등이 저장됨.
그러나, 실행 환경에 따라 메모리 구조가 달라질 수 있다.
보통 위같은 구조로 나뉘는 것은 논리적인 메모리 구조에 대해 이야기할 때 인데,
실제로 메모리가 프로그램마다 저렇게 구조에따라 나뉘어 사용될 수 있는 이유는 물리적 메모리와 가상 메모리라는 개념을 통해 운영체제가 메모리를 효율적으로 관리하기 때문이다.
1. 물리 메모리(Physical Memory)
RAM(Random Access Memory)는 실제 물리적으로 존재하는 메모리이다. 예를들어 8GB RAM이 장착되어 있다면, 이 메모리 크기가 물리적으로 사용할 수 있는 공간도 8GB라는 이야기이다.
하지만, 물리메모리만으로 모든 프로그램을 동시에 실행할 수는 없다. 이를 해결하기위해 가상메모리가 도입된다.
2. 가상 메모리(Virtual Memory)
가상 메모리는 프로그램이 사용할 수 있는 논리적 메모리 공간을 제공한다.
즉, 프로그램은 자신만의 독립적인 메모리 공간을 가지는 것처럼 보이지만, 실제로는 운영체제가 물리 메모리와 디스크 공간을 매핑하여 제공한다.
페이지 단위(Page 단위)로 메모리를 나누어, 필요한 데이터만 실제 물리 메모리에 할당한다.
가상 메모리를 사용하면 프로그램이 물리 메모리 크기에 상관없이 큰 메모리공간을 사용하는 것처럼 보이게 된다.
운영체제는 프로세스마다 독립된 가상 메모리 공간을 제공하고, 각 프로세스가 서로의 메모리에 접근할 수 없게 만들어 프로그램 간 충돌을 방지한다.
가상 메모리는 페이지(Page)라는 작은 메모리 단위로 나뉘어 관리되며 일반적으로 4Kb 크기의 페이지가 사용된다.
운영체제는 페이지 테이블을 통해 가상 메모리 주소를 물리 메모리 주소에 매핑하고, 프로그램이 메모리에 접근할 때 이 가상 주소를 페이지 테이블을 통해 물리 메모리 주소로 변환한다.
(이 물리 메모리 주소에 페이지가 없다면 페이지 폴트(Page Fault)가 발생해 디스크(스왑 영역)에서 해당 페이지를 가져온다, 그렇게 필요한 페이지가 물리 메모리에 로드되면, 프로그램이 해당 데이터에 접근할 수 있다.)
따라서, 운영체제와 프로그램에 따라 메모리가 논리적으로 나뉘는 방식이 달라져 메모리 구조가 달라질 수 있다.

JVM 기반 프로그램(Java, Kotlin)의 경우 JVM위에서 실행되며, JVM이 메모리 구조를 관리한다. JVM 알아보기 →
- 메소드 영역(메타스페이스): 클래스 정보와 메타데이터(메드, static 변수 등)를 저장.
- 힙 영역: 객체 및 인스턴스 변수를 저장.
- 스택 영역: 각 스레드마다 호출된 메서드의 지역 변수와 매개변수 등이 저장됨.
- PC register(Program Counter): 현재 실행 중인 JVM 스레드의 명령어 주소를 저장한다.
- Native Method Stack: JNI(Java Native Interface)로 호출되는 네이티브 코드의 스택을 저장한다.
인터프리터 기반 프로그램(Python, JavaScript, Ruby)의 경우 인터프리터 언어이므로 인터프리터 런타임이 메모리 구조를 관리한다.(프로그램이 실행될 때 런타임 환경에 따라 메모리 구조가 다르다.)
- Python은 PyObject Heap이라는 구조를 통해 객체를 관리한다.
- JavaScript는 브라우저 또는 Node.js의 V8 엔진에서 메모리를 관리한다.
OS에 따라서도 메모리 구조가 달라진다.
- 리눅스는 프로세스마다 4GB 가상 메모리를 할당하며, 코드/데이터/스택/힙의 크기와 시작주소가 다를 수 있다.
동일한 언어라도 메모리 구조가 달라질 수 있다.
- Java 프로그램의 경우: JVM 옵션에 따라 메모리 구조가 달라진다(-Xms, -Xmx 등 옵션을 통해 힙 메모리 크기, 메타스페이스 크기 등을 조절할 수 있고, JVM 구현체(Oracle JVM, OpenJ9, GraalVM 등)에 따라 메모리 구조와 가비지 컬렉션 방식이 달라진다.)
- Python 프로그램의 경우: CPython, PyPy, Jython 등 인터프리터에 따라 메모리 관리 방식이 달라진다.
'Computer Science' 카테고리의 다른 글
| 확장자명은 무슨 역할을 하나 ? (1) | 2025.02.18 |
|---|---|
| 정적 콘텐츠를 파일로 저장하기 ? vs Base64 방식으로 저장하기 ? (4) | 2025.02.07 |
| 운영체제의 메모리 관리 방식에 대해 알아보기 (3) | 2025.01.17 |
| Linux 권한설정 알아보기 (6) | 2025.01.16 |
| 컴파일러(Compiler)와 인터프리터(Interpreter) 알아보기 (4) | 2025.01.07 |