Post

[OS] 프로세스 동기화

3줄 요약
프로세스 동기화는 실행 순서를 제어하고 상호 배제를 보장하기 위한 핵심 기술
임계 구역에서의 문제를 방지하기 위해 뮤텍스, 세마포어, 모니터 등의 기법 사용
올바른 동기화를 통해 race condition 방지 및 자원 일관성 확보

💻 컴퓨터 구조 & 운영체제 시리즈

이 시리즈는 『혼자 공부하는 컴퓨터 구조+운영체제』 (강민철 저)
+ 인프런 강의를 기반으로 개인적으로 복습 및 정리한 기록입니다.


🔄 프로세스 동기화

🔹 동기화란?

프로세스들의 수행 시기를 맞추는 기술

  • 실행 순서 제어: 프로세스들이 올바른 순서대로 실행되도록 함
  • 상호 배제: 동시에 접근하면 안 되는 자원에 하나의 프로세스만 접근하도록 제한

🔸 실행 순서 제어

  • Reader-Writer Problem
    → 여러 프로세스가 동시에 실행될 때, 실행 순서를 제어하지 않으면 예상치 못한 결과가 발생
    → 순서를 보장하기 위한 동기화 필요

🔸 상호 배제

  • Bank Account Problem
    공유 자원을 동시에 접근하면 문제 발생
    → 한 번에 하나의 프로세스만 접근해야 하는 자원은 동기화를 통해 보호

  • Producer & Consumer Problem

    • 총합 = 10
    • 생산자/소비자가 공유 자원(버퍼와 총합 변수)에 동시에 접근
1
2
3
4
5
6
7
8
9
10
11
// 생산자
생산자() {
    버퍼에 데이터 삽입
    "총합" 변수 1 증가
}

// 소비자
소비자() {
    버퍼에서 데이터 빼내기
    "총합" 변수 1 감소
}

생산자 100,000번, 소비자 100,000번 수행 시 결과가 항상 0이 되리라는 보장은 없음
동기화되지 않았기 때문에 생기는 문제


🔸 핵심 개념

  • 공유 자원: 여러 프로세스 혹은 스레드가 함께 사용하는 자원
    → 전역 변수, 파일, 입출력 장치, 보조기억장치 등

  • 임계 구역 (Critical Section)
    → 동시에 접근 시 자원 일관성이 깨질 수 있는 코드 영역
    → 예: 총합 변수 업데이트 구간

  • Race Condition (경쟁 상태)
    → 둘 이상의 프로세스가 동시에 임계 구역에 접근하여 예기치 못한 결과 발생


✅ 상호 배제의 세 가지 조건

  1. Mutual Exclusion (상호 배제)
    → 임계 구역에 하나의 프로세스만 진입 가능

  2. Progress (진행)
    → 임계 구역에 아무도 없을 경우, 진입을 원하는 프로세스는 즉시 진입 가능해야 함

  3. Bounded Waiting (유한 대기)
    → 어떤 프로세스도 무한정 대기해서는 안 되며, 언젠가는 진입할 수 있어야 함


🧰 동기화 기법


🔐 뮤텍스 락 (Mutex Lock)

상호 배제를 위한 대표적인 동기화 도구로, 자물쇠 역할을 한다.

  • 전역 변수 lock을 통해 자물쇠 역할 수행
  • acquire() 함수: 임계 구역 진입 전 자물쇠를 잠금
  • release() 함수: 임계 구역 작업 완료 후 잠금 해제
1
2
3
4
5
6
7
8
9
10
11
12
13
static boolean lock;

static void acquire() {
    // 바쁜 대기(busy waiting) 계속 잠겨 있는지 확인
    while (lock == true) {
        pass;
    }
    lock = true;  // 잠겨 있지 않다면 잠그기
}

static void release() {
    lock = false;  // 잠금 해제
}

🚦 세마포(어) (Semaphore)

철도 차단기

임계 구역 앞에서 진입 가능 여부를 판단하는 동기화 도구
철도 차단기처럼, 자원이 없으면 멈추고 기다림

  • 전역 변수 s: 사용 가능한 자원의 개수
  • wait() 함수: 자원이 있을 때만 진입 가능 (진입 시 자원 수 감소)
  • signal() 함수: 자원 해제 후 자원 수 증가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
static int s = 2;

static void wait() {
    while (s <= 0) {
        pass;  // 자원이 없으면 바쁜 대기
    }
    s--;  // 자원 확보
}

// 임계 구역 작업...

static void signal() {
    s++;  // 자원 해제
}

문제점: busy waiting → CPU 낭비 발생
해결책: 자원이 없을 때 대기 상태로 전환, 자원이 생기면 준비 큐로 복귀

세마포를 활용한 실행 순서 제어

  • 세마포 변수 s = 0으로 초기화
  • 먼저 실행해야 할 프로세스 뒤에 signal() 호출
  • 나중에 실행될 프로세스 앞에 wait() 호출

🧵 모니터 (Monitor)

자바 등 고급 언어에서 제공하는 추상화된 동기화 도구
개발자가 사용하기 쉬우며, 상호 배제실행 순서 제어 모두 지원

  1. 상호 배제 구현
    • 공유 자원 접근 요청 시 인터페이스 큐에 삽입
    • 큐 순서대로 하나씩만 공유 자원에 접근 가능
  2. 실행 순서 제어
    • 조건 변수 (condition variable) 사용
      • wait() → 해당 조건이 충족될 때까지 대기
      • signal() → 기다리는 쓰레드 하나를 깨움

모니터는 내부적으로 뮤텍스 + 조건 변수를 함께 관리하여
더 안전하고 편리한 동기화를 제공한


✅ 마무리 정리

프로세스 동기화는 멀티 프로세스 환경에서 자원 보호와 실행 안정성을 위해 반드시 필요한 기술
뮤텍스, 세마포, 모니터 등의 기법을 통해 상호 배제실행 순서 제어를 구현할 수 있으며
올바른 동기화는 시스템의 신뢰성과 효율성을 좌우함


📚 참고 자료


읽어주셔서 감사합니다 🙌
내용이 도움이 되었거나, 틀린 부분이 있다면 댓글이나 GitHub Issue로 알려주세요 😊

This post is licensed under CC BY 4.0 by the author.