자료구조

자료구조 <메모리 영역>

um_coding 2023. 8. 22. 20:52

메모리 영역

작성한 프로그램이 컴퓨터에서 어떻게 동작하는지 이해하려면 메모리 구조에 대해 이해할 필요가 있다.

프로그램이 실행되는 과정을 메모리 구조와 함께 정리한다.

 

RAM

RAM은 자유롭게 읽고 쓸 수 있는 기억장치로, RWM(Read Write Memory)라고 부르기도 한다.

또한 RAM에는 현재 사용 중인 프로그램이나 데이터가 저장되어 있다.

시스템의 전원이 꺼지면 기억된 내용이 모두 사라지는 휘발성 메모리의 특징을 가진다.

일반적으로 주기억장치 or 메모리라고 불린다.

 

프로그램 실행 순서

프로그램이 실행되는 과정을 도식화하면 다음과 같다.

  1. 사용자가 프로그램 실행을 요청하면
  2. 프로그램의 정보를 읽어 메모리에 로드(load)되는 과정을 거치고
  3. 프로그램이 실행되면 OS는 메모리(RAM)에 공간을 할당해준다.
  4. cpu는 기계어 코드를 실행한다.

프로세스

사용자가 프로그램을 실행하면 하드디스크에 있는 실행 이미지가 메모리에 로드된다.

이 말은 기계어로 된 실행파일을 보조기억장치에서 주기억장치(메모리)로 copy한다는 뜻이다.

이때 메모리에는 프로그램에 대한 인스턴스가 생성된다.

프로그램을 여러번 실행하면 여러 개의 인스턴스가 생긴다.

ex) Chrome브라우저를 세 번 실행해서 Google, Naver, Daum을 각각 접속했다면 똑같은 프로그램의 인스턴스 3개가 만들어진다.

인스턴스 각각을 식별하기 위해 프로세스라고 부르며, 이 상황에서 프로세스 별로 기계어 코드는 동일하다.

물론 실행되었을 때 사용자 명렬이나 결과는 다르겠지만 cpu는 같은 내용을 연산한다.

컴퓨터의 작업관리자에서 현재 어떤 프로세스들이 실행되고 있는지 확인할 수 있다.

 

메모리 구조

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 한다. 또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.

따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공, 할당한다.

프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간을 다음과 같다.

1.  Stack영역

메모리의 Stack영역은 함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역이다.

Stack영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.

이렇게 Stack영역에 저장되는 함수의 호출 정보를 **스택 프레임(stack frame)**이라고 한다.

Stack영역은 **푸시(push)**동작으로 데이터를 저장하고, **팝(pop)**동작으로 데이터를 인출한다.

이러한 Stack은 **후입선출(LIFO, Last-In First-Out)**방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출된다.

Stack영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.

Stack영역이 높은 주소에서부터 주소값을 채워 내려오다가 Heap영역을 침범하는 경우 Stack Overflow가 발생한다.

 

2. Heap영역

메모리의 Heap영역은 사용자가 직접 관리할 수 있는 (+관리해야 하는) 메모리 영역이다.

Heap영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

Heap영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

Heap영역이 Stack영역을 침범하는 경우 Heap Overflow가 발생한다.

 

3. Data영역 / BSS영역

메모리의 Data영역은 프로그램의 전역변수정적변수가 저장되는 영역이다.

RAM의 Data영역에는 ROM의 Data영역에서 복사된 초기화된 전역변수와 정적변수가 저장되어 있다.

Data영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.

 

전역변수와 정적변수를 선언할 때 값을 초기화했으면 Data영역에 생성되고, 초기화하지 않았으면 BSS영역에 생성된다.

BSS영역은 프로그램 실행을 시작하기 전에 OS커널에 의해 0으로 자동 초기화된다.

전역변수와 정적변수를 프로그램 내에서 초기화하지 않아도 0으로 자동 초기화되는 이유가 이 때문이다.

BSS는 Block Started by Symbol의 약자이다.

 

C언어에서 변수를 어떻게 선언하느냐에 따라 저장될 메모리 영역이 결정된다.

저장 영역과 같은 특성을 지정하는 것은 **기억 부류 지정자(storage class specifier)**를 통해 가능하다.

static, auto, extern등이 있으며, 흔히 키워드라고 부르기도 한다.

4. code 영역

컴파일러가 사용하는 영역이 코드영역이다.

컴퓨터가 필요한 자원이 100인데 50만 주고 코드를 번역하라고 하면 못한다. 그래서 이를 방지하기 위해 코드 영역은 컴퓨터가 할당한 자원을 자 주게 해준다. 그래서 사용자가 통제하지 못한다.

메모리의 Code영역은 실행할 프로그램의 코드가 저장되는 영역으로 Text영역이라고도 부른다. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.

 

지금까지 보았던 내용을 그림으로 보면 아래와 같다.

Stack과 Heap은 같이 봐야한다.

Stack영역(1mb)

지역 변수와 매개변수가 저장되는 영역

변수가 저장되는 영역은 Stack이다. → 용량은 작다. 조회속도가 Heap보다 빠르다.

빠르게 조회하기 위해 사용, 사용하고 빠르게 값을 비워줘야 한다.

*변수 규칙: 무조건 값을 하나만 저장

참조형 변수

값의 주소를 가지고 있을 때 참조형 변수

int a = [1, 2, 3, 4, 5];

Stack = 창고위치를 저장

a ⇒ 100번지

기본형 변수

자기가 변수 값을 가지고 있으면 기본형 변수

int b = 5;

b ⇒ 5

Heap영역(800mb)

힙에는 변수가 저장이 안된다.

힙에는 용량이 커서 여유가 있다.

int a = [1, 2, 3, 4];

Heap

100번지

[1, 2, 3, 4];