Semaphore/Mutex

sz L·2023년 9월 12일
0

통신

목록 보기
7/11

프로세스 간 메시지를 전송하거나, 공유메모리를 통해 공유된 자원에 여러 개의 프로세스가 동시에 접근하면 Critical Section(여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 블록) 문제가 발생할 수 있다.

이를 해결하기 위해 데이터를 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 두는 동기화 방식을 취해야 한다.

동기화 도구에는 대표적으로 뮤텍스(Mutex)와 세마포어(Semaphore)가 있다.

이들은 모두 공유된 자원의 데이터를 여러 스레드/프로세스가 접근하는 것을 막는 역할을 한다.

※ 임계구역 : 서로 다른 두 프로세스, 혹은 스레드 등의 처리 단위가 같이 접근해서는 안 되는 공유 영역을 뜻한다.

Semaphore


공유된 자원의 데이터 혹은 임계영역 등에 여러 Process 혹은 Thread가 접근하는 것을 막아준다. (동기화 대상 하나 이상)

세마포어는 단순히 공유자원의 개수를 나타내는 변수라고 생각하면 된다.

사용하고 있는 스레드/프로세스의 수를 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성한다.

공유 자원에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근할 수 있으며, 각 프로세스는 세마포어의 값을 확인하고 변경할 수 있다.

자원을 사용하지 않는 상태가 될 때, 대기하던 프로세스가 즉시 자원을 사용하고, 이미 다른 프로세스에 의해 사용중이라는 사실을 알게 되면, 재시도 전에 일정시간 대기해야 한다.

예를들어, 서버에 프린트가 다섯 대가 물려있다고 하자.
사용자가 프린트를 사용하려고 서버에 요청하면 프린트가 5개가 있으니 즉, 공유자원이 5로 설정된다.
그리고 프린터를 사용자가 사용할 때마다 하나씩 감소한다.
이렇게 다섯 대의 프린터가 모두 사용되고 있다면 공유자원(세마포어)은 0이된다.

Mutex(Mutual Exclusion_상호 배제)

공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 하나의 Process 혹은 Thread가 접근하는 것을 막아줌 -> 동기화 대상 하나

임계구역을 가진 스레드들의 실행시간이 서로 겹치지 않고 각각 단독으로 실행되도록 하는 기술

lock : 현재의 임계 구역에 들어갈 권한을 얻어온다. 만일 다른 프로세스/스레드가 임계 구역을 수행 중이라면 종료할 때까지 대기한다.(Entry Section)

unlock : 현재의 임계 구역을 모두 사용했음을 알린다. 대기중인 다른 프로세스/스레드가 임계 구역에 진입할 수 있다.

한 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호배제 기법이고 Key에 해당하는 어떤 객체(Object)가 있으며, 이 객체를 소유한 스레드/프로세스만이 공유자원에 접근할 수 있다.

다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 동기화(Synchroniczation) 또는 락(Lock)을 사용함으로써 뮤텍스 객체를 두 스레드가 동시에 접근할 수 없다.

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

  • 동기화 대상의 개수
    • Mutex : 1개
    • Semaphore : 1개 이상
  • 자원 소유의 유무
    • Mutex : 자원 소유 가능, 책임을 가짐
    • Semaphore : 자원 소유 불가능
  • 임계구역 접근/해제
    • Mutex는 상태가 0과 1 뿐이므로 Lock을 가질 수 있고, 소유하고 있는 스레드만이 이 Mutex를 해제할 수 있다.
    • Semaphore는 Semaphore를 소유하지 않는 스레드가 Semaphore를 해제할 수 있다
  • 범위
    • Mutex는 프로세스의 범위를 가지고 프로세스가 종료될 때 자동으로 Clean Up 된다.
    • Semaphore는 시스템 범위에 걸쳐있고, 파일 시스템 상의 파일로 존재함
profile
가랑비는 맞는다 하지만 폭풍은 내 것이야

0개의 댓글