운영체제(Operation System)는 하드웨어와 소프트웨어 사이에서 중재자 역할을 하는 시스템 소프트웨어이다.
사용자가 하드웨어 자원을 쉽게 사용할 수 있도록 추상화된 환경을 제공한다.
대표적인 운영체제: Windows, macOS, Linux, Android, iOS
자원 관리
CPU, 메모리, 디스크, I/O 장치 등 한정된 하드웨어 자원을 효율적으로 관리하고 할당한다.
프로세스 관리
프로그램들이 실행되는 단위인 프로세스를 생성, 스케줄링, 동기화, 통신 등을 관리한다.
메모리 관리
한정된 메모리 공간을 여러 프로세스가 효율적으로 공유하고 사용할 수 있도록 관리한다.
파일 시스템 관리
데이터를 영구적으로 저장하고 관리하기 위한 파일 시스템을 제공한다.
I/O 시스템 관리
키보드, 마우스, 모니터 등 다양한 입출력 장치와의 상호작용을 관리한다.
보안 및 보호
시스템 자우너에 대한 불법적인 접근을 막고, 사용자 간의 간섭을 방지하여 시스템의 안정성을 유지한다.
효율성
시스템 자원을 최대한 활용하여 처리량을 높이고 응답 시간을 줄입니다.
사용자 편의성
사용자가 컴퓨터를 쉽고 편리하게 사용할 수 있는 환경을 제공합니다.
안정성
시스템 오류를 최소화하고, 장애 발생 시 복구를 지원하여 시스템이 안정적으로 동작하도록 합니다.
실행 중인 프로그램의 인스턴스이다. 운영체제로부터 독립적인 자원(메모리 공간, 코드, 데이터, 스택, 힙 등)을 할당받아 실행된다.
특징
독립적인 메모리 공간(Code, Data, Stack, Heap)을 가진다.
프로세스 간 자원 공유가 어렵고, IPC(Inter-Process Communication) 방식을 통해 통신한다.
하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.
Context Switching 시 오버헤드가 크다. (독립적인 자원들을 모두 교체해야 함)
오버헤드란 어떤 명령어를 처리하는데 소비되는 간접적, 추가적인 컴퓨터 자원을 의미한다.
예를들어, 10초 걸리는 기능이 간접적인 원인으로 20초걸린다면 오버헤드는 10초가 되는것이다.
프로세스 내에서 실행되는 실행의 흐름 단위. 프로세스의 자원을 공유하면서 자신만의 스택과 레지스터를 가진다.
특징
프로세스: 독립적인 환경에서 안정성을 중요하게 생각할 때 (예: 웹 브라우저의 각 탭, 서로 다른 애플리케이션)
스레드: 프로세스 내에서 여러 작업을 동시에 처리하여 효율성을 높이고자 할 때 (예: UI 스레드와 백그라운드 작업 스레드)
| 항목 | 프로세스 (Process) | 스레드 (Thread) |
|---|---|---|
| 정의 | 실행 중인 프로그램 | 프로세스 내 작업 단위 |
| 자원 | 독립된 메모리 공간 | 자원을 공유함 |
| 통신 | IPC(Inter-Process Communication) 필요 | 메모리 공유로 빠름 |
| 예시 | 크롬 브라우저 | 크롬 탭들 각각의 스레드 |
여러 개의 작업을 번갈아가며 처리하는 방식 (OS 수준)
장점
안정성: 각 프로세스가 독립적인 메모리 공간을 가지므로, 하나의 프로세스가 죽더라도 다른 프로세스에게 영향을 주지 않아 시스템 전체의 안정성이 높다.
자원 분리: 자원 관리가 명확하다.
단점
Context Switching 오버헤드: 독립적인 자원을 모두 교체해야 하므로 Context Switching 비용이 커서 성능 저하를 야기할 수 있다.
IPC 복잡성: 프로세스 간 통신(IPC)이 복잡하고 오버헤드가 발생한다.
자원 소모: 각 프로세스마다 독립적인 자원을 할당받으므로 많은 자원을 소모한다.
하나의 프로세스 안에서 여러 작업을 동시에 처리하는 방식
장점
자원 효율성: 스레드 간 자원(Code, Data, Heap)을 공유하여 메모리 사용량이 적고 효율적이다.
Context Switching 오버헤드 감소: 스택과 레지스터만 교체하면 되므로 Context Switching 비용이 적어 처리율이 높다.
데이터 공유 용이: 동일 프로세스 내에서 데이터 공유가 용이하여 협업이 빠르다.
단점
동기화 문제: 여러 스레드가 공유 자원에 동시에 접근할 때 동기화 문제(경쟁 상태, 데드락 등)가 발생할 수 있어 복잡한 동기화 메커니즘이 필요하다.
안정성 취약: 하나의 스레드에 문제가 발생하면 프로세스 전체에 영향을 줄 수 있어 안정성이 낮다.
디버깅 어려움: 공유 자원과 동기화 문제로 인해 디버깅이 어렵다.
동시다발적으로 실행되는 프로세스들은 공동의 목적으로 서로 협력하는데 프로세스들은 실행 순서와 자원의 일관성을 보장하기 위해서 동기화를 한다.
공유 데이터의 동시 접근은 데이터의 불일치 문제를 발생시킬 수 있기 때문이다.
경쟁 상태 (Race Condition): 여러 스레드가 공유 자원에 동시에 접근하여 예상치 못한 결과가 발생하는 상황.
교착 상태 (Deadlock): 둘 이상의 프로세스/스레드가 서로 상대방이 가지고 있는 자원을 기다리면서 무한히 대기하는 상태.
기아 (Starvation): 특정 프로세스/스레드가 자원을 계속 얻지 못하여 영원히 실행되지 못하는 상태.
뮤텍스 (Mutex)
Mutual Exclusion의 약자. 상호 배제를 의미한다.
하나의 스레드만이 공유 자원에 접근하도록 허용하는 잠금 메커니즘.
잠금을 획득한 스레드만 접근 가능하며, 작업이 끝나면 잠금을 해제하여 다른 스레드가 접근할 수 있도록 한다.
세마포어 (Semaphore)
자원의 개수를 기반으로 하는 동기화 기법.
카운터 변수를 두어 동시에 공유 자원에 접근할 수 있는 스레드의 수를 제어한다.
바이너리 세마포어(0 또는 1)는 뮤텍스와 유사하게 사용될 수 있다.
모니터 (Monitor)
뮤텍스와 조건 변수를 결합한 고급 동기화 기법.
공유 데이터를 보호하고, 조건에 따라 스레드를 대기시키거나 깨우는 기능을 제공한다.
자바의 synchronized 키워드나 C#의 lock이 대표적인 모니터 구현체.
실제 물리 메모리 크기와 상관없이 프로세스에게 큰 메모리 공간을 제공하고, 물리 메모리를 효율적으로 사용할 수 있도록 하는 기술
실제 메모리 주소(물리 주소)와는 독립적인 가상 주소(논리 주소) 공간으로 프로세스를 할당한다.
프로세스는 가상 주소를 사용하고, 운영체제는 가상 주소를 물리 주소로 매핑하여 실제 메모리에 접근한다.
메모리가 부족할 경우, 사용하지 않는 메모리 영역을 하드디스크의 스와핑 공간으로 옮겨 메모리를 확보한다. (페이지 아웃/스왑 아웃)
필요할 때 다시 스와핑 공간에서 물리 메모리로 가져온다. (페이지 인/스왑 인)
물리 메모리의 한계 극복: 물리 메모리가 부족하더라도 더 큰 프로그램이나 여러 프로그램을 동시에 실행할 수 있게 한다.
메모리 공유: 여러 프로세스가 동일한 물리 메모리 영역(예: 공유 라이브러리)을 공유하여 메모리 사용량을 줄일 수 있다.
프로세스 간 보호: 각 프로세스에 독립적인 가상 주소 공간을 제공하여 다른 프로세스의 메모리 영역에 접근하는 것을 방지한다.
메모리 파편화 해결: 물리 메모리의 단편화 문제를 완화한다.
CPU를 여러 프로세스가 공정하고 효율적으로 사용할 수 있도록, 어떤 프로세스에 CPU를 할당할 것인지 결정하는 운영체제의 기능이다.
CPU 이용률 극대화
처리량(Throughput) 증대
응답 시간(Response Time) 최소화
대기 시간(Waiting Time) 최소화
공정성 유지
선점형 (Preemptive) 스케줄링
현재 실행 중인 프로세스를 중단시키고 다른 프로세스에게 CPU를 할당할 수 있는 방식.
빠른 응답 시간과 높은 처리율이 중요한 시스템에 적합.
종류
라운드 로빈 (Round Robin): 각 프로세스에 동일한 시간 할당량(Time Quantum)을 부여하고, 할당량이 끝나면 다음 프로세스로 CPU를 넘긴다. 시분할 시스템에 적합.
SRTF (Shortest Remaining Time First): 현재 실행 중인 프로세스보다 남은 실행 시간이 더 짧은 프로세스가 도착하면 CPU를 선점하여 할당한다. SJF의 선점형 버전.
우선순위 스케줄링 (Priority Scheduling): 우선순위가 높은 프로세스에게 CPU를 먼저 할당합니다. 기아 현상이 발생할 수 있어 에이징(Aging) 기법 등으로 보완하기도 한다.
비선점형 (Non-Preemptive) 스케줄링
한 번 CPU를 할당받은 프로세스는 스스로 CPU를 반납하거나, I/O 작업 등으로 대기 상태가 되기 전까지 CPU를 계속 사용하는 방식.
오버헤드가 적지만, 중요한 작업이 대기할 수 있다.
종류
FCFS (First Come First Served): 먼저 요청한 프로세스에게 CPU를 먼저 할당한다. FIFO 큐와 유사.
SJF (Shortest Job First): 가장 짧은 CPU 버스트 시간을 가진 프로세스에게 CPU를 먼저 할당한다. 평균 대기 시간 최소화에 효과적이지만, 다음 CPU 버스트 시간을 예측하기 어렵다.