운영체제

[운영체제] 뮤텍스(Mutex)와 세마포어 (Semaphore)

hyeonit 2024. 9. 21. 03:59

뮤텍스와 세마포어는 멀티스레드 환경때문에 나왔다 

 

왜 나왔냐?

-> 동시성 문제 때문에 나왔다

-> 데드락 문제

 

 

동시성 문제

동시성 문제는 여러 스레드가 동시에 접근할 때 발생할 수 있는 충돌을 말한다

 

데드락(deadlock)

두개 이상의 스레드가 서로 다른 자원을 점유하고 서로 상대방의 자원을 기다릴때 교착 상태가 발생 할 수 있다

 

예를 들면 

여러 스레드가 하나의 데이터베이스에 동시에 update 연산을 시도할 경우에 데이터 일관성에 문제가 생길 수 있다 

 

이를 방지하기 위해 뮤텍스세마포어가 필요하다

 

 

뮤텍스(Mutex)?

 

  • 한번에 하나의 스레드만 특정 자원에 접근 할 수 있도록 제어하는 동기화 객체이다
  • 자원에 접근하기 전 뮤텍스를 획득 하고 자원 사용이 끝나면 해제하는 방식이다

 

 

세마포어(Semaphore)?

 

  • 정해진 개수의 스레드가 자원에 접근할 수 있도록 허용하는 동기화 도구
  • 카운터로 동작하고 각 스레드가 자원을 사용할 때마다 카운터 값을 감소시키고 사용을 마치면 카운터 값을 다시 증가 시킨다

 

 

그럼 각각 어떨때 사용할까?

 

뮤텍스 :

  • 한번에 하나의 스레드만 자원을 사용해야 할때
  • 동시에 여러 스레드가 파일에 접근하여 데이터를 변경하면 데이터가 꼬일 수 있다 
  • 이때 뮤텍스를 사용하여 데이터 일관성을 보장한다

 

세마 포어 :

  • 여러 스레드가 동시에 자원에 접근할 수 있지만 자원의 수가 제한되어 있을때
  • 데이터베이스 connection pool 에서 여러 스레드가 동시에 접근 하려고 하면 세션의 수가 제한적이다
  • 이때 세마포어를 사용하여 일정 수의 스레드만 접근 할 수 있게 제한하면 과부화를 방지하고 여러 스레드가 동시에 자원을 사용할 수 있게 된다

 

 

차이점 정리

  뮤텍스 세마포어
동작 방식 한 번에 하나의 스레드만 자원 접근 가능 여러 스레드가 자원에 접근 할 수 있음
소유권 소유권이 있다 소유권 없다
자원 접근  자원에 대한 독점적 접근을 보장 자원에 대해 공유 접근을 허용