[CS] 운영체제(OS, Operating System)

HAHAHELLO·2025년 3월 11일

CS

목록 보기
12/14

운영체제

운영체제(OS, Operating Sysetm)란 하드웨어 위에 설치되어 하드웨어 계층과 다른 소프트웨어 계층을 연결하는 소프트웨어 계층이다.
컴퓨터 시스템의 자원을 관리하고, 사용자가 컴퓨터를 사용할 수 있는 환경을 제공하는 역할을 수행한다. CPU, 메모리 같은 컴퓨터 자원은 제한적이라서 이러한 자원을 관리하는 일은 매우 중요하다.

운영체제(OS)를 간단히 설명하자면, 컴퓨터를 켜면 가장 먼저 실행되는 프로그램이라고 할 수 있다. 예를 들어, 우리가 스마트폰을 사용할 때 앱을 실행하고 여러 작업을 동시에 할 수 있는 이유도 OS가 있기 때문이다.

대표적인 OS로는 윈도우(Window), 맥(iOS), 리눅스(Linux), 유닉스(Unix) 등이 존재한다.

운영체제의 역할

OS는 사용자나 하드웨어(컴퓨터 부품) 사이에서 중간 역할을 한다.
예를 들어, 내가 키보드로 입력하면, OS가 이를 받아서 컴퓨터가 이해할 수 있도록 전달해준다.

운영체제의 핵심 역할은 아래와 같다.

  • 프로세스 관리: 여러 개의 프로그램을 동시에 실행할 수 있도록 조정한다. 예를 들어, 멀티태스팅, CPU 스케줄링, 프로세스 동기화 등이 있다.
  • 메모리 관리: 실행 중인 프로그램이 사용할 메모리를 적절히 분배한다. 가상 메모리, 캐시 등이 있다.
  • 파일 시스템 관리: 파일을 저장, 삭제, 수정하는 기능을 제공하다.
  • 입출력(I/O) 관리: 키보드, 마우스, 프린터 등과의 데이터 교환을 관리한다. 디스크 스케줄링, 버퍼링, 캐싱 등이 있다.
  • 보안 및 보호: 사용자 계정 관리, 악성 프로그램을 차단 등을 수행한다.

프로세스와 스레드

프로세스(Process)

프로세스(Process)란 실행 중인 프로그램이며, 독립된 메모리 공간을 갖는다.

즉, 프로그램(앱)이 실행되면 프로세스가 된다고 할 수 있다. 프로그램(코드) 자체는 단순한 파일이지만, 실행되면 프로세스가 된다.
예를 들어, 크롬을 실행하면 크롬 프로세스가 만들어지고, 여러 개의 탭을 열면 각각의 별도 프로세스가 생성된다.

PCB(Process Control Block)를 통해 프로세스 상태, 스케줄링 정보, 리소스 정보 등을 저장한다.

여기서 PCB란 운영체제가 프로세스를 관리하기 위해 저장하는 정보(데이터 구조체)를 말한다. 각 프로세스마다 하나의 PCB가 생성되며 프로세스의 현재 상태, 자원 정보, 실행 정보 등을 저장한다.

프로세스의 상태 변화

OS는 여러 개의 프로그램을 동시에 실행하기 때문에 각 프로세스의 상태를 관리해야 한다. 프로세스는 아래와 같이 5가지 상태를 갖는다.

  • New: 새로 생선된 프로그램을 실행한다.
  • Ready: CPU 할당을 대기하면서 실행 준비가 완료되기를 기다린다.
  • Running: CPU에서 프로그램이 실행된다.
  • Blocked: 입출력을 받기 위한 입출력 대기로 전환된다.
  • Terminated: 실행이 종료된다.

스레드(Thread)

스레드프로세스 내에서 실행되는 작업 단위를 말한다. 하나의 프로세스는 여러 개의 작업(스레드)으로 나뉠 수 있다.
예를 들어, 크롬을 실행하면 한 개의 프로세스가 생성되지만, 한 스레드는 웹페이지를 로드하고, 다른 스레드는 음악을 재생하는 식으로 동작한다.

컨텍스트 스위칭(Context Switching)이란 CPU가 실행 중인 프로세스를 변경할 때 발생하는 오버헤드를 말한다. 프로세스 간 전환 시 PCB 저장 및 복원 과정이 필요하다.
아래 계속 나오는 개념이기 때문에 알아 두고 가자.

멀티스레딩(Multi-threading)

멀티스레딩(Multi-threading)이란 하나의 프로세스에서 여러 개의 작업(스레드)을 동시에 수행하는 기술을 말한다. 스레드는 프로세스의 자원(Code, Data, Heap)을 공유하지만, Stack 영역은 독립적으로 갖는다.
멀티스레딩을 통해 CPU 활용도를 높이고, 병렬 작업을 수행하여 성능을 향상시킬 수 있다.

커널-레벨 스레드(Kernel-level Thread, KLT)

커널-레벨 스레드(KLT)OS가 직접 스레드를 관리한다. 스레드 스케줄링과 동기화도 OS 커널이 담당한다. 커널이 여러 개의 스레드를 관리하므로, 하나의 스레드가 블록되더라도 다른 스레드는 계속 실행될 수 있다.

동작 방식
프로세스가 여러 개의 스레드를 생성하면, OS 커널에서 각 스레드를 직접 관리한다. 스레드 간의 컨텍스트 스위칭이 발생하며, 커널이 개입하여 상태를 저장하고 전환한다. CPU가 직접 여러 스레드를 실행할 수 있다.

장점

  • 하나의 스레드가 블록되어도 다른 스레드는 계속 실행이 가능하기 때문에 병렬 처리 성능이 우수하다.
  • 다중 코어에서 진짜 멀티스레딩(병렬 처리)이 가능하다.

단점

  • 컨텍스트 스위칭 비용이 높다. OS가 개입하므로 오버헤드가 발생하기 때문이다.
  • 스레드 생성과 관리가 상대적으로 복잡하다.

유저-레벨 스레드(User-Level Thred, ULT)

유저-레벨 스레드(ULT)사용자 영역에서 관리하며 컨텍스트 스위칭이 빠르다. OS가 아닌 라이브러리(POSIX Threads 등)를 사용하여 스레드를 생성하고 스케줄링한다.
OS는 스레드의 존재를 알지 못하며 플세스 단위로만 관리한다.

동작 방식
라이브러리가 스레드를 생성하고 관리하다. 여기서 OS는 개입하지 않는다. 스레드 간 컨텍스트 스위칭이 빠르다. OS가 개입하지 않기때문에 오버헤드도 적다.
CPU가 프로세스 단위로 실행하므로, OS는 하나의 프로세스만 보고 실행 스레드는 알지 못한다.

장점

  • OS 개입이 필요 없기 때문에 컨텍스트 스위칭 비용이 낮다
  • 스레드 생성과 관리가 상대적으로 쉽다.

단점

  • 한 스레드가 블록되면, 모든 스레드가 블록된다.
  • OS가 스레드 개수를 모르믈, 다중 코어 활용이 어렵다.

언제 KLT, ULT를 사용해야 할까?

커널-레벨 스레드(KLT) 사용해야 하는 경우

  • 멀티코어 시스템에서 실제 병렬 처리(Parallel Processing)가 필요한 경우
  • 멀티스레딩을 적극적으로 활용해야 하는 고성능 애플리케이션 (예: 웹 서버, 데이터베이스 서버)
  • 스레드가 I/O 작업을 많이 수행하는 경우 (한 스레드가 블록되더라도, 다른 스레드가 계속 실행되어야 함)

유저-레벨 스레드(ULT) 사용해야 하는 경우

  • 스레드 생성/삭제 속도가 중요한 경우 (예: 가벼운 작업을 빠르게 처리해야 하는 애플리케이션)
  • OS 개입 없이 스레드를 직접 제어해야 하는 경우 (예: 가상 머신, 특정 언어의 런타임 환경)
  • 싱글 코어 환경에서 멀티스레딩을 흉내내야 할 때 (병렬 처리가 필요 없는 경우)

프로세스와 스레드 차이점

  • 프로세스는 독립적인 실행 단위, 스레드는 프로세스 내의 실행단위다.
  • 프로세스 간에는 메모리가 독립적이지만, 스레드는 코드, 데이터, 힙을 공유한다.
  • 멀티스레딩은 빠르지만 동기화 문제(Raco Condition, Deadlock 등)가 발생할 수 있다.
  • 멀티프로세싱은 독립적인 프로세스를 여러개 실행하여 안전하지만, 오버헤드는 높다.
  • 반면, 멀티스레딩은 하나의 프로세스 내에서 여러 스레드를 실행하기 때문에 빠르지만 동기화 문제 발생 가능성이 있다.

CPU 스케줄링

CPU 스케줄링이란 한 번에 하나의 프로세스만 실행 가능한 컴퓨터에게 CPU를 어떤 프로세스에 할당할지 순서를 정해주는 것이다. 즉, 한정된 CPU 자원을 여러 프로세스에 배분하는 방법이다.

CPU 스케줄링 알고리즘 종류

  • FCFS(First Come First Serve): 먼저 온 프로세스부터 실행한다.(비선점형)
  • SJF(Shortest Job First): 실행 시간이 가장 짧은 프로세스부터 실행한다. (비선점형)
  • SRTF (Shortest Remaining Time First): 실행 시간이 가장 짧은 프로세스를 우선 처리한다. (선점형)
  • Round Robin(RR): 각 프로세스에 일정 시간씩 CPU를 할당하고 시간이 지나면 다음 프로세스로 변경한다. (선점형)
  • Priority Scheduling: 우선순위가 높은 프로세스를 먼저 실행한다. (선점/비선점형)
  • MLFQ (Multi-Level Feedback Queue): 여러 개의 큐를 사용하여 우선순위를 동적으로 조정한다.

메모리 관리

OS는 프로세스가 사용할 메모리를 관리해야 한다. 프로세스가 실행될 때 RAM(메모리)에서 실행되므로, 운영체제는 메모리를 효율적으로 배분해야한다.

가상 메모리 (Virtual Memory)

실행 중인 프로그램이 RAM보다 더 많은 메모리를 필요로 할 때, 하드디스크의 일부를 가상 메모리처럼 사용하는 기법이다. 페이지 단위로 스왑하여 사용한다.

장점은 프로그램이 실제 RAM보다 더 많은 메모리를 사용할 수 있다는 것이지만, 단점은 디스크 I/O가 증가하면 속도가 느려지는 스레싱(Thrashing) 문제가 발생한다는 것이다.

페이징(Paging)과 세그멘테이션(Segmentation)

페이징(Paging)은 메모리를 작고 균등한 크기의 페이지로 나누어 관리한다. 내부 단편화가 발생할 수 있다.

페이지 교체 알고리즘

  • FIFO (First In First Out): 가장 오래된 페이지를 교체한다.
  • LRU (Least Recently Used): 가장 오랫동안 사용되지 않은 페이지를 교체한다.
  • LFU (Least Frequently Used): 참조 횟수가 가장 적은 페이지를 교체한다.
  • Optimal (OPT): 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체한다.

세그멘테이션(Segmentation)은 메모리를 기능별로 나누어 관리한다. 따라서 메모리의 크기는 불균등하다. 외부 단편화가 발생할 수 있다.

파일 시스템 & I/O 관리

파일 시스템이란 OS가 파일을 저장하고 관리하는 방식이다.
대표적인 파일 시스템으로는 FAT32, NTFS (Windows), ext3, ext4 (Linux), APFS (MacOS) 등이 있다.

디스크 스케줄링 알고리즘

OS는 디스크에서 데이터를 효율적으로 읽고 쓰기 위해 아래와 같은 스케쥴링 알고리즘을 사용한다.

  • FCFS: 요청 순서대로 처리한다.
  • SSTF(Shortest Seek Time First): 가장 가까운 데이터부터 처리한다.
  • SCAN(엘리베이터 알고리즘): 디스크 헤드가 일정 방향으로 이동하며 요청을 처리한다.
  • C-SCAN (Circular SCAN): SCAN과 유사하지만, 끝에 도달하면 처음으로 되돌아간다.

동기화와 데드락

프로세스 동기화란 여러 개의 프로세스가 공유 자원에 접근할 때 충돌을 방지하는 기법이다.

데드락은 프로세스가 서로의 자원을 기다리다가 영원히 멈추는 현상을 말한다.
데드락 발생조건은 아래와 같다. (Coffman 조건)

  • 상호 배제 (Mutual Exclusion)
  • 점유와 대기 (Hold and Wait)
  • 비선점 (No Preemption)
  • 순환 대기 (Circular Wait)

데드락 해결 방법

  • 예방: 4가지 조건 중 하나 이상을 제거한다.
  • 회피: 은행원 알고리즘을 사용한다.
  • 탐지 및 복구: 데드락을 감지 후 해결한다.

선점형(Preemptive)과 비선점형(Non-preemptive) 스케줄링

선점형은 CPU를 사용하던 프로세스를 강제로 중단하고 다른 프로세스에 할당이 가능하다.
반면, 비선점형은 프로세스가 CPU를 점유하면 종료될 때까지 실행된다.

profile
데이터 엔지니어가 되어 봅시다 🌈

0개의 댓글