위 그림대로 차들이 무조건 진행방향으로만 나아가려고 한다면 진전이 없이 계속 막히게 될 것이다 이러한 상황을 Deadlock이라 한다.
Deadlock
일련의 프로세스들이 서로가 가진 자원(하드웨어, 소프트웨어 등을 포함하는 개념)을 기다리면 block된 상태
ex)
=> 위 4가지 조건을 모두 만족해야 Deadlock이 발생
Deadlock이 발생했는지를 자원할당그래프를 통해서 알 수 있음
동그라미: 프로세스
사각형: 자원
동그라미로 들어오는 화살표: 프로세스가 해당 자원을 소유하고 있음
사각형으로 들어오는 화살표: 프로세스가 해당 자원을 요청(기다림)
사각형 안에 점들: 자원의 개수
위 그림을 Deadlock일까?
=> 자원에 대한 이용율이 낮아지고, 시스템 성능 저하, starvation 문제 발생
=> 잘 생기지도 않을 데드락을 고려해 제약조건을 많이 달아놓기에 굉장히 비효율적인 방법
프로세스의 시작 단계에서 프로세스가 쓸 자원의 최대량을 알고 있다고 가정하고, 프로세스에게 자원을 할당할 때 Deadlock이 발생할거 같으면 할당 안함
자원의 인스턴스가 하나밖에 없는 상황
점선: 프로세스가 적어도 한번 해당 자원을 요청할 수 있는 가능성
프로세스 2가 자원을 실제로 요청(점선 -> 실선)
점선을 포함하면, 사이클이 형성됨(이런 경우에는 프로세스 2에게 자원을 할당하지 않음)
만약 1번 프로세스가 자원을 요청해서 얻었다면, 사이클은 형성되지 않음(이런 경우에는 할당)
자원의 인스턴스가 여러개 있는 경우(Banker's Algorithm을 이용)
=> 비효율적임(자원이 남아돌게 됨). unsafe로 판단됐다고 해서 무조건 Deadlock은 아님
Deadlock 탐지
자원당 인스턴스가 1개인 경우
자원당 인스턴스가 여러개인 경우
Allocation: 프로세스 당 소유한 자원들
Request: 프로세스가 각 자원들 요청 한 수(요청한 자원이 없으면, 반납한다고 가정)
Available: 가용자원
위 그림은 Deadlock이 없음
Dealock Recovery
Deadlock에 연루된 프로세스들 Kill
모든 프로세스들 한꺼번에 kill
Deadlock에 연루된 프로세스를 하나씩 kill(Deadlock이 없어질때까지)
Deadlock에 연루된 프로세스들의 자원을 뺏는 것(자원을 뺏을 victim 프로세스 선정하고, 자원을 뺏어 Deadlock을 없앰 -> safe state로 rollback 후 프로세스 restart)
=> victime 프로세스 선정 방법을 매번 달리해야 하고, rollback 횟수도 고려
https://core.ewha.ac.kr/publicview/C0101020140307151724641842?vmode=f