두 개 이상의 스레드나 프로세스가 공유 자원에 동시에 접근하려고 할 때, 예상치 못한 결과가 발생하는 현상을 말한다
멀티쓰레드 또는 멀티 프로세스 환경에서 여러 개의 스레드나 프로세스가 동시에 공유 자원(메모리, 파일, 데이터베이스 등)에 접근하면서 데이터를 수정하려고 할 때 발생한다.
이를 해결하기 위해 동기화 기법(락, 세마포어, 뮤텍스 등)을 사용하여 공유 자원에 대한 접근을 조절하거나, 스레드나 프로세스간의 통신을 통해 실행 순서나 시점을 조절하여 레이스 컨디션을 방지할 수 있다
여러 개의 프로세스나 스레드가 공유 자원에 접근하는 코드 영역
두 개의 주요 연산, wait(대기)와 signal(신호)을 이용하여 공유 리소스에 대한 접근을 조절하는 동기화 기법이다. 일반적으로 정수 변수로 구현되며, 초기값을 설정하고 wait() 연산은 세마포어 값을 감소시키고, signal() 연산은 세마포어 값을 증가시킨다. 세마포어 값이 0보다 작아지면 대기 상태로 전환되어 다른 프로세스가 해당 리소스를 사용할 수 없게 된다.
둘 이상의 프로세스나 스레드가 서로가 가진 리소스를 기다리며, 그 상태가 무한히 지속되는 상황을 의미한다.
예를 들어, 프로세스 A가 프로세스 B가 점유한 리소스를 기다리고 있고, 동시에 프로세스 B도 프로세스 A가 점유한 리소스를 기다리는 경우 데드락이 발생 한다. 이 경우 두 프로세스 모두 상대방이 점유한 리소스를 얻지 못하고 영원히 기다리며, 작업이 진행되지 않게 된다
운영체제에서 프로세스나 스레드가 원하는 리소스를 계속해서 얻지못하여 작업이 지연되는 현상을 의미한다. 예를 들어 우선순위가 낮은 프로세스가 항상 우선순위가 높은 프로세스에게 밀려서 리소스를 얻지 못하고 작업이 계속 지연되는 경우 기아 현상이 발생한다.
: 생산자 - 소비자 문제
Buffer in shared memory
Producer
Consumer
buffer 자체 및 buffer 조작 변수
(empty/full buffer의 시작 위치)mutual exclusion
→ Need binary semaphore (shared data의 mutual exclusion을 위해)resource count
→ Need integer semaphore (남은 full/empty buffer의 수 표시)한 프로세스가 DB에 write 중 일 때 다른 프로세스가 접근하면 안됨
read는 동시에 여럿이 해도 됨
solution
Shared data
DB 자체
readcount;
현재 DB에 접근 중인 Reader의 수Synchronization variables
mutex
공유 변수 readcount를 접근하는 코드(critical section)의 nutual exclsion 보장을 위해 사용db
Reader와 writer가 공유 DB 자체를 올바르게 접근하는 역할Synchronization variables
세마포어의 단점을 해결한 상호배제 메커니즘
모니터는 운영체제가 처리하는 것이 아니라 프로그래밍 언어 차원에서 지원하는 방법이다.
대표적으로 자바에서 모니터를 지원하는데 자바에서 싱크로나이즈 키워드가 붙으면 이 키워드가 붙은 함수들은 동시에 여러 프로세스에서 실행시킬 수 없다.
즉, 상호배제가 완벽하게 이루어진다. 모니터의 구현만 완벽하다면 프로그래머는 세마포어처럼 wait() 함수나 signal() 함수를 임계영역에 감싸지 않아도 돼서 편리하고 안전하게 코드를 작성할 수 있다
세마포어와의 차이점은 lock을 걸 필요가 없다
condition x,y;
wait
와 signal
연산에 의해서만 접근 가능x.wait();
x.wait()을 invoke한 프로세스는 다른 프로세스가 x.signal()을 invoke하기 전 까지 suspend된다
x.signal();
x.signal()은 정확하게 하나의 suspend 된 프로세스를 resume 한다.
Suspend된 프로세스가 없으면 아무 일도 일어나지 않는다.