동기화 문제 디버깅하기 사람이 컴퓨터 보다 아름다워♪ Advanced Windows Debugging Chapter.10 <NHN 게임서버개발플랫폼TF> 2008.07.29 안준석
개요 병행 프로그래밍? 동기화? 디버거? 병행 프로그래밍 시 발생할 수 있는 동기화 문제들을 살펴본다. 여러 가지 동기화 객체들의 특징을 알아본다 디버거를 통해 동기화 객체들의 작동 방식을 이해하고 동기화 문제를 인지, 해결하는 방법을 배운다. 동기화? 디버거?
순서 Problem Scenarios Synchronization Basic Insight! 마무리
Problem Scenarios Deadlock Orphaned Critical Section DllMain Awareness Lock Contention Managing Critical Section
윈도우 C++ 쓰레드 “ 병행 프로그램을 Primitives 로 지원하기엔 너무 낡은 플랫폼. “ … 그래서 동기화라는 트릭이 필요했다.
5가지 동기화 문제 상황 CS 잘못 사용한 경우 동기화 Lock 경합 DllMain Loader Lock! 짝 잃은 동기화객체 Deadlock Orphaned CS DllMain Awareness Lock Contention Managing CS 동기화 Lock 경합 DllMain Loader Lock! 짝 잃은 동기화객체 교착 상태
Deadlock LiveLock 들어 보셨나요? P. 510 ~ 511 레지스트리 Critical Secion timeOut 값을 수정을 통해 추가 디버깅 정보 얻을 수 있음. E2 E2 E1
Orphaned Critical Section#1 Try { Lock() … Unlock() } Catch Finally P. 516 ~ 517 Exception 발생했을 때 동기화 객체 Release 처리 누락으로 문제 발생 C++ 의 리소스 관리 기법인 소멸자 테크닉을 사용하자!
Orphaned Critical Section#2 HeapAlloc 내 안에 Critical Section 있다 P. 523 ~ 524 Thread Termianation 할 때! 해당 쓰레드에서 예상치 못한 동기화 객체를 사용하고 있을 때 문제 발생
DllMain Awareness DllMain() { Switch case DLL_PROCESS_ATTACH … case DLL_THREAD_ATTACH } 내 안에 Loader Lock있다 P. 530 ~ 531 쓰레드는 APC 상태 부터 시작해서 초기화 완료 후 유저 모드 쓰레드와 맵핑 된다. DllMain() 함수는 시리얼하게 이벤트를 수신해서 처리한다.
Lock Contention Do { Lock() i++ Unlock() } P. 540 ~ 541 많은 수의 쓰레드가 작은 리소스를 두고 경합 벌일 때 어디서 오버헤드가 생기는가? OwnerShip Transfer 하면서! Window2003 sp1 이후 변경됨!
Managing Critical Section CreticalSection cs Initialization (&cs) Enter (&cs) Leave (&cs) … P. 546 ~ 547 크리티컬 섹션 함수를 바르게 사용하자! LockCount 를 고려하면서! 초기화를 고려하면서!
Synchronization Basic Event Critical Section Mutex Semaphore 문제 해결 시나리오
동기화 객체 Event Critical Section Mutex Semaphore Critical Section 님!
Critical Section#1 Critical Section 은 유저 모드 다? Mutex 보다 훨씬 비용이 적게 든다? 커널 모드로 이동 합니다! Critical Section 은 유저 모드 다? Mutex 보다 훨씬 비용이 적게 든다? 멀티 프로세스와 싱글 프로세스에서 작동이 같다? 특정 상황에서만! 스핀은 멀티프로세스에서만!
Critical Section#2 P. 498 스핀 카운트와 Event 커널 객체를 이용하는 똑똑한 유저 모드 동기화 객체! RTL_CRITICAL_SECTION + DebugInfo + LockCount + RecursionCount + OwningThread + LockSemaphore + SpinCount P. 498 스핀 카운트와 Event 커널 객체를 이용하는 똑똑한 유저 모드 동기화 객체! OwnerShip 전환에 걸리는 시간을 줄여 Lock Convoy 현상을 줄임!
문제 해결 시나리오 증상 인식하기 (CPU 점유율등으로) 모든 쓰레드 덤프 뜨기 (~*kb) 동기화 문제가 가능한지 분석 !runaway !handle !cs 문제 수정 Application Verifier 를 사용해 볼까요~!
Insight! 병행프로그래밍 멀티쓰레드프로그래밍 Erlang
병행Concurrent 순차Sequential 병렬Parallel 어떠한 순서로 처리하든 상관없게 작업 분할 동시에 [분할 된 독립작업] 처리 순차Sequential 순서대로 [한 개] 처리 병렬Parallel 동시에 [여러 개] 처리
메이저 OS와 언어에서는 리소스 공유에 따른 동기화 문제가 발생한다! 왜 멀티쓰레드를 써야 할까? “동시에 다수의 일을 처리해야 하니까” 메이저 OS와 언어에서는 리소스 공유에 따른 동기화 문제가 발생한다!
비동기 실행결과 얻기 호출과 실행의 분리 OS... 동기화.. 쓰레드.. BYE! 2008년엔 얼랭을 배워봐요! Thread-Per-Message 비동기 Worker Thread 패턴 OS... 동기화.. 쓰레드.. BYE! Producer-Consumer 호출과 실행의 분리 2008년엔 얼랭을 배워봐요! Future 패턴 실행결과 얻기
마무리 Reference
Reference Advanced Windows Debugging p.493 ~ 550 Windows 구조와 원리 2th
끝 감사합니다. 동기화 문제 이제 Windbg로 분석해 볼까요? ^^; joonseok.ahn@live.co.kr 2008.07.29 안준석