JAVA/지식

뮤텍스(Mutex)와 세마포어(Semaphore)의 차이

우엥우아앙 2021. 2. 9. 10:08

뮤텍스와 세마포어를 알아보기 전에 임계구역과 동기와의 의미를 알아보도록 하자!

 

임계구역(Critical Region)

  • 두 개 이상의 쓰레드가 공유 데이터를 조작할 때, 원하지 않는 결과를 얻을 수가 있다.

동기화(Synchronized)

  • 두 개 이상의 쓰레드가 하나의 자원을 공유할 때 자원을 보호하기 위해 사용한다.

  • 공유 자원에 접근할 때 다른 쓰레드가 접근하지 못하도록 해당 자원을 잠금(lock)해버리는 기능을 가지고 있다.

  • 자원의 사용이 끝나면 unlock을 하여 다른 쓰레드가 접근할 수 있도록 한다.

  • 자바에서는 메서드 앞에 sychronized를 붙여 동기화를 할 수 있다.

뮤텍스(Mutex)

자원에 대한 접근을 동기화하기 위해 사용되는 상호배제 기술이다. 이것은 프로그램이 시작될 때 고유한 이름으로 생성된다. 뮤텍스는 Locking 매커니즘으로 오직 하나의 쓰레드만이 동일한 시점에 뮤텍스를 얻어 임계 영역(Critical Section)에 들어올 수 있다. 그리고 오직 이 쓰레드만이 임계 영역에서 나갈 때 뮤텍스를 해제할 수 있다.

 

예시) 화장실이 하나밖에 없는 식당

 

 

세마포어(Semaphore)

세모포어는 Signaling 매커니즘이라는 점에서 뮤텍스와 다르다. 세마포어는 락을 걸지 않는 쓰레드도 Signal을 보내 락을 해제할 수 있다는 점에서, wait 함수를 호출한 쓰레드만이 signal 함수를 호출할 수 있는 뮤텍스와 다르다.

세마포어는 동기화를 위해 wait와 signal이라는 2개 atomic operations를 사용한다.

wait를 호출하면 세마포어의 카운트를 1 줄이고, 세마포어의 카운트가 0보다 작거나 같아질 경우에 락이 실행된다.

세마포어의 카운트가 0보다 작거나 같아져 동기화에 실행된 상황에, 다른 쓰레드가 signal 함수를 호출하면 세마포어의 카운트가 1증가하고, 해당 쓰레드는 락에서 나올 수 있다.

세마포어는 크게 Counting Semaphores, Binary Semaphore 2 종류가 있다. 카운팅 세마포어는 세마포어의 카운트가 양의 정수값을 가지며, 설정한 값만큼 쓰레드를 허용하고 그 이상의 쓰레드가 자원에 접근하면 락이 실행된다. 바이너리 세마포어는 세마포어의 카운트가 1이며 Mutex 처럼 사용될 수 있다. (뮤텍스는 절대 세마포어처럼 사용될 수 없다.)

 

예시) 화장실이 여러 칸이 있는 식당

'JAVA > 지식' 카테고리의 다른 글

Spring Boot Batch(read, process, write) #1  (0) 2021.02.28
ActiveMQ vs kafka vs RabbitMQ  (0) 2021.02.28
[AOP] AOP 정의, 용어정리, 활용방법  (0) 2021.02.08
[JAVA] 열거형(enum)  (0) 2021.02.04
[Java] TimeUnit.Sleep 과 Thead.Sleep 차이  (0) 2021.01.28