동기화 매커니즘, 뮤텍스(Mutex)와 세마포어(Semaphore)

Jinho Lee·2024년 10월 25일
0

개요

  • WPF 프로그램을 동시에 복수 실행되지 않도록 하기위해 뮤텍스를 사용해보려 했는데, 실패하였다. 그래서 이 개념을 확실히 알고 후에 활용하기 위해 정리한다.

동기화 매커니즘

  • 동기화 매커니즘은 프로세스나 스레드가 공유 자원에 동시에 접근하지 않도록 접근 순서를 제어하는 방법이다.

  • 이를 통해 공유 자원(파일, 메모리 등)의 일관성을 유지하고 경쟁 상태(race condition)를 방지할 수 있다.

  • 경쟁 상태(Race Condition)란 여러 개의 프로세스가 동시에 공유 자원을 읽고 쓸 때 문제가 되는 상황으로, 이로 인해 실행/출력 결과가 일정치 않아진다.

  • 여기서 공유 자원을 임계 구역(Critical Section)이라 하고, 보호되지 않는 임계 구역에 두 처리 단위(프로세스, 스레드)가 동시에 접근할 때 발생하는 문제를 임계 구역 문제라고 한다.

뮤텍스(Mutex)

  • 뮤텍스(Mutex)란 ‘Mutual Exclusion'의 줄임말로, 상호 배제를 의미하는 동기화 매커니즘으로, 여러 프로세스 또는 스레드가 동시에 같은 자원에 접근하는 것을 방지하기 위한 기술이다.

  • 간단히 말하자면, 자원에 접근하기 위해 각 프로세스는 락을 획득하여 접근 허용 권한을 얻어야 한다. 한 프로세스가 접근 권한을 허용 받으면 다른 프로세스는 락을 반환하기 전까지는 자원 사용이 불가하다. 결국 두 프로세스가 동시에 접근하는 일은 없게 된다.

특징

1. 단일 접근 허용

  • 뮤텍스는 한 번에 오직 하나의 프로세스나 스레드만 자원에 접근할 수 있도록 막는다.
    이 때 다른 프로세스나 스레드는 뮤텍스가 해제될 때까지 대기한다.

2. 프로세스 간 동기화

  • 뮤텍스는 다른 프로세스 간의 동기화를 지원한다. 이는 모니터와의 차이점이며, 이를 통해 하나의 자원에 대한 독점적인 접근을 보장한다.

3. 소유권

  • 뮤텍스는 뮤텍스를 획득한(접근한) 프로세스나 스레드만이 잠금을 해제할 수 있다.

4. 이름을 통한 전역 관리

  • 뮤텍스는 이름을 가지고, 이를 통해 시스템 전역에서 다른 프로세스 간에 동일한 뮤텍스를 공유할 수 있다. 이로써 프로그램의 중복 실행을 방지하거나 여러 프로그램이 임계 구역에 접근하는 것을 막을 수 있다.

동작 원리

1. 잠금 요청

  • 처리 단위(프로세스, 스레드)가 자원에 접근할 때, 먼저 뮤텍스를 잠그려 시도한다.
    이미 잠겨있다면 처리 단위는 잠금이 해제될 때까지 대기한다.

2. 자원 접근

  • 잠금을 성공한 처리 단위는 자원에 접근한다. 그동안 다른 처리 단위는 접근이 불가하다.

3. 잠금 해제

  • 자원 사용을 마친 처리 단위가 뮤텍스(잠금)를 해제한다. 그리고 대기 중인 다른 처리 단위가 뮤텍스를 획득한다.

세마포어(Semaphore)

  • 세마포어(Semaphore)는 에츠허르 다익스트라가 고안한, 뮤텍스와 같은 동기화 객체로, 공유 자원(임계 구역)에 접근할 수 있는 프로세스나 스레드의 수를 제한한다.

  • 뮤텍스와 달리 복수의 프로세스나 스레드가 임계 구역에 접근할 수 있으며, 접근한 처리 단위 수를 세는 것으로 상호 배제를 이룬다.

  • 에츠허르 다익스트라는 뮤텍스로 인해 발생할 수 있는 교착 상태(식사하는 철학자들 문제 등)를 해결하기 위해 이 방법을 제안했다. 다만, 세마포어가 모든 교착 상태를 해결하지는 못한다.

  • 교착 상태(데드락, Deadlock) : 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태

    • 다음 네 가지 필요 조건을 충족시키면 발생한다.
      1. 상호배제(Mutual exclusion) : 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다.
      2. 점유대기(Hold and wait) : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.
      3. 비선점(No preemption) : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.
      4. 순환대기(Circular wait) : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.

특징

1. 여러 스레드 접근 가능

  • 초기 카운트 값에 따라 여러 프로세스나 스레드가 접근할 수 있다.

2. 소유권 없음

  • 세마포어는 소유권이 없어 어느 처리 단위라도 잠금을 해제할 수 있다.

3. P 연산, V 연산

  • 카운트는 P 연산(Wait)과 V 연산(Signal)으로만 변경할 수 있다.

동작 원리

1. 초기화

  • 초기 카운트를 설정해 여러 프로세스나 스레드가 자원에 접근할 수 있게 한다. 예를 들어, 카운트가 3이면 최대 3개의 처리 단위가 동시에 접근이 가능하다.

2. P 연산(Wait)

  • 프로세스나 스레드가 자원에 접근할 때, 카운트를 1만큼 감소시킨다. 카운트가 0이 되면 자원에 접근할 수 있을 때까지 대기한다.

3. V 연산(Signal)

  • 처리 단위 하나가 자원 사용을 끝내면 카운트를 1만큼 증가시켜 대기 중인 다른 프로세스나 스레드가 자원에 접근할 수 있다.

뮤텍스와 세마포어의 차이 요약

구분뮤텍스 (Mutex)세마포어 (Semaphore)
접근 스레드 수한 번에 하나의 스레드만 접근 가능초기 카운트 값에 따라 여러 스레드가 접근 가능
소유권소유권 있음 (획득한 스레드만 해제 가능)소유권 없음 (어느 스레드나 해제 가능)
용도단일 자원 접근 제어제한된 자원에 대한 동시 접근 제어

참고

0개의 댓글

관련 채용 정보