🫷들어가기 전
필자는 개발자가 꼭 알아야 할 메모리에 대해서알아볼 거다. 다른 블로그를 찾아보니까 개발자가 반드시 알아야 할 메모리 블로그가 있는 게 아니라 컴퓨터 쪽에 관련해서 심층까지 파고든 블로그가 있어서 "아, 이건 내가 개발자를 위한 블로그로 정리해봐야겠다."라고 생각해 포스팅해본다.
🧩 메모리(Memory)란?
우리는 한정적인 자원에서 효율적인 프로그램을 실행하려면 항상 생각하고 염려해둬야 한다. 그럼 메모리가 도대체 무엇이고 왜 그렇게 중요하게 생각할까?
메모리는 주기억장치를 의미하며 말 그대로 저장공간이다. 프로그램을 실행하기 위해서는 로드(load) 되어야 한다. 로드는 프로그램이나 데이터를 CPU가 바로 사용할 수 있도록 주기억장치로 옮기는 과정이다. 프로그램을 실행하기 전 데이터나 코드들을 메모리에 할당(로드(load)라고 부름)하고 그걸 CPU가 가져다 사용하는 것이다.
다시 정리하자면 로드(load)는 프로그램이 실행되어 지기 위해 메모리 공간을 할당하는 것을 말하고, 메모리는 정보에 빠르게 액세스할 수 있도록 컴퓨터가 실시간으로 사용하는 정보를 저장하는 시스템의 단기 데이터 저장공간이다. 이 메모리는 휘발성 메모리며 컴퓨터가 종료될 경우 메모리에 있는 프로그램 데이터나 정보들이 삭제된다.
메모리를 좁은 의미로 RAM(Random Access Memory)이라고 부르며 주로 메인 메모리(Main Memory)를 가리킨다.
시스템에서 많은 프로그램을 실행하려고 하면 더 많은 메모리 용량을 요구한다. 또, 시스템이 느리고 반응이 없을 경우, 메모리 업그레이드는 성능 향상에 도움이 되는 방법 중 하나이다.
🕹️ 메모리의 구조(Memory Structure)
메모리는 크게 4가지 code, data, heap, stack 영역으로 나누어 진다.
아래 그림에서 위에서부터 보자면 code -> data -> heap -> stack 순으로 나누어져 있다.
다양한 영역이 있는데 순차적으로 하나하나 살펴보자.
1. Code
Code 영역은 개발자(사용자)가 작성한 코드가 컴파일 된 후 기계어로 저장되는 영역이다. 다른 말로는 Text 영역이라고 부른다. CPU는 코드 영역에 있는 코드들을 하나씩 가져가 처리하며 제어문, 함수, 상수들이 이 영역에 저장된다.
2. Data
Data 영역은 전역 변수, 정적 변수가 저장되는 영역이다. 프로그램이 시작과 동시에 main 함수가 호출되기 전에 할당되며 프로그램 종료 후에는 소멸된다.
3. Heap
Heap 영역은 프로그램이 실행되는 동안 동적으로 할당되는 데이터가 저장되는 영역이고, 사용자가 직접관리할 수 있다. 이 영역은 Stack 영역과 다르게 메모리의 낮은 주소부터 높은 주소로 할당된다.
4. Stack
Stack 영역은 함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역이다. Stack 영역과 Heap 영역은 같은 공간을 나누며 사용할 수 있다. 한 쪽의 저장공간이 부족하면 다른 한 쪽 영역을 침범하는데 우리는 이걸 스택 오버 플로우, 힙 오버 플로우라고 지칭한다. Stack 영역은 메모리의 높은 주소부터 낮은 주소로 할당된다.
Stack 영역을 자세히 알아보자면 한쪽 끝이 막혀 있는 통과 같은 저장 공간이다. 한쪽이 막혀있어 막혀있지 않은 곳으로 데이터를 차곡차곡 저장하고, 저장한 자료를 꺼낼 때는 마지막으로 저장한 데이터부터 꺼낸다. 즉, 나중에 저장한 데이터를 가장 먼저 꺼내는 후입선출이라는 점에서 자료 구조 또는 LIFO라고 부른다.
예를 들어서 1 - 2 - 3 - 4순으로 데이터를 저장했다고하면 데이터를 꺼낼 때는 4 - 3 - 2 - 1순으로 꺼낼 수 있다.
이때 Stack 영역에 새로운 데이터를 넣는 명령어가 PUSH이며, Stack에 저장된 데이터를 꺼내는 명령어가 POP이다.
잘못된 내용이나 부족한 부분이 있을 수 있습니다. 댓글로 남겨주시면 감사하겠습니다. 😄