🧵 쓰레드와 동시성 제어 (Threads & Concurrency Control)

사용자 수준 쓰레드(ULT) vs 커널 수준 쓰레드(KLT)

  • 사용자 수준 쓰레드 (User-Level Thread, ULT)

    • 쓰레드의 생성, 종료 등 관리가 사용자 영역의 라이브러리에 의해 이루어짐.
    • 장점: 커널 모드 전환이 없어 빠르고, 라이브러리 이식성이 좋다.
    • 단점: 한 쓰레드가 블락(block)되면 프로세스 내 모든 쓰레드가 함께 블락되며, 다중 처리기에서 병렬 실행이 불가능하다.
  • 커널 수준 쓰레드 (Kernel-Level Thread, KLT)

    • 쓰레드 관리를 커널이 직접 수행.
    • 장점: 커널이 모든 쓰레드를 인지하므로 CPU 활용률이 좋고 병렬 실행이 가능하다.
    • 단점: 쓰레드 관리 시 모드 스위치 오버헤드가 발생하여 ULT보다 느리다.

동시성 기본 개념

  • Critical Resource (임계 자원)
    • 한 번에 하나의 thread만 접근할 수 있는 resource.
  • Critical Section (임계 구역)
    • Critical resource에 접근하는 code.
  • Mutual Exclusion (상호 배제)
    • 한 번에 하나의 thread만 critical section에서 실행되는 것을 보장.
    • 이 구간은 순차 실행 영역이 되어 성능이 떨어질 수 있으므로, 정말 필요한 곳에만 적용해야 함.

동기화 도구 (Synchronization Primitives)

  • Condition Variable (조건 변수)
    • 프로세스가 어떤 특정 조건이 일어나기를 기다리게 하는 것.
  • Spin Lock
    • while 문으로 busy waiting하면서 lock을 기다리는 방식.
    • 구현이 간단하고 상호 배제를 보장.
    • 단점: Fairness를 보장하지 않아 starvation(기아) 이 일어날 수 있으며, 특히 single-processor에서는 CPU 낭비가 심하다.
    • Critical section이 짧으면 block/awake 방식보다 빠를 수 있다.
  • Semaphore (세마포어)
    • P(wait)와 V(signal) 연산을 사용하는 동기화 도구.

메모리 모델과 재배치

  • Memory Model: 다중 처리기 환경에서 메모리가 어떻게 작동하는지에 대한 규칙.
    • Sequential Consistency: 명령어 재배치(reordering)를 허용하지 않음.
    • Relaxed Consistency: 성능 향상을 위해 명령어 재배치를 허용.
  • Memory Barrier: 명령어 재배치를 막기 위한 명시적인 명령어.

💾 메모리 관리 (Memory Management)

메모리 할당 기법

  • 고정 분할 (Fixed Partitioning)
    • 미리 정해진 크기의 파티션으로 메모리를 나눔.
    • 단점: 내부 단편화 발생, 파티션보다 큰 프로그램 실행 불가.
  • 동적 분hal (Dynamic Partitioning)
    • 실행 시간에(runtime) 프로그램이 요청하는 크기만큼 파티션을 생성.
    • 단점: 프로세스가 빠져나가면서 총량은 충분하지만 작은 조각들로 나뉘어 할당 못하는 외부 단편화 발생.
    • 배치 전략:
      • First fit: 가장 먼저 발견하는 충분한 공간에 할당 (성능 좋음).
      • Next fit: 마지막 할당 위치부터 검색 시작.
      • Best fit: 요청 크기와 가장 비슷한 공간에 할당 (전체 검색으로 성능 나쁨).
  • Buddy System
    • 고정과 동적 방식의 하이브리드. 메모리를 2의 거듭제곱 크기로 분할(split)하고 합병(coalesce)함.

불연속 할당 기법

  • Paging (페이징)

    • 프로세스를 페이지(Page) 라는 고정 크기 블록으로 나눔.
    • 메모리는 페이지와 동일한 크기인 프레임(Frame) 으로 나눔.
    • 페이지 테이블을 이용해 페이지와 프레임을 매핑.
    • 장점: 외부 단편화가 없음.
    • 단점: 마지막 페이지에서 약간의 내부 단편화 발생.
  • Segmentation (세그멘테이션)

    • 프로세스를 Code, Data, Stack 등 논리적 단위세그먼트(Segment) 로 나눔.
    • 세그먼트는 가변 크기를 가짐.
    • 장점: 보호와 공유가 용이함.
    • 단점: 외부 단편화 발생.

💻 가상 메모리 (Virtual Memory)

프로세스 실행에 필요한 부분만 메모리에 적재하는 기법.

가상 메모리 개요

  • Page Fault (페이지 폴트)
    • 실행하려는 페이지가 메인 메모리에 없을 때 발생하는 인터럽트.
    • 느린 Disk I/O가 발생함.
    • 프로그램의 지역성(Locality) 덕분에 효율적으로 동작 가능.

페이지 교체 알고리즘 (Page Replacement Algorithms)

빈 프레임이 없을 때 어떤 페이지를 내보낼지 결정.

  • Optimal (최적 교체)
    • 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체. 이론상 최적이지만 구현 불가능.
  • FIFO (First-In, First-Out)
    • 가장 먼저 들어온 페이지를 교체. 구현은 쉽지만 비효율적.
    • Belady’s Anomaly: 프레임을 늘려도 페이지 폴트가 증가하는 현상 발생 가능.
  • LRU (Least Recently Used)
    • 가장 오랫동안 사용되지 않은 페이지를 교체. 성능이 좋지만 오버헤드가 큼.
  • Clock (Second-Chance)
    • LRU의 근사 알고리즘. Reference bit를 사용하여 교체 대상을 결정.

상주 집합 관리 (Resident Set Management)

  • Thrashing (쓰레싱)
    • 프로세스에 할당된 프레임이 너무 적어 페이지 폴트가 빈번하게 발생하고, 시스템 성능이 급격히 저하되는 현상.
  • Working Set Model
    • 프로세스의 지역성에 기반하여, 특정 시간 동안 참조된 페이지 집합(Working Set)이 메모리에 유지되도록 프레임을 할당.
  • Page Fault Frequency (PFF)
    • 페이지 폴트 빈도를 측정하여 상한선을 넘으면 프레임을 더 할당하고, 하한선보다 낮으면 회수하는 동적 방식.

가상 메모리의 장점

  • 더 많은 프로세스를 동시에 실행 가능.
  • 실제 메모리보다 더 큰 프로세스 실행 가능.
  • 메모리 보호에 용이.