DevBoi

데드락이란? 본문

Language/[Java]

데드락이란?

HiSmith 2022. 4. 7. 15:41
반응형

쓰레드 데드락이란?

멀티 쓰레드 프로그래밍에서 동기화를 통해 락을 획득하여 동일한 자원을 여러곳 에서 함부로 사용하지 못하도록 하였다.

하지만 두개의 쓰레드에서 서로가 가지고있는 락이 해제되기를 기다리는 상태가 생길수 있고 이걸 교착상태, 즉 데드락이라고 한다.

서로 다른 두개의 쓰레드가 상대방의 작업이 끝나기를 기다리는 상태이다.

 

데드락 발생조건 (모두 충족 시)

- 상호 배제 : 한 자원에 대해 여러 쓰레드 동시 접근 불가

- 점유와 대기 : 자원을 가지고 있는 상태에서 다른 쓰레드가 사용하고있는 자원을 반납하길 기다림

- 비선점 : 다른 쓰레드의 자원을 실행 중간에 강제로 가져올 수 없음

- 환경 대기 : 각 쓰레드가 순환적으로 다음 쓰레드가 요구하는 자원을 가지고있는 것

 

 

 

해당 데드락은 프로세스,쓰레드, 데이터 베이스 등에 발생할수있고, 개념은 동일하다

 

데드락 방지를 위해서는 한가지를 풀어주면된다.

 

-상호 배제 방지

상호 배제라는 것은 공유가 불가능한 자원을 소유하고있는 것을 말한다.

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