정보처리기사 실기 공부를 하던 중 나온 개념 중 뮤텍스와 세마포어에 대해 좀 더 공부하고 정리해봤다.
공유자원(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