SlideShare a Scribd company logo
Story 19. 골치 아픈 멀티스레드 버그
           : 하이젠버그
         chois79
하이젠버그

● 이 버그는 문제가 있음이 확실하지만 재현이 어려움
   ○ ex) 오류 탐색을 위한 코드로 인해 재현이 안되는 경우

● 용어의 유래
   ○ 불확정성의 원리: 베르너 하이젠 베르크
   ○ 하이젠버그 = 하이젠 + 버그 
멀티스레드 버그-데이터 레이스

● 데이터 레이스
   ○ 공유 데이터가 두 스레드 이상에서 동시에 접근 
   ○ 단, 하나의 접근이 쓰기인 경우
  int global_data = 0;

  DWORD CALLBACK ThreadFunc(void* thread_id) {
    for(int i = 0; i < 10000000; i++)
       ++global_data;
    printf("result = %dn", global_data);
  }

 ○ 2개의 스레드에 의해 위 함수가 실행될 때 그 결과를 예
   측할 수 없음
멀티스레드 버그 - 원자성 위반

● 일련의 작업이 침범 받지 않고 안전하게 수행되지 못함 
   ○ 데이터 레이스가 아니지만 오류 발생

                  모질라 nxXULDocument.cpp에서 발견
              Thread_1                          Thread_2

              void LoadScript(nsSpt * aspt) {
                Lock(1);
                gCurrentScript = aspt;
                LaunchLoad(aspt);
                Unlock(1);
              }                                 Lock(1);
                                                gCurrentScript = NULL;
              // LaunchLoad의 결과로                Unlock(1);
              // 비동기적으로 Callback
              void OnLoadComplete() {
                 Lock(1);
                 gCurrentScript->compile();
                 Unlock(1);
              }
멀티스레드 버그 - 순서 위반

● 의도한 순서가 멀티 스레드 상황에서 지켜지지 않을 경우 




       모질라의 순서 위반 버그
   Thread_1                   Thread_2

   int ReadWriteProc(...) {   void DoneWating(..) {
      ...                       ...
      PBReadAsync(&P);          io_pending = TRUE;
      io_pending = TRUE;        ...
                              }

       ...
       while(io_pending) {
       ...
       }
   }
해결 방안

● 데이터 레이스
   ○ 락으로 수정 가능
● 그외의 멀티 스레드 버그
   ○ 락의 순서 조정
   ○ 현재의 락만으로는 모든 병행성 문제를 해결할 수 없음
   ○ 알고리즘의 수정
      ■ 자료 구조 및 알고리즘을 병행성 문제가 없도록 수정
결론

● 멀티 스레드 버그는 재현이 힘들어서 디버깅이 힘들다.

● 락으로 데이터 레이스 문제를 해결할 수 있지만, 멀티스레드
  문제 전체를 해결 할 수는 없다.
Story 20. 어두운 병렬 프로그래밍
       그리고 그 미래는?
        chois79
병렬 프로그래밍의 문제: 가짜 공유 

● 공유되지 않는 데이터 인데 캐시 구조의 특성으로 공유되는
  것으로 인식 => 성능 저하 현상 발생
 volatile int data1;
 volatile int data2;

 DWORD CALLBACK TestThread1( ... ) {
   // 0번 CPU에서 작동
   SetThreadAffinityMask(GetCurrentThread(), 1 << 0);
   for(int i = 0; i < 150000000; ++i)
      data1 = data1 +1;
 }

 DWORD CALLBACK TestThread2( ... ) {
   // 2번 CPU에서 작동
   SetThreadAffinityMask(GetCurrentThread(), 1 << 0);
   for(int i = 0; i < 150000000; ++i)
      data2 = data2 +1;
 }
가짜공유문제 - Cont'd

● 0번 코어가 Data1을 1번 코어가  Data2를 사용
● 양쪽 코어의 같은 캐쉬 라인에 위치하게 됨
   ○ 캐시는 일반적으로 4바이트 이상이 한 단위로 처리
   ○ 두 변수의 주소가 인접
● 코어가 한 캐시라인을 업데이트 하면 다른 코어가 가진 사본
  을 모두 무효화
   ○ 즉, 가짜 공유 문제 발생
   ○ 양쪽 모두 계속해서 캐시 미스 발생

         코어 0         코어 1
   data1              data2
     1     2      1     2
가짜 공유 문제 - Cont'd

● 해결책
   ○ 캐쉬 선언 만큼 데이터 선언을 분리
 #define CACHE_LINE 64
 #define CACHE_ALIGN_MSVC __declspec(align(CACHE_LINE))
 #define CACHE_ALIGN_GCC __attribute__((aligned(CACHE_LINE)))

 volatile CACHE_ALIGN_MSVC int data1;
 volatile CACHE_ALIGN_MSVC int data2;

 volatile struct {
   int data1;
   char padding[CACHE_LINE];
   int data2;
 } DATA;
미래의 병렬 프로그래밍 방법론

● 병행성 해결을 위한 하드웨어적 방법
   ○ 트랜잭셔널 메모리(TM)
      ■ 원자적으로 실행될 부분을 키워드로 선언
    void TransferValue(FIFO Q1, FIFO Q2) {
      __atomic { // 트랜잭션 영역
         v = Q1.dequeue();
         Q2.enqueuue(v);
      }
    }


   ■ 충돌이 감지되면, 트랜잭션을 무효화 하고, 다시 실행
   ■ TM 블록 내에 I/O가 있을 경우 재실행이 힘듬
   ■ ACID중 원자성과 독립성만 보장
   ■ 10년 내에 실용화 가능성이 있음
미래의 병렬 프로그래밍 방법론-
Cont'd
● 병행성 해결을 위한 하드웨어적 방법
   ○ 스레드 수준 투기(TLS)
      ■ 분기 예측과 메모리 실행을 스레드 수준까지 올림
      ■ 어떤 코드를 먼저 여러 스레드에서 실행 후, 충돌이
        없다면 병렬로 실행
      ■ 컴파일러가 적절하게 TLS를 활용한 코드를 생성
      ■ 이론상으로만 존재
결론

● 가짜 공유 문제는 멀티 코어 구조로 인한 것이므로 프로그래
  머의 주의가 필요

● 앞으로의 병렬 프로그래밍 방법
   ○ 하드웨어적 방법
      ■ 트랜잭션 메모리
      ■ 스레드 수준 투기

More Related Content

What's hot

Jvm
JvmJvm
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
내훈 정
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7
JinWoo Lee
 
Concurrency in action - chapter 5
Concurrency in action - chapter 5Concurrency in action - chapter 5
Concurrency in action - chapter 5
JinWoo Lee
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
내훈 정
 
242 naver-2
242 naver-2242 naver-2
242 naver-2NAVER D2
 
LockFree Algorithm
LockFree AlgorithmLockFree Algorithm
LockFree Algorithm
Merry Merry
 
Effective modern cpp item14
Effective modern cpp item14Effective modern cpp item14
Effective modern cpp item14
진화 손
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
sung ki choi
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr
내훈 정
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
NAVER D2
 
Java 8 고급 (3/6)
Java 8 고급 (3/6)Java 8 고급 (3/6)
Java 8 고급 (3/6)
Kyung Koo Yoon
 
Java 8 고급 (2/6)
Java 8 고급 (2/6)Java 8 고급 (2/6)
Java 8 고급 (2/6)
Kyung Koo Yoon
 
안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주
iamhjoo (송형주)
 
V8 engine internal
V8 engine internalV8 engine internal
V8 engine internal
Jinhyuck Kim
 
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
흥배 최
 
Arduino Coding
Arduino CodingArduino Coding
Arduino Coding
영욱 김
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
내훈 정
 

What's hot (19)

Jvm
JvmJvm
Jvm
 
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7
 
Concurrency in action - chapter 5
Concurrency in action - chapter 5Concurrency in action - chapter 5
Concurrency in action - chapter 5
 
Ndc12 2
Ndc12 2Ndc12 2
Ndc12 2
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
242 naver-2
242 naver-2242 naver-2
242 naver-2
 
LockFree Algorithm
LockFree AlgorithmLockFree Algorithm
LockFree Algorithm
 
Effective modern cpp item14
Effective modern cpp item14Effective modern cpp item14
Effective modern cpp item14
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
 
Java 8 고급 (3/6)
Java 8 고급 (3/6)Java 8 고급 (3/6)
Java 8 고급 (3/6)
 
Java 8 고급 (2/6)
Java 8 고급 (2/6)Java 8 고급 (2/6)
Java 8 고급 (2/6)
 
안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주
 
V8 engine internal
V8 engine internalV8 engine internal
V8 engine internal
 
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
 
Arduino Coding
Arduino CodingArduino Coding
Arduino Coding
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 

Viewers also liked

Mining the social web ch1
Mining the social web ch1Mining the social web ch1
Mining the social web ch1
HyeonSeok Choi
 
Abstract factory petterns
Abstract factory petternsAbstract factory petterns
Abstract factory petternsHyeonSeok Choi
 
Elastic search 클러스터관리
Elastic search 클러스터관리Elastic search 클러스터관리
Elastic search 클러스터관리
HyeonSeok Choi
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
HyeonSeok Choi
 
HTTP 완벽가이드 1장.
HTTP 완벽가이드 1장.HTTP 완벽가이드 1장.
HTTP 완벽가이드 1장.
HyeonSeok Choi
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
HyeonSeok Choi
 
To become Open Source Contributor
To become Open Source ContributorTo become Open Source Contributor
To become Open Source ContributorDaeMyung Kang
 
프로그래머로 사는 법 Ch6
프로그래머로 사는 법 Ch6프로그래머로 사는 법 Ch6
프로그래머로 사는 법 Ch6HyeonSeok Choi
 
Ooa&d
Ooa&dOoa&d
프로그래머로 사는 법 Ch1
프로그래머로 사는 법 Ch1프로그래머로 사는 법 Ch1
프로그래머로 사는 법 Ch1HyeonSeok Choi
 
프로그래머로사는법 Ch10
프로그래머로사는법 Ch10프로그래머로사는법 Ch10
프로그래머로사는법 Ch10HyeonSeok Choi
 
MiningTheSocialWeb.Ch2.Microformat
MiningTheSocialWeb.Ch2.MicroformatMiningTheSocialWeb.Ch2.Microformat
MiningTheSocialWeb.Ch2.Microformat
HyeonSeok Choi
 
Domain driven design ch9
Domain driven design ch9Domain driven design ch9
Domain driven design ch9HyeonSeok Choi
 
Refactoring 메소드 호출의 단순화
Refactoring 메소드 호출의 단순화Refactoring 메소드 호출의 단순화
Refactoring 메소드 호출의 단순화HyeonSeok Choi
 
자바 병렬 프로그래밍 ch9
자바 병렬 프로그래밍 ch9자바 병렬 프로그래밍 ch9
자바 병렬 프로그래밍 ch9
HyeonSeok Choi
 
Domain driven design ch1
Domain driven design ch1Domain driven design ch1
Domain driven design ch1
HyeonSeok Choi
 

Viewers also liked (20)

Mining the social web ch1
Mining the social web ch1Mining the social web ch1
Mining the social web ch1
 
Abstract factory petterns
Abstract factory petternsAbstract factory petterns
Abstract factory petterns
 
Elastic search 클러스터관리
Elastic search 클러스터관리Elastic search 클러스터관리
Elastic search 클러스터관리
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
 
Clean code Chapter.2
Clean code Chapter.2Clean code Chapter.2
Clean code Chapter.2
 
Chean code chapter 1
Chean code chapter 1Chean code chapter 1
Chean code chapter 1
 
HTTP 완벽가이드 1장.
HTTP 완벽가이드 1장.HTTP 완벽가이드 1장.
HTTP 완벽가이드 1장.
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
To become Open Source Contributor
To become Open Source ContributorTo become Open Source Contributor
To become Open Source Contributor
 
프로그래머로 사는 법 Ch6
프로그래머로 사는 법 Ch6프로그래머로 사는 법 Ch6
프로그래머로 사는 법 Ch6
 
Ooa&d
Ooa&dOoa&d
Ooa&d
 
Clean code ch15
Clean code ch15Clean code ch15
Clean code ch15
 
프로그래머로 사는 법 Ch1
프로그래머로 사는 법 Ch1프로그래머로 사는 법 Ch1
프로그래머로 사는 법 Ch1
 
프로그래머로사는법 Ch10
프로그래머로사는법 Ch10프로그래머로사는법 Ch10
프로그래머로사는법 Ch10
 
MiningTheSocialWeb.Ch2.Microformat
MiningTheSocialWeb.Ch2.MicroformatMiningTheSocialWeb.Ch2.Microformat
MiningTheSocialWeb.Ch2.Microformat
 
Domain driven design ch9
Domain driven design ch9Domain driven design ch9
Domain driven design ch9
 
Code1_2
Code1_2Code1_2
Code1_2
 
Refactoring 메소드 호출의 단순화
Refactoring 메소드 호출의 단순화Refactoring 메소드 호출의 단순화
Refactoring 메소드 호출의 단순화
 
자바 병렬 프로그래밍 ch9
자바 병렬 프로그래밍 ch9자바 병렬 프로그래밍 ch9
자바 병렬 프로그래밍 ch9
 
Domain driven design ch1
Domain driven design ch1Domain driven design ch1
Domain driven design ch1
 

Similar to MutiCore 19-20

NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
noerror
 
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
khuhacker
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링xxbdxx
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
Yong Joon Moon
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
Sangon Lee
 
android_thread
android_threadandroid_thread
android_thread
handfoot
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
Dong Chan Shin
 
7가지 동시성 모델-2장
7가지 동시성 모델-2장7가지 동시성 모델-2장
7가지 동시성 모델-2장
Sunggon Song
 
사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401guest91f89d83
 
프로세스 방어
프로세스 방어프로세스 방어
프로세스 방어
주항 박
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
Ryan Park
 
스레드
스레드스레드
스레드xxbdxx
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
NAVER D2
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
Dong Chan Shin
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
Jae-yeol Lee
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6SukYun Yoon
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
jongho jeong
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .
YEONG-CHEON YOU
 

Similar to MutiCore 19-20 (20)

NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
android_thread
android_threadandroid_thread
android_thread
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
7가지 동시성 모델-2장
7가지 동시성 모델-2장7가지 동시성 모델-2장
7가지 동시성 모델-2장
 
사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401
 
프로세스 방어
프로세스 방어프로세스 방어
프로세스 방어
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
 
스레드
스레드스레드
스레드
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .
 

More from HyeonSeok Choi

밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05
HyeonSeok Choi
 
밑바닥부터시작하는딥러닝 Ch2
밑바닥부터시작하는딥러닝 Ch2밑바닥부터시작하는딥러닝 Ch2
밑바닥부터시작하는딥러닝 Ch2
HyeonSeok Choi
 
프로그래머를위한선형대수학1.2
프로그래머를위한선형대수학1.2프로그래머를위한선형대수학1.2
프로그래머를위한선형대수학1.2
HyeonSeok Choi
 
알고리즘 중심의 머신러닝 가이드 Ch04
알고리즘 중심의 머신러닝 가이드 Ch04알고리즘 중심의 머신러닝 가이드 Ch04
알고리즘 중심의 머신러닝 가이드 Ch04
HyeonSeok Choi
 
딥러닝 제대로시작하기 Ch04
딥러닝 제대로시작하기 Ch04딥러닝 제대로시작하기 Ch04
딥러닝 제대로시작하기 Ch04
HyeonSeok Choi
 
밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05
HyeonSeok Choi
 
7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장
HyeonSeok Choi
 
Bounded Context
Bounded ContextBounded Context
Bounded Context
HyeonSeok Choi
 
DDD Repository
DDD RepositoryDDD Repository
DDD Repository
HyeonSeok Choi
 
DDD Start Ch#3
DDD Start Ch#3DDD Start Ch#3
DDD Start Ch#3
HyeonSeok Choi
 
실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8
HyeonSeok Choi
 
실무로 배우는 시스템 성능 최적화 Ch7
실무로 배우는 시스템 성능 최적화 Ch7실무로 배우는 시스템 성능 최적화 Ch7
실무로 배우는 시스템 성능 최적화 Ch7
HyeonSeok Choi
 
실무로 배우는 시스템 성능 최적화 Ch6
실무로 배우는 시스템 성능 최적화 Ch6실무로 배우는 시스템 성능 최적화 Ch6
실무로 배우는 시스템 성능 최적화 Ch6
HyeonSeok Choi
 
Logstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaLogstash, ElasticSearch, Kibana
Logstash, ElasticSearch, Kibana
HyeonSeok Choi
 
실무로배우는시스템성능최적화 Ch1
실무로배우는시스템성능최적화 Ch1실무로배우는시스템성능최적화 Ch1
실무로배우는시스템성능최적화 Ch1
HyeonSeok Choi
 
HTTP 완벽가이드 21장
HTTP 완벽가이드 21장HTTP 완벽가이드 21장
HTTP 완벽가이드 21장
HyeonSeok Choi
 
HTTP 완벽가이드 16장
HTTP 완벽가이드 16장HTTP 완벽가이드 16장
HTTP 완벽가이드 16장
HyeonSeok Choi
 
HTTPS
HTTPSHTTPS
HTTP 완벽가이드 6장.
HTTP 완벽가이드 6장.HTTP 완벽가이드 6장.
HTTP 완벽가이드 6장.
HyeonSeok Choi
 
Cluster - spark
Cluster - sparkCluster - spark
Cluster - spark
HyeonSeok Choi
 

More from HyeonSeok Choi (20)

밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05
 
밑바닥부터시작하는딥러닝 Ch2
밑바닥부터시작하는딥러닝 Ch2밑바닥부터시작하는딥러닝 Ch2
밑바닥부터시작하는딥러닝 Ch2
 
프로그래머를위한선형대수학1.2
프로그래머를위한선형대수학1.2프로그래머를위한선형대수학1.2
프로그래머를위한선형대수학1.2
 
알고리즘 중심의 머신러닝 가이드 Ch04
알고리즘 중심의 머신러닝 가이드 Ch04알고리즘 중심의 머신러닝 가이드 Ch04
알고리즘 중심의 머신러닝 가이드 Ch04
 
딥러닝 제대로시작하기 Ch04
딥러닝 제대로시작하기 Ch04딥러닝 제대로시작하기 Ch04
딥러닝 제대로시작하기 Ch04
 
밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05
 
7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장
 
Bounded Context
Bounded ContextBounded Context
Bounded Context
 
DDD Repository
DDD RepositoryDDD Repository
DDD Repository
 
DDD Start Ch#3
DDD Start Ch#3DDD Start Ch#3
DDD Start Ch#3
 
실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8
 
실무로 배우는 시스템 성능 최적화 Ch7
실무로 배우는 시스템 성능 최적화 Ch7실무로 배우는 시스템 성능 최적화 Ch7
실무로 배우는 시스템 성능 최적화 Ch7
 
실무로 배우는 시스템 성능 최적화 Ch6
실무로 배우는 시스템 성능 최적화 Ch6실무로 배우는 시스템 성능 최적화 Ch6
실무로 배우는 시스템 성능 최적화 Ch6
 
Logstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaLogstash, ElasticSearch, Kibana
Logstash, ElasticSearch, Kibana
 
실무로배우는시스템성능최적화 Ch1
실무로배우는시스템성능최적화 Ch1실무로배우는시스템성능최적화 Ch1
실무로배우는시스템성능최적화 Ch1
 
HTTP 완벽가이드 21장
HTTP 완벽가이드 21장HTTP 완벽가이드 21장
HTTP 완벽가이드 21장
 
HTTP 완벽가이드 16장
HTTP 완벽가이드 16장HTTP 완벽가이드 16장
HTTP 완벽가이드 16장
 
HTTPS
HTTPSHTTPS
HTTPS
 
HTTP 완벽가이드 6장.
HTTP 완벽가이드 6장.HTTP 완벽가이드 6장.
HTTP 완벽가이드 6장.
 
Cluster - spark
Cluster - sparkCluster - spark
Cluster - spark
 

MutiCore 19-20

  • 1. Story 19. 골치 아픈 멀티스레드 버그 : 하이젠버그 chois79
  • 2. 하이젠버그 ● 이 버그는 문제가 있음이 확실하지만 재현이 어려움 ○ ex) 오류 탐색을 위한 코드로 인해 재현이 안되는 경우 ● 용어의 유래 ○ 불확정성의 원리: 베르너 하이젠 베르크 ○ 하이젠버그 = 하이젠 + 버그 
  • 3. 멀티스레드 버그-데이터 레이스 ● 데이터 레이스 ○ 공유 데이터가 두 스레드 이상에서 동시에 접근  ○ 단, 하나의 접근이 쓰기인 경우 int global_data = 0; DWORD CALLBACK ThreadFunc(void* thread_id) { for(int i = 0; i < 10000000; i++) ++global_data; printf("result = %dn", global_data); } ○ 2개의 스레드에 의해 위 함수가 실행될 때 그 결과를 예 측할 수 없음
  • 4. 멀티스레드 버그 - 원자성 위반 ● 일련의 작업이 침범 받지 않고 안전하게 수행되지 못함  ○ 데이터 레이스가 아니지만 오류 발생 모질라 nxXULDocument.cpp에서 발견 Thread_1 Thread_2 void LoadScript(nsSpt * aspt) { Lock(1); gCurrentScript = aspt; LaunchLoad(aspt); Unlock(1); } Lock(1); gCurrentScript = NULL; // LaunchLoad의 결과로 Unlock(1); // 비동기적으로 Callback void OnLoadComplete() { Lock(1); gCurrentScript->compile(); Unlock(1); }
  • 5. 멀티스레드 버그 - 순서 위반 ● 의도한 순서가 멀티 스레드 상황에서 지켜지지 않을 경우  모질라의 순서 위반 버그 Thread_1 Thread_2 int ReadWriteProc(...) { void DoneWating(..) { ... ... PBReadAsync(&P); io_pending = TRUE; io_pending = TRUE; ... } ... while(io_pending) { ... } }
  • 6. 해결 방안 ● 데이터 레이스 ○ 락으로 수정 가능 ● 그외의 멀티 스레드 버그 ○ 락의 순서 조정 ○ 현재의 락만으로는 모든 병행성 문제를 해결할 수 없음 ○ 알고리즘의 수정 ■ 자료 구조 및 알고리즘을 병행성 문제가 없도록 수정
  • 7. 결론 ● 멀티 스레드 버그는 재현이 힘들어서 디버깅이 힘들다. ● 락으로 데이터 레이스 문제를 해결할 수 있지만, 멀티스레드 문제 전체를 해결 할 수는 없다.
  • 8. Story 20. 어두운 병렬 프로그래밍 그리고 그 미래는? chois79
  • 9. 병렬 프로그래밍의 문제: 가짜 공유  ● 공유되지 않는 데이터 인데 캐시 구조의 특성으로 공유되는 것으로 인식 => 성능 저하 현상 발생 volatile int data1; volatile int data2; DWORD CALLBACK TestThread1( ... ) { // 0번 CPU에서 작동 SetThreadAffinityMask(GetCurrentThread(), 1 << 0); for(int i = 0; i < 150000000; ++i) data1 = data1 +1; } DWORD CALLBACK TestThread2( ... ) { // 2번 CPU에서 작동 SetThreadAffinityMask(GetCurrentThread(), 1 << 0); for(int i = 0; i < 150000000; ++i) data2 = data2 +1; }
  • 10. 가짜공유문제 - Cont'd ● 0번 코어가 Data1을 1번 코어가  Data2를 사용 ● 양쪽 코어의 같은 캐쉬 라인에 위치하게 됨 ○ 캐시는 일반적으로 4바이트 이상이 한 단위로 처리 ○ 두 변수의 주소가 인접 ● 코어가 한 캐시라인을 업데이트 하면 다른 코어가 가진 사본 을 모두 무효화 ○ 즉, 가짜 공유 문제 발생 ○ 양쪽 모두 계속해서 캐시 미스 발생 코어 0 코어 1 data1 data2 1 2 1 2
  • 11. 가짜 공유 문제 - Cont'd ● 해결책 ○ 캐쉬 선언 만큼 데이터 선언을 분리 #define CACHE_LINE 64 #define CACHE_ALIGN_MSVC __declspec(align(CACHE_LINE)) #define CACHE_ALIGN_GCC __attribute__((aligned(CACHE_LINE))) volatile CACHE_ALIGN_MSVC int data1; volatile CACHE_ALIGN_MSVC int data2; volatile struct { int data1; char padding[CACHE_LINE]; int data2; } DATA;
  • 12. 미래의 병렬 프로그래밍 방법론 ● 병행성 해결을 위한 하드웨어적 방법 ○ 트랜잭셔널 메모리(TM) ■ 원자적으로 실행될 부분을 키워드로 선언 void TransferValue(FIFO Q1, FIFO Q2) { __atomic { // 트랜잭션 영역 v = Q1.dequeue(); Q2.enqueuue(v); } } ■ 충돌이 감지되면, 트랜잭션을 무효화 하고, 다시 실행 ■ TM 블록 내에 I/O가 있을 경우 재실행이 힘듬 ■ ACID중 원자성과 독립성만 보장 ■ 10년 내에 실용화 가능성이 있음
  • 13. 미래의 병렬 프로그래밍 방법론- Cont'd ● 병행성 해결을 위한 하드웨어적 방법 ○ 스레드 수준 투기(TLS) ■ 분기 예측과 메모리 실행을 스레드 수준까지 올림 ■ 어떤 코드를 먼저 여러 스레드에서 실행 후, 충돌이 없다면 병렬로 실행 ■ 컴파일러가 적절하게 TLS를 활용한 코드를 생성 ■ 이론상으로만 존재
  • 14. 결론 ● 가짜 공유 문제는 멀티 코어 구조로 인한 것이므로 프로그래 머의 주의가 필요 ● 앞으로의 병렬 프로그래밍 방법 ○ 하드웨어적 방법 ■ 트랜잭션 메모리 ■ 스레드 수준 투기