티스토리 뷰

 

2️⃣ 프로세스 관리 (Process Management)

✅ 프로세스란?

**프로세스(Process)**는 실행 중인 프로그램의 인스턴스입니다. 단순한 프로그램 코드가 실제 메모리에서 실행되면서 **자원(CPU, 메모리, 파일 등)**을 할당받은 존재예요.

구성 요소:

  • 프로그램 코드 (텍스트 섹션)
  • 프로세스 스택 (함수 호출, 지역변수)
  • 데이터 섹션 (글로벌 변수)
  • 힙 (동적 할당)
  • 프로세스 상태 정보 (레지스터, 프로그램 카운터 등)

✅ 프로세스 상태 (Process States)

  • New: 생성 중
  • Ready: 실행 준비 상태
  • Running: CPU에서 실행 중
  • Waiting (Blocked): I/O 등 대기 중
  • Terminated: 실행 종료

✅ 프로세스 제어 블록 (PCB)

운영체제가 각 프로세스를 관리하기 위해 사용하는 데이터 구조입니다.

포함 내용:

  • 프로세스 ID (PID)
  • 프로세스 상태
  • 프로그램 카운터
  • CPU 레지스터
  • 메모리 관리 정보
  • 계정 정보 (UID 등)
  • I/O 상태 정보

👉 컨텍스트 스위칭 시 이 PCB 정보가 저장/복원됩니다.


✅ 프로세스 계층 및 관계

  • 부모/자식 프로세스:
    • fork() 시스템 콜로 부모 → 자식 생성
  • 프로세스 트리: 계층적 구조

✅ 멀티프로세싱과 멀티스레딩

구분 멀티프로세싱 멀티스레딩

정의 여러 프로세스가 동시에 실행 하나의 프로세스 내에서 여러 쓰레드 실행
메모리 공간 각자 독립적 메모리(힙, 데이터)는 공유
예시 여러 브라우저 인스턴스 웹 페이지 렌더링 + 다운로드 동시 진행

✅ 프로세스 생성 & 종료 (UNIX 기준)

  • 생성: fork(), exec()
  • 종료: exit()
  • 좀비 프로세스: 부모가 자식의 종료 상태를 수거하지 않으면 생김 (wait() 필요)

✅ 쓰레드 개념 (간략)

쓰레드는 프로세스 내의 경량 실행 단위로, 프로세스와 달리 같은 주소 공간을 공유합니다. 프로세스와 다르게 오버헤드가 작아 빠른 병렬 처리가 가능합니다.

  • POSIX Thread (pthreads)
  • C++11 이후: std::thread

🛠 C++ 간단 예시

#include <iostream>
#include <thread>

void task() {
    std::cout << "Hello from thread!\n";
}

int main() {
    std::thread t(task);
    t.join();  // join 호출 안 하면 메인 종료 시 크래시
}

✅ 심화 개념

  • 컨텍스트 스위칭 비용:
    • 프로세스 간: 무겁다 (메모리 맵까지 바꿔야 함)
    • 쓰레드 간: 상대적으로 가볍다
  • 프로세스 간 통신 (IPC):
    • 파이프, 소켓, 공유 메모리, 메시지 큐

"스핀락을 사용할 때, 컨텍스트 스위칭 비용은 원칙적으로 발생하지 않습니다."

하지만 조건이 있습니다.


✅ 왜 컨텍스트 스위칭 비용이 발생하지 않나?

  • 일반적인 std::mutex나 OS 커널 수준의 뮤텍스는 락을 획득하지 못하면 **커널에 제어권을 넘기고 대기 상태(블록 상태)**로 전환되며 컨텍스트 스위치가 발생합니다.
  • 반면 **스핀락(SpinLock)**은:
    • 락을 잡을 때까지 계속 루프를 돌면서(active waiting) CPU를 점유합니다.
    • 다른 쓰레드로 전환되지 않고 현재 쓰레드가 계속 CPU를 차지합니다.

따라서:

  • 스핀락을 사용하는 동안에는 쓰레드가 블록되지 않으므로 컨텍스트 스위칭이 발생하지 않습니다.
  • 이 때문에 락 대기 시간이 매우 짧은 상황에서는 스핀락이 mutex보다 빠를 수 있어요.

🚨 그런데 주의할 점

  • 스핀락은 컨텍스트 스위칭은 안 하지만, CPU 자원을 낭비합니다. CPU 코어 하나가 그 락을 기다리며 계속 바쁘게 루프를 돌기 때문입니다.
  • 운영체제의 스케줄러가 "이건 너무 오래 스핀만 돈다"라고 판단하면 강제로 다른 스레드로 전환시킬 수 있습니다. 이건 운영체제 스케줄링 정책에 따라 다릅니다만, 긴 스핀은 결국 컨텍스트 스위치를 유발할 가능성이 있습니다.

✅ 정리

질문 답변

스핀락 사용 시 컨텍스트 스위칭이 발생하는가? 아니요, 기본적으로 발생하지 않습니다.
언제든 컨텍스트 스위치가 발생할 수 있는가? OS 스케줄러가 개입하거나 타임 슬라이스가 끝나면 발생할 수 있습니다.
락 점유 시간이 길면 어떤 문제가 생기는가? 스핀락이 비효율적이고, 결국 컨텍스트 스위칭이 발생할 수도 있습니다.

따라서, 짧은 임계구역에서는 스핀락이 유리하지만, 긴 대기 시간이 예상되면 일반 mutex 같은 커널 락을 쓰는 게 안전합니다.

'다시 정리하는 CS 이론 > OS' 카테고리의 다른 글

[OS] CPU 스케쥴링 (CPU Scheduling)  (0) 2025.05.03
[OS] 운영체제 개요  (0) 2025.05.03
[OS] 운영체제 커리큘럼  (1) 2025.05.03
Comments
최근에 올라온 글