정보처리기사 실기 공부를 하던 중 나온 개념 중 뮤텍스와 세마포어에 대해 좀 더 공부하고 정리해봤다.
공유자원(Shared Resource)
동시 프로그래밍에서 여러 프로세스(스레드)가 공동으로 사용하는 변수, 메모리, 파일 등의 자원.
동시에 공유자원을 사용할 시 경쟁조건(Race Condition)이 발생하며 순서가 결과값에 영향을 줄 수 있게된다.
임계 영역(Critical Section)
위의 상황(경쟁)이 발생하는 프로그램의 코드 영역(블럭)
뮤텍스와 세마포어는 대표적인 동시성 제어 도구로 공유자원을 여러 쓰레드/프로세스가 접근하는 것을 상호배제(Mutual Exclusion)로 막는 역할을 한다.
![]()
이미지 출처 : chelseashin
동시에 여러 스레드가 공유 자원에 접근하는 상황에서 한번에 하나의 스레드만 접근하도록 보장하는 알고리즘
프로세스나 스레드가 공유자원을 lock()을 통해 잠그고, 사용 후에는 unlock()을 통해 잠금 해제하는 객체다.
잠금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에는 접근할 수 없다.
뮤텍스 객체를 두 스레드가 동시에 사용할 수 없다.
잠금 or 잠금해제 2가지 상태만 가진다.
임계영역을 가진 스레드들의 Running Time이 겹치지 않고 상호배제를 통해 각각 단독으로 실행되도록 한다.
다른 스레드가 뮤텍스를 이미 소유하고 있으면 해제될 때 까지 대기상태가 된다.
![]()
동시에 접근 가능한 허용된 스레드나 프로세스를 나타내는 정수 변수.
일반화된 뮤텍스
간단한 정수 값과 wait(P 함수), signal(V 함수)로 공유자원에 대한 접근을 처리한다.
wait() : 자신의 차례가 올 때까지 기다리는 함수
signal() : 다음 프로세스로 순서를 넘겨주는 함수
binary semaphore. 0과 1 두가지 값만 가질 수 있는 세마포어.
값이 0이면 다른 스레드가 세마포어를 획득하기 전 까지 대기
값이 1이면 스레드는 세마포어를 획득하고 작업을 수행한 뒤 세마포어를 해제
논리적으로는 뮤텍스가 여기에 속한다고 할 수 있지만, 엄밀히 따지면 뮤텍스는 잠금 기반의 상호배제이고, 세마포어는 신호기반이다.
counting semaphore. 여러 값을 가질 수 있는 세마포어.
여러 동시접근을 허용할 수 있다. 심지어 값이 음수가 될 수도 있다.
값이 0이하면 스레드는 대기상태에 들어간다.
값이 양수면 세마포어를 획득해 작업을 수행한 뒤 해제한다.
한 번에 여러 스레드가 접근할 수 있기 때문에 상호배제보다는 동시접근 허용의 측면에서 사용된다.
뮤텍스는 소유한 스레드만 해제할 수 있지만, 세마포어는 소유하지 않은 스레드가 해제할 수 있다.
세마포어는 시스템 범위에 걸쳐있고 파일로 존재하지만, 뮤텍스는 프로세스의 범위를 가지고 프로세스가 종료될 때 clean up 된다.
뮤텍스는 동기화 대상이 only 1 일때 사용하고, 세마포어는 1개 이상일때 사용한다.
참고 사이트 : https://chelseashin.tistory.com/40