Race Condition
경쟁 프로세스의 경우, 세 가지 제어 문제에 직면한다.
하나하나 살펴보자
Race Condition을 막기 위해서는 두 개 이상의 프로세스가 공용 데이터에 동시에 접근을 하는 것을 막아야한다. 즉, 한 프로세스가 공용 데이터를 사용하고 있다면 그 자원을 사용하지 못하도록 막거나, 다른 프로세스가 그 자원을 사용하지 못하도록 막으면 이 문제를 피할 수 있다.
이것을 상호 배제(Mutual exclusion)이라고 한다.
그러나 위와 같은 Mutual exclusion를 시행하면 추가적인 제어 문제가 발생한다. 바로 Deadlock(교착상태)이다.
프로세스가 각자 프로그램을 실행하기 위해 두 자원 모두에 액세스 해야 한다고 가정할 때 프로세스는 두 자원 모두를 필요로 하므로 필요한 두 리소스를 사용하여 프로그램을 수행할 때까지 이미 소유한 리소스를 해제하지 않는다. 이러한 상황에서 두 프로세스는 교착 상태에 빠지게 되는 문제가 발생할 수 있다.
Starvation는 프로세스들이 더 이상 진행을 하지 못하고 영구적으로 블록되어 있는 상태로, 시스템 자원에 대한 경쟁 도중에 발생할 수 있고 프로세스 간의 통신 과정에도 발생할 수 있는 문제이다. 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있기 때문에 결과적으로는 아무것도 완료되지 못하는 상태가 된다.
이렇게 Raca Condition인 경우에는 스레드의 실행 순서를 잘 조절하지 않으면 비정상적인 상태가 발생한다.
이러한 문제들은 디버깅을 할 때에는 전혀 보이지 않고, 발생 시에 모든 프로세스에 원하는 결과가 발생하는 것을 보장할 수 없으므로 큰 문제를 야기할 수 있다.
이러한 문제가 발생하지 않도록, OS는 다른 프로세스의 의도하지 않은 간섭으로부터 각 프로세스의 데이터 및 물리적 자원을 보호해야 하며 여기에 메모리, 파일 및 I/O 장치와 관련된 내용이 포함된다. 그리고 프로세스에서 수행하는 내용과 프로세스가 생성하는 결과는, 다른 동사 프로세스의 실행 속도와 무관하게
즉, 기능과 결과는 서로 독립적이어야 한다.
Race Condition을 예방할 수 있는 방법으로는 세마포어
와 뮤텍스
가 있다. 자세한 내용은 아래 글을 참고하자!
뮤텍스와 세마포어에 대하여
두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓸 때, 공용 데이터에 대한 접근이 순서에 따라 실행 결과가 달라지는 상황
Race Condition이 발생하게 되면, 모든 프로세스에 원하는 결과가 발생하는 것을 보장할 수 없음. 따라서 이러한 상황은 피해야 하며 상호배제나 임계구역으로 해결이 가능하다.
출처
Tech Interview for developer
혼자 공부하는 컴퓨터 구조 + 운영체제
https://helloinyong.tistory.com/293