운영체제 1강
운영체제란 무엇인가?
✅ 운영체제란?
- 시스템 소프트웨어의 일종
- 컴퓨터 하드웨어(CPU, 메모리, 저장장치 등)를 관리하고, 응용 프로그램 실행을 지원하는 프로그램들의 모음
- 사용자와 하드웨어 사이의 매개체
✅ 운영체제의 목적
- 자원 관리: CPU, 메모리, 입출력 장치 등
- 편의성 제공: 사용자 명령 해석 및 실행
- 효율성: 프로그램 간의 자원 분배, 멀티태스킹 지원
- 안정성: 시스템의 예측 가능한 동작 보장
✅ 운영체제의 구조
● 계층 구조
사용자
↓
응용 프로그램
↓
운영체제
↓
하드웨어
✅ 실행 모드
- 커널 모드: 운영체제 커널이 실행됨. 하드웨어 직접 제어 가능.
- 사용자 모드: 일반 응용프로그램 실행. 제한된 권한.
✅ 커널 구조 유형
● 일체형 커널 (Monolithic Kernel)
- 모든 OS 서비스가 커널 내부에 포함
- 예: UNIX, Linux
- 장점: 빠름, 효율적 상호작용
- 단점: 하나의 오류가 전체 시스템에 영향을 줄 수 있음
● 마이크로커널 (Microkernel)
- 최소한의 핵심 기능만 커널에 포함
- 나머지는 외부 서비스로 분리
- 장점: 유지보수 쉬움, 안정성 우수
- 단점: 성능 저하 가능 (IPC 필요)
✅ 시스템 호출 (System Call)
- 응용 프로그램이 운영체제의 기능을 요청하는 방식
- 예: 파일 읽기/쓰기, 메모리 할당, 프로세스 생성
✅ 운영체제의 구성 요소
| 구성 요소 | 설명 |
|---|
| 프로세스 관리자 | 실행 중인 프로그램 관리 |
| 메모리 관리자 | RAM 사용 및 할당 관리 |
| 파일 관리자 | 파일 및 디렉토리 관리 |
| 장치 관리자 | 키보드, 마우스 등 I/O 장치 관리 |
✅ 운영체제의 유형
- 일괄 처리 시스템 (Batch): 작업 모아서 순차 처리
- 시분할 시스템 (Time Sharing): 사용자별 시간 할당
- 실시간 시스템 (Real-Time): 정해진 시간 안에 응답 (예: 미사일, 증권)
- 분산 시스템 (Distributed): 여러 컴퓨터가 네트워크로 연결
운영체제 2강
프로세스와 쓰레드
✅ 프로그램 vs 프로세스
| 항목 | 프로그램 | 프로세스 |
|---|
| 정의 | 정적, 수동적 개체 | 실행 중인 동적, 능동적 개체 |
| 실행 여부 | 실행되지 않음 | CPU가 명령을 실행 |
| 자원 사용 | 없음 | CPU, 메모리, 입출력, 파일 등 사용 |
✅ 프로세스의 메모리 구성
- 코드 영역: 실행 코드
- 데이터 영역: 전역 변수, 상수 등
- 힙 영역: 동적 할당 메모리
- 스택 영역: 함수 호출 스택 (지역변수, 반환주소 등)
✅ PCB (Process Control Block)
- 운영체제가 프로세스를 관리하기 위해 사용하는 정보 구조체
- 프로세스마다 하나씩 존재하며, 문맥 교환 시 사용
● 포함 정보:
- 프로세스 ID (PID)
- 프로세스 상태
- 프로그램 카운터 (PC)
- 레지스터 정보
- 메모리 정보
- 우선순위
- 회계 정보 등
✅ 프로세스 상태와 전이
| 상태 | 설명 |
|---|
| 생성 | 프로세스 생성 요청됨 |
| 준비 | CPU 할당을 기다림 |
| 실행 | CPU에서 명령어 수행 중 |
| 대기 | 입출력 또는 자원 요청으로 대기 중 |
| 종료 | 프로세스 실행 완료 또는 강제 종료됨 |
- 상태 전이 예시: 준비 → 실행 (디스패치), 실행 → 대기 (I/O 요청), 실행 → 종료 등
✅ 프로세스 생성 방식
● 사용자 실행
● fork()
- 자식 프로세스를 생성 (부모의 복제본)
- PID 부여됨, 동일한 메모리 구조 복사
● exec()
● CreateProcess()
✅ 프로세스 종료
- 정상 종료: 작업 완료 후 스스로 종료
- 비정상 종료: 부모가 자식 강제 종료 (PID 이용)
- 부모 종료 시 자식도 운영체제가 정리
✅ 쓰레드 (Thread)
- 하나의 프로세스 내에서 실행 흐름을 나눔
- 코드, 데이터, 힙은 공유 / 레지스터, 스택은 개별
● 장점
- 병렬 처리 가능
- 자원 사용 효율 높음
- 여러 작업을 동시에 처리 (예: 계산, 입력, 백업 등)
● 구조 예시
- 하나의 프로세스 메모리 구조 내에 여러 쓰레드 존재
- 각 쓰레드는 독립된 PC(Program Counter), 레지스터, 스택 가짐
✅ 멀티쓰레드 처리
- 여러 CPU에서 쓰레드를 병렬로 실행 가능
- 병렬성 증가 → 처리 효율 향상
예:
- CPU1: 계산용 쓰레드
- CPU2: 입력 처리용 쓰레드
- CPU3: 백업용 쓰레드
운영체제 3강
프로세스 스케줄링
✅ 프로세스 스케줄링이란?
- 여러 작업(프로세스)의 실행 순서를 결정하는 것
- CPU, 디스크 등 자원을 효율적으로 사용하기 위해 필수
- 디스패처(dispatcher): 준비 큐에서 프로세스를 선택하여 CPU에 할당하는 역할
✅ 스케줄링 목표
- 공정성: 모든 프로세스가 적절히 실행될 기회 제공
- 효율성: 자원을 충분히 활용
- 응답시간 최소화, 처리량 최대화, 대기시간 최소화
✅ 프로세스 상태와 스케줄링 단계
- 상위 단계: 작업 큐 → 프로세스
- 중간 단계: 실행/일시중지 제어
- 하위 단계: 준비 큐 → 실행 (디스패치)
✅ 선점형 vs 비선점형
● 선점형
- 실행 중인 프로세스를 강제로 중단하고 다른 프로세스 실행
- 인터럽트, 문맥 교환 발생
- 실시간/시분할 시스템에 적합
● 비선점형
- 프로세스가 스스로 CPU를 반납할 때까지 실행
- 오버헤드 없음, 짧은 작업이 대기 가능성 있음
✅ 문맥 교환 (Context Switch)
- 현재 실행 중인 프로세스의 상태(레지스터, PC 등)를 PCB에 저장
- 새로운 프로세스의 PCB 정보를 불러와 실행 상태로 전환
✅ 주요 스케줄링 알고리즘
1. FCFS (First Come First Serve)
- 도착 순서대로 처리
- 단점: 긴 프로세스가 짧은 프로세스를 지연시킴 (Convoy Effect)
2. SJF (Shortest Job First)
- 실행 시간이 가장 짧은 프로세스부터 실행
- 평균 대기시간 최소
- 실행시간 예측 필요
3. SRT (Shortest Remaining Time)
- SJF의 선점형 버전
- 남은 시간이 가장 짧은 프로세스를 우선 실행
- 오버헤드 존재
4. RR (Round Robin)
- 시간 할당량(Time Quantum) 단위로 프로세스를 순환 실행
- 시분할 시스템에 적합
- 짧은 시간 할당량은 문맥 교환 오버헤드 증가
5. HRN (Highest Response Ratio Next)
- 응답비율 = (대기시간 + 실행시간) / 실행시간
- 오래 기다린 프로세스 우선
- 공정성과 효율성 사이 균형
6. 다단계 피드백 큐
- 여러 큐에서 우선순위 및 행동에 따라 프로세스를 이동시킴
- I/O 위주 → 높은 우선순위 유지
- 연산 위주 → 낮은 우선순위, 긴 할당량
✅ 평균 대기시간 vs 평균 반환시간
- 대기시간: 준비 큐에서 대기한 총 시간
- 반환시간: 생성 시점부터 종료까지 걸린 전체 시간
✅ 요약 비교
| 알고리즘 | 방식 | 특징 |
|---|
| FCFS | 비선점형 | 간단하나 짧은 작업 지연됨 |
| SJF | 비선점형 | 평균 대기시간 최소, 예측 필요 |
| SRT | 선점형 | SJF 개선, 오버헤드 있음 |
| RR | 선점형 | 공정, 시분할에 적합, 시간할당 중요 |
| HRN | 비선점형 | 기다린 만큼 우선순위 상승 |
| MLFQ | 선점형 | 동작에 따라 우선순위 조정 |
운영체제 4강
병행 프로세스 (Concurrency)
✅ 병행 프로세스 개요
- 여러 개의 프로세스 또는 쓰레드가 동시에 수행되는 시스템 특성
- 자원을 공유하거나 독립적으로 실행됨
● 시스템 구조
- 강결합 시스템: 공유 메모리 기반
- 약결합 시스템: 분산 메모리 기반 (네트워크로 연결됨)
✅ 독립 vs 협력 프로세스
| 유형 | 설명 |
|---|
| 독립 | - 다른 프로세스에 영향 없음 - 데이터 및 상태 공유하지 않음 - 결정적/재생 가능 |
| 협력 | - 다른 프로세스와 상호작용 - 데이터 및 상태 공유 - 비결정적/재생 불가능 |
✅ 병행성 문제: 임계 영역 (Critical Section)
- 둘 이상의 프로세스가 동시에 접근하면 안 되는 코드 영역
- 예: 잔고 업데이트 시 두 프로세스가 동시에 접근하여 값 꼬임
✅ 임계영역 조건
- 상호배제(Mutual Exclusion): 한 번에 하나의 프로세스만 접근
- 진행(Progress): 다른 프로세스가 진입하지 않으면 접근 가능
- 한정된 대기(Bounded Waiting): 대기 중인 프로세스는 유한 시간 내 진입 가능
✅ 프로세스 동기화 (Process Synchronization)
- 서로 관련된 작업의 실행 순서를 조절
- 예: 계좌 입금 → 출금이 순차적으로 수행되어야 정확
✅ 프로세스 간 통신 (IPC: Inter Process Communication)
✅ 세마포어 (Semaphore)
- 공유 자원 접근을 제어하기 위한 변수
- 정수형 변수로, 자원의 상태 표현
- 초기값:
- mutex: 1 (상호배제용)
- sync: 0 (동기화용)
✅ 세마포어 연산
void P(semaphore s) {
if (s > 0)
s--;
else
wait();
}
void V(semaphore s) {
if (no waiters)
s++;
else
wake_one();
}
✅ 세마포어를 이용한 임계영역 보호
P(mutex);
V(mutex);
mutex는 상호배제용 세마포어
P(mutex): 임계영역 진입 시도
V(mutex): 임계영역 탈출 후 다음 프로세스 깨움
✅ 세마포어 활용 예 (Sync)
V(sync);
P(sync);
✅ 요약
- 병행성은 현대 OS에서 필수 요소이며, 병렬 처리 효율성을 극대화함
- 임계영역과 동기화 문제를 해결하기 위해 세마포어를 사용
- 상호배제, 진행, 한정대기 등의 조건을 충족시켜야 신뢰성 있는 실행 가능
운영체제 5강
병행 프로세스 - 생산자-소비자 문제, 판독기-기록기 문제, IPC
✅ 생산자-소비자 문제 (Producer-Consumer)
- 생산자: 데이터를 생성하여 버퍼에 넣는 프로세스
- 소비자: 데이터를 버퍼에서 꺼내어 소비하는 프로세스
● 요구 사항
- 상호배제(Mutex): 동시에 버퍼 접근 불가
- 동기화(Sync):
- 버퍼가 가득 찼을 경우: 생산자 대기
- 버퍼가 비었을 경우: 소비자 대기
● 세마포어 사용
mutex: 상호배제용 (초기값 1)
empty: 빈 공간 수 (초기값 = 버퍼 크기 n)
full: 채워진 공간 수 (초기값 0)
● 코드 구조
while (true) {
produce_item();
P(empty);
P(mutex);
insert_item();
V(mutex);
V(full);
}
while (true) {
P(full);
P(mutex);
remove_item();
V(mutex);
V(empty);
consume_item();
}
✅ 판독기-기록기 문제 (Readers-Writers Problem)
- 판독기(Reader): 데이터를 읽는 프로세스
- 기록기(Writer): 데이터를 쓰는 프로세스
● 요구 사항
- 쓰는 동안은 누구도 접근 불가 (Writer 우선)
- 읽는 동안 쓰기 불가, 읽기는 병렬 허용
● 세마포어 및 변수
mutex: rcount 보호용
wrt: 공유자원 접근 제어
rcount: 현재 읽고 있는 판독기 수
● 코드 구조
P(mutex);
rcount++;
if (rcount == 1) P(wrt);
V(mutex);
read_data();
P(mutex);
rcount--;
if (rcount == 0) V(wrt);
V(mutex);
P(wrt);
write_data();
V(wrt);
✅ 프로세스 간 통신 (IPC: Inter-Process Communication)
● 공유 메모리 방식
- 변수 등 메모리 공간을 공유
- 생산자-소비자, 판독기-기록기 문제 예시
● 메시지 전달 방식
- 시스템 호출:
send(), receive()
- 커널을 통한 통신 수행
✅ 메시지 전달 특성
- 연결 방식: 1:1, 1:N, N:N
- 방향성: 단방향, 양방향
- 용량: 무한, 유한, 0
- 대기 방식:
- 비동기 (Non-blocking)
- 동기 (Blocking)
✅ 통신 링크 유형
- 직접 통신 (Direct):
send(B, m1);
receive(B, m2);
- 간접 통신 (Indirect):
- 우편함(mailbox) 사용
- 다수 프로세스 공유 가능
- 단방향 또는 양방향
send(X, m);
receive(X, m);
✅ 요약
- 생산자-소비자: 버퍼 공유, 상호배제 + 동기화 필요
- 판독기-기록기: 다수 판독 병행 허용, 쓰기 시 독점 필요
- IPC: 공유 메모리 vs 메시지 전달
- 통신 채널 특성: 방향성, 연결성, 동기성 등 고려 필요