💡 메모리 구조
프로그램이 실행되기 위해서는 프로그램이 메모리에 로드(load)되어야 한다.
메모리에 올라가지 않은 상태는 그저 소스 코드 덩어리일 뿐이다.
메모리가 올라간다는 것은 코드의 부분부분에 메모리가 할당되는 것이다.
→ 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 각각의 메모리 공간은 상호작용하며 프로그램 실행에 기여한다.
1) 코드(code) 영역: 실행할 프로그램의 코드
2) 데이터(data) 영역: 전역 변수, 정적(static) 변수
3) 스택(stack) 영역: 컴파일 타임에 크기가 결정됨
4) 힙(heap) 영역: 런타임시 크기가 결정됨(동적할당)
💡 컴파일 타임
사람이 작성한 소스코드를 컴퓨터가 해석할 수 있도록 기계어로 변환시키는 과정을 컴파일이라고 한다.
💡 런타임
컴파일 과정을 끝낸 프로그램이 사용자에 의해 실행되고 응용 프로그램이 동작되는 시점을 런타임이라고 한다.
1. 코드(code) 영역
- 메모리의 코드(code) 영역은 실행할 프로그램의 소스 코드가 저장되는 영역 (= 텍스트 영역)
- CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리함
2. 데이터(data) 영역
- 프로그램의 전역 변수와 정적 변수(static)이 저장되는 영역
- 프로그램의 시작과 함께 할당됨
- 프로그램 종료 시 소멸
3. 스택(stack) 영역
- 함수의 호출과 관계되는 지역변수, 매개변수가 저장되는 영역
- 함수 호출과 함께 할당됨
- 함수 실행 후 완료 시 소멸
- 푸시(push) 동작으로 데이터 저장
- 팝(pop)으로 데이터 출력
- 메모리의 높은 주소에서 낮은 주소 방향으로 할당
4. 힙(heap) 영역
- 사용자가 직접 관리해야 하는 메모리 영역
- 메모리 공간이 동적으로 할당되고 해제됨
- 객체의 참조값이 힙 영역에 저장되는 대표적인 데이터 (java의 class)
- 메모리의 낮은 주소에서 높은 주소 방향으로 할당
🔎 메모리 간의 상호작용
- 스택 영역과 힙 영역을 사실 상 같은 공간을 사용한다.
- 스택 영역이 클 수록 힙 영역이 작아지고 반대로 힙 영역이 클 수록 스택 영역이 작아짐
- 스택 높 → 낮 / 힙 낮 → 높 메모리 할당이기 때문에 자신의 영역이 상대의 영역을 침범하는 사태가 발생할 수 있음
(스택 오버 플로우 / 힙 오버 플로우라고 불림)
💡 Stack의 역할
- Heap 영역에 생성된 Object 타입의 데이터 참조값이 할당된다.
- 원시타입의 데이터 (ex : byte, short, int, char .. 등)가 값과 함께 할당된다.
- 원시타입의 데이터는 Heap 영역에 할당되지 않음
- 지역변수들은 scope에 따른 visibility를 가진다.
- 각 Thread는 자신만의 stack을 가진다.
💡 Heap의 역할
- 주로 긴 생명주기를 가지는 데이터들이 저장된다.
- 애플리케이션의 모든 메모리 중 stack 데이터를 제외한 부분이라고 보면 됨
- 모든 Object 타입(Integer, String, ArrayList, HashMap 등..)의 참조값은 데이터 타입과 함께 Heap영역에 생성된다.
- Heap 영역에 있는 객체들을 가리키는 참조 변수(메모리 주소 값)는 stack에 올라가게 된다.
💡 RAM (랜덤 액세스 메모리, Random Access Memory)이란?
- 휘발성 메모리
- 작업 중인 파일을 일시적으로 저장
- 즉, 컴퓨터를 재시작하거나 종료 시 내용이 삭제된다.
💡 ROM (읽기 전용 메모리, Read Only Memory)이란?
- 비휘발성 메모리
- 컴퓨터에 지시사항을 영구적으로 저장
- 정보가 칩에 영구 저장된다는 의미
- 데이터 저장에 있어 전류에 의존하지 않음
- 사용자가 변경할 수 없음
[출처]
https://velog.io/@seungho1216/CS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
https://www.crucial.kr/articles/about-memory/what-is-the-difference-between-ram-and-rom
'ETC' 카테고리의 다른 글
CI(Continuous Integration)/CD(Continuous Delivery & Continuous Deployment)란? (0) | 2024.03.18 |
---|---|
모놀리식 아키텍처(Monolithic Architecture) vs MSA(MicroService Architecture) (0) | 2024.02.19 |
[Windows] 레지스트리(Registry) 개념 정리 (0) | 2023.12.12 |