경쟁 상태(Race Condition)

Lys·2023년 11월 2일
0

운영체제

목록 보기
14/23

경쟁 상태(Race Condition)란

  • 공유 자원에 대해 여러 프로세스가 동시에 접근을 시도할 때, 타이밍이나 순서 등이 결과 값에 영향을 줄 수 있는 상태를 의미한다.
  • 공유 자원에 여러 프로세스가 동시에 접근할 때 자료의 일관성을 해치는 결과가 나타날 수 있다.
  • 공유 메모리를 쓰는 프로세스끼리는 경쟁상태가 발생할 수 있는데, 이에 대한 해결책이 동기화다.
  • 경쟁 상태가 발생하는 경우

예시

Producer-Consumer 상황을 예시로 들어보겠다.
Producer는 공유 메모리에 데이터를 쓰는 쓰레드고, Consumer는 공유 메모리에서 데이터를 가져가는 쓰레드다

int counter = 0;
item nextProduced;
item nextConsumed;

//Producer thread
while(TRUE){
	while(counter == BUFFER_SIZE);
    buffer[in] = nextProduced;
    in = (in + 1) % BUFFER_SIZE;
    counter++;
}

//Consumer thread
while(TRUE){
	while(counter == 0);
    nextConsumed = buffer[out];
    out = (out + 1) % BUFFER_SIZE;
    counter--;
}

counter++; //Rroducer thread
counter--; //Consumer thread

counter = 3 ??  // counter의 값이 3이 맞을까??

항상 3임을 보장받을 수 없다. counter++, counter--는 3가지 assembly code로 이루어져
있다. 단계는 아래와 같다.


//counter++
register1 = counter // load from memory
register1 = register +1;
counter = register1; // store in memory

//counter--
register2 = counter //load from memory
register2 = register -1;
counter = register2 // store in memory

차례대로 실행되는 과정을 자세히 풀어보겠다.

  • TO : producer execute register1 = counter {register1 = 3}
  • T1 : producer execute register1 = register1+1 {register1 = 4}
  • T2 : producer execute counter = register1 {counter = 4}
  • T3 : consumer execute register2 = counter {register2 = 4}
  • T4 : consumer execute register2 = register2-1 {register2 = 3}
  • T5 : consumer execute counter = register2 {counter = 3}
    counter의 값이 3이 되는 경우는 T0~T5가 순서대로 실행될 때다. 하지만 producer와 consumer는 서로 다른 쓰레드다. 만약에 context switch가 발생한다면 어떻게 될까

  • TO : producer execute register1 = counter {register1 = 3}
  • T1 : producer execute register1 = register1+1 {register1 = 4}
  • context switch P1 -> P2
  • T2 : consumer execute register2 = counter {register2 = 3}
  • T3 : consumer execute register2 = register2-1 {register2 = 2}
  • context switch P2 -> P1
  • T4 : producer execute counter = register1 {counter = 4}
  • context switch P1 -> P2
  • T5 : consumer execute counter = register2 {counter = 2}
    counter의 최종값은 2가 되었다. 이렇게 실행 순서에 따라 순서가 달라지는 현상을 경쟁 상태라고 한다. 경쟁상태의 근본적인 원인은 메모리 공유이다.


    이에 대한 해결방안은 동기화이다.



🙇‍ 참고 사이트 🙇‍

https://daily-progress.tistory.com/65
https://charles098.tistory.com/88

0개의 댓글

관련 채용 정보