운영체제
[운영체제] 뮤텍스(Mutex)와 세마포어 (Semaphore)
hyeonit
2024. 9. 21. 03:59
뮤텍스와 세마포어는 멀티스레드 환경때문에 나왔다
왜 나왔냐?
-> 동시성 문제 때문에 나왔다
-> 데드락 문제
동시성 문제
동시성 문제는 여러 스레드가 동시에 접근할 때 발생할 수 있는 충돌을 말한다
데드락(deadlock)
두개 이상의 스레드가 서로 다른 자원을 점유하고 서로 상대방의 자원을 기다릴때 교착 상태가 발생 할 수 있다
예를 들면
여러 스레드가 하나의 데이터베이스에 동시에 update 연산을 시도할 경우에 데이터 일관성에 문제가 생길 수 있다
이를 방지하기 위해 뮤텍스와 세마포어가 필요하다
뮤텍스(Mutex)?
- 한번에 하나의 스레드만 특정 자원에 접근 할 수 있도록 제어하는 동기화 객체이다
- 자원에 접근하기 전 뮤텍스를 획득 하고 자원 사용이 끝나면 해제하는 방식이다
세마포어(Semaphore)?
- 정해진 개수의 스레드가 자원에 접근할 수 있도록 허용하는 동기화 도구
- 카운터로 동작하고 각 스레드가 자원을 사용할 때마다 카운터 값을 감소시키고 사용을 마치면 카운터 값을 다시 증가 시킨다
그럼 각각 어떨때 사용할까?
뮤텍스 :
- 한번에 하나의 스레드만 자원을 사용해야 할때
- 동시에 여러 스레드가 파일에 접근하여 데이터를 변경하면 데이터가 꼬일 수 있다
- 이때 뮤텍스를 사용하여 데이터 일관성을 보장한다
세마 포어 :
- 여러 스레드가 동시에 자원에 접근할 수 있지만 자원의 수가 제한되어 있을때
- 데이터베이스 connection pool 에서 여러 스레드가 동시에 접근 하려고 하면 세션의 수가 제한적이다
- 이때 세마포어를 사용하여 일정 수의 스레드만 접근 할 수 있게 제한하면 과부화를 방지하고 여러 스레드가 동시에 자원을 사용할 수 있게 된다
차이점 정리
뮤텍스 | 세마포어 | |
동작 방식 | 한 번에 하나의 스레드만 자원 접근 가능 | 여러 스레드가 자원에 접근 할 수 있음 |
소유권 | 소유권이 있다 | 소유권 없다 |
자원 접근 | 자원에 대한 독점적 접근을 보장 | 자원에 대해 공유 접근을 허용 |