PromleeBlog
sitemapaboutMe

posting thumbnail
동기화 도구들(mutex, semaphore, monitor) - 하루 10분 운영체제 6일차
Synchronization Tools (mutex, semaphore, monitor) - 10 Minutes of OS Day 6

📅

🚀

들어가기 전에🔗

멀티스레드 환경에서는 여러 작업이 동시에 실행되기 때문에, 동일한 자원에 접근할 때 문제가 생길 수 있습니다. 예를 들어, 두 사람이 동시에 하나의 문서를 편집하면 충돌이 생기듯이, 컴퓨터에서도 이런 상황이 발생할 수 있습니다.
이런 충돌을 막고 프로그램이 안정적으로 동작하도록 도와주는 것이 바로
동기화 도구(Synchronization Tools)
입니다. 이번 글에서는 대표적인 도구들(뮤텍스, 세마포어, 모니터)과 그 원리를 하나씩 살펴보겠습니다.

🚀

임계구역과 동기화의 필요성🔗

임계구역(Critical Section)
은 여러 스레드가 동시에 접근하면 안 되는 코드 영역을 의미합니다. 예를 들어, 은행 계좌에서 잔액을 갱신하는 코드가 이에 해당합니다.
만약 두 스레드가 동시에 입금과 출금을 처리하려고 하면, 최종 결과가 잘못될 수 있습니다. 이런 문제를 해결하려면 반드시 하나의 스레드만 해당 영역을 사용할 수 있도록 제어해야 합니다.
┌──────────────┐       ┌──────────────┐
│   Thread A   │       │   Thread B   │
└─────┬────────┘       └──────┬───────┘
      │                       │
      ▼                       ▼
[진입 시도: 임계구역]     [진입 시도: 임계구역]
      │                       │
      ▼                       ▼
┌────────────────────────────────────────┐
│        임계구역 (Critical Section)       │
└────────────────────────────────────────┘
      ▲                       ▲
  동시에 접근 → 충돌 발생 (Race Condition)

🚀

Peterson의 알고리즘🔗

Peterson 알고리즘은 두 개의 프로세스 간의
임계구역
접근을 조율하는 고전적인 알고리즘입니다. 아래 세 가지 조건을 만족시키며, 이론적으로 매우 중요한 개념입니다.

1. 상호 배제 (Mutual Exclusion)🔗

한 순간에 오직 하나의 프로세스만 임계구역에 진입할 수 있어야 합니다.
예시: 두 은행 직원이 같은 고객 계좌 데이터를 수정하는 상황을 생각해보세요. Peterson 알고리즘은 한 명이 데이터를 다 수정하고 나올 때까지 다른 한 명은 기다리도록 보장합니다.

2. 진입 대기 (Progress)🔗

임계구역에 아무도 없을 때, 진입을 원하는 프로세스가 있다면 언젠가는 진입해야 합니다. 즉, 어느 한 쪽도 영원히 대기하지 않아야 합니다.
예시: P1과 P2 둘 다 임계구역 밖에 있는데, P1이 먼저 진입을 시도한다면, P2가 방해하지 않고 P1이 들어가야 합니다.

3. 한정 대기 (Bounded Waiting)🔗

어떤 프로세스도 다른 프로세스에게 영원히 진입을 양보하지 않아야 합니다. 즉, “무한정 기다림”은 없어야 합니다.
예시: P1이 계속 진입하고, P2는 수십 번이나 시도했지만 계속 밀리는 상황은 있어서는 안 됩니다. 이 조건이 깨지면
기아(Starvation)
현상이 발생합니다.
Peterson 알고리즘은 간단하면서도 이 세 조건을 모두 만족시키는 대표적인 알고리즘으로, 이론적 개념을 이해하는 데 큰 도움이 됩니다.

🚀

하드웨어 기반 동기화 지원🔗

CPU는 동기화를 위해 다음과 같은 명령어 수준의 지원을 제공합니다

🚀

동기화 도구 3가지🔗

멀티스레드 프로그램에서는 여러 스레드가 동시에 하나의 자원(예: 메모리, 변수, 파일 등)에 접근할 수 있습니다. 그런데 이렇게 동시에 접근하면 문제가 생길 수 있기 때문에, 꼭 필요한 규칙이 필요합니다.
그 규칙을 도와주는 친구들이 바로 Mutex, Semaphore, Monitor입니다.

Mutex (뮤텍스) — 하나만 들어올 수 있는 문🔗

뮤텍스는 말 그대로
한 번에 하나의 스레드만
자원을 사용할 수 있게 만드는 문입니다. 누군가 문을 잠그면(lock), 다른 스레드는 문이 열릴 때까지 기다려야 합니다.
❗️ "나 먼저 쓸게! 너는 내가 끝날 때까지 기다려줘!"
➡️

예시 코드 (C++)🔗

C++
std::mutex mtx;
void critical_section() {
  mtx.lock();       // 문 잠금
  // 공유 자원 사용
  mtx.unlock();     // 문 열기
}
➡️

주의할 점🔗

Semaphore (세마포어) — 들어갈 수 있는 인원 수 제한하기🔗

세마포어는
자원을 여러 명이 함께 쓸 수 있게 해주는
친구입니다. 놀이기구처럼 동시에 N명까지 탈 수 있고, 그 이상은 줄을 서야 합니다.
🎢 "자리는 총 3개야! 먼저 탄 사람 나올 때까지 기다려야 해."
➡️

예시 코드 (C)🔗

C
sem_t sem;
sem_init(&sem, 0, 3); // 동시에 3명까지 입장 가능
sem_wait(&sem);       // 들어가기 (자리 하나 차지)
// 공유 자원 사용
sem_post(&sem);       // 나가기 (자리 하나 비움)
➡️

응용🔗

Monitor (모니터) — 자동으로 문 열고 닫아주는 똑똑한 집사🔗

모니터는
뮤텍스와 조건 변수(condition variable)
를 함께 묶어놓은 고급 도구입니다. 우리가 신경 쓰지 않아도
문을 열고 닫고, 줄을 세우는 것까지 자동으로
해줍니다.
🤖 "주인님, 걱정 마세요. 제가 대신 문 열고 닫고 줄 세울게요!"
➡️

예시 코드 (Java)🔗

Java
synchronized(obj) {
  // 공유 자원 사용
}
➡️

장점🔗

비교🔗

구분Mutex (뮤텍스)Semaphore (세마포어)Monitor (모니터)
동시에 몇 명?1명N명까지 가능1명 (자동 제어)
락/해제 직접 해야 하나요?아니요
주로 어디서 써요?스레드 보호리소스 수 제한Java 등 객체지향 언어
데드락 걱정 있어요?있음있음거의 없음

🚀

Livness와 평가 기준🔗

동기화 도구의 품질은 다음과 같은 기준으로 평가됩니다
현대 운영체제는 이러한 기준을 충족시키도록 설계된 다양한 동기화 도구를 제공합니다.

🚀

요약🔗

이번 글에서는 병행 환경에서 발생할 수 있는 충돌 문제를 방지하는
동기화 도구들
에 대해 배워보았습니다. 뮤텍스, 세마포어, 모니터는 기술 면접에서도 자주 등장하는 항목이며, 각 도구의 특징과 예시를 꼭 기억해두는 것이 좋습니다.
다음 글에서는 이 도구들이 실제로 어떻게 사용되는지를 다양한
동기화 문제 예제
를 통해 살펴보겠습니다.

참고🔗