본문 바로가기
프로그래밍/개념, 용어

데드락(Deadlock)과 라이브락(Livelock)

by 제페 2015. 2. 5.
728x90

데드락과 라이브락


데드락(Deadlock)


데드락은 스레드들이 서로 상대방이 가진 자원을 기다리느라 전혀 진도를 나가지 못하는 상황이다.


두 개의 뮤텍스 락 A, B를 모두 획득하려는 두 개의 스레드를 예를 들어보자.

스레드0이 락A를 스레드1이 락B를 각각 획득한 상태라면 스레드0은 B를 확보할 수가 없어 작업 진행을 할 수 없고,

스레드1은 락A를 확보할 수 없어 작업을 진행하지 못한다.


Thread0


void update()

{

  획득(A)

  획득(B) // 스레드0은 여기서 무한 대기

  어떤작업()

  해제(B)

  해제(A)

}


Thread1


void update()

{

  획득(B)

  획득(A) // 스레드1은 여기서 무한 대기

  어떤작업()

  해제(A)

  해제(B)

}



라이브락(Livelock)


라이브락은 두 스레드가 락의 해제와 획득을 무한 반복하는 상태이다. 

라이브락은 데드락을 피하려는 의도에서 수정한 코드가 불완전할 때 발생하곤 한다. 


Thread0


int done = 0;


while(!done)

{

  획득(A)

  

  if(획득시도(B) == true)

  {

    어떤작업()

    해제(B)

    해제(A)

    done = 1;

  }

  else

  {

    해제(A)

  }

}


Thread1


while(!done)

{

  획득(B)

  

  if(획득시도(A) == true)

  {

    어떤작업()

    해제(A)

    해제(B)

    done = 1;

  }

  else

  {

    해제(B)

  }

}


두 스레드가 같은 시점에 구동된다면 라이브락에 걸려 뮤텍스를 획득하고 해제하는 반복 루프에 빠지게되어 어느 스레드도 작업을 진행할 수 없게 된다.

댓글0