race condition이란 공용데이터에 대한 접근이 어떤 '순서'에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황을 말한다.
경쟁 프로세스의 경우 세가지 제어 문제에 직면한다.
race condition 을 막기 위해서는 두개 이상의 프로세스가 공용데이터에 동시에 접근하는 걸 막아야함.
즉, 한 프로세스가 공용 데이터를 사용하고 있으면 그 자원을 사용하지 못하도록 막거나, 다른 프로세스가 그 자원을 사용하지 못하도록 막으면 이 문제를 피할 수 있다. 이를 상호 배제 라고 부른다. -> Binary mutex.
그러나 위와 같은 상호배제를 시행하면 deadlock 이 생길수 잇다. 두 프로세스가 모두 하나의 자원에 엑세스 해야한다고 가정하자. 이미 사용하여 프로그램을 수행하고 있기 때문에 그게 필요한 다른 프로세스는 그 자원을 사용할 수 없고 프로그램을 수행할 수 없게 된다. 이때 프로세스는 교착상태에 빠지게 된다.
기아 상태이다. 시스템 자원에 대한 경쟁도중에 발생할 수 잇고 프로세스간의 통신과정에도 발생할 수 잇는 문제. 두개이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있기 때문에 결과적으로는 아무것도 완료되지 못하는 상태가 된다.
=> cached proxy 에서 readcount mutex 를 해제하지 않고 바로 write mutex에 들어 가려 할때 이미 readcount 요청이 들어오고 있는 cache 라면 접근 할 수 조차 없는 문제가 발생한다.
race condition을 예방하는 방법으로 semaphore 와 mutex가 있다.
공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는것. (여기서 공유된 자원이란 프로세스들이 돌아가는 전체 가상 메모리?)
하나의 스레드만 들어가게 할수도있고 여러개의 스레드가 들어가게 할수도 있다. -> 뮤텍스와의 차이? 아마 하나의 프로세스 안에 한개의 스레드가 있을 수도 있고 여러개의 스레드가 있을 수도 있으니 프로세스를 들어오게한다는 건 그 안에 진행되는 모든 스레드를 들어오게 한다는 의미가 아닐까.
Critical Section(각 프로세스에서 공유데이터를 엑세스 하는 프로그램 코드 부분)을 가진 쓰레드들의 running time이 서로 겹치지 않게 단독으로 실행되게 하는 기술.
=> locking and unlocking. 상호배제함으로써 두 쓰레드가 동시에 사용할 수 없다는 뜻