[OS] 뮤텍스와 세마포어

Minji Lee·2024년 1월 11일
0

CS공부

목록 보기
6/6
post-thumbnail

공유자원

시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수를 의미

  • 공동으로 이용되기 때문에 누가 언제 데이터를 읽거나 쓰느냐에 따라 결과가 달라짐

  • 경쟁 상태: 공유자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황

    ex) 공유자원이 예금 10만원이 존재한다고 가정, 프로세스 P1은 예금 확인 후 10만원 더 입금하고 프로세스 P2는 예금 확인 후 5만원 더 입금한다고 가정

    → 결론적으로는 25만원이 되어야 하지만, 20만원이라는 맞지 않는 문제 발생


임계 구역

공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역

임계구역 해결 조건

  1. 상호 배제(mutual exclusion)

    한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 들어갈 수 없음

    ex) 주방에서 두 요리사가 한 믹서에 각자의 재료들을 한 번에 넣고 갈면 안됨

  2. 한정 대기(bounded waiting)<.span>

    특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안됨 ⇒ 무한 대기 X

    ex) 한 요리사가 믹서를 계속 사용해서 다른 요리사가 믹서를 사용하지 못한 채 기다리게 해서는 안됨

  3. 진행의 융통성(progress flexibility)

    한 프로세스가 다른 프로세스의 일을 방해하면 안됨

    ex) 요리사 A와 B가 믹서를 번갈아 사용할 때, 요리사 B가 믹서를 사용한 후 요리사 A가 사용하든 안하든 믹서 사용할 때까지 기다려야하는 상황에서 요리사 B는 요리사 A의 작업 속도와 관계없이 믹서가 비어있으면 언제든 사용 가능해야 함

임계구역 해결 방법

뮤텍스, 세마포어, 모니터

  • 위의 세가지 방법은 임계구역 해결 조건을 만족
  • lock(잠금)이용
    • 임계구역에 들어가면 lock을 함
    • 해당 작업 완료되면 lock 해제하면서 다른 사람 사용하라는 동기화 신호 보냄

뮤텍스(Mutex)

프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠금 해제하는 객체

  • 잠금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역 접근 불가능 ⇒ 잠금
  • 해제되었을 때 접근 가능 ⇒ 잠금 해제

세마포어(Semaphore)

간단한 정수 값과 두 가지 함수 wait(P함수)signal(V함수)로 공유 자원에 대한 접근 처리

  • 일반화된 뮤텍스
  • wait(): 자신의 차례가 올 때까지 기다리는 함수
    → 프로세스나 스레드가 공유 자원 접근하면 세마포어에서 wait() 작업 수행
  • signal(): 다음 프로세스로 순서 넘겨주는 함수
    → 프로세스가 스레드가 공유 자원을 해제하면 세마포어에서 signal() 작업 수행

세마코어 내부 코드

1. Semaphore(n); //전역 변수 RS를 n으로 초기화(RS: 현재 사용 가능한 자원의 수)
2. P();  // if RS>0 then RS=RS-1; else block();
/*
 임계구역
*/
3. V(); // RS=RS+1; wake_up();
  1. Semaphore(n)에서 전역 변수 RS를 n으로 초기화

  2. RS가 0보다 크면(=사용 가능한 자원이 있다면) 1만큼 감소시킨 후 임계 구역 진입

    만약, RS가 0보다 작으면(=사용 가능한 자원이 없으면) 0보다 커질 때까지 대기

  3. V()는 잠금해제와 동기화 같이 수행하는 코드, RS값 1로 증가 시킨 후 세마포어에서 기다리는 프로세스에게 임계구역 진입해도 좋다는 wake_up 신호 보냄

바이너리 세마포어

0과 1의 두 가지 값만 가질 수 있는 세마포어

  1. P1이 먼저 도착하여 임계 구역 진입, RS를 1 감소시킴
  2. 나중에 P2가 도착 하였지만, 현재 RS값이 0이므로 P1이 임계구역 빠져나올 때까지 세마포어 큐에서 대기
  3. P1이 작업을 다 마친 후 V()를 실행하여 RS 1 증가시킨 후, wake_up 신호를 P2에게 보냄
  4. 신호를 받은 P2가 작업 수행

❗️뮤텍스의 흐름과 비슷해 보이지만, 뮤텍스는 잠금을 기반으로 하는 ‘잠금 메커니즘’이고, 세마포어는 신호를 기반으로 하는 ‘신호 메커니즘’

카운팅 세마포어

여러 개의 값을 가질 수 있는 세마포어

  • 여러 자원에 대한 접근 제어하는데 사용됨

  1. P1은 RS값 1 감소시킨 후 임계구역 진입
  2. P2도 RS값 1 감소시킨 후 임계구역 진입
  3. P3는 RS값이 0이므로 다른 프로세스가 임계구역 빠져나올 때까지 대기
  4. P1이 작업 끝내고 V() 실행하면 RS값 1로 증가시키고, wake_up() 신호 P3로 보냄
  5. P3도 작업 수행

세마포어와 뮤텍스 차이

  • Mutex동기화 대상이 오직 1개일 때 사용하며, Semaphore동기화 대상이 1개 이상일 때 사용
  • Mutex자원을 소유할 수 있고, 책임을 가지는 반면 Semaphore자원 소유가 불가능
  • Mutex상태가 0, 1뿐이므로 Lock을 가질 수 있고 소유하고 있는 스레드만이 이 Mutex를 해제할 수 있다.
  • SemaphoreSemaphore를 소유하지 않는 스레드가 Semaphore를 해제할 수 있다.
  • Semaphore시스템 범위에 걸쳐 있고 파일 시스템 상의 파일로 존재한다. 반면 Mutex프로세스의 범위를 가지며 프로세스가 종료될 때 자동으로 Clean up 된다.

참고 자료

[10분 테코톡] 🎲 와일더의 Mutex vs Semaphore

쉽게 배우는 운영체제

면접을 위한 CS 전공지식 노트

0개의 댓글