꼬꼬마 블로그

꼬꼬마의 기술 블로그

뮤텍스와 세마포어는 멀티프로그래밍에서 공유자원을 안전하게 관리하기 위해 상호 배재 (한 번에 한 개의 프로세스가 공유 자원을 접근하여 사용)를 위한 기법이 필요합니다.

 

각 기법은 멀티 프로그래밍 즉 멀티 프로세스와 멀티 스레드 모두에 해당되는 내용입니다. 편의상 프로세스로 설명하도록 하겠습니다.

뮤텍스 (Mutex)

뮤텍스를 얻은 프로세스만이 임계 영역에 들어와 공유 자원에 접근할 수 있습니다. 이때 공유자원을 점유한다면 뮤텍스를 Lock 합니다.

다른 프로세스는 Lock이 된 자원에 접근할 수 없습니다. 이 프로세스가 자원을 모두 사용하고 임계영역을 빠져나오며 뮤텍스를 Unlock 합니다.

 

뮤텍스는 1개의 Lock을 가지는 Locking 메커니즘입니다.

 

조금 쉽게 빗대어 보면 화장실과 열쇠 보관함에 빗댈 수 있습니다.

열쇠 보관함에 하나의 열쇠가 있습니다. 물론 화장실은 잠겨있습니다.

만약 한 사람이 열쇠 보관함에서 열쇠를 가지고 화장실에 간다면 열쇠는 없어지게 되겠죠?

이때 다른 사람들이 화장실을 가기 위해선 열쇠 보관함에서 기다려야 합니다.

오직 화장실을 간 사람만이 화장실을 열고 나와 열쇠를 열쇠 보관함으로 반납할 수 있습니다.

 

이런 방식이 바로 뮤텍스입니다. 하나의 프로세스가 자원을 사용하고 있다면 자원은 Lock 되어 다른 프로세스는 점유 중인 프로세스에서 사용이 끝날 때까지 기다려야 점유할 수 있습니다.

세마포어 (Semaphore)

세마포어는 동기화 대상이 여러 개일 경우 사용할 수 있습니다. 세마포어에는 세 가지 요소가 있습니다.

 

S: P, V 연산으로만 접근 가능한 세마포어 변수입니다. 공유 자원의 개수를 나타내며 0과 1 또는 0과 양의 값을 가질 수 있습니다.
P: 프로세스가 임계 영역에 진입한다면 S(세마포어 변수)를 감소시킵니다 S = S - 1
V: 프로세스가 자원의 점유를 마치고 임계 영역을 빠져나올 때 S(세마포어 변수)를 증가시킵니다 S = S + 1

 

동기화 대상이 많을 경우 여러 프로세스가 공유 자원에 접근할 수 있도록 하는 방식입니다. 하나의 프로세스가 접근할 때마다 S를 감소시키고 점유를 마치면 S를 증가하여 공유자원에 접근할 수 있는 프로세스의 수를 알려줍니다.

 

이것도 마찬가지로 화장실에 빗대어 보도록 하겠습니다.

두 개의 화장실이 있고 화장실에 빈칸을 표시해주는 TV가 있습니다.

한 명이 들어오면 화장실의 빈칸(세마포어 변수)을 하나 줄여줍니다.

물론 나가면 화장실의 빈칸은 하나 늘어납니다.

만약 화장실의 빈칸이 0일 경우 화장실을 가고 싶은 사람은 대기해야 합니다.

 

세마포어는 이진 세마포어(Binary Semaphore)와 계수형 세마포어(Counting Semaphore)로 이루어졌습니다.

 

이진 세마포어는 S(세마포어 변수)가 이진 수(0과 1)밖에 갖지 못합니다. 즉 뮤텍스와 같습니다.

계수형 세마포어는 그 이상의 S(세마포어 변수)를 가질 수 있습니다.