데드락은 A,B B,A 요청상황
라이브락은, 네트워크에서 패킷상황.
인터넷이 엄청 빨라져서 DB에 엄청 많이 써야 함
하지만 이부분은 병목임
그래가지고, 패킷 큐에 계속 쌓임
패킷 큐가 꽉 참
그래서 다른 애들은 통신오류인 줄 알고 계속 보냄
운영체제는 인터럽트가 계쏙 걸리면서 아무것도 할 수 없게됨
시간차로 극복
상호 배제
한번에 하나의 작업흐름만 해당 리소스를 점유할 수 있다.
점유하고 대기
비선점(실제 스케줄링이 아니라, 자원의 관점에서. 스레드가 무조건 버려야지 자원이 뺏어진다.)
순환대기
한 개의 인스턴스만 가지면, 사이클 존재 시 무조건 데드락 발생한다.
두 개 이상을 가지면, 사이클이 존재할 수도, 안 존재할 수도 있다.
즉, 상황에 따라 다르며, 모른다.
상호배제
예를 들어, 읽기만 하면 상관 없지만 쓰기 상황일 때 상호배제를 안 하게 되면 망한다.
게다가, 애초에 뮤텍스 락이라는 자원은 개념적으로 공유할 수가 없는 자원이다.
점유하며 대기
자원을 가지고 가기 전 all or nothing으로 리소스를 할당하면 가능하지만, 잠깐 쓰이는 자원을 위해 오래동안 기다려야 할 수도 있으므로 효율적이지 못하다.
비선점
만약, 어떤 자원을 가지고 있는 상태에서 락이 걸리면, 그냥 자원을 방출한다. 그리고 다시 모든 자원을 획득할 수 있을 때 시작한다. 프로세스 실행 시간이 엄청나게 길어질 수도 있다.
또한 뮤텍스의 정의 상, 한번 가지고 있던 뮤텍스락을 놓아버린다는 것이 말이 안 된다.
순환대기
가장 가능성 있다.
자원에 번호를 매겨놓고, 오름차순으로만 자원 할당이 가능하도록 한다.
결국 성능은 또 떨어질 수 밖에 없다.
이렇게 사이클이 있다면,, 예약간선은 현재 상태가 아니라 미래의 상태이다. 굵은게 현재 상태.
스레드가 필요한 자원의 갯수를 스레드 시작 시 모두 다 신고하여야 한다.
Need = MAX - ALLOCATION
안전성 검증 알고리즘
자주, 몇 개가 걸리는 지에 따라 달려있다.
스레드의 요청을 만족시키지 못할 때마다, 교착상태를 탐지하는 알고리즘이 있긴 한데, 조금 그래.
교착상태에 빠진 모든 스레드에 대해 실행하기 때문에, 원인파악이 가능하다.
CPU 이용률이 엄청 떨어졌을 때, 알고리즘을 돌려서 교착상태를 확인한다.
원인파악은 불가능하다.
그냥 다 꺼버린다. 끔찍하네
아니면 하나씩 끄면서 교착상태가 해결되어ㄴㅆ는지 본다.
뭘 끌 것인가는,,
여태까지 실행된 정보라던가, 우선순위라던가, 자원의 수라던가,, 진짜 많다.
롤백
결국, 자원을 먹기 전으로 되돌려놓아야 한다. 쉽지 않은 일.
희생자 선택
기아 상태. 즉, 맨날 나한테만 자원선점하려해 ㅠㅠ 이럴 수도 있지.