웹 프레임워크 관련된 작업만 하다보니 기본 상식인 Computer Science에 대해 너무 모르고 있었다.
오늘은 프레임워크나 상위 레벨의 프로그래밍 언어에 대해 알아가는 것보다, 컴퓨터가 돌아가는데 필수 요소 중 하나인 메모리에 대해서 알아보았다.
보통 하드웨어의 측면에서 RAM(랜덤 액세스 메모리)을 메모리라 하며, 소프트웨어의 측면에서는 프로그램을 실행시킬 때 단기 데이터 저장소로 빠르게 정보에 액세스 하는 용도로 사용된다.
하드웨어 측면에서의 메모리는 조금 다른 얘기로 흘러가니, 이번에는 소프트웨어의 측면에서 메모리의 구조에 대해 알아본다.
프로그램이 실행되기 위해서 메모리에 먼저 로드되어야 한다. 컴퓨터의 운영체제에 따라 다양한 메모리 공간을 제공하는데 보통은 아래와 같이 4개의 영역으로 이루어져 있다.
- 코드(code) 영역
- 데이터(data) 영역
- 스택(stack) 영역
- 힙(heap) 영역
메모리의 코드 영역은 말 그대로 프로그램을 실행하는 소스 코드가 저장되는 영역이다. 텍스트 영역이라고 불리며 CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.
메모리의 데이터 영역은 프로그램의 전역 변수와 정적(static) 변수를 저장하는 영역이다.
자바스크립트에서는 정적 변수에 대한 개념이 없지만, Java나 C언어 계열의 언어를 사용하다보면 익숙할 것이다.
데이터 영역은 프로그램의 시작과 함께 할당되며 프로그램이 종료되면 소멸한다.
코드와 데이터 영역을 합쳐서 보통 정적 세그먼트(Static Segment)라 불린다.
메모리의 스택 영역은 함수의 호출과 관계된 지역변수와 매개변수가 저장되는 영역이다.
함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸된다. 스택 영역은 동명의 자료구조와 같이 푸시(push)로 데이터를 저장하고, 팝(pop)으로 데이터를 인출한다.
후입선출의 구조로 동작하고 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
런타임에 크기가 결정되는 특징이 있다
메모리의 힙 영역은 사용자가 직접 관리할 수 있는 해야만 하는! 영역으로 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
보통 객체를 생성할 때 쓰는 new 명령어를 통해 힙 영역에 데이터를 할당한다.
프로그래밍 언어에 따라 가비지 컬렉터가 있을 경우 자동으로 할당된 데이터가 해제되기도 하고, C++언어처럼 사용자가 직접 데이터를 해제해야 할 수 있다.
스택 영역과 힙 영역을 합쳐서 동적 세그먼트(Dynamic Segment)라 한다.
컴파일 타임에 크기가 결정되는 특징이 있다
스택 영역과 힙 영역은 서로의 영역을 공유하고 있기 때문에 잘 관리 못하면 우리가 흔히 보는 stack overflow 혹은 heap overflow 에러가 발생한다.
힙 영역은 메모리의 위쪽 주소부터 할당되며 스택 영역은 아래부터 할당된다.