운영체제 핵심 개념 정리
📚 목차
메모리 계층
계층 구조

레지스터 (Register)
↓
캐시 (Cache - L1, L2, L3)
↓
주기억장치 (RAM)
↓
보조기억장치 (HDD, SSD)
각 계층의 특징
| 계층 | 속도 | 용량 | 가격 | 휘발성 |
|---|---|---|---|---|
| 레지스터 | 가장 빠름 | 가장 적음 | 가장 비쌈 | O |
| 캐시 | 빠름 | 적음 | 비쌈 | O |
| RAM | 보통 | 보통 | 보통 | O |
| HDD/SSD | 느림 | 많음 | 저렴 | X |
💡 캐시 (Cache)
캐시란?
- 빠른 장치와 느린 장치 간 속도 차이를 줄이기 위한 임시 저장소
- 데이터 접근 시간 단축 및 재계산 시간 절약
지역성의 원리
1. 시간 지역성 (Temporal Locality)
- 최근 사용한 데이터에 다시 접근하는 특성
- 예: for문의 변수 i
for (let i = 0; i < 10; i += 1) {
arr[i] = i; // i에 반복적으로 접근
}
2. 공간 지역성 (Spatial Locality)
- 최근 접근한 데이터 근처의 공간에 접근하는 특성
- 예: 배열의 연속적인 요소 접근
캐시 히트 vs 캐시 미스
- 캐시 히트: 캐시에서 데이터를 찾음 → 빠름 (CPU 내부 버스 사용)
- 캐시 미스: 주 메모리에서 데이터를 가져옴 → 느림 (시스템 버스 사용)
캐시 매핑 방식
| 방식 | 설명 | 장점 | 단점 |
|---|---|---|---|
| 직접 매핑 | 1:1 순차 매핑 | 처리 빠름 | 충돌 빈번 |
| 연관 매핑 | 관련 있는 것끼리 매핑 | 충돌 적음 | 탐색 느림 |
| 집합 연관 매핑 | 직접+연관 혼합 | 균형잡힘 | - |
웹 브라우저의 캐시
| 종류 | 만료기한 | 용량 | 특징 |
|---|---|---|---|
| 쿠키 | 있음 | 4KB | 서버/클라이언트 설정 가능 |
| 로컬 스토리지 | 없음 | 10MB | 브라우저 닫아도 유지/클라이언트에서만 수정 |
| 세션 스토리지 | 탭 단위 | 5MB | 탭 닫으면 삭제/클라이언트에서만 수정 |
메모리 관리
🔄 가상 메모리 (Virtual Memory)
개념
- 실제 메모리 자원을 추상화하여 큰 메모리로 보이게 만드는 기법
- 가상 주소 → MMU → 실제 주소 변환
페이지 테이블
- 가상 주소와 실제 주소의 매핑 정보 저장
- TLB(Translation Lookaside Buffer)로 속도 향상
⚠️ 스와핑 (Swapping)
페이지 폴트 발생 시 처리 과정
- 유효한 가상 주소 접근 시 페이지 없음 → 트랩 발생
- 디스크에서 사용하지 않은 프레임 탐색
- 페이지 교체 알고리즘으로 프레임 교체
- 페이지 테이블 갱신 후 명령어 재시작
🔥 스레싱 (Thrashing)
원인
- 메모리에 너무 많은 프로세스 → 스와핑 빈번 → 페이지 폴트율 증가
해결 방법
- 하드웨어: 메모리 증설, SSD 사용
- 작업 세트: 지역성 기반 페이지 집합을 미리 로드
- PFF: 페이지 폴트 빈도 조절 (상한선/하한선 설정)
메모리 할당 방식
1. 연속 할당
고정 분할 방식
- 메모리를 미리 나눔
- 융통성 없음
- 내부 단편화 발생
가변 분할 방식
- 프로그램 크기에 맞게 동적 할당
- 외부 단편화 발생 가능
| 방식 | 설명 |
|---|---|
| 최초적합 | 첫 번째 홀에 할당 |
| 최적적합 | 가장 작은 홀에 할당 |
| 최악적합 | 가장 큰 홀에 할당 |
2. 불연속 할당 (현대 OS)
- 페이징: 동일 크기 페이지 단위 (보통 4KB)
- 세그멘테이션: 의미 단위로 분할
- 페이지드 세그멘테이션: 두 방식 결합
📋 페이지 교체 알고리즘
| 알고리즘 | 설명 | 특징 |
|---|---|---|
| 오프라인 | 미래 참조 페이지 교체 | 이론적 최적 (실제 불가능) |
| FIFO | 먼저 들어온 것 먼저 교체 | 구현 간단 |
| LRU | 가장 오래된 것 교체 | 해시테이블 + 이중연결리스트 |
| NUR | Clock 알고리즘, 0/1 비트 사용 | LRU 개선 |
| LFU | 참조 횟수 적은 것 교체 | - |
프로세스와 스레드
📦 프로세스 (Process)
정의
- 실행 중인 프로그램
- 프로그램이 메모리에 올라가 인스턴스화된 것
컴파일 과정
소스 코드
↓ [전처리] - 주석 제거, 헤더 병합, 매크로 치환
어셈블리어
↓ [컴파일러] - 오류 처리, 코드 최적화
목적 코드 (.o)
↓ [어셈블러]
실행 파일 (.exe, .out)
↓ [링커] - 라이브러리 결합
🔄 프로세스 상태
생성 (create)
↓
대기 (ready) ←→ 대기중단 (ready suspended)
↓
실행 (running)
↓
중단 (blocked) ←→ 일시중단 (blocked suspended)
↓
종료 (terminated)
🧠 프로세스 메모리 구조
높은 주소
┌─────────────┐
│ 스택 │ ← 지역변수, 매개변수 (동적)
├─────────────┤
│ ↓ │
│ │
│ ↑ │
├─────────────┤
│ 힙 │ ← 동적 할당 변수 (동적)
├─────────────┤
│ 데이터 영역 │ ← BSS, Data segment (정적)
├─────────────┤
│ 코드 영역 │ ← 프로그램 코드 (정적)
└─────────────┘
낮은 주소
📊 PCB (Process Control Block)
저장 정보
- 프로세스 스케줄링 상태
- 프로세스 ID
- 프로세스 권한
- 프로그램 카운터
- CPU 레지스터
- CPU 스케줄링 정보
- 계정 정보
- I/O 상태 정보
컨텍스트 스위칭 (Context Switching)
- PCB 저장 → 다른 프로세스 로드
- 비용: 유휴 시간 + 캐시 미스
- 스레드 컨텍스트 스위칭이 더 빠름 (메모리 공유)
🔀 멀티프로세싱 vs 멀티스레딩
멀티프로세싱
- 여러 프로세스로 병렬 처리
- 신뢰성 높음 (독립적)
- IPC로 통신 (공유 메모리, 파일, 소켓, 파이프, 메시지 큐)
웹 브라우저 예시
- 브라우저 프로세스
- 렌더러 프로세스
- 플러그인 프로세스
- GPU 프로세스
멀티스레딩
- 하나의 프로세스 내 여러 스레드
- 효율성 높음 (자원 공유)
- 한 스레드 문제 → 전체 영향
스레드 메모리 구조
- 공유: 코드, 데이터, 힙
- 개별: 스택, 레지스터
🔒 임계 영역 (Critical Section)
해결 조건
- 상호 배제: 한 번에 하나만 접근
- 한정 대기: 무한 대기 방지
- 융통성: 방해 없이 진입 가능
해결 방법
1. 뮤텍스 (Mutex)
- lock() / unlock()
- 잠금/해제 두 상태만 존재
2. 세마포어 (Semaphore)
- wait() / signal()
- 정수 값으로 관리
- 바이너리 세마포어 (0/1)
- 카운팅 세마포어 (여러 값)
3. 모니터 (Monitor)
- 공유 자원 숨김
- 인터페이스만 제공
- 자동 상호 배제
- 구현 쉬움
⚠️ 교착 상태 (Deadlock)
발생 조건
- 상호 배제: 자원 독점
- 점유 대기: 자원 보유 중 다른 자원 요청
- 비선점: 강제 회수 불가
- 환형 대기: 순환 대기 구조
해결 방법
- 예방: 조건 성립 방지
- 회피: 은행원 알고리즘
- 탐지: 사이클 탐지 후 프로세스 종료
- 무시: 사용자가 직접 종료 (현대 OS 채택)
📌 핵심 용어 정리
- TLB: 주소 변환 캐시
- 페이지: 가상 메모리 최소 단위
- 프레임: 실제 메모리 최소 단위
- 내부 단편화: 할당 공간 > 프로그램 크기
- 외부 단편화: 할당 공간 < 프로그램 크기
- 홀: 할당 가능한 빈 메모리
- 동시성: 작은 단위로 나눠 동시 실행처럼 보이게
'STUDY' 카테고리의 다른 글
| 데이터베이스 (0) | 2026.02.09 |
|---|---|
| CPU 스케줄링 알고리즘 (0) | 2026.02.09 |
| 파이프라인 모니터링 클러스터 모니터링 (0) | 2026.02.01 |
| HTTP 프로토콜 & 운영체제 (0) | 2026.01.28 |
| 네트워크 (0) | 2026.01.13 |