새소식

반응형
기타

뮤텍스(Mutext), 세마포어(Semaphore)

  • -
반응형

여러개의 프로세스가 동시에 접근하는 동시성 프로그래밍에서 가장 큰 숙제는 공유자원 관리이다.

공유자원을 안전하게 관리하기 위해서는 상호배제(Mutual Exclusion)을 달성하는 기법이

필요하다.

데이터 접근에 대해 한번에 하나의 프로세스만 접근할 수 있도록 제한을 두는 동기화 방식을

취해야 한다. 대표적인 방식으로는 뮤텍스와 세마포어가 있다.

 

Mutex(뮤텍스)

공유된 자원의 데이터에 하나의 프로세스 혹은 쓰레드가 사용하고 있으면

또 다른 쓰레드는 접근할 수 없도록 막는 방법

 

특정 프로세스가 공유된 자원의 데이터에 접근하기 위해선 Key가 필요하며,

특정 프로세스가 Key를 가지고 자원에 접근해 있으면 다른 프로세스는

접근할 수 있는 Key가 반납될 때까지 대기하는 Key를 기반으로 하는 상호배제 기법이다.

 

예를 들어 아래 이미지는 어떠한 식당이 있다.

화장실을 가려면 카운터에서 키를 받아 화장실을 가야한다. 남자는 화장실이 가고싶어

카운터에 갔지만 다른사람이 먼저 Key 를 가지고 화장실에 들어가 있다.

화장실 및 Key 가 하나이므로 남자는 화장실이 가고싶어도 대기해야 한다.

이러한 방법이 뮤텍스가 동작하는 방식이다.

 

화장실을 이용하는 사람은 프로세스 혹은 쓰레드이며 화장실은 공유자원, 화장실 키는

공유자원에 접근하기 위해 필요한 어떤 오브젝트이다.

 

 

Semaphore(세마포어)

세마포어도 뮤텍스와 비슷하지만 접근할 수 있는 공유자원에 대해 최대 허용치만큼 설정해놓고

동시에 사용자가 접근할 수 있다.

최대 허용치를 초과하게 되면 접근하려는 프로세스 혹은 쓰레드는 대기한다.

 

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

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

 

예를 들어 큰 식당의 화장실이 3개이다. 화장실 입구에는 현재 화장실의 빈칸 개수를 보여주는

전광판이 있다.

만약 화장실에 가고싶어 입구에서 빈칸 개수를 확인하고 빈칸이 1개 이상이라면

빈칸의 개수를 하나 뺀 다음에 화장실로 입장해야 한다.

 

화장실이 가고싶어 화장실 전광판을 봤지만 빈칸의 개수가 0이라면 빈칸의 개수가 1개 이상일때 까지

대기해야 한다.

 

위처럼 세마포어는 공통으로 관리하는 자원에 대해 상호배제를 달성한다.

 

 

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

- 뮤텍스는 동기화 대상이 오직 1개일 때 사용하며, 세마포어는 동기화 대상이 1개 이상일 때 사용한다.

- 뮤텍스는 자원을 소유할 수 있고, 책임을 가지는 반면 세마포어는 자원 소유가 불가능하다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.