이전 글에서 운영체제(OS)와 Kernel에 대해 정리했다.
운영체제는 애플리케이션과 하드웨어 사이에서 여러 자원을 관리하고, 그중에서도 Kernel은 실제로 다음과 같은 컴퓨터 자원을 관리한다고 했다.
CPU
Memory
Disk
Network
Process
...
그런데 여기서 한 가지 문제가 생겼다.
CPU와 RAM, Disk가 정확히 뭐지?
CPU는 컴퓨터의 두뇌, RAM은 메모리라고 많이 들어봤지만 막상 각각 어떤 역할을 하고 서로 어떻게 연결되는지 설명하려니 애매했다.
그래서 이번에는 OS와 Kernel에서 한 단계 더 내려가서, 컴퓨터의 가장 기본적인 자원인 CPU, RAM, Disk가 무엇인지 정리해보려고 한다.
너무 파고드는건가? 싶지만 이해하지 못하면 나는 앞으로 나아갈 수 없다..
컴퓨터를 하나의 주방이라고 했을 때,
CPU = 요리사
RAM = 조리대
Disk = 냉장고 / 창고
요리를 하기 위해서는 세 가지가 모두 필요하다.
재료는 냉장고에 보관하고, 지금 사용할 재료를 조리대에 꺼내놓은 뒤 요리사가 실제로 요리를 한다.
컴퓨터도 비슷하다.
Disk
프로그램과 데이터를 보관
↓
RAM
현재 사용할 프로그램과 데이터를 올려둠
↓
CPU
실제 명령을 실행
이 흐름을 기준으로 하나씩 살펴보자.
CPU(Central Processing Unit)는 프로그램의 명령을 실제로 계산하고 실행하는 장치이다.
흔히 CPU를 컴퓨터의 두뇌라고 표현한다.
예를 들어 다음과 같은 Java 코드가 있을 때,
int result = 10 + 20;
개발자는 단순히 10 + 20이라는 코드를 작성하지만, 결국 실제 계산을 수행하는 것은 CPU이다.
Java 프로그램
↓
컴퓨터가 실행할 수 있는 명령
↓
CPU
↓
계산 수행
CPU는 계산만 하는 것은 아니다.
프로그램을 실행하면서 필요한 수많은 명령을 계속 처리한다.
예를 들면 다음과 같다.
즉,
프로그램이 실행된다는 것은 결국 CPU가 프로그램의 명령을 계속 처리하고 있다는 뜻이다.
CPU를 알아보다 보면 Core라는 단어도 자주 등장한다.
AWS EC2에서도 vCPU라는 표현을 볼 수 있었다.
CPU를 요리사라고 생각한다면 Core는 실제로 일을 처리할 수 있는 작업 단위이다.
1 Core
👨 🍳
4 Core
👨 🍳 / 👨 🍳 / 👨 🍳 / 👨 🍳
Core가 여러 개라면 여러 작업을 동시에 처리할 수 있는 여지가 커진다.
물론 실제 CPU 성능은 Core 개수만으로 결정되는 것은 아니지만, 처음에는 다음 정도로 이해했다.
Core가 많아질수록 여러 작업을 병렬로 처리할 수 있는 능력이 커질 수 있다.
AWS에서 보는 vCPU는 이러한 CPU 실행 자원을 가상화해서 제공하는 단위라고 한다.
RAM(Random Access Memory)은 현재 실행 중인 프로그램과 필요한 데이터를 임시로 올려두는 빠른 작업 공간이다.
주방으로 비유하면 조리대이다.
요리를 할 때 모든 재료를 냉장고 안에 넣어놓은 상태로 요리할 수는 없다.
지금 필요한 재료는 냉장고에서 꺼내 조리대 위에 올려놓는다.
컴퓨터도 마찬가지!!
Spring Boot 애플리케이션의 app.jar 파일이 있을 때,
처음에는 이 파일이 SSD에 저장되어 있다.
SSD
app.jar
그리고 다음 명령어를 실행한다.
java -jar app.jar
그러면 프로그램 실행에 필요한 내용들이 RAM에 올라오고, CPU가 이를 사용하여 명령을 처리한다.
SSD
app.jar 저장
↓
RAM
실행에 필요한 프로그램과 데이터
↓
CPU
명령 실행
즉 RAM은 CPU가 지금 사용해야 하는 데이터를 빠르게 접근할 수 있도록 준비해두는 공간이라고 볼 수 있다.
다시 주방을 생각해보자.
조리대가 매우 작다면 몇 개의 재료만 올려놓아도 공간이 꽉 찬다.
작은 조리대
🥩 🥕
반대로 조리대가 넓다면 여러 재료와 도구를 한꺼번에 올려놓고 사용할 수 있다.
넓은 조리대
🥩 🥕 🍅 🥬 🥔 🍳
RAM도 비슷하다.
개발을 할 때는 보통 하나의 프로그램만 실행하지 않는다.
Chrome
IntelliJ
Spring Boot
MySQL
Docker
각 프로그램은 실행되면서 RAM을 사용한다.
그래서 IntelliJ, Docker, MySQL, Spring Boot 등을 한꺼번에 실행하면 RAM 사용량이 빠르게 증가한다.
RAM이 부족해지면 컴퓨터가 사용할 수 있는 빠른 작업 공간이 줄어들기 때문에 전체적인 성능에도 영향을 줄 수 있다.
실제로 부트캠프 초반에는 RAM이 적은 노트북으로 IntelliJ, Docker, MySQL, Spring Boot, ZEP까지 동시에 실행해서 사용했는데, 컴퓨터가 매우매우매우 느려졌던 경험이 있다.
당시에는 단순히 노트북 성능이 좋지 않다고만 생각했지만, 지금 돌이켜보면 여러 프로그램이 동시에 RAM을 사용하면서 메모리가 부족해진 것도 큰 원인이었을 것이다.
아 역시 개발하려면 성능 좋은 컴퓨터가..ㅜ
그럴 수 없다.
RAM에는 중요한 특징이 하나 있다.
RAM의 데이터는 일반적으로 전원이 꺼지면 사라진다.
컴퓨터를 종료했다고 해서 내가 작성한 프로젝트까지 사라져서는 안 된다.
예를 들어:
my-project/
├── src/
├── build.gradle
└── README.md
이런 파일은 컴퓨터를 껐다가 다시 켜도 그대로 존재해야 한다.
그래서 데이터를 장기간 저장할 수 있는 별도의 공간이 필요하다.
그것이 Disk이다.
Disk는 프로그램과 데이터를 장기간 저장하기 위한 공간이다.
현재 개인용 컴퓨터에서는 주로 SSD(Solid State Drive)를 사용한다.
예를 들어 다음과 같은 것들이 SSD에 저장된다.
Spring Boot 프로젝트
app.jar
IntelliJ
Java JDK
사진
영상
문서
MySQL 데이터
컴퓨터를 종료해도 이러한 데이터는 그대로 유지된다.
주방으로 비유하면 Disk는 냉장고나 창고이다.
냉장고
→ 재료를 오래 보관
Disk
→ 프로그램과 데이터를 오래 보관
처음에는 Disk = SSD라고 생각했는데 정확히는 조금 다르다.
Disk 또는 Storage는 데이터를 저장하는 공간을 넓게 표현하는 용어이고, 실제 저장장치에는 여러 종류가 있다.
대표적으로:
Storage
├── HDD
└── SSD
가 있다.
예전에는 HDD가 많이 사용되었지만 현재는 속도가 빠른 SSD를 많이 사용한다.
따라서 클라우드나 서버 공부에서 Disk라는 표현이 등장하더라도 실제 저장장치가 반드시 HDD라는 뜻은 아니다.
둘 다 데이터를 저장한다고 생각하면 처음에는 헷갈린다.
하지만 목적이 다르다.
| 구분 | RAM | Disk / SSD |
|---|---|---|
| 역할 | 현재 사용하는 데이터의 임시 저장 | 데이터 장기 저장 |
| 속도 | 매우 빠름 | RAM보다 느림 |
| 용량 | 상대적으로 작음 | 상대적으로 큼 |
| 전원을 끄면 | 데이터가 사라짐 | 데이터가 유지됨 |
| 비유 | 조리대 | 냉장고 / 창고 |
가장 중요한 차이는 다음과 같다.
Disk
→ 나중에도 사용할 데이터를 보관
RAM
→ 지금 당장 사용할 데이터를 올려놓음
Spring Boot 프로젝트를 빌드해서 다음 파일이 만들어졌다고 가정했을 때,
app.jar
이 파일은 우선 SSD에 저장되어 있다.
Disk / SSD
app.jar
이 상태에서는 단순히 저장되어 있는 프로그램일 뿐이다.
다음 명령어를 입력하면?
java -jar app.jar
프로그램을 실행하면 필요한 프로그램과 데이터가 RAM에 올라간다.
Disk
app.jar
↓ 실행
RAM
실행에 필요한 프로그램과 데이터
그리고 CPU가 실제 명령을 처리한다.

즉,
Disk에 저장된 프로그램을 실행하면 필요한 내용이 RAM에 올라오고, CPU가 실제 명령을 수행한다.
Spring Boot 서버를 실행한 뒤 HTTP 요청이 들어온다고 생각해보면,
Client
↓
HTTP Request
↓
Spring Boot
↓
RAM에 올라가 있는 프로그램과 데이터 사용
↓
CPU가 Java 코드의 명령을 처리
↓
HTTP Response
내가 작성한 Controller나 Service 코드도 결국 컴퓨터 관점에서는 CPU가 실행하는 명령으로 이어진다.
예를 들어:
@GetMapping("/members")
public List<Member> getMembers() {
return memberService.getMembers();
}
개발자에게는 Java 코드이지만 결국 컴퓨터 안에서는:
Java 코드
↓
프로그램 실행
↓
RAM 사용
↓
CPU가 명령 처리
라는 흐름으로 동작한다.
여기까지 이해하고 나니 AWS EC2를 생성할 때 왜 CPU와 Memory를 선택했는지도 조금 이해가 되었다.
EC2 Instance Type을 보면 다음과 같은 자원이 등장한다.
EC2 Instance
├── vCPU
├── Memory
├── Storage
└── Network
클라우드라고 해서 CPU와 RAM이 사라지는 것이 아니다.
AWS 데이터센터에도 결국 실제 컴퓨터가 존재한다.
AWS Data Center
Physical Server
├── CPU
├── RAM
├── Disk
└── Network
우리는 그 실제 컴퓨터의 자원을 가상화하여 필요한 만큼 사용하는 것이다.
그래서 Spring Boot 서버를 AWS에서 실행하더라도 결국에는:
CPU
→ 애플리케이션의 명령 실행
RAM
→ 실행 중인 애플리케이션과 데이터 사용
Disk
→ 애플리케이션과 데이터를 저장
하는 기본 원리는 동일하다.
처음에는 CPU, RAM, Disk가 각각 따로 존재하는 컴퓨터 부품이라고만 생각했다.
하지만 프로그램이 실행되는 흐름으로 연결해보면 이해하기가 훨씬 쉬웠다.
Disk에 프로그램이 저장되어 있다.
↓
프로그램을 실행한다.
↓
필요한 프로그램과 데이터가 RAM에 올라간다.
↓
CPU가 실제 명령을 실행한다.
주방 비유로 다시 정리하면 다음과 같다.
CPU
= 실제 요리를 하는 요리사
RAM
= 지금 사용할 재료를 올려놓는 조리대
Disk
= 재료를 장기간 보관하는 냉장고 / 창고
한 문장씩 정리하면:
CPU는 프로그램의 명령을 실제로 계산하고 실행한다.
RAM은 현재 실행 중인 프로그램과 필요한 데이터를 빠르게 사용할 수 있도록 임시로 저장한다.
Disk는 프로그램과 데이터를 전원이 꺼져도 유지할 수 있도록 장기간 저장한다.
이전 글에서 OS와 Kernel이 CPU, Memory, Disk 같은 컴퓨터 자원을 관리한다고 했는데, 이제야 그 문장이 조금 더 구체적으로 이해되기 시작했다.
Application
↓
Operating System / Kernel
↓
CPU / RAM / Disk
그리고 이 기본 구조를 알고 나니 다음으로 정리할 VM과 Container가 CPU와 RAM 같은 자원을 어떻게 나누어 사용하고, OS와 Kernel을 어떻게 사용하는지도 조금 더 쉽게 이해할 수 있었다.