Race Condition & Critical Section & Semaphore, Mutex

노지환·2022년 3월 29일
0

운영체제

목록 보기
5/5
post-custom-banner

항상 deadlock을 따라다니는 세 친구들

자료들을 읽다보면, Race Condition부터 시작하여 Critical Section이 무엇인지 그리고 이를 해결하기 위한 Semaphore와 mutex가 무엇인지 설명하고 시작하는 경우가 많다.
이번 기회에 어떤 친구들인지 알아보기로 하자.

Race Condition

동시에 여러개의 프로세스가 동일한 자료를 접근하여 조작하고,

그 실행 결과가 특정 순서에 의존하는 상황

ex

이렇게 되어버리면 사용자가 원하는 결과를 얻지 못하고, 이상한 값들을 가지게 된다.

그래서 이러한 문제를 해결하기 위한 접근 방법이 Critical Section Problem 이다.

Critical Section(임계영역)

동일한 자원을 동시 접근하는 작업을 실행하는 코드 영역

Critical Section Problem(임계영역 문제)

프로세스들이 Critical Section을 함께 사용할 수 있는 프로토콜을 설계하는 것

이를 해결하려면 3가지 조건들이 모두 만족해야한다.

  • Mutual Exclusion(상호 배제)
    • 프로세스 P1이 Critical Section에서 실행 중이라면, 다른 프로세스들은 그들이 가진 Critical Section에서 진행될 수 없다.
  • Progress(진행)
    • Critical Section에서 실행중인 프로세스가 없고, 별도의 동작이 없는 프로세스들만 Critical Section 진입 후보로서 참여될 수 있다.
  • Bounded Waiting(한정된 대기)
    • P1가 Critical Section에 진입 신청 후부터 받아들여질 때까지, 다른 프로세스들이 Critical Section에 진입하는 횟수는 제한이 있어야 한다.

Semaphore & Mutex

Semaphore

임계구역을 설정하여 그 동안에는 다른 프로세스가 접근하지 못하도록 하는 방법

가용한 개수를 가진 자원에 대한 접근 제어용으로 사용. semaphore는 가용한 자원의 개수로 초기화 한다.

자원을 사용하면 세마포가 감소하고, 방출하면 세마포가 증가한다.

  • P와 V라는 동작이 있다고 가정함.
    • P: 임계 구역 들어가기 전에 수행 ( 프로세스 진입 여부를 자원의 개수(S)를 통해 결정)
    • V: 임계 구역에서 나올 때 수행 (자원 반납 알림, 대기 중인 프로세스를 깨우는 신호)

Mutex

  • 프로세스가 임계구역에 들어가기 전에 lock을 획득하고, 나올 때 lock을 반환한다.
  • 상태가 0, 1인 이진 세마포어라고 부르기도 한다.

문제점

busy waiting
→ 자원을 얻을 때까지 계속 확인하는 것을 의미
→ CPU 자원을 쓸데 없이 낭비하기 때문에 좋지 않은 쓰레드 동기화 방식

해결방법

wait하는 함수에 block()이라는 함수 추가 → list에 자기 자신을 등록하고 sleep()하는 함수

wakeup(): signal()함수 내부에서 실행. 대기하고 있는 프로세스 중 하나를 깨워줌

profile
기초가 단단한 프로그래머 -ing
post-custom-banner

0개의 댓글