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

HEETAE HEO·2022년 6월 11일
1
post-thumbnail

뮤텍스와 세마포어를 알아보기 전 임계구역(Critical Section)를 먼저 알아보겠습니다

임계구역(Critical Section)이란

여러 프로세스 혹은 스레드가 작업을 수행하면서 공유된 자원을 건드리게 될 수 있는데, 이때 프로그램 코드 상에서 공유 자원에 접근하는 부분을 임계 구역이라고 합니다.

이렇게 임계 구역에 여러 프로세스 및 스레드가 함부로 접근할 수 없도록 관리를 잘 해줘야 하는데, 이를 위해 사용하는 방식에 대표적으로 세마포어와 뮤텍스가 있습니다.

뮤텍스

동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘중 하나로 특징은 다음과 같습니다.

  • 임계구역을 가진 스레드들의 실행시간이 서로 겹치지 않고 각각 단독으로 실행(상호배제 Mutual Exclution)되도록 하는 기술
  • 한 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호배제 기법 Key에 해당하는 어떤 객체(Object)가 있으며, 이 객체를 소유한 스레드/프로세스만 이 공유자원에 접근할 수 있다.

  • 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 동기화 또는 락을 사용합니다.

  • 즉 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없습니다.

세마포어

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

  • 공유자원의 상태로 나타낼 수 있는 카운터로 생각할 떄

    • 사용하고 있는 스레드/프로세스의 수를 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성한다.
    • 운영체제 또는 커널의 한 지정된 저장장치 내의 값
    • 일반적으로 비교적 긴 시간을 확보하는 리소스에 대한 이용
    • 유닉스 프로그래밍에서 세마포어는 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 해동을 조정하거나 또는 동기화하는 기술
  • 공유 자원에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근할 수 있습니다.

  • 각 프로세스는 세마포어의 값을 확인하고 변경할 수 있다.

  • 각 프로세스는 세마포어의 값을 확인하고 변경할 수 있습니다.

  • 자원을 사용하지 않는 상태가 될 때 대기하던 프로세스가 즉시 자원을 사용한다.

  • 이미 다른 프로세스에 의해 사용중이라는 사실을 알게되면 재시도 전에 일정시간 대기 해야한다.

  • 세마포어를 사용하는 프로새스는 그 값을 확인하고 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 대기하도록 해야한다.

  • 세마포어는 이진수를 사용하거나 추가적인 값을 사용할 수 있다.

뮤텍스와 세마포어의 차이점

  1. 동기화 대상의 개수
    Mutex는 동기화 대상이 only 1개일 때 사용
    Semaphore는 동기화 대상이 1개 이상일 때 사용

  2. 세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없다.
    Mutext는 0,1로 이루어진 이진 상태이므로 Binary Semaphore

  3. Mutex는 자원 소유가능 + 책임을 가지는 반면 Semaphore는 자원 소유가 불가합니다.

  4. Mutex는 소유하고 있는 스레드 만이 이 Mutex를 해제할 수 있다.
    반면, Semaphore는 Semaphore를 소유하지 않는 스레드가 Semaphore를 해제할 수 있다.

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

뮤텍스와 세마포어는 모두 완벽한 기법은 아니므로 데이터 무결성을 보장할 수 없으며 모든 교착 사애를 해결하지는 못합니다. 하지만 상호배제를 위한 기본적인 기법이기에 알아야하는 지식입니다.

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글