[TIL/크래프톤 정글] DAY 37

배재준·2025년 4월 15일

크래프톤 정글 - TIL

목록 보기
30/93
post-thumbnail

2025.04.15

TIL(TODAY I LEARN)


  • 오늘한 내용 : CS - 가상화, GCC

  • WEEK05: C Pointer(&, * 연산자), 동적 메모리 할당, Linked List, Stack, Queue, Binary Tree, Binary Search Tree, 동적 프로그래밍, 그리디 알고리즘

  • 가상화? 추상화? 아직도 헷갈린다.


가상화

3주차 퀴즈
5. 추상화는 전산학에서 가장 중요한 개념입니다. 운영체제 관점에서 4가지 추상화를 설명해주세요 (1점)

파일은 입출력 장치의 추상화이며
가상메모리는 프로그램 메모리의 추상화이고
프로세스는 실행중인 프로그램의 추상화입니다.
추가로 가상머신이 있으며, 이는 운영체제, 프로세서, 프로그램모두를 포함하는 컴퓨터 전체의 추상화를 의미합니다.

3주차 퀴즈 5번 문제였다. 기억을 되살려보자.


가상화? 추상화? 뭐가 다르지?

개념의미비유
추상화 (Abstraction)복잡한 걸 감추고 핵심만 보여줌자동차 운전자가 엔진 구조 몰라도 운전 가능
가상화 (Virtualization)실제 자원을 가짜처럼 만들어 여러 개/다르게 사용한 대 컴퓨터를 여러 대처럼 나눠 쓰는 것

가상화?

  • 가상화(假像化, virtualization)는 컴퓨터에서 컴퓨터 리소스의 추상화를 일컫는 광범위한 용어
  • (1) 컴퓨팅 리소스를 ‘추상화’ 시켜서 (2) 하나의 물리 리소스를 여러 개의 논리 리소스처럼 기능시키거나 (3) 여러 개의 물리 리소스들을 묶어서 하나의 논리 리소스인 것처럼 사용
    • 리소스(컴퓨팅 자원) - CPU, 메모리, 스토리지, 네트워크 등 컴퓨터를 구성하는 요소

추상화

  • 추상화(abstraction)는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것
  • 사용자는 내부 알 필요 없다! 쓰기만 해라

등장 배경

무어의 법칙

반도체 칩의 성능 즉, 메모리의 용량이나 CPU의 속도가 약 24개월마다 2배로 증가하고, 가격은 2배씩 낮아진다는 법칙

  • 소프트웨어의 발전 속도가 하드웨어의 발전 속도를 따라가지 못함
→ 서버 성능의 10%수준만 활용

→ 아깝다! 한대 서버를 여러대 처럼 써서 하드웨어 다쓰자

- 컴퓨팅 자원 비효율 문제를 해결하기 위해


  • 가상화는 두가지로 분류? 될 수 있다.
    • 플랫폼 / 리소스

플랫폼 가상화

OS / 컨테이너 가상화
참고 : 박지성 군의 가상화 정리글

  • 지성이가 정리를 참 잘해놓았다.

  • OS 자체를 가상화

  • 여러 개의 운영체제를 한 머신에서 돌릴 수 있게

위키피디아

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

가상 머신(Virtual Machine, VM)

  • 자체 컴퓨팅 자원과 OS를 갖춘 가상 컴퓨팅 환경
  • 생성된 VM - 게스트 서버
  • VM들이 구동되는 서버 - 호스트 서버

가상 머신(VM)의 장단점

장점
🔹 격리성VM 내 작업이 호스트 OS에 영향을 주지 않음
🔹 멀티 OS 실행한 PC에서 Windows, Linux 등 여러 OS 사용 가능
🔹 복원 용이스냅샷으로 상태 저장 및 복구 가능
🔹 관리 편리개별 VM 단위로 운영/테스트 환경 관리 쉬움
🔹 자원 최적화
단일 서버로 다양한 환경 운용 가능

단점
🔸성능 저하하이퍼바이저 + OS 오버헤드로 실행 속도 느림
🔸 자원 소비 큼VM마다 OS 포함 → 메모리/디스크 소모 큼 (ex. Windows 5GB)
🔸 불안정성 증가VM이 많아지면 성능, 안정성 관리 어려움
🔸 느린 부팅각 VM은 실제 OS를 부팅해야 함

하이퍼바이저(Hypervisor)

  • 가상화 계층을 구현해주는 소프트웨어
  • 물리 하드웨어와 가상 머신의 영역을 분리하고 자신이 그 사이에서 중간 관리자, 즉 인터페이스 역할
  • VM들이 자신이 가상화되었는지도 모르게 해버리는 놈

하이퍼바이저 유형

Type 1 (Bare-Metal, Native Hypervisor)

구조 설명:

  • 물리 하드웨어 위에 직접 설치되는 하이퍼바이저
  • 별도의 호스트 운영체제 없이, 하드웨어 자원을 직접 관리
  • 그 위에 여러 게스트 OS(가상 머신) 가 각각 독립적으로 실행됨

최신 특징 및 장점:

  • 오버헤드 최소화 → 성능 효율 우수
  • 게스트 OS 간 격리성 강화 → 보안에 유리
  • 최신 제품들은 하드웨어 가상화 지원(HAV) 을 기반으로 성능 개선
  • 일부 제품은 웹 기반 관리 도구/콘솔 기능도 내장 (GUI 지원)

단점:

  • 전통적으로는 GUI나 직접적인 관리 기능이 부족했음
  • 여전히 VM 관리를 위한 별도의 도구나 서버가 필요한 경우 있음
  • 물리적 자원에 대한 직접 접근이 필요한 경우 설정 복잡

대표 제품:

  • VMware ESXi – 가장 널리 쓰이는 엔터프라이즈 하이퍼바이저
  • Microsoft Hyper-V (Server Core 버전)
  • Citrix Xen / XCP-ng
  • AWS Nitro Hypervisor – AWS EC2에서 사용하는 경량형 Type 1 (하드웨어 지원 기반)

참고:

  • 전가상화 (Full Virtualization): OS는 진짜 하드웨어라고 착각하게 하고, 하이퍼바이저가 모든 걸 대신 처리함
  • 반가상화 (Paravirtualization): OS에게 '넌 가상 환경에 있어'라고 알려주고, 직접 하이퍼바이저한테 요청하게 함
  • HAV (Hardware-Assisted Virtualization): CPU가 아예 가상화 기능을 내장하고 있어서, 하이퍼바이저가 굳이 애써 흉내 안 내도 됨
방식비유
전가상화외국인이 말할 때 통역사가 실시간 번역 (느림)
반가상화외국인이 아예 현지어로 말해줌 (빠름, 근데 언어를 배워야 함)
HAV통역 없이, 자동 번역 이어폰 착용함 (빠르고 아무 변화 없이 작동됨) 😎

전가상화 / 반가상화 / HAV 비교 요약

항목전가상화 (Full Virtualization)반가상화 (Paravirtualization)HAV (Hardware-Assisted Virtualization)
기본 개념게스트 OS를 속여서 실제 하드웨어처럼 보이게 함게스트 OS가 가상 환경임을 인지하고 협조CPU가 가상화를 직접 지원해줌
게스트 OS 인식"나는 진짜 하드웨어 위에 있음""나는 가상 환경에 있음""나는 진짜 하드웨어 위에 있음"
게스트 OS 수정 필요없음있음 (커널 수정 필요)없음
명령 처리 방식하이퍼바이저가 모든 명령 가로채서 처리특권 명령은 OS가 하이퍼콜로 하이퍼바이저에게 직접 요청CPU가 가상화 전용 명령어로 직접 처리
성능느림 (소프트웨어 시뮬레이션)빠름 (협력 덕분)매우 빠름 (하드웨어 가속)
호환성높음 (Windows, Linux 모두 OK)낮음 (수정된 리눅스만 가능)높음 (표준 CPU 지원 시 모두 가능)
비유"OS를 속여서 몰래 처리""OS가 직접 도와줌""CPU가 도와줌"
사용 예시초기 VMware, QEMUXen (리눅스용)VMware ESXi, KVM, Hyper-V, AWS Nitro
현대 사용 여부거의 안 씀제한적 사용사실상 표준 방식

Type 2 (Hosted Hypervisor)

구조 설명:

  • 기존 운영체제(호스트 OS) 위에 설치되는 소프트웨어 형태의 하이퍼바이저
  • 일반 프로그램처럼 동작하며, 그 위에 게스트 OS(가상 머신)가 실행됨
  • 게스트 OS는 하드웨어 상에서 3번째 계층에 위치하게 됨

특징 및 장점:

  • 설치와 사용이 간편 → 개인용, 개발/테스트 환경 구성에 적합
  • 기존 OS가 있는 시스템에서도 별도 환경 없이 바로 사용 가능
  • 대부분 GUI 기반 관리 도구 제공 → VM 생성, 설정, 제어 등이 쉬움
  • 윈도우, macOS 환경에서도 다양한 OS 실습 가능

단점:

  • 게스트 OS가 하드웨어에 직접 접근하지 못해 성능 오버헤드가 큼
  • 호스트 OS에 의존 → 호스트에 문제가 생기면 게스트에도 영향
  • VM 간 격리성 및 보안성은 Type 1에 비해 상대적으로 낮음

대표 제품:

  • VMware Workstation / Fusion
  • Oracle VirtualBox
  • Parallels Desktop (macOS 용)
  • Docker Desktop (WSL2 기반 구조는 Type 2에 가까움)

참고:

  • 개인 개발 환경이나 리눅스 실습 환경 구성 시 자주 사용됨
  • 예: Windows에서 VirtualBox로 Ubuntu 설치하여 VM 사용

Type 1 vs Type 2 하이퍼바이저 비교

항목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 실습

그럼 도커(Docker)는?

하이퍼바이저처럼 OS 전체를 가상화하지 않고,

하나의 OS 내에서 여러 개의 격리된 실행 환경(=컨테이너) 을 만들어주는 기술

  • 도커는 하이퍼바이저가 아니라 커널 기반 격리 기술
    • Type 1/2 분류 대상이 아님
    • 도커는 리눅스 커널 기반 → windows, mac 에서는 몰래 vm 돌린다.(Like Type 2)
  • 호스트OS와 커널을 공유함

커널(Kernel)

운영체제(OS)의 핵심부

하드웨어와 사용자 프로그램 사이에서 중간다리 역할을 해주는 뇌같은 존재

  • 모든 프로그램은 직접 하드웨어를 만지는게 아님
    • 커널한테 요청해서 처리

컨테이너(Container)

커널은 공유하지만, 나머지 실행환경은 전부 격리된 프로세스 집합

  • 하나의 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 vs Docker

항목VMDocker
가상화 범위하드웨어 전체운영체제 수준
커널각 VM이 독립 커널커널 공유
속도느림 (부팅 필요)빠름 (즉시 실행)
용량큼 (수 GB)작음 (수 MB ~ 수백 MB)

리소스 가상화

CPU, 메모리, 저장장치, 네트워크 같은 컴퓨터의 물리적 자원들을
논리적으로 분할하거나 묶어서 사용하는 기술

  • OS가 개별 프로세스마다 독립된 리소스를 가진 것처럼 보여줌
  • 실제로는 물리 자원을 공유함

OS가 하는 대표적인 가상화 3대장

항목무엇을 가상화?왜 필요해?결과
가상 메모리메모리 공간1. 물리 메모리 부족 2. 프로세스 격리각 프로세스가 독립된 주소 공간처럼 사용
프로세스(스케줄링)CPU 자체CPU는 하나인데 프로세스는 많음CPU를 번갈아 사용하면서도 마치 독점하는 것처럼
파일 시스템 추상화장치와 I/O다양한 장치를 일관되게 사용다양한 장치(I/O)를 동일한 파일 인터페이스로 제공

가상 메모리(Virtual Memory)

운영체제가 각 프로세스에게 독립된 메모리 공간을 제공하고,

물리 메모리가 부족할 때는 디스크를 활용해 확장하는 기술


목적설명
1. 프로세스 간 메모리 격리프로세스끼리 메모리 침범을 막고 독립된 주소 공간을 제공
2. 물리 메모리 확장실제 RAM이 부족해도 디스크(Swap)를 활용해 프로그램 실행 유지

동작 과정

참고 블로그

  1. CPU가 가상 주소(Virtual Address)를 생성
  2. 운영체제가 페이지 테이블(Page Table) 을 통해
    가상 주소를 물리 주소로 변환 (Address Translation)
  3. 자주 사용하는 변환은 TLB(고속 캐시)에 저장되어 빠르게 처리
  4. 만약 해당 페이지가 물리 메모리에 없으면
    페이지 폴트(Page Fault) 발생
    → 디스크(Swap)에서 페이지를 RAM으로 로드

핵심 개념 정리

개념설명
가상 주소프로세스가 보는 논리 주소 공간
물리 주소실제 RAM 상의 주소
페이지(Page)고정 크기(보통 4KB)의 메모리 단위
페이지 테이블가상 주소 → 물리 주소 매핑 구조
TLB페이지 테이블 캐싱용 고속 메모리
Swap 공간RAM이 부족할 때 사용하는 디스크 영역

페이지 폴트 (Page Fault)

  • RAM에 없는 가상 주소에 접근 시 발생하는 예외
  • 운영체제가 해당 페이지를 디스크에서 읽어와 메모리에 올림
  • 필요시 기존 페이지는 다른 곳으로 밀어냄 (Page Replacement)

페이지 교체 알고리즘 예시

알고리즘설명
FIFO가장 먼저 들어온 페이지 제거
LRU가장 오래 안 쓰인 페이지 제거
ClockLRU의 근사 구현 (원형 포인터)
Optimal이론적으로 가장 오랫동안 안 쓸 페이지 제거 (현실 불가능)

CPU 가상화 (시간 가상화)

하나의 CPU를 여러 프로세스가 마치 동시에 실행되는 것처럼 보이게 하는 기술

→ 실제론 시간을 잘게 쪼개서 CPU를 번갈아 배정


스케줄링과 컨텍스트 스위칭

1. 타임 슬라이싱 (Time Slicing)

  • CPU 시간을 작은 단위(time slice) 로 나눔
  • 각 프로세스가 짧은 시간 동안 CPU 사용 후 다음으로 교체됨

2. 컨텍스트 스위칭 (Context Switching)

  • 현재 실행 중인 프로세스의 상태(레지스터, PC 등)를 저장하고
  • 다음 프로세스의 상태를 복원하는 과정

이걸 엄청 빠르게 반복해서 사용자 눈에는 동시에 실행되는 것처럼 보임

스케줄링 알고리즘 종류

참고 블로그

알고리즘설명
FIFO먼저 온 순서대로 실행
SJF최단 작업 우선
STCF최소 잔여시간 우선
Round Robin고정 시간 단위로 순환 실행 (→ 시간 가상화의 핵심 방식)

I/O 추상화

운영체제가 다양한 입출력 장치들(디스크, 키보드, 프린터 등)을

“파일”이라는 공통된 인터페이스로 감싸서

동일한 방식으로 다룰 수 있게 해주는 것


참고 블로그

GCC란?

  • GCC는 GNU 컴파일러 모음 (GNU Compiler Collection)의 약자이다. GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러이다.

GNU란?

  • GNU는 GNU’s not UNIX 의 재귀약자로, 리처드 스톨먼이 각종 자유 소프트웨어들이 돌아가고 번영할 수 있는 기반 생태계를 구축하기 위해 시작한 프로젝트이다.

소스코드가 실행 파일이 되는 과정

  • 전처리 단계(-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            # 위 과정 한번에 하기

다양한 GCC 컴파일 옵션

옵션설명
-o출력 파일 지정
-Wall모든 경고 메시지 표시
-g디버깅 정보 포함 (GDB용)
-O, -O2, -O3최적화 레벨 설정
-c컴파일만 하고 링크는 안 함 (object 파일 .o 생성)
-S어셈블리 코드로 변환
-E전처리 결과만 출력

  • 가상화에서 페이지 개념들, 프로세스 스케줄링 등 운영체제에서 중요한 부분들을 더 주의 깊게 봐야할 것 같다.
  • 이번 C 과제를 하면서 도커란 녀석을 처음 써봤는데 간단하고 좋더라.

0개의 댓글