[CS] 뮤텍스와 세마포어

·2024년 3월 27일
0

CS

목록 보기
23/23

배경

동시에 여러 스레드가 공유 자원에 접근하면 race condition에 놓여 프로그램의 안정성과 일관성을 해치게 될 것이다.

공유자원을 안전하게 관리하기 위해서는 데이터를 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 두는 동기화 방식이 필요하다.

동기화 도구에는 대표적으로 MutexSemaphore가 있다.
이들은 모두 공유된 자원의 데이터를 여러 스레드/프로세스가 접근하는 것을 막는다.

임계영역(Critical Section)
여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 블록

즉, 여러 프로세스가 동일 자원을 동시에 참조하여 값(공유하는 변수명, 파일 등)이 오염될 가능성이 있는 영역이다.
프로그래밍 시, 성능 향상을 위해 임계영역을 최소화하는 설계를 해야한다.

Mutex

동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘

  • 임계영역을 가진 스레드들의 실행시간이 서로 겹치지 않고 각각 단독으로 실행하여 상호 배제 되도록 하는 기술
  • 한 프로세스에 의해 소유될 수 있는 key를 기반으로 한 상호배제 기법
    • key에 해당하는 어떤 객체가 있으며, 이 객체를 소유한 스레드와 프로세스만이 공유자원에 접근할 수 있다.
  • 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 동기화(Synchronization) 또는 락(Lock)을 사용
  • 즉 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없음

Semaphore

멀티 프로그래밍 환경에서 공유된 자원에 대한 접근을 제한하는 방법

  • 공유 자원의 상태를 나타낼 수 있는 카운터로 생각할 때
    • 사용하고 있는 스레드/프로세스의 수를 공통으로 관리하는 하나의 값을 이용해 상호배제 달성
    • 운영체제 또는 커널의 한 지정된 저장장치 내의 값
    • 일반적으로 비교적 긴 시간을 확보하는 리소스에 대한 이용
  • 공유자원에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근 가능
  • 각 프로세스는 세마포어의 값을 확인하고 이용할 수 있음
  • 자원을 사용하지 않는 상태가 될 때, 대기하던 프로세스가 즉시 자원을 사용
  • 이미 다른 프로세스에 의해 사용중이라는 사실을 알게 되면 재시도 전에 일정시간 대기해야함
  • 세마포어를 사용하는 프로세스는 그 값을 확인하고 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 대기하도록 해야함
  • 이진수를 사용하거나 추가적인 값을 가질 수 있음

Mutex와 Semaphore의 차이점

  1. 동기화 대상의 갯수
    • Mutex : 1개
    • Semaphore : 1개 이상

  2. Semaphore는 Mutex가 될 수 있지만 Mutex는 Semaphore가 될 수 없음
    • Mutex : 0, 1로 이루어진 이진 상태
    • Binary Semaphore

  3. Mutex는 자원 소유가 가능하고 책임을 가지는 반면, Semaphore는 자원 소유 불가
    • Mutex는 상태가 0, 1 뿐이므로 Lock을 가질 수 있다

  4. Mutex를 소유하고 있는 스레드만이 Mutex를 해제할 수 있음
    • Semaphore는 Semaphore를 소유하지 않는 스레드가 Semaphore를 해제할 수 있음

  5. Semaphore는 시스템 범위에 걸쳐 있고, 파일 시스템 상의 파일로 존재 한다.
    • Mutex는 프로세스의 범위를 가지며 프로세스가 종료될 때 자동으로 clean up 된다.

Mutex와 Semaphore는 모두 완벽한 기법은 아니므로, 데이터 무결성을 보장할 수 없으며 모든 교착 상태를 해결하지는 못한다.

하지만 상호배제를 위한 기본적인 기법이며 여기에 좀 더 복잡한 메커니즘을 적용해 개선된 성능을 가질 수 있도록 하는 것이 중요하다.

참고

https://chelseashin.tistory.com/40
https://worthpreading.tistory.com/90

0개의 댓글