상세 컨텐츠

본문 제목

메모리의 구조와 동작 방식은 어떻게 될까?

운영체제

by 박여치 2026. 4. 20. 20:00

본문

메모리는 컴퓨터에 왜 필요할까?

지난 글에서는 CPU의 구조와 동작 과정에 정리했습니다.

운영체제(OS)를 이해하려면 CPU뿐 아니라 메모리(Memory)에 대한 이해도가 반드시 필요합니다.

운영체제(OS)는 프로그램 실행에 필요한 메모리(Memory)를 할당하고 회수하며, 여러 프로세스(Process)가 서로 충돌하지 않도록 관리하는 역할을 담당하기 때문입니다.

또한 프로세스(Process), 스레드(Thread), 문맥 교환(Context Switching), 가상 메모리(Virtual Memory)와 같은 개념들 역시 모두 메모리(Memory)와 밀접하게 연결되어 있습니다.

이번 글에서는 메모리 구조와 계층 구조를 함께 정리하겠습니다.

 

메모리 구조

 

출처 <리눅스 커널 내부구(백승재)>

프로그램(Program)이 실행되면 역할에 따라 여러 영역으로 나뉘어 메모리(Memory)에 적재됩니다.

대표적으로 메모리 구조는 코드(Code), 데이터(Data), 힙(Heap), 스택(Stack)과 같이 구분할 수 있습니다.

코드(Code) 영역

코드(Code) 영역은 실행할 명령어(Instruction)이 저장되는 공간입니다.

즉, 프로그램(Program)의 실제 코드가 이 영역에 위치하게 됩니다.

일반적으로 실행 중에 코드(Code) 내용이 바뀌지 않기 때문에 읽기 전용(Read Only) 성격을 가지는 경우가 많습니다.

운영체제(OS)나 CPU 입장에서는 이 영역에 저장된 명령어를 읽어와 실행하게 됩니다.

데이터(Data) 영역

데이터(Data) 영역은 전역 변수(Global Variable)나 정적 변수(Static Variable)처럼 프로그램 실행 동안 계속 유지되어야 하는 데이터(Data)가 저장되는 공간입니다.

즉, 프로그램(Program) 시작과 함께 할당되고 종료될 때까지 유지되는 값들이 여기에 포함됩니다.

힙(Heap) 영역

힙(Heap) 영역은 프로그램 실행 중 동적으로 할당되는 공간입니다.

C의 `malloc()`, C++의 `new`, Java의 객체 생성처럼 실행 도중 필요에 따라 메모리(Memory)를 확보하는 경우 이 영역이 사용합니다.

힙(Heap)은 유연하게 사용할 수 있다는 장점이 있지만, 개발자가 직접 관리해야 하는 언어에서는 메모리 누수(Memory Leak)과 같은 문제가 발생할 수 있습니다.

스택(Stack) 영역

스택(Stack) 영역은 함수 호출과 관련된 정보가 저장되는 공간입니다.

대표적으로 함수의 매개변수(Parameter), 지역 변수(Local Variable), 반환 주소(Return Address)가 저장됩니다.

함수가 호출될 때 Stack에 정보가 쌓이고, 함수 실행이 끝나면 다시 제거됩니다.

즉, Stack은 프로그램(Program)의 실행 흐름과 가장 밀접하게 연결된 메모리 영역이라고 볼 수 있습니다.

메모리 계층 구조 (Memory Hierarchy)

출처 <Chatgpt Image Producing>

메모리는 여러 종류가 존재하며, 속도와 용량, 비용에 따라 여러 단계로 나뉘어 구성됩니다.

이를 메모리 계층 구조(Memory Hierarchy)라고 합니다.

일반적으로 레지스터(Register) → 캐시(Cache) → 주 기억 장치(Main Memory) → 보조 기억 장치(Secondary Storage) 순으로 이루어집니다.

하위 단계로 갈수록 속도가 느려지고 비용이 싸지는 특징을 가지고 있습니다.

레지스터(Register)

레지스터(Register)는 CPU 내부에 위치한 가장 빠른 저장 공간입니다.

CPU가 현재 처리 중인 값이나 주소, 명령어 관련 정보를 잠시 저장하는 데 사용합니다.

속도는 매우 빠르지만 비용이 높아 매우 작은 용량만 사용합니다.

캐시(Cache)

Cache(캐시)는 CPU와 주 기억 장치(Main Memory) 사이에서 자주 사용하는 데이터를 빠르게 제공하기 위한 고속 메모리 입니다.

CPU는 필요한 데이터가 Cache에 있다면 주 기억 장치(Main Memory)까지 가지 않고 바로 가져올 수 있기 때문에 성능이 크게 향상됩니다.

즉, 캐시(Cahce)의 목적은 CPU와 주 기억 장치(Main Memory)의 속도 차이를 줄이기 위해 존재합니다.

주 기억 장치(Main Memory)

주 기억 장치(Main Memory)는 일반적으로 우리가 말하는 RAM(Random Access Memory)를 의미합니다.

실행 중인 프로그램(Program)의 코드(Code), 데이터(Data), 스택(Stack), 힙(Heap) 등이 올라가는 공간이며, CPU는 직접적으로 이 주 기억 장치(Main Memory)의 데이터를 읽고 사용합니다.

보조 기억 장치 (Secondary Stroage)

보조 기억 장치(Secondary Strorage)는 SDD, HDD와 같은 종류가 있습니다.

프로그램 파일이나 데이터 파일은 보통 여기에 저장되어 있다가, 실행이 필요할 때 주 기억 장치(Main Memory)로 올라오게 됩니다.

속도가 느리지만 가격이 싸기 때문에, 대용량으로 사용됩니다.

메모리 동작 과정

CPU가 프로그램(Program)을 실행한다는 것은 결국 명령어와 데이터를 메모리(Memory)에서 읽어와 처리한다는 뜻입니다.

해당 과정은 아래와 같이 이루어집니다.

 

1. 프로그램(Program)이 실행되면 보조기억장치(Secondary Storage)에 있던 코드와 데이터가 주 기억 장치(Main Memory)에 적재

2. CPU가 필요한 명령어와 데이터를 주 기억 장치(Main Memory)에서 읽어옴(Load)

3. 자주 사용하는 값은 캐시(Cache)에 저장 → 더 빠른 접근

4. 실제 연산에 필요한 값은 레지스터(Register)에 저장

5. CPU가 레지스터(Register)에 있는 값을 바탕으로 연산 장치(ALU)를 통해 계산 수행

지역성 (Locality)

메모리 계층 구조가 효과적으로 동작할 수 있는 이유는 프로그램(Program) 실행에 지역성(Locality)라는 특징이 있기 때문입니다.

지역성(Locality)는 프로그램(Program)이 메모리(Memory)를 사용할 때 일정한 패턴을 보이는 형상을 일컫습니다.

캐시(Cache)는 지역성(Locality)를 이용하여 자주 사용할 가능성이 높은 데이터와 인접한 데이터를 미리 저장해두는 방식으로 성능을 향상시킵니다.

시간 지역성 (Temporal Locality)

한 번 사용한 데이터(Data)나 명령어(Instruction)은 곧 다시 사용할 가능성이 높은 성질입니다.

예를 들어 반복문 안의 변수나 자주 호출되는 함수는 짧은 시간 안에 여러 번 사용될 가능성이 크다고 볼 수 있습니다.

공간 지역성(Spatial Locality)

어떤 위치의 데이터(Data)에 접근했다면, 그 주변 위치의 데이터도 곧 접근할 가능성이 높은 성질입니다.

예를 들어 배열을 순차적으로 읽는 경우가 이에 해당합니다.

 

정리

프로그램은 실행되면서 코드(Code), 데이터(Data), 힙(Heap), 스택(Stack)과 같은 영역으로 나뉘어 메모리에 적재됩니다. 시스템 전체는 레지스터(Register), 캐시(Cache), 주 기억 장치(Main Memory), 보조 기억 장치(Secondary Storage)로 이루어진 계층 구조를 바탕으로 동작합니다.

또한 캐시(Cache)는 지역성(Locality)을 활용해 CPU와 메모리 사이의 속도 차이를 줄이며, 시스템 전체 성능 향상에 중요한 역할을 합니다.

 

관련글 더보기