전체 글 (505)
방명록
- [운영체제] 동기화 기법 : 뮤텍스 락, acquire/release 함수, 그리고 바쁜 대기2025년 04월 01일 10시 11분 07초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
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반응형'CS > 컴퓨터구조와 운영체제' 카테고리의 다른 글
[운영체제] 동기화 기법 : 모니터, 인터페이스, 그리고 조건 변수 (1) 2025.04.01 [운영체제] 동기화 기법 : 세마포, wait/signal 함수, 그리고 대기 큐 (0) 2025.04.01 [컴퓨터 구조] 보조기억장치(하드 디스크, 플래시 메모리) (0) 2025.03.26 [컴퓨터구조] 캐시 메모리 및 저장 장치 계층 구조 관련 용어 정리 (0) 2025.03.25 다음글이 없습니다.이전글이 없습니다.댓글