어제의 나보다 성장한 오늘의 나

[운영체제] 세마포어와 뮤텍스 본문

CS/운영체제

[운영체제] 세마포어와 뮤텍스

NineOne 2021. 4. 30. 02:23

세마포어란?

이미지 출처 https://jhnyang.tistory.com/101

semaphore는 깃발이라는 뜻을 가지고 있다. 옛날에는 기찻길에서 깃발 표식으로 파란색이 걸려있으면 지나가도 되고 빨간색이 걸려있으면 섰다가 다른 기차가 지나가게끔 하는 용도로 깃발을 사용했다.

즉 겹치는 기찻길 부분이 두 기차가 공유하는 critical section이라고 할 수 있다. 따라서 critical section(기찻길)을 지나가도 된다 안된다를 알려주는 단어이다.

다시 정리하면! 공유된 자원에 여러 프로세스가 동시에 접근하면서 문제가 발생할 수 있기 때문에 공유된 자원 데이터는 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 둬야 한다.

 

세마포어 종류

Binary semaphore

  • s가 0과 1 두 종류의 값만 갖는 경우
  • 상호배제나 프로세스 동기화의 목적으로 사용
  • Mutex라고도 불린다.

Counting semaphore

  • s가 0이상의 정수 값을 가질 수 있는 경우
  • Producer-Consumer 문제 등을 해결하기 위해 사용 ( 생산자 - 소비자 문제 )

자 그러면 Counting semaphore 세마포어를 예시로 서버에 프린트 다섯 대가 물려있다고 가정하자! 사용자는 프린트를 사용하려고 서버에 요청한다. 그러면 공유자원 즉! 프린터가 5개가 있으니깐 5로 설정되어 있고 사용자가 사용할 때마다 하나씩 감소한다. 그러다가 프린터가 없이 지면 세마포어는 0이 되고 누군가가 프린터가 다 쓰고 반환하면 세마포어가 다시 1로 증가한다. 다시 말하면 세마포어는 단순한 변수이고 공유 자원의 개수를 나타내는 변수이다.

 

세마포어의 동작원리 P, V 연산

  • P : 임계 구역 들어가기 전에 수행 ( 프로세스 진입 여부를 자원의 개수(S)를 통해 결정)
  • V : 임계 구역에서 나올 때 수행 ( 자원 반납 알림, 대기 중인 프로세스를 깨우는 신호 )
procedure P(S)   --> 최초 S값은 1임
    while S=0 do wait  --> S가 0면 1이 될때까지 기다려야 함
    S := S-1   --> S를 0로 만들어 다른 프로세스가 들어 오지 못하도록 함
end P

--- 임계 구역 ---

procedure V(S) --> 현재상태는 S가 0임
    S := S+1   --> S를 1로 원위치시켜 해제하는 과정
end V

이를 통해 한 프로세스가 P 혹은 V를 수행하고 있는 동안! 프로세스가 인터럽트 당하지 않게 된다. P와 V를 사용하여 임계 구역에 대한 상호 배체 구현이 가능하게 되었다.

예시

최초 S 값은 1이고, 현재 해당 구역을 수행할 프로세스 A, B가 있다고 가정하자

  1. 먼저 도착한 A가 P(S)를 실행하여 S를 0으로 만들고 임계구역에 들어감
  2. 그 뒤에 도착한 B가 P(S)를 실행하지만 S가 0이므로 대기 상태
  3. A가 임계구역 수행을 마치고 V(S)를 실행하면 S는 다시 1이 됨
  4. B는 이제 P(S)에서 while문을 빠져나올 수 있고, 임계 구역으로 들어가 수행함

 

뮤텍스란?

  • 뮤텍스는 세마포어와 마찬가지로 병행 처리를 위한 동기화 기법 중 하나이다.
  • Mutual Exclusion으로 상호 배제라고도 한다.
  • Critical Section을 가진 스레드들의 Running Time이 서로 겹치지 않게 각각 단독으로 실행하는 기술
  • 뮤텍스는 상태가 0, 1로 이진 세마포어로 부르기도 함
  • 임계 영역에 들어갈 때 락(lock)을 걸어 다른 프로세스(혹은 스레드)가 접근하지 못하도록 하고, 임계 영역에서 나와 해당 락을 해제(unlock)를 한다.

 

 

 

세마포어와 뮤텍스 차이

  • 세마포어는 Mutex가 될 수 있지만 뮤텍스는 세마포어가 될 수 없다. (뮤텍스는 상태가 0,1 두 개 뿐인 binary Semaphore)
  • 세마포어는 소유할 수 없는 반면, 뮤텍스는 소유가 가능하며 소유주가 이에 대한 책임을 진다. (뮤텍스의 경우 상태가 두 개뿐인 lock 이므로 lock을 가질 수 있다.)
  • 현재 수행 중인 프로세스가 아닌 다른 프로세스가 세마포어를 해제할 수 있다. 하지만 뮤텍스는 락(lock)을 획득한 프로세스가 반드시 그 락을 해제해야 한다.
  • 세마포어는 시스템 범위에 걸쳐 있고 파일 시스템상의 파일 형태로 존재한다. 반면 뮤텍스는 프로세스 범위를 가지며 프로세스가 종료될 때 자동으로 clean up 된다.
  • 세마포어는 공유 자원에 세마포어의 변수만큼 프로세스(또는 스레드)가 접근할 수 있다. 반면 뮤텍스는 오직 1개 만의 프로세스(또는 스레드)만 접근할 수 있다.

가장 큰 차이점!! 관리하는 동기화 대상의 개수이다. 뮤텍스는 동기화 대상이 오직 하나뿐일 때, 세마포어는 동기화 대상이 하나 이상일 때 사용한다.

 

출처

Comments