PR CENTER

뉴스룸     |     료실

mobile background

PR CENTER

뮤텍스(Mutex)와 세마포어(Semaphore)

관리자
2025-07-07
조회수 139

뮤텍스(Mutex)와 세마포어(Semaphore)

두개 모두 멀티스레드 환경에서 공유 자원의 접근을 제어하는 동기화 도구이지만, 작동 방식과 목적이 다르다.

이 둘의 차이점과 장/단점을 알기 이전에 교착상태, 임계영역, 교착상태 조건, 상호 배제를 설명한다.


교착상태(Deadlock)

  • 두 가지 이상의 작업이 서로 상대방의 작업이 끝나기를 하염없이 기다리는 상태를 말한다.
  • 여러 개의 프로세스 or 스레드가 서로 자원이 해제되기를 무한히 기다리며 멈춰버리는 상태를 말한다.
  • 프로세스 or 스레드 들이 서로 필요한 자원을 한정적으로 서로 가지고 있을 때 발생한다.
  • 경쟁 상태(Race Condition)에서 서로 lock을 가졌을 때 생길 수 있는 상태를 말한다.
  • 병목 현상(Bottleneck)이랑은 다른 상태이다.
    • 시스템 내 특정 부분(리소스, CPU, I/O 등)이 너무 느려서 전체 성능을 제한하는 현상
    • 프로그램이 멈추지는 않지만 느리게 진행됨.
  • 예시코드
  • 결과


교착 상태 예방

  • 자원 할당 순서를 고정하거나, 자원을 선점할 수 있는 프로세스를 설정.
  • 타임아웃 처리: lock.tryLock()을 사용하여 일정 시간 내에 락을 획득하지 못하면 교착 상태를 피할 수 있다.


임계 영역

  • 멀티스레드 환경에서 두개 이상의 스레드가 동시에 실행되면 안되는 코드 영역을 의미한다.
  • 공유자원(메모리, 파일, 변수 등등)에 접근하는 코드 블록이며, 동기화(Synchronization)을 통해 한번에 하나의 스레드만 접근할 수 있도록 보장되어야 한다.
  • 선점한 스레드가 독점적인 resource 점유를 갖는다.
  • 자바에서 임계 영역을 보호하는 방법
    • synchronized 키워드 사용
      • increment()와 getCount()가 임계 영역이고 한번에 하나의 스레드만 실행하도록 보호한다.
    • ReentrantLock 사용
      • try-finally 블록을 통해 명확하게 lock을 해제한다.
      • tryLock() 같은 추가 기능도 사용할수 있어서 synchronized보다 유연한 동기화 기법을 제공
    • volatile(단일 변수 동기화, 임계영역 보호X)

      • 이 키워드를 사용하면 메모리 가시성 문제는 해결되는데, 원자성은 보장하지 않는다.
      • 여러 스레드가 동시에 count++ 하면 여전히 경합 문제가 발생 가능


경쟁 조건

  • 여러 스레드가 동시에 임계 영역에 접근할 때, 예상치 못한 결과가 발생하는 문제.


원자성

  • 작업이 중간에 끊기지 않고 완전히 실행되는 특성이다.
  • 예시: count++는 원자적이지 않아서 여러 스레드가 동시에 실행되면 예상치 못한 결과가 나올 수 있다.


교착상태(Deadlock) 조건 4가지

  • 상호배제(Mutual exclusion)
    • 자원은 동시에 하나의 프로세스만 접근할 수 있어야 한다.
    • 자원이 독점적으로 사용되어야 한다.
    • 예시: synchronized , lock() 메서드 같은 동기화 메커니즘을 사용하여 자원에 대한 상호배제를 보장.
  • 점유 대기(Hold and Wait)
    • 하나의 프로세스가 자원을 점유한 채 다른 자원을 기다리고 있어야 한다.

이때, 다른 프로세스가 자원을 점유한 상태여야 한다.

    • 예시: 스레드가 lock()을 사용하여 자원을 점유하고, 또 다른 자원을 기다리기 위해 대기상태.
  • 비선점(No Preemption)
    • 자원을 할당 받은 프로세스가 자원을 반납하기 전에는 다른 프로세스가 그 자원을 강제로 뺏을 수 없다.
    • 예시: 시스템이 프로세스를 중단시키지 않고, 프로세스가 자원을 해제할 때까지 대기.

→ ReentrantLock 이나 synchronized는 비선점적인 동기화 방식이다.

  • 순환 대기(Circular Wait)
    • 교착 상태를 일으키는 중요한 조건이다.
    • 프로세스들이 서로 자원을 순환적으로 기다리는 상태가 발생해야 한다.
    • 예시: Thread1이 Resource1을 점유한 상태에서 Resource2를 기다리고, Thread2는 Resource2를

점유한 상태에서 Resource1을 기다리는 경우.


뮤텍스(Mutex)

  • 여러 스레드를 실행하는 환경에서 자원에 대한 접근 제한을 강제하기 위한 동기화 매커니즘 이다.
  • 하나의 스레드만 자원을 소유 가능하다.
  • 소유권이 존재한다. (lock() 한 스레드만 unlock() 가능)
  • 바이너리(0 또는 1) 상태로 자원을 보호한다.(Lock/Unlock 개념)
  • 재귀적 사용 불가 (Reentrant Mutex가 아니면 같은 스레드에서 다시 lock하면 데드락 발생)
    • Reentrant Mutex 란?
      • 재진입 가능 뮤텍스로, 같은 스레드가 동일한 뮤텍스를 여러 번 lock() 하고, unlock() 할 수 있도록 허용하는 뮤텍스 이다.
      • 동일 스레드가 다시 lock() 할 수 있도록 만들어져, 자기 자신에게 재진입을 허용한다.
      • [ 참고 ] 기본적으로 뮤텍스는 한번 lock() 한 후, 반드시 unlock()을 수행할 때까지 다른 스레드가 접근하지 못하도록 제한한다.
  • 다른 스레드가 이미 lock()을 호출하여 자원을 점유하고 있다면 현재 스레드는 자원을 사용할 수 없다.

이때 다른 스레드는 자원에 접근하기 위해 대기 상태가 된다.


사용목적

  • 단 하나의 스레드만 자원을 사용하도록 보장하기 위해서 사용.


세마포어(Semaphore)

  • n개의 자원에 대해 n개의 스레드가 동시에 자원을 공유할 수 있도록 허용한다.
  • 카운팅 방식으로 자원을 관리한다.
  • 자원을 사용할 수 있는 최대 개수를 설정하여 동시 접근 가능한 스레드 수를 제어한다.
  • release()를 호출하면 카운트 증가 : 대기 중인 스레드가 하나씩 자원을 사용하도록 허용(signal)한다.
  • acquire()를 호출하면 카운트 감소 : 카운트가 0일 경우 자원을 사용할 수 없도록 대기(waiting) 한다.


사용목적

  • 자원 공유: n개 스레드가 자원을 공유할 수 있지만, 동시에 자원을 사용할 수 있는 최대 개수를 제한하여 동시 접근을 제어한다.
  • 동시성 제어: 자원에 대한 동시 접근을 제어하고, 자원이 부족할 경우 대기 시켜 효율적인 자원 관리가 가능하다.



                                                                                                                                                                                                                                                         ⭐발표자 : 남상엽님 


0 0

페이지 바로가기

@2024 K2SYSTEMS. All rights reserved.

HOME       |       ABOUT US       |       SOLUTION       |       PR CENTER       |       CONTACT       |       인재채용       |       kakao i cloud 고객센터  

@2024 K2SYSTEMS. All rights reserved.