문제점
동시에 여러 스레드가 공유 자원에 접근하면
- 일관성 없는 데이터
- 데드락: 두 개 이상의 스레드가 서로 다른 자원을 점유하고, 상대 자원을 기다릴때 교착상태 발생
- 성능 저하: 스레드간의 경쟁 상황으로 인한 성능저하
임계구역(Critical Section)
여러 프로세스 혹은 스레드가 작업을 수행하면서 공유된 자원을 건드리게 될 수 있는데, 이때 프로그램 코드 사엥서 공유 자원에 접근하는 부분을 임계 구역이라고 한다.
임계 구역에 여러 프로세스 및 스레드가 함부로 접근할 수 없도록 관리를 잘 해줘야하는데, 이를 위해 사용하는 방식에 대표적으로 세마포어와 뮤텍스가 있다.
뮤텍스(Mutex)
동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘 중 하나
- 임계구역을 가진 스레드들의 실행시간이 서로 겹치지 않고 각각 단독으로 실행(상호 배제:Mutual Exclution)되도록 하는 기술
- 잠금과 해제로 관리
- 이진 상태(잠금 OR 해제)만을 가짐
세마포어(Semaphore)
멀티 프로그래밍 환경에서 공유된 자원에 대해 접근을 제한하는 방법
- 공유 자원에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자 접근 가능
- 각 프로세스는 세마포어의 값(카운터)을 확인하고 변경 가능
- 자원을 사용하지 않는 상태가 될 때, 대기 프로세스가 즉시 자원 사용
차이점
- 동기화 대상의 개수
- 뮤텍스: Only 1
- 세마포어: n개(카운터)
- 세마포어는 뮤텍스로 사용 가능하지만, 반대는 불가능
- 소유자
- 해제
- 뮤텍스는 소유하고 있는 스레드만이 락을 해제 가능
- 세마포어는 세마포어를 공유하는 스레드가 다른 스레드의 세마포어 해제 가능