쓰레드 데드락이란?
멀티 쓰레드 프로그래밍에서 동기화를 통해 락을 획득하여 동일한 자원을 여러곳 에서 함부로 사용하지 못하도록 하였다.
하지만 두개의 쓰레드에서 서로가 가지고있는 락이 해제되기를 기다리는 상태가 생길수 있고 이걸 교착상태, 즉 데드락이라고 한다.
서로 다른 두개의 쓰레드가 상대방의 작업이 끝나기를 기다리는 상태이다.
데드락 발생조건 (모두 충족 시)
- 상호 배제 : 한 자원에 대해 여러 쓰레드 동시 접근 불가
- 점유와 대기 : 자원을 가지고 있는 상태에서 다른 쓰레드가 사용하고있는 자원을 반납하길 기다림
- 비선점 : 다른 쓰레드의 자원을 실행 중간에 강제로 가져올 수 없음
- 환경 대기 : 각 쓰레드가 순환적으로 다음 쓰레드가 요구하는 자원을 가지고있는 것
해당 데드락은 프로세스,쓰레드, 데이터 베이스 등에 발생할수있고, 개념은 동일하다
데드락 방지를 위해서는 한가지를 풀어주면된다.
-상호 배제 방지
상호 배제라는 것은 공유가 불가능한 자원을 소유하고있는 것을 말한다.
readonly 파일은 여러 쓰레드,프로세스가 해당 자원을 공유할 수 있다. 또한 대기 프로세스나 쓰레드가 없어진다.
-점유 대기 방지
점유 대기란 프로세스가 자원을 소유한 상태에서 다른 추가 자원을 요청하기 때문에 발생한다.
만약 프로세스가 동시 점유 자원이 1개라면, 자원 획득을 위해 자원을 소유한채로 기다리는 건 없어진다.
-비 선점 방지
자원을 점유하고있는 프로세스가 당장 할당 받을 수 없는 다른 추가 자원을 요청하면,
요청 프로세스가 가지고있는 모든 자원들을 선점형으로 바꾸어 버리는 방법이 있다.
자원을 뺏긴 프로세스는 대기 상태로 빠지고,
-순환 대기 방지
모든 프로세스가 획득하는 자원의 순서를 동일하게 맞추는 것,
자원마다 고유 번호를 부여하고 오름차순으로 획득하도록 맞춘다면 순환 대기가 발생하지 않는다.
데드락 회피
* 안정상태 체크
프로세스가 자원을 요청할때 안정 상태를 유지할수 있는지 확인하고 자원을 할당한다
- P0은 지금 5개의 자원을 가지고 있다. 작업을 마치기 위해 5개의 자원이 더 필요 하다.
- P1은 지금 2개의 자원을 가지고 있다. 작업을 마치기 위해 2개의 자원이 더 필요 하다.
- P2은 지금 2개의 자원을 가지고 있다. 작업을 마치기 위해 7개의 자원이 더 필요 하다.
- 시스템에는 현재 12개의 자원 중 3개의 자원이 남아 있다.
이런 케이스일때, P1 -> P0 -> P2로 하면 문제 없이 할당이 가능하기 때문이다.
'Language > [Java]' 카테고리의 다른 글
[Java] 멀티 쓰레드란 (0) | 2022.04.08 |
---|---|
[Java] Restful API (0) | 2022.04.07 |
[Java] JUnit4 와 JUnit5차이 (0) | 2022.04.07 |
CDN이란? (0) | 2022.04.06 |
[Java] Java 8 날짜 API (0) | 2022.04.06 |