1일 1개념정리 24.08.09.금 ~
큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.
무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#62. DeadLock
예전에 동시성 문제로 글을 썼는데, 데드락에 대해서 언급이 빈약하여 보완해본다.
DeadLock
일단 데드락이란, 둘 이상의 프로세스(또는 스레드)가 서로 자원을 기다리며 무한 대기 상태에 빠져 더 이상 실행이 안되는 상황을 말한다. A는 B의 자원을 요청하고, B는 A의 자원을 요청하는 것이다. 이는 "배고픈 철학자"를 보며 이해해보자.
데드락 발생 조건
데드락은 아래 4가지 상황을 "동시에" 만족할 때 발생한다. 사실 그렇기에 데드락이 그렇게까지 흔하게 발생하진 않는다. 물론, 시스템에서 워낙 많은 일들이 동시 다발적으로 발생하므로 자원에 대한 요청을 비동기적으로 하다 보면 데드락이 발생하는 것도 이상한 일은 아니다.
- Mutual Exclusion : 자원은 한 번에 한 프로세스만 사용 가능하다. (애당초 동시에 자원공유가 가능하면 데드락 발생할 이유가 없음.)
- Hold and Wait : 최소 하나의 자원을 점유한 상태로 또 다른 자원을 기다리는 프로세스가 존재해야 한다. 위에서 말했듯 A는 B를, B는 A를 기다리는 상황이다. 그리고 이 욕심쟁이들은 상대의 자원을 요청하면서 자신의 자원은 내려놓지 않아야한다.
- No Preemption : 다른 프로세스가 가진 자원은 선점할 수 없다. 자원 내려놓을 때까지 기다려야함. (선점이 가능하면 데드락따윈 없었겠죠 ?)
- Circular Wait : 자원을 대기하는 프로세스들이 순환 형태로 서로의 자원을 기다리고 있어야한다. A는 B를 기다리고, B는 C를 기다리고, C는 A를 기다리고 .... 예를 들면 DB에서 여러 트랜잭션이 동일한 레코드를 서로 다른 순서로 LOCK걸고 사용하려 할 때, 이런 순환 대기 상태에 빠질 수 있다. 이를 방지하고자 DBMS는 주기적으로 데드락 감지 & 강제로 트랜잭션 롤백 등을 하고 있다.
데드락 해결 방법 4가지
해결법으로는 4가지가 제시된다. 예방, 회피, 탐지, 회복인데 사실 완벽하게 데드락을 방지할 방법은 없다고 한다 .... 그래서 예방을 노력하는 게 최선이다....?? 라고 배운 기억이 난다.
1. 예방 : 앞서 말한 데드락 발생 조건 4개 중에 무엇이든 가능한 것을 제거하는 것이다 !!!! 왜냐면 4가지를 "동시에" 만족시켜야 데드락이 발생하므로, 하나라도 예방할 수 있다면 데드락을 막을 수 있다.
- 상호 배제 제거 : 자원을 여러 프로세스가 공유할 수 있게 한다. / BUT 상호 배제라는 것 자체가 기본적으로 필수인 경우가 많아 현실적으로 어렵다 ..... 공유하게 두면 동시성이나 무결성 등에서 문제가 생길 수 있다.
- 점유 대기 제거 : 프로세스가 자원을 요청할 때, 자원을 하나도 점유하고 있지 않은 상태에서만 요청할 수 있도록 한다. → 내가 이해하기론 마치 자원 요청의 원자성같은 느낌이다 .... 모든 자원을 한번에 얻거나, 모두 못얻거나.
- 비선점 제거 : 말 그대로, 선점을 허용한다. BUT 서비스 성질에 따라 어려울 수 있다.
- 순환 대기 제거 : 자원에 번호를 매겨 프로세스가 자원을 오름차순으로만 요청하도록 함으로써 순환 대기를 방지한다.
2. 회피 : 데드락이 발생할 가능성을 동적으로 회피한다. 이 방법으로는 "은행원 알고리즘"이 있다. 이는 이분께서 블로그에 매우 잘 정리해주셔서..... 요걸 살펴보자.
3. 탐지 & 회복 : 데드락 발생을 허용한 뒤, 원인을 탐지하는 것이다. 그리고 데드락에 걸린 프로세스를 강제로 종료하거나 자원을 회수하여 데드락을 해결한다.
참고자료
'1일 1개념정리 (24년 8월~) > 운영체제' 카테고리의 다른 글
1일1개 (60) - 실제 메모리 아닌데~ 실제 메모리 아닌데~ (0) | 2024.10.14 |
---|---|
1일1개 (27) - 동시성 문제 (2) | 2024.09.06 |
1일1개 (22) - 동기 vs 비동기 (0) | 2024.08.31 |
1일1개 (3) - 멀티 프로세스 (0) | 2024.08.11 |
1일1개 (2) - 멀티 쓰레드 & spring 동시 요청 처리 (1) | 2024.08.10 |