inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

DeadLock 탐지

데드락 탐지에 관해 질문드립니다!

417

literate_t

작성한 질문수 68

1

안녕하세요.

데드락 탐지에 관해 질문드립니다.

1. PushLock()에서 lock_id를 LLockStack의 마지막 아이디하고만 비교하는 이유가 궁금합니다.

 

2. PopLock()을 할 때 _nameToId, _idToName, _lockHistory에서도 해당 락을 제거해줘야 하지 않나요? CheckCycle()에서 nameToId.size()로 걸린 락의 개수를 구하는 부분도 그렇고 히스토리를 통해 사이클을 검사하는데, 언락이 된 락은 더 이상 관리 대상이 아니라고 생각했습니다.

 

감사합니다.

deadlock windows-server MMORPG network

답변 1

1

Rookiss

데드락 탐지에서 핵심은 락을 거는 모든 경로를 추적해서
락 거는 순서에 싸이클이 발생하는지를 보는 것인데요.

1.
A->A를 중첩해서 거는 것은 데드락이 발생하지 않기 때문에 무시하는겁니다.

2.
모든 경로에 대한 히스토리를 기반으로 판별하는 것이기에,
과거의 히스토리도 그대로 남기고 있는 것입니다.
Unlock했다고 history에서 삭제하면, 현재 잡혀있는 락 순서만 추적할 수 있는데
그러면 결국 확률적으로 일어나는 타이밍 이슈는 잡지 못하게 됩니다.

1

literate_t

2번 설명이 잘 와닿지 않습니다ㅠ데드락이 문제인 이유는 현재 잡고 있는 락끼리 교착 상태에 빠지기 때문인데, 히스토리에 남긴 과거 정보를 통해 '타이밍 이슈'를 어떻게 잡을 수 있는 것인지요..'타이밍 이슈'라는 것도 아직 잘 이해되지 않네요..

1

Rookiss

A, B라는 락이 있는데, A->B 순서로 잡을 수도 있고,
B->A 순서로도 잡을 수 있는 상황이 있다면 그 자체로 문제입니다.
그런데 이게 멀티쓰레드 환경에서는 극악의 확률로 일어나서
특정 쓰레드가 A->B로 잡은 다음에 바로 풀자마자 (B Unlock -> A Unlock),
다른 쓰레드에서 B->A를 간발의 차이로 나중에 Lock 해버린다면
당장 크래시가 안 나고 넘어갈 수 있겠죠.
이런 식으로 잠재적인 버그가 운좋게 지나가서
2주에 한 번 크래시가 나는 문제가 나는게 더 짜증나는 상황입니다. (QA에도 걸리지 않기 때문)

따라서 데드락 디텍터의 목적은 아예 데드락에 빠질 수 있는 후보군들을 싹 잡아주는 것이기 때문에
당장 데드락이 발생하지 않았다 하더라도 바로 잡아줘야 하는 것입니다.

0

literate_t

와! 이해 됐습니다. 히스토리를 남겨두는 이유가 그거였군요!

A->B로 잡았다면 B->A로 못 잡게 한다!

락을 거는 것도 신중해지겠네요.

감사합니다.

P.S

만약 B->A 순서로 걸어줘야 하는 상황이 발생한다면

그건 프로그램의 구조 문제로 봐도 되는 걸까요?

만약 동시에 잡고 있진 않지만 어느 시점에 B->A 순서로

락을 걸어야 하는 상황이 생긴다면, 실무에서 관련한 경험이 있으셨는지,

있으셨다면 혹시 대략 어떤 식으로 해결하셨는지 조금이라도 알려줄 수 있으신가요!

감사합니다.

0

Rookiss

네 결과적으로 프로그램 설계 문제이긴 하지만,
큰 프로젝트에서는 몇십명이서 공동 작업을 하고 퇴사하고 입사하고 왔다 갔다 하기 때문에
그 방대한 100만줄 코드를 일일히 다 알 수가 없습니다.
A->B와 B->A가 둘다 등장하는 경우
대부분의 경우에는 적당히 코드를 수정해서 우회할 수 있는 경우가 많은데
이는 너무 코드에 따라 다르니 정확히 뭘 해야 한다고 말씀드리긴 힘듭니다.

0

literate_t

넵! 답변 감사합니다👍

Memory Pool에서 오버플로우 질문입니다.

0

61

2

포토폴리오 및 진로 관련하여 고민입니다.

0

109

1

포토폴리오 관련 고민입니다.

0

59

1

실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.

0

80

2

성능 테스트 결과

0

101

2

게임 서버 Stateful, Stateless 진로 고민

0

118

1

WaitOnAddress와 Sleep의 차이 질문

0

81

1

궁금한거 있습니다.

0

79

2

JobTimer 구동 스레드

0

105

2

TryPop() 동작 관련 질문

0

79

1

로드맵 C#서버 C++서버 방향성 질문

0

145

2

스레드 id를 출력할떄 메인스레드 id도 출력되나요?

0

71

1

생명주기를 위한 의도적 복사

0

83

2

락프리의 실무에서 사용 질문

0

138

2

32bit threadID와 16비트 상위 WriteFlag에 대해

0

99

2

mutex와 sleep 차이점

0

115

1

실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다

0

150

2

Stomp Allocator의 Release함수에 대한 질문입니다.

0

94

1

공부법 관련해서

0

181

2

MakeShared 함수 관련

0

112

1

지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.

0

142

2

운영체제관련 질문입니다

0

129

1

send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.

0

115

2

메모리 풀 질문있습니다.

0

121

1