
2025.04.15
오늘한 내용 : CS - 가상화, GCC
WEEK05: C Pointer(&, * 연산자), 동적 메모리 할당, Linked List, Stack, Queue, Binary Tree, Binary Search Tree, 동적 프로그래밍, 그리디 알고리즘
가상화? 추상화? 아직도 헷갈린다.
3주차 퀴즈
5. 추상화는 전산학에서 가장 중요한 개념입니다. 운영체제 관점에서 4가지 추상화를 설명해주세요 (1점)
파일은 입출력 장치의 추상화이며
가상메모리는 프로그램 메모리의 추상화이고
프로세스는 실행중인 프로그램의 추상화입니다.
추가로가상머신이 있으며, 이는 운영체제, 프로세서, 프로그램모두를 포함하는 컴퓨터 전체의 추상화를 의미합니다.
3주차 퀴즈 5번 문제였다. 기억을 되살려보자.
| 개념 | 의미 | 비유 |
|---|---|---|
| 추상화 (Abstraction) | 복잡한 걸 감추고 핵심만 보여줌 | 자동차 운전자가 엔진 구조 몰라도 운전 가능 |
| 가상화 (Virtualization) | 실제 자원을 가짜처럼 만들어 여러 개/다르게 사용 | 한 대 컴퓨터를 여러 대처럼 나눠 쓰는 것 |
반도체 칩의 성능 즉, 메모리의 용량이나 CPU의 속도가 약 24개월마다 2배로 증가하고, 가격은 2배씩 낮아진다는 법칙
- 소프트웨어의 발전 속도가 하드웨어의 발전 속도를 따라가지 못함
→ 서버 성능의 10%수준만 활용
→ 아깝다! 한대 서버를 여러대 처럼 써서 하드웨어 다쓰자
- 컴퓨팅 자원 비효율 문제를 해결하기 위해

OS / 컨테이너 가상화
참고 : 박지성 군의 가상화 정리글
지성이가 정리를 참 잘해놓았다.
OS 자체를 가상화
여러 개의 운영체제를 한 머신에서 돌릴 수 있게
위키피디아
- 가상 머신은 실제 하드웨어 위에 설치된 호스트 소프트웨어(= 제어 프로그램)를 통해 실행됨.
- 호스트 소프트웨어는 게스트 운영체제를 위해 가상의 컴퓨터 환경을 시뮬레이션함.
- 게스트 OS는 마치 자기 전용 하드웨어에 설치된 것처럼 독립적으로 실행됨.
- 여러 개의 가상 머신을 하나의 물리적 컴퓨터 위에서 동시에 실행할 수 있음 (단, 리소스 제한 있음).
- 게스트 OS는 호스트 OS와 다를 수도 있음.
- 게스트 OS가 동작하기 위해, 하드디스크, 네트워크 카드 등 가상 장치 인터페이스도 함께 제공되어야 함.

| 장점 | |
|---|---|
| 🔹 격리성 | VM 내 작업이 호스트 OS에 영향을 주지 않음 |
| 🔹 멀티 OS 실행 | 한 PC에서 Windows, Linux 등 여러 OS 사용 가능 |
| 🔹 복원 용이 | 스냅샷으로 상태 저장 및 복구 가능 |
| 🔹 관리 편리 | 개별 VM 단위로 운영/테스트 환경 관리 쉬움 |
| 🔹 자원 최적화 | |
| 단일 서버로 다양한 환경 운용 가능 |
| 단점 | |
|---|---|
| 🔸성능 저하 | 하이퍼바이저 + OS 오버헤드로 실행 속도 느림 |
| 🔸 자원 소비 큼 | VM마다 OS 포함 → 메모리/디스크 소모 큼 (ex. Windows 5GB) |
| 🔸 불안정성 증가 | VM이 많아지면 성능, 안정성 관리 어려움 |
| 🔸 느린 부팅 | 각 VM은 실제 OS를 부팅해야 함 |

구조 설명:
최신 특징 및 장점:
단점:
대표 제품:
참고:
| 방식 | 비유 |
|---|---|
| 전가상화 | 외국인이 말할 때 통역사가 실시간 번역 (느림) |
| 반가상화 | 외국인이 아예 현지어로 말해줌 (빠름, 근데 언어를 배워야 함) |
| HAV | 통역 없이, 자동 번역 이어폰 착용함 (빠르고 아무 변화 없이 작동됨) 😎 |
| 항목 | 전가상화 (Full Virtualization) | 반가상화 (Paravirtualization) | HAV (Hardware-Assisted Virtualization) |
|---|---|---|---|
| 기본 개념 | 게스트 OS를 속여서 실제 하드웨어처럼 보이게 함 | 게스트 OS가 가상 환경임을 인지하고 협조 | CPU가 가상화를 직접 지원해줌 |
| 게스트 OS 인식 | "나는 진짜 하드웨어 위에 있음" | "나는 가상 환경에 있음" | "나는 진짜 하드웨어 위에 있음" |
| 게스트 OS 수정 필요 | 없음 | 있음 (커널 수정 필요) | 없음 |
| 명령 처리 방식 | 하이퍼바이저가 모든 명령 가로채서 처리 | 특권 명령은 OS가 하이퍼콜로 하이퍼바이저에게 직접 요청 | CPU가 가상화 전용 명령어로 직접 처리 |
| 성능 | 느림 (소프트웨어 시뮬레이션) | 빠름 (협력 덕분) | 매우 빠름 (하드웨어 가속) |
| 호환성 | 높음 (Windows, Linux 모두 OK) | 낮음 (수정된 리눅스만 가능) | 높음 (표준 CPU 지원 시 모두 가능) |
| 비유 | "OS를 속여서 몰래 처리" | "OS가 직접 도와줌" | "CPU가 도와줌" |
| 사용 예시 | 초기 VMware, QEMU | Xen (리눅스용) | VMware ESXi, KVM, Hyper-V, AWS Nitro |
| 현대 사용 여부 | 거의 안 씀 | 제한적 사용 | 사실상 표준 방식 |

구조 설명:
특징 및 장점:
단점:
대표 제품:
참고:
| 항목 | Type 1 하이퍼바이저 (Bare-Metal) | Type 2 하이퍼바이저 (Hosted) |
|---|---|---|
| 설치 위치 | 하드웨어 위에 직접 설치 | 기존 운영체제 위에 설치 |
| 호스트 OS | 없음 | 있음 (필수) |
| 실행 구조 | 하드웨어 → 하이퍼바이저 → 게스트 OS | 하드웨어 → 호스트 OS → 하이퍼바이저 → 게스트 OS |
| 성능 | 오버헤드 적고 성능 우수 | 성능 손실 있음 (호스트 OS 거침) |
| 보안성과 격리성 | 높음 (VM 간 간섭 없음) | 낮음 (호스트에 영향 받음) |
| GUI / 관리 도구 | 전통적으로 없음 (요즘은 일부 웹 콘솔 제공) | 대부분 GUI 제공, 사용 편리 |
| 사용 환경 | 서버, 데이터센터, 클라우드 인프라 | 개인용, 개발·테스트 환경 |
| 대표 제품 | VMware ESXi, AWS Nitro, Hyper-V (Server) | VirtualBox, VMware Workstation, Parallels |
| 장점 | 성능과 안정성, 자원 격리 | 사용 편의성, 빠른 설치 및 실습 |
| 단점 | 초기 설정 복잡, 관리 도구 필요 | 성능 낮고 보안성 낮음 |
| 사용 예 | AWS EC2, 기업 서버 | Windows에서 Ubuntu 실습 |
하이퍼바이저처럼 OS 전체를 가상화하지 않고,
하나의 OS 내에서 여러 개의 격리된 실행 환경(=컨테이너) 을 만들어주는 기술
- 도커는 하이퍼바이저가 아니라 커널 기반 격리 기술
- Type 1/2 분류 대상이 아님
- 도커는 리눅스 커널 기반 → windows, mac 에서는 몰래 vm 돌린다.(Like Type 2)
- 호스트OS와 커널을 공유함
운영체제(OS)의 핵심부
→ 하드웨어와 사용자 프로그램 사이에서 중간다리 역할을 해주는 뇌같은 존재
- 모든 프로그램은 직접 하드웨어를 만지는게 아님
- 커널한테 요청해서 처리
커널은 공유하지만, 나머지 실행환경은 전부 격리된 프로세스 집합
- 하나의 OS 위에서 다른 앱과 격리해서 나만의 작은 공간을 마련
- 도커 이미지로부터 만들어진 실제 실행 인스턴스

VM은 OS 전체를 포함한 가상화,
Docker는 OS는 공유하고 환경만 격리해서 훨씬 가볍고 빠름
컨테이너를 실행하기 위한 실행 환경(앱 + 파일 + 설정)을 담은 ‘정적인 설계도’
- 도커 이미지 = “설치 + 설정 + 코드”가 다 적용된 미리 저장된 실행 환경
- 컨테이너는 이걸 복사해서 바로 실행하는 것
- 그럼 여러 컨테이너를 실행하려면 설계도를 다 다운받아야 하는 것 아닌가?
- 레이어 구조로 되어 있어서 중복 다운로드를 안함
ubuntu= A + B + C
nginx= A + B + C + nginx
webapp= A + B + C + nginx + source- 소스만 바뀌면 그 레이어만 새로 받으면 됨
→ A, B, C, nginx는 이미 캐시돼 있으므로 재사용
| 항목 | VM | Docker |
|---|---|---|
| 가상화 범위 | 하드웨어 전체 | 운영체제 수준 |
| 커널 | 각 VM이 독립 커널 | 커널 공유 |
| 속도 | 느림 (부팅 필요) | 빠름 (즉시 실행) |
| 용량 | 큼 (수 GB) | 작음 (수 MB ~ 수백 MB) |
CPU, 메모리, 저장장치, 네트워크 같은 컴퓨터의 물리적 자원들을
논리적으로 분할하거나 묶어서 사용하는 기술
- OS가 개별 프로세스마다 독립된 리소스를 가진 것처럼 보여줌
- 실제로는 물리 자원을 공유함
| 항목 | 무엇을 가상화? | 왜 필요해? | 결과 |
|---|---|---|---|
| 가상 메모리 | 메모리 공간 | 1. 물리 메모리 부족 2. 프로세스 격리 | 각 프로세스가 독립된 주소 공간처럼 사용 |
| 프로세스(스케줄링) | CPU 자체 | CPU는 하나인데 프로세스는 많음 | CPU를 번갈아 사용하면서도 마치 독점하는 것처럼 |
| 파일 시스템 추상화 | 장치와 I/O | 다양한 장치를 일관되게 사용 | 다양한 장치(I/O)를 동일한 파일 인터페이스로 제공 |
운영체제가 각 프로세스에게 독립된 메모리 공간을 제공하고,
물리 메모리가 부족할 때는 디스크를 활용해 확장하는 기술
| 목적 | 설명 |
|---|---|
| 1. 프로세스 간 메모리 격리 | 프로세스끼리 메모리 침범을 막고 독립된 주소 공간을 제공 |
| 2. 물리 메모리 확장 | 실제 RAM이 부족해도 디스크(Swap)를 활용해 프로그램 실행 유지 |

| 개념 | 설명 |
|---|---|
| 가상 주소 | 프로세스가 보는 논리 주소 공간 |
| 물리 주소 | 실제 RAM 상의 주소 |
| 페이지(Page) | 고정 크기(보통 4KB)의 메모리 단위 |
| 페이지 테이블 | 가상 주소 → 물리 주소 매핑 구조 |
| TLB | 페이지 테이블 캐싱용 고속 메모리 |
| Swap 공간 | RAM이 부족할 때 사용하는 디스크 영역 |
| 알고리즘 | 설명 |
|---|---|
| FIFO | 가장 먼저 들어온 페이지 제거 |
| LRU | 가장 오래 안 쓰인 페이지 제거 |
| Clock | LRU의 근사 구현 (원형 포인터) |
| Optimal | 이론적으로 가장 오랫동안 안 쓸 페이지 제거 (현실 불가능) |
하나의 CPU를 여러 프로세스가 마치 동시에 실행되는 것처럼 보이게 하는 기술
→ 실제론 시간을 잘게 쪼개서 CPU를 번갈아 배정함
이걸 엄청 빠르게 반복해서 사용자 눈에는 동시에 실행되는 것처럼 보임
| 알고리즘 | 설명 |
|---|---|
| FIFO | 먼저 온 순서대로 실행 |
| SJF | 최단 작업 우선 |
| STCF | 최소 잔여시간 우선 |
| Round Robin | 고정 시간 단위로 순환 실행 (→ 시간 가상화의 핵심 방식) |
운영체제가 다양한 입출력 장치들(디스크, 키보드, 프린터 등)을
“파일”이라는 공통된 인터페이스로 감싸서
동일한 방식으로 다룰 수 있게 해주는 것
GNU 컴파일러 모음 (GNU Compiler Collection)의 약자이다. GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러이다.
-E)-S)-c)gcc -E hello.c -o hello.i # 전처리
gcc -S hello.i -o hello.s # 컴파일
gcc -c hello.s -o hello.o # 어셈블리
gcc hello.o -o hello # 링킹
----------------------------------------------------
gcc hello.c -o hello # 위 과정 한번에 하기
| 옵션 | 설명 |
|---|---|
-o | 출력 파일 지정 |
-Wall | 모든 경고 메시지 표시 |
-g | 디버깅 정보 포함 (GDB용) |
-O, -O2, -O3 | 최적화 레벨 설정 |
-c | 컴파일만 하고 링크는 안 함 (object 파일 .o 생성) |
-S | 어셈블리 코드로 변환 |
-E | 전처리 결과만 출력 |