Dandy Now!
  • [운영체제] 동기화 기법 : 뮤텍스 락, acquire/release 함수, 그리고 바쁜 대기
    2025년 04월 01일 10시 11분 07초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    1. 뮤텍스 락, acquire/release 함수, 그리고 바쁜 대기

    1-1. 뮤텍스 락 (Mutex Lock) 이란?

    뮤텍스(Mutex, Mutual Exclusion) 락은 여러 스레드가 동시에 공유 자원에 접근하는 것을 막기 위한 동기화 기법이다. 임계 구역(Critical Section)이라고 불리는 코드 영역을 한 번에 하나의 스레드만 실행하도록 보장하여 데이터의 일관성을 지킨다.

    • 상호 배제: 뮤텍스의 가장 핵심적인 기능. 하나의 스레드가 특정 자원이나 코드 영역에 접근하면, 다른 스레드는 해당 스레드가 락을 해제할 때까지 기다려야 함.
    • 공유 자원 보호: 여러 스레드가 동시에 접근하여 값을 변경할 때 발생할 수 있는 경쟁 상태(Race Condition)를 방지.
    • 동기화: 스레드들의 실행 순서를 제어하는 데 사용.

    1-2. acquire()와 release() 함수

    뮤텍스 락을 사용하기 위한 기본적인 두 가지 연산이다.

    • acquire() 함수 (락 획득 시도):
      • 스레드가 임계 구역에 진입하기 전에 호출.
      • 만약 뮤텍스 락이 사용 가능(available) 상태라면, 해당 스레드가 락을 획득하고 임계 구역으로 진입. 락은 사용 중(unavailable/locked) 상태가 됨.
      • 만약 다른 스레드가 이미 락을 획득하여 사용 중이라면, 락을 요청한 스레드는 락이 해제될 때까지 대기 (블로킹되거나 바쁜 대기 상태).
    • release() 함수 (락 해제):
      • 스레드가 임계 구역에서의 작업을 마치고 나올 때 호출.
      • 획득했던 뮤텍스 락을 반환하여 사용 가능(available) 상태로 만듦.
      • 이후 대기 중이던 다른 스레드가 락을 획득할 기회를 얻게 됨.

    1-3. 바쁜 대기 (Busy-Waiting)

    바쁜 대기는 스레드가 락을 얻거나 특정 조건이 만족될 때까지 CPU 시간을 소모하면서 반복적으로 확인하는 대기 방식이다. 스핀락(Spinlock)이 대표적인 바쁜 대기 방식의 락이다.

    • 동작 방식:
      • 락을 얻을 수 있는지 혹은 조건이 충족되는지를 루프(loop) 안에서 계속 확인함.
      • 대기하는 동안 CPU 자원을 계속 사용 (Context Switching이 발생하지 않음).
    • 장점:
      • 락을 기다리는 시간이 매우 짧을 것으로 예상될 때, 스레드를 재우고 깨우는 컨텍스트 스위칭 비용보다 유리할 수 있음.
    • 단점:
      • 대기 시간이 길어지면 CPU 자원을 심각하게 낭비함. 시스템 전체 성능에 악영향을 줄 수 있음.
      • 멀티코어 환경이 아닌 경우, 락을 가진 스레드가 실행되지 못해 락을 해제하지 못하는 상황(Deadlock과 유사)이 발생할 수 있음.
    • 대안: 일반적으로는 스레드를 대기 큐에 넣고 잠들게 하는 블로킹(Blocking) 방식의 대기(예: 세마포어, 일반적인 뮤텍스)가 더 효율적임.

    2. 뮤텍스 락과 바쁜 대기의 관계

    뮤텍스 락이 바쁜 대기의 한 형태일까? 일부 뮤텍스 구현(특히 스핀락)은 바쁜 대기를 사용하지만, 일반적인 뮤텍스 구현은 CPU 효율을 위해 스레드를 잠들게 하는 방식을 사용한다.

    2-1. 뮤텍스 락의 구현 방식

    뮤텍스 락 자체는 상호 배제를 보장하는 개념 또는 메커니즘을 의미한다. 이 메커니즘을 실제로 구현하는 방식은 다양하다.

    • 핵심: 뮤텍스는 '락을 획득할 수 없을 때 스레드가 어떻게 대기할 것인가?'에 대한 구체적인 방식을 반드시 포함하는 것은 아님.
    • 구현 선택: 락을 기다리는 방식으로 '바쁜 대기(Busy-Waiting)'를 사용할 수도 있고, '스레드를 잠들게 하는(Blocking/Sleeping)' 방식을 사용할 수도 있음.

    2-2. 일반적인 뮤텍스: 블로킹 방식 (Blocking/Sleeping Wait)

    대부분의 운영체제나 표준 라이브러리에서 제공하는 일반적인 뮤텍스 구현은 바쁜 대기를 사용하지 않는다. 대신 블로킹 방식을 사용한다.

    • 동작:
      • 스레드가 acquire()를 호출했을 때 락이 이미 사용 중이면, 해당 스레드는 대기 큐(Wait Queue)에 들어가 '수면(Sleep)' 상태가 됨 (CPU를 사용하지 않음).
      • 다른 스레드가 release()를 호출하여 락을 해제하면, 운영체제는 대기 큐에서 기다리던 스레드 중 하나를 깨워(Wake up) 락을 획득할 기회를 줌.
    • 장점: CPU 자원을 낭비하지 않음. 대기 시간이 길어져도 시스템에 부담이 적음.
    • 단점: 스레드를 재우고 깨우는 과정(컨텍스트 스위칭)에 오버헤드가 발생.

    2-3. 스핀락 (Spinlock): 바쁜 대기 방식 락

    바쁜 대기(Busy-Waiting)를 사용하여 구현된 락을 특별히 '스핀락(Spinlock)'이라고 부른다.

    • 동작:
      • 스레드가 락을 획득하려 할 때 락이 사용 중이면, 스레드는 락이 해제될 때까지 계속해서 락 상태를 확인하는 루프를 돌면서 CPU를 사용하며 기다림 (Busy-Waiting).
    • 사용 경우:
      • 락을 기다리는 시간이 매우 짧을 것으로 예상될 때 (컨텍스트 스위칭 비용보다 루프를 도는 비용이 적을 때).
      • 주로 멀티코어/멀티프로세서 환경의 커널 수준 코드 등에서 제한적으로 사용됨.

    2-4. 결론

    • 뮤텍스 락 ≠ 바쁜 대기: 모든 뮤텍스 락이 바쁜 대기를 사용하는 것은 아니다. 뮤텍스는 상호 배제 메커니즘이며, 대기 방식은 구현에 따라 다름.
    • 일반적 구현: 표준 뮤텍스는 주로 CPU 효율성을 위해 '블로킹(Sleeping Wait)' 방식을 사용.
    • 스핀락: '바쁜 대기(Busy-Waiting)' 방식을 사용하는 특정 종류의 락.
    728x90
    반응형
    댓글