경쟁상태를 해결하는 대표적인 방법으로는 뮤텍스, 세마포어, 모니터 3가지가 있다.
- 이들은 상호배제, 한정대기, 진행의 융통성의 조건을 만족시키며 경쟁상태를 해결한다.
- 상호 배제(mutual exclusion) : 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없음
- 한정 대기(bounded wating) : 특정 프로세스가 임계영역 진입을 요청한 후 해당 요청이 승인되기 전까지 다른 프로세스가 임계 영역에 진입하는 횟수를 제한하는 것을 말하며 이를 통해 특정 프로세스가 영원히 임계 영역에 들어가지 못하게 하는 것을 방지함.
- 진행의 융통성(progress) : 만약 어떠한 프로세스도 임계영역을 사용하지 않는다면 임계영역 외부의 어떠한 프로세스도 들어갈 수 있으며 이 때 프로세스끼리 서로 방해하지 않는 것을 말함.
🔒 뮤텍스 (Mutex, Mutual Exclusion)
- 정의:
하나의 스레드만 임계영역에 진입할 수 있도록 보장하는 상호 배제 기법입니다.
락(Lock)을 획득한 스레드만 해당 자원을 사용할 수 있으며, 나머지 스레드는 대기해야 합니다. - 특징:
- 값이 0 또는 1인 이진 락 (Binary Lock)
- 자원을 사용하는 동안은 다른 스레드가 접근 불가
- 락을 획득(lock) → 작업 수행 → 해제(unlock) 순서로 사용
⚖️ 세마포어 (Semaphore)
- 정의:
동시 접근 가능한 스레드 수를 제어하는 동기화 도구입니다.
내부적으로 카운터를 가지고 있으며, 카운터 값이 0이면 대기 상태가 됩니다. - 종류:
- 카운팅 세마포어: 여러 개의 리소스를 동시에 관리 (카운터 > 1)
- 이진 세마포어: 뮤텍스처럼 동작 (카운터 0 또는 1)
- 작동 방식:
- wait() → 자원 요청 시 카운터 감소
- signal() → 자원 반환 시 카운터 증가
🧩 모니터 (Monitor)
- 정의:
임계영역을 자동으로 관리하는 상호배제 메커니즘입니다.
뮤텍스 + 조건 변수(Condition Variable)를 캡슐화한 고수준 추상화 도구입니다. - 특징:
- 자원 접근 시 자동으로 락을 획득 및 해제
- 내부에서 조건 변수로 스레드 간 통신 가능
- Java의 synchronized, Python의 with threading.Lock() 등이 예시
* 뮤텍스와 세마포어의 차이점은 잠금 기반이냐? 신호 기반이냐? 라고 정의할 수 있을 거 같다.
'CS > 운영체제' 카테고리의 다른 글
| 공유자원과 경쟁상태 그리고 임계영역 (0) | 2025.05.29 |
|---|---|
| 멀티프로세싱과 멀티스레딩 (1) | 2025.05.29 |
| PCB와 컨텍스트 스위칭(context switching) (0) | 2025.05.29 |
| 프로세스 메모리 구조 (1) | 2025.05.29 |
| 프로그램 컴파일 과정 (0) | 2025.05.29 |