STUDY

운영체제 - 메모리, 프로세스와 스레드

Lim임 2026. 2. 3. 03:54

운영체제 핵심 개념 정리

📚 목차


메모리 계층

계층 구조

레지스터 (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)

페이지 폴트 발생 시 처리 과정

  1. 유효한 가상 주소 접근 시 페이지 없음 → 트랩 발생
  2. 디스크에서 사용하지 않은 프레임 탐색
  3. 페이지 교체 알고리즘으로 프레임 교체
  4. 페이지 테이블 갱신 후 명령어 재시작

🔥 스레싱 (Thrashing)

원인

  • 메모리에 너무 많은 프로세스 → 스와핑 빈번 → 페이지 폴트율 증가

해결 방법

  1. 하드웨어: 메모리 증설, SSD 사용
  2. 작업 세트: 지역성 기반 페이지 집합을 미리 로드
  3. 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. 상호 배제: 한 번에 하나만 접근
  2. 한정 대기: 무한 대기 방지
  3. 융통성: 방해 없이 진입 가능

해결 방법

1. 뮤텍스 (Mutex)

  • lock() / unlock()
  • 잠금/해제 두 상태만 존재

2. 세마포어 (Semaphore)

  • wait() / signal()
  • 정수 값으로 관리
  • 바이너리 세마포어 (0/1)
  • 카운팅 세마포어 (여러 값)

3. 모니터 (Monitor)

  • 공유 자원 숨김
  • 인터페이스만 제공
  • 자동 상호 배제
  • 구현 쉬움

⚠️ 교착 상태 (Deadlock)

발생 조건

  1. 상호 배제: 자원 독점
  2. 점유 대기: 자원 보유 중 다른 자원 요청
  3. 비선점: 강제 회수 불가
  4. 환형 대기: 순환 대기 구조

해결 방법

  1. 예방: 조건 성립 방지
  2. 회피: 은행원 알고리즘
  3. 탐지: 사이클 탐지 후 프로세스 종료
  4. 무시: 사용자가 직접 종료 (현대 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