본문 바로가기
Study/OS & Network

[OS] 뮤텍스와 세마포어

by DawIT 2021. 12. 23.
320x100

개요

뮤텍스(Mutex)세마포어(Semaphore)는 모두 '동시성 프로그래밍에서 공유 자원(임계 영역)을 상호 배제를 통해 안전하게 관리하기 위해 고안된 방법' 이다. 여기서 상호 배제(Mutual Exclusion)이란, 공유 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘을 뜻한다.

 

조금 더 쉽게 풀어서 이야기하자면, 수많은 프로세스와 스레드 내에서 함께 사용할 수 없는 자원을 관리하기 위해 고안된 방법들인 것이다.

 

뮤텍스

뮤텍스는 여러개의 스레드를 사용할 때 공유 자원에 대한 접근을 관리하기 위한 동기화 방식이다. 뮤텍스는 기본적으로 공유 자원이 사용중이라면 Lock을 걸어서 다른 스레드가 사용할 수 없도록 막는다. 그리고 해당 자원에 대한 사용이 끝나면 이를 해제하고 다음 스레드가 사용할 수 있도록 한다.

 

 

예시로 화장실을 공유 자원(또는 임계 영역)이라고 생각하고, 이용자를 스레드라고 생각한다.

 

 

뮤텍스 기법은 공유 자원을 한 스레드가 사용할 때 해당 공유 자원에 Lock을 걸어서 다른 스레드가 사용하지 못하도록 한다. 보통 boolean 타입의 변수를 사용하여 잠금 여부를 관리한다. 만약 다른 스레드가 이 상태에서 접근하려고 한다면 해당 스레드는 Blocking 되고 대기 큐로 보내진다.

 

 

해당 공유 자원의 사용이 끝나면 Unlock 상태로 변경되고, 대기 큐에서 다른 스레드가 해당 자원에 접근할 수 있게 된다.

 

세마포어

세마포어는 정수 변수를 통해 자원 접근을 관리한다. 세마포어 변수는 해당 자원에 접근할 수 있는 스레드의 수를 뜻한다. 세마포어 변수의 값을 증가시키는 연산을 하는 semSignal, 감소시키는 연산을 하는 semWait 함수가 존재한다.

 

 

세마포어는 이렇게 접근 가능한 스레드 수를 세마포어 변수로 둔다.

 

 

여기서 하나의 스레드가 접근하면, semWait 함수가 호출된다. semWait 함수는 현재 세마포어 변수를 확인하고 0보다 크다면 값을 하나 감소시키고 해당 스레드의 접근을 하용한다. 만약 0 이하라면 값을 하나 감소시키고 해당 스레드의 접근을 막고 대기 큐로 보낸다.

 

 

그래서 만약 공유 자원이 전부 사용되고 있고, 2개의 스레드가 기다리고 있다면 세마포어 변수는 -2가 된다.

 

 

여기서 하나의 스레드가 자원 사용을 마치고 나가게 된다면 semSignal() 함수가 호출된다. 이를 통해 세마포어 변수는 증가하고 만약 세마포어 변수가 음수였다면 대기 큐에 있던 스레드가 공유 자원에 접근할 수 있게 된다.

 

세마포어는 뮤텍스가 될수 있지만 뮤텍스는 세마포어가 될 수 없다는 말은 세마포어 변수가 1일 때를 이야기하는 것이다. 세마포어 변수가 1 이라면 하나의 스레드만 접근할 수 있기 때문에 뮤텍스와 유사하게 동작할 수 있다.

 

차이점

  • 세마포어는 여러 개의 스레드가 공유 자원에 접근하는 것을 관리하는 반면에, 뮤텍스는 단 하나의 스레드만 공유 자원에 접근하게 할 수 있다.
  • 뮤텍스는 Lock이 존재하고, Lock을 진행한 스레드가 해당 Lock을 풀어야만 다른 스레드가 공유 자원에 접근이 가능하다.

댓글