[OS] 동기화 도구

do_it·2025년 10월 23일

os

목록 보기
10/13

1. 세마포어 & 뮤텍스

세마포어는 자원의 개수를 제어하거나 작업 간의 순서 동기화 등 에 활용되고,
뮤텍스는 주로 상호 배타를 위해 사용되는 가장 단순한 형태의 동기화 도구

구분뮤텍스 (Mutex)세마포어 (Semaphore)
목적상호 배제 (Mutual Exclusion)자원 접근 제한 (Resource Counting)
동기화 대상 개수단 한 개의 자원/임계 구역 (1)여러 개의 자원 (N)
소유권있음 (잠근 스레드만 풀 수 있음)없음 (신호를 통해 다른 스레드/프로세스가 값을 변경 가능)
메커니즘잠금(Locking): Key를 획득해야 함신호(Signaling): 카운터 값을 조정
사용 e.g.임계 구역 보호제한된 자원(커넥션, 버터 등)접근 제어

1-1. 세마포어 (Semephore)

신호 매커니즘을 사용하여 여러 개의 자원에 대한 접근을 제한하는 방법
⇒ 자원 접근의 허가권을 관리하는 카운터 기반 제어 장치

유한한 재원 개수 관리, 생산자-소비자 문제와 같은 순서 동기화에서 사용된다.

세마포어의 작동 방식

  • 내부적으로 정수형 변수(counter)를 가지고 있고,
    이 값은 사용 가능한 자원의 개수를 의미함
  • 신호 매커니즘의 2가지 연산
    두 연산은 원자적으로 수행되어야 하며, 수행 중간에 끼어들 수 없다.
    - 1) P(/Wait)연산
    자원을 요청하는 동작
    세마포어 값이 0보다 크면 1을 감소시키고 자원을 획득함
    0이면, 자원이 모두 사용 중 → 스레드는 대기 상태로 들어감
    - 2) V(/Signal)연산
    자원을 해제하는 동작
    세마포어 값을 1 증가시카고, 대기 중인 스레드가 있다면 그 중 하난를 깨움
// S: 세마포어 변수 (공유 자원 접근 여부를 나타냄)
// P(S): 자원 요청
// V(S): 자원 해제

/* 잠금 or 진입 요청
세마포어 값 S가 0이면 자원이 이미 사용중이라는 뜻
다른 프로세스가 임계 구역에서 빠졍나와 S가 1이 될 때까지 대기 (wait)
*/
procedure P(S) // 최초 S값 = 1
	while S = 0 do wait 
	S := S-1 // S=1(자원이 사용 가능한 상태)이면, S를 0으로 만듦
	// 이 순간부터 다른 프로세스들은 S=0을 보고 대기 상태로 들어감
	// 결과적으로, 임계 구역에는 오직 하나의 프로세스만 진입 가능
end P

--- 임계 구역 ---

/*
임계 구역 실행이 끝난 후, 자원을 다른 프로세스에게 개방함
S를 다시 1로 복원함으로써 대기 중이던 다른 프로세스 하나를 깨움
이제 그 다음 프로세스가 P(S)를 통해 진입할 수 있음
*/
procedure V(S) // 현재 S = 0
	S := S+1 // S를 1
end V
단계변수 S의 값의미
초기1자원이 비어 있음
프로세스 A P(S) 호출0A가 임계 구역 진입,
다른 프로세스는 대기
프로세스 A V(S) 호출1A가 임계 구역을 나감,
다른 프로세스 진입 가능

세마포어의 종류

  1. 카운팅 세마포어 (Counting Semsaphore)
    값이 0 이상인 정수 값을 가질 수 있음
  • 여러 개의 자원을 동시에 관리할 수 있는 경우
    동시에 여러 개의 자원을 접근할 수 있도록 하되, 그 개수를 제한할 수 있음
  • 자원의 개수만큼 초기 값을 설정하고, 자원 사용 시 값을 감소시키고, 자원을 반납할 때 값을 증가시킴
  1. 이진 세마포어 (Binary Semaphore)
  • 값이 0 /1 만 가짐
  • 한 번에 한 프로세스만 자원에 접근할 수 있도록 제한함
  • 뮤텍스와 유사하지만 다르게 동작함
    뮤텍스는 소유자가 있지만 세마포어는 소유권이 없음

1-2. 뮤텍스 (Mutex)

Mutex, Mutual Exclusion Object: 상호 배제를 구현하는 기법

공유 자원에 동시에 접근하는 것을 제어하기 위한 동기화 도구

한 번에 오직 하나의 스레드만 임계 구역에 들어갈 수 있도록 보장함

공유 데이터의 일관성 & 안전성을 보장하기 위한 잠금 메커니즘

  • 한 스레드가 임계 구역을 실행하기 전에 뮤텍스를 획득(lock)해야 함
  • 임계구역을 빠져나올 때 뮤텍스를 해제(unlock)해야 함
  • 이미 다른 스레드가 뮤텍스를 가지고 있다면, 그 뮤텍스를 기다리는 스레드는 대기상태가 됨 (blocked)

0개의 댓글