[운영체제] Race Condition (경쟁조건)
https://www.youtube.com/watch?v=vp0Gckz3z64&list=PLcXyemr8ZeoQOtSUjwaer0VMJSMfa-9G-&index=4
해당 영상을 참고하여 작성하였습니다.

멀티쓰레드 환경에서는 위와 같은 동작이 예상한 결과대로 동작하지 않을 가능성이 있다.
쓰레드 T1이 메모리에 있는 state값을 불러와서 불량상태의 귤을 인지하여 +1 연산을 한다.
그런데 문맥교환이 발생하여 T2가 increment를 호출하여 state값을 가져올때는 이전 T1에 의한 증가작업이
저장되지 않아 0으로 불러와서 1을 더해 state값은 최종적으로 1로 저장된다.
이제 다시 T1의 작업으로 교환될때 이전에 저장작업을 하지 않았으므로
전에 했던 작업을 이어서 1을 저장하게 된다.
결과론적으로는 state값은 1이 되어 버린다. ---> 동시성 문제로 인하여 예상치 못한 결과가 도출되었다. (예측결과: 2)
이러한 원인은 t1이 작업을 완전히 종료 후 (값읽음->증가->저장) 에 해야 안전하지만 t2가 기다리지 않고 바로했기 때문이다.
이렇게 여러 프로세스 or 쓰레드가 동시에 같은 데이터를 조작할때 타이밍이나 접근 순서에 따라 결과가 달라질 수 있는 현상을
race condition (경쟁조건) 이라고 한다.
이러한 멀티 쓰레드(프로세스) 환경에서 동시 실행에서도 공유데이터의 일관성을 유지하는 것을 동기화(synchronization)라고 한다.
동기화로서는
increment메서드를 한 쓰레드가 작업중이라면 접근을 막는 방법이 있다.
이렇게 공유데이터의 일관성 보장을 위해 하나의 스레드만 진입해서 실행 가능한 영역을 임계영역 이라고 한다.
임계 영역 문제에 대한 해결책
1. mutual exclusion (상호배제) : 한번의 하나의 쓰레드만 작업이 가능하다.
2. progress (진행) : 어떠한 쓰레드들이 진입을 원하고자 한다면 그 중 하나는 임계영역 안에서 실행가능 해야 한다.
(지속적으로 진행될 수 있게)
3. bounded waiting (한정된 대기) :
프로세스가 임계영역에 접근하지 못하고 무한정 대기 상태에 빠지면 안된다.