프로세스와 스레드, CPU 스케줄링 알고리즘

박세건·2025년 4월 16일
0

프로세스(Process)와 스레드(Thread)


1. 프로세스(Process)

프로세스: 실행 중인 프로그램의 인스턴스

  • CPU 스케줄링의 기본 단위
  • 메모리에 로드되면 고유의 자원(메모리 공간, 파일 디스크립터 등)을 할당받음

1.1 프로세스 생성과 실행 흐름

  1. 생성 (New)
    • fork(), exec() 호출로 새로운 PCB(Process Control Block) 생성
  2. 준비(Ready) / 대기(Waiting)
    • CPU 할당 대기 (I/O나 이벤트 대기 시 Blocked)
  3. 실행(Running)
    • CPU를 점유해 명령어 수행 (CPU burst)
  4. 중단(Suspended)
    • 메모리 부족 등으로 스와핑(swapped out) → 디스크로 이동
  5. 대기 중단(Suspended Waiting)
    • I/O 대기 + 메모리 스와핑
  6. 종료(Terminated)
    • 정상 또는 강제 종료 → 자원 반환

참고: 일부 단순/임베디드 OS는 “준비(Ready)” 상태를 생략하고 대기 ↔ 실행만 구분하기도 함.


2. 프로세스 메모리 구조

┌───────────────────────────┐
│        코드 영역          │  (Text)  
├───────────────────────────┤
│    초기화된 전역 변수     │  (.data)  
├───────────────────────────┤
│  초기화되지 않은 전역 변수 │  (BSS)  
├───────────────────────────┤
│          힙(Heap) ↑        │  (동적 할당 영역)  
│           …               │
│                           │
│          스택(Stack) ↓     │  (함수 호출·지역 변수)  
└───────────────────────────┘
  • 코드(Text): 실행할 기계어 명령어
  • .data: 초기값이 0이 아닌 전역·정적 변수
  • BSS: 초기값이 0 이거나 생략된 전역·정적 변수
  • 힙(Heap): malloc/new 등 동적 메모리
  • 스택(Stack): 함수 호출 시 스택 프레임(매개변수, 반환 주소, 지역 변수)

힙은 낮은 주소에서 ↑로, 스택은 높은 주소에서 ↓로 자라며, 서로 충돌하면 할당 실패 또는 세그멘테이션 오류 발생.


3. PCB(Process Control Block)

  • 역할: 프로세스 메타데이터(상태, 레지스터, 메모리 맵 등) 저장
  • 주요 필드
    • 프로세스 ID (PID)
    • 상태 (New, Ready, Running, Blocked, Suspended, Terminated)
    • 프로그램 카운터(PC)
    • CPU 레지스터 집합
    • 메모리 관리 정보 (페이지 테이블, 세그먼트 테이블)
    • 스케줄링 우선순위, 계정 정보 등

4. 컨텍스트 스위칭(Context Switch)

  1. 현재 PCB 저장
    • 레지스터, PC, 상태 등을 PCB에 기록
  2. 스케줄러 실행
    • 다음 실행할 프로세스 선정
  3. 새 PCB 복원
    • 선택된 PCB에서 레지스터, PC 등을 복원
  4. 실행 재개

오버헤드(레지스터 저장/복원, 캐시 미스 등)가 발생하므로 과도한 스위칭은 성능 저하 원인.


5. 스레드(Thread)와 멀티스레딩(Multi‑threading)

  • 스레드: 프로세스 내에서 독립적으로 실행 가능한 최소 단위
    • 코드, 데이터, 힙 영역 공유
    • 스택레지스터 컨텍스트는 각자 별도
  • 장점:
    • 경량화 → 컨텍스트 스위칭 비용 ↓
    • 자원 공유로 통신 비용 ↓
  • 단점:
    • 하나의 스레드 오류가 프로세스 전체에 영향
    • 동기화 복잡도 ↑

6. 멀티프로세싱 vs 멀티스레딩

구분멀티프로세싱멀티스레딩
메모리 공간완전 독립코드·데이터·힙 공유, 스택만 분리
오버헤드PCB 교체, 별도 주소 공간 → 높음레지스터·스택 교체만 → 낮음
장애 격리프로세스 간 독립 → 안정적한 스레드 오류 시 전체 프로세스 영향
통신(IPC)별도 메커니즘 필요 (IPC)메모리 공유 → 간단하지만 동기화 필요

7. 프로세스 간 통신(IPC)

  1. 공유 메모리(Shared Memory)
    • 공용 메모리 블록에 직접 읽기·쓰기
    • 가장 빠름, 동기화(뮤텍스 등) 필요
  2. 파이프(Pipe / Named Pipe)
    • 단방향(익명) 또는 양방향(이름 있는) 바이트 스트림
  3. 메시지 큐(Message Queue)
    • 커널 큐에 메시지 단위 전송, 우선순위 지원
  4. 소켓(Socket)
    • 네트워크/로컬 IPC 모두 가능, TCP/UDP 사용

8. 동기화와 임계 영역(Critical Section)

  • 임계 영역: 공유 자원에 접근하는 코드 구간
  • 경쟁 상태(Race Condition): 동시 접근 시 결과 불확실

8.1 뮤텍스(Mutex)

  • 상호 배제(Mutual Exclusion) → 한 번에 하나만 진입
  • lock() / unlock() API

8.2 세마포어(Semaphore)

  • 카운팅 세마포어: 자원 개수만큼 동시 접근 허용
  • 이진 세마포어: 뮤텍스와 유사

8.3 모니터(Monitor)

  • 고수준 동기화 객체
  • 뮤텍스 + 조건 변수(condition variable) 결합
  • 자동 락/언락, wait()/signal() 지원

9. 교착 상태(Deadlock)

네 가지 필요 조건이 모두 성립 시 발생
1. 상호 배제 (Mutual Exclusion)
2. 점유 및 대기 (Hold and Wait)
3. 비선점 (No Preemption)
4. 순환 대기 (Circular Wait)

해결 기법

  • 예방(Prevention): 필요 조건 하나 이상 차단
  • 회피(Avoidance): 은행원 알고리즘 등으로 안전 상태 유지
  • 탐지 및 복구(Detection & Recovery): 교착 발생 후 프로세스 강제 종료 또는 자원 회수

profile
멋있는 사람 - 일단 하자

0개의 댓글