1) 상호 배제
- 작업을 하고 있을 때 다른 테스크가 해당 테스크에 접근이 불가능한 것
- 실질적으로 크게 유효하진 않다.
- 읽기 - 전용파일이 좋은 예이다. → 읽기만 하기에 여러명이 동시에 봐도 상관이 없다.
2) 점유하면서 대기
- 자원을 할당받기 위해 대기중일 때 기존에 받았던 자원을 점유한 상태로 대기하는 것
- 예방법
- 모든 자원을 한 번에 요청 및 할당받을 수 있을 때 수행
- 스레드가 자원을 전혀 갖고 있지 않을 때 수행
3) 비선점
- 스레드가 작업을 수행 중일 때 해당 자원을 선점하지 못하게 하는 것
- 예방법
- 사용가능한지 여부에 따라 가져온다.
- 만약 선점할 자원이 다른 자원을 대기 중이라면, 그 자원이 선점가능한지 보고 가능하다면 가져오고, 불가능하다면 모두 대기
- 상태가 쉽게 저장되는 CPU 레지스터난 DB 트랜젝션같은 경우에 사용가능
- mutex 락과 세마포는 사용 불가능
4) 순환 대기
- 앞의 작업의 순환이 끝나고 나서 자신이 수행가능 하게 하는 것
- 앞의 순환 조건하나를 무시함으로써 해결 가능 → 위 세 가지보다 유용한 이유
- 순서를 부여하거나 계층을 부여하는 방법이 있다. → 하지만 완벽하지 않아 프로그래머의 역량에 차이가 있음
❇️ Starvation과 DeadLock의 차이