[CS] 메모리 영역

최민길(Gale)·2023년 7월 6일
1

CS 탐구

목록 보기
2/13

안녕하세요 이번 시간에는 컴퓨터의 메모리 영역에 대해서 알아보는 시간을 갖도록 하겠습니다.

컴퓨터의 메모리 영역은 크게 다음의 4가지로 분류됩니다.

  1. 데이터 영역
  2. 코드 영역
  3. 스택 영역
  4. 힙 영역

먼저 데이터 영역이란, 전역 변수와 정적 변수가 저장되는 영역입니다. 프로그램이 실행될 때 초기화된 데이터가 저장되는 영역이며 프로그램 수행 중 값이 변경 가능하다는 특징이 있습니다.

코드 영역이란, 프로그램의 실행 코드가 저장되는 영역으로 CPU가 코드 영역에 저장된 명령어들을 차례대로 가져와 실행합니다. 읽기 전용이며 프로그램 실행 시 메모리에 로드됩니다.

스택 영역이란 지역 변수와 함수 호출 시 생성되는 변수(함수 내에서만 살아있는 변수)가 저장되는 영역입니다. 함수 호출이 발생하면 해당 함수에 필요한 데이터와 복귀 주소 등이 스택에 저장되고 함수가 종료되면 스택에서 해당 데이터가 제거됩니다.

복귀 주소란 컴퓨터 시스템에서 프로그램이 실행되다가 서브루틴 또는 인터럽트 처리 등을 마치고 본래의 실행 위치로 돌아가기 위해 사용되는 주소입니다. 서브루틴이란 재사용 가능한 코드 블록으로 특정 작업을 수행하기 위해 호출될 수 있는 독립적인 함수 또는 프로시저입니다. 인터럽트란 CPU가 현재 실행 중인 작업을 중단하고 특정한 처리를 수행하는 것입니다. 즉 복귀 주소는 프로그램이 특정 함수나 메소드를 호출하거나 입출력 장치에서의 인터럽트 등을 마치고 다시 원래 시점으로 돌아가기 위해 필요한 주소라고 볼 수 있습니다.

이어서 스택에 대해 조금 더 알아보겠습니다. 스택은 고정된 크기를 가지며 작은 메모리 공간을 사용합니다. 또한 스택에 저장된 데이터는 스레드가 종료되거나 블록을 벗어날 때 자동으로 해제됩니다. 이로 인해 스택은 함수 호출 시 생성되어 함수 종료 시 블록을 벗어나기 때문에 제거되는 수명을 가지게 되어 변수의 수명을 함수 수준으로 제한 가능하게 됩니다.

스택은 LIFO 형태로 마지막에 추가된 데이터가 가장 먼저 빠져나올 수 있습니다. 이 때 메모리 주소가 높은 주소에서 낮은 주소의 방향으로 저장됩니다. 즉 스택의 맨 위가 가장 낮은 주소, 스택의 맨 아래가 가장 높은 주소입니다.

메모리 주소는 프로세서에서 특정 메모리 블록에 접근하고 데이터를 읽거나 쓰기 위해 사용됩니다. 메모리 블록이란 컴퓨터 시스템에서 사용되는 메모리의 작은 조각으로 프로그램이나 데이터를 저장하고 검색하는데 사용됩니다. 이 때 주소는 주소 공간의 선형성을 유지하기 위해 낮은 순서대로 먼저 사용됩니다.

스택의 경우 (일반적인 아키텍처에서) 스택 포인터가 가장 처음 가리키는 메모리 주소가 가장 높고, 데이터가 추가될 때마다 항목에 대한 공간을 할당하기 위해 스택 포인터가 감소하면서 메모리 주소가 점점 작아지는 방식입니다.

힙 영역의 경우 프로그램 실행 중 동적으로 할당된 메모리가 저장되는 영역입니다. 힙은 크기가 유동적이기 때문에 동적 할당이 가능한 자료구조입니다. 할당된 메모리는 포인터를 사용하여 참조되며 프로그램의 어떤 부분에서든 접근 가능합니다. 운영체제로부터 할당된 메모리 블록으로 시작되며, 할당된 메모리는 낮은 주소에서 높은 주소의 방향으로 증가하여 저장됩니다. 이 때 힙은 수명 관리가 자동으로 이루어지지 않아 힙에 저장된 데이터는 개발자가 직접 할당 및 해제해야 하기 때문에 명시적인 관리가 필요합니다.

그럼 스택 영역과 힙 영역을 나눈 이유에 대해서 조금 더 알아보겠습니다. 스택 영역은 정적으로 할당되고 해제되는 메모리를 저장하는데 사용하는 반면, 힙 영역은 실행 중 필요한 크기의 메모리를 동적으로 할당하고 해제하며 사용합니다. 또한 스택은 데이터 추가 제거 시 포인터 조작만으로 이루어지기 때문에 메모리 관리 측면에서 매우 빠르고 효율적이지만, 힙의 경우 동적으로 할당 해제되기 때문에 더 복잡한 프로세스로 동작하여 할당 및 해제 처리가 제대로 되지 않을 경우 메모리 누수 등의 문제가 발생할 수 있습니다. 이어서 스택은 함수의 생성 및 소멸과 같은 생명주기를 가져 변수의 수명을 함수 수준으로 제한이 가능하여 메모리 누수를 방지할 수 있으나 힙은 개발자가 직접 처리해야 하기 때문에 메모리 관리가 더 어렵다는 단점이 있습니다.

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글