• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    해결됨

데드락의 정의와 해결방안에 대해 질문드립니다

21.05.18 15:21 작성 조회수 372

1

안녕하세요 앨런님! 데드락에 대해 강의를 듣고 정리하던 중 궁금한 점이 생겨 질문 남깁니다! 

1. 

데드락을 “한정된 자원을 여러 스레드에서 사용하려고 할 때, 자원을 얻지 못해 다음 처리가 어려운 상태”라고 정의할 때,

동기 작업이 현재 스레드가 필요한 경우 (3-2. sync 메소드에 대한 주의 사항)” 에서 발생하는 데드락 상황은 얻으려고 하는 “한정된 자원”을 무엇으로 정의할 수 있을까요? 

저 상황에서 데드락이 발생하는 이유는 sync 로 task 를  보내서 멈춰있는 스레드에 다른 task 가 다시 할당되어서 더 이상 서로 작업을 진행할 수 없는 상황이기 때문이라고 이해하고 있습니다. 

즉, 

  • 스레드는 task 가 끝나길 기다리고
  • task 는 끝나려면 스레드에서 실행이 되어야하는데 해당 스레드가 멈춰있는 상태

이기 때문에 서로 다음 상황으로 진행을 위한 조건이 충족이 안되고, 데드락이 발생한다! 까지는 이해가 되는데 여기서 데드락의 정의에 따라 “스레드가 얻고자 하는 한정된 자원”을 각각 무엇으로 표현할 수 있을지 궁금합니다. 

이러한 데드락 상황을 “한정된 자원을 여러 스레드에서 사용하려고 할 때, 자원을 얻지 못함” 이라는 정의에 포함할 수 있을까요? 아니면 데드락의 정의를 그냥 다음 조건으로 가지 못하는 막힌 상태..? 정도로 넓게 이해해야할까요? 

2. 

또한 데드락에 대한 간단한 해결 방법으로  serial queue 사용을 말씀주셨습니다. 

한정된 자원을 여러개의 스레드가 동시에 필요로 할때 데드락이 발생할 수 있기 때문에, 한번에 하나의 스레드만 자원(들)에 접근하도록 serial queue 를 사용하면 해결 된다는 의미로 말씀 주신것 같습니다.

하지만 이전 강의에서 본 “동기 작업이 현재 스레드가 필요한 경우”는 serial queue를 사용하더라도 데드락이 발생하게 됩니다. (ex. 메인 스레드에서 DispatchQueue.main.sync 호출)

뭔가 데드락 발생 상황과 해결 방안이 1:1로 대응되는 것 같지 않아 혼란이 오는 것 같습니다. 이런 상황은 다른 해결 방안으로 말씀 주신 “객체 등 설계시에 주의”로 해결을 해야하는 거겠지요?

혹시 잘못 이해하고 있는 부분이 있다면 같이 말씀 부탁드리겠습니다. 감사합니다!

답변 1

답변을 작성해보세요.

1

안녕하세요! 수진님 :)

오랜만에 질문을 올려주셨군요!

1. 문제와 관련해서,

일단은 위의 sync 메소드에 대한 주의 사항과 관련된 한정된 자원은 "쓰레드"라고도 볼 수 있을 것 같습니다. 쓰레드라는 자원을 사용해야하는데, 기다리고 있기 때문에 쓰레드를 사용하지 못하는 상황인 거죠. 

그리고, 만약에 데드락을 학문적으로 정의한다면.. (제가 운영체제에서 공부했던 바로는) 여러가지 필요 충분조건(상호배재/비선점/점유와대기/환형대기)로 인해 프로세스 진행이 되지 않는 모든 상황이라고 말씀드릴 수 있을 것 같지만, 제 머리속으로는 간단하게.. 어떠한 상황으로든(예를 들어 프로세스 내에서 여러 쓰레드간에 위와 같은 상황 포함, 또는 운영체제에서 프로세스 여러개 간에 발생할 수 있는 상황) 하여금 "일이 진행이 되지 않는 상황"이라고 간단하게 생각하고 있긴 합니다. (그리고 실질적으로도 그렇다고 생각하고 있습니다. 교착이라는 말 자체가 아주 잘 설명한다고 생각하고 있기 때문이기도 하고, 예전에 구글링을 통해 이런 내용에 대해서 열심히 공부했을때 너무 많은 케이스들이 있기 때문에 이론적으로 정확한 정의를 내리는 것이 별 의미가 없구나 라고 생각하기도 했던 것 같습니다. ^^;)



혹시, 이와 관련하여, 정말 학문적인 더 구체적인 내용을 알고 싶으시다면
제가 운영체제에서 공부했던 아래의 링크를 혹시나 참고해 보시면 조금은 도움이 되실 것 같긴합니다. :)

교착상태https://www.youtube.com/watch?v=ofCwGdzKeHY&t=93s

교착상태의 해결: https://www.youtube.com/watch?v=0v2DGCH1y58&t=1s

(제 강의에서는 데드락에 대해서 조금 간단한 차원으로 다뤘던 것이고, 위의 강의는 운영체제 내의 학문적으로 보다 심화된 내용을 다루고 있습니다.^^)



2. 데드락의 해결방법 관련해서,

1번에서 말씀드린 것처럼 데드락을 "일이 진행이 되지 않는 모든 상황"이라고 생각하신다면, 사실은 아주 정확하게 말씀드린다면.. 각 경우마다 해결책은 다를 것입니다.

제가 serial queue로 간단하게 해결할 수 있다는 의미는...  "일반적인 경우의 데드락은 주로, 2개의 쓰레드를 쓰는 상황에서 발생하니" 그런 경우는 아예 2개의 쓰레드를 사용하지 않는... serial queue를 사용하면 된다고 말씀드린 것 뿐이고, 실제로 현재의 쓰레드에서 현재의 쓰레드로 sync메서드를 사용하는 그 자체가 잘 못된 것이니.. 그것을 하지 않는 것이 해결방안인 것 같습니다.. ^^

이정도면 고민하고 계신 것이 해결되실 것 같긴한데, 혹시나 해결되지 않는 부분이 있으시다면 언제든지 다시 질문 주세요! :)



앗, 그리고 너무 늦었지만.., 수강평 너무 멋지게 써주셔서.. 진짜 감동 감동이었답니다.ㅠㅠ 너무나 힘이 되기도 했고..
정말 감사합니다. :)

아하 "한정된 자원을 여러 스레드에서 사용" 한다고 해서 그럼 스레드는 자원으로 보는게 아닌가..?라는 생각이 들어서 1번의 질문이 나왔던것 같아욤. 유투브 추천해주신 덕분에 오랜만에 교수님 강의도 들을 수 있었네요ㅎㅎㅎ

2번과 관련해서도 어떤 의미에서 serial queue 를 해결방안으로 말씀 주신 것인지 이해했습니다!

수강평은.. 그저 갓강의를 들으며 느낀점을 썼을뿐인디.. 힘이 되었다니 저도 감사하네용 ㅎㅎ

아무튼 요번에도 자세한 답변 감사합니다! :)

아닙니다.. ㅎㅎ 정말 정말 감사합니다. :)