Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Thread Blocking Is Evil    게임네트웍컴포넌트팀        김준현
ThreadBlocking
Non-Blocking      &순차적 코드 작성
Why doesMulti-Thread  matter?
“The Free Lunch   is OVER.”                Herb Sutter             December 2004
Clock speedExecution optimizationCache
HyperthreadingMulticoreCache
Write Multithreaded    Application
MULTITHREAD
CONCURRENCY
하지만현실은?
줄을 서서기다린다
도대체왜?
ThreadBlocking
Starvation             Deadlock
Starvation
Task A           Task B1: Lock          1: Sleep 1msec2: Sleep 2msec3: Unlock
Deadlock Hold & Wait
Thread A                         Thread B1A: Lock                         1B: Lock2A: Request                      2B: Sen...
Thread A                         Thread B1A: Lock                         1B: Lock2A: Request                      2B: Sen...
MyProblem
로비-룸 형태의 게임을 제작
Remote Procedure Call
처리 로직을 함수 단위로짜기 때문에 개발이 쉽다
방 입장 RPC          인증 RPCGame Client              Room            Lobby
Game Client                 Room               Lobby              방 입장 RPC 호출                                   인증 RPC 호출 ...
Game Client                 Room               Lobby              방 입장 RPC 호출                                   인증 RPC 호출 ...
Game Client                  Room               Lobby               방 입장 RPC 호출                                    인증 RPC ...
Game Client                  Room               Lobby               방 입장 RPC 호출                                    인증 RPC ...
악의 축은?
Game Client                 Room               Lobby              방 입장 RPC 호출                                   인증 RPC 호출 ...
RPC의 태생적 한계
처리 로직을 함수 단위로짜기 때문에 개발이 쉽다
처리 로직을 함수 단위로짜기 때문에 찢을 수 없다
RPC::Result* JoinRoom(…){   …   RPC::Result answer = RPC::SyncCall(“VerifyLobbyUserToken”, …);   ….   return result;}
우리가 원하는 것
RPC의 장점인순차적 코드 작성Non-Blocking
가능한 해결책은?
RPC 이원화
방 입장 요청 RPC                 인증 요청 RPCGame Client                        Room                      Lobby              방 입장 ...
Non-Blocking O                     방 입장 요청 RPC                 인증 요청 RPCGame Client                        Room           ...
RPC 이원화
Thread Pool 분리
Room              방 입장 RPC            인증 RPCGame Client              TP#1              Lobby                         TP#2 ...
순차적 코딩 O                             Room                방 입장 RPC            인증 RPCGame Client                TP#1        ...
Thread Pool 분리
이대로 끝인 거야?
Solution
AsynchronousProgramming
Request(callback, …)
Pros:Non-Blocking
Cons:Can’t Write Sequential CodeCan’t Use Stack VariableCan’t Split Programming Construct…
어렵다!
이대로 끝인 거야?
Coroutine
Similar to Thread
Line of Execution
Stack      &Local Variable
But
Non-preemptive
Instruction:YieldYield BreakResume
Coroutine을제공하는 언어는?
C#      Erlang      HaskellJavaScript(since 1.7)        Lua        Perl Python(since 2.5)       Ruby         …
C++은?
손수 구현해야 한다
Windows: FiberLinux:getcontext/setcontextmakecontextswapcontext
AsynchronousProgramming      +  Coroutine
Non-Blocking      &순차적 코드 작성
Solution   forStarvation
Task A           Task B1: Lock          1: Sleep 1msec2: Sleep 2msec3: Unlock
Task A                                 Task BThread A                               1: Sleep 1msec1: Create & Resume   Cor...
Solution    forDeadlock Hold & Wait
Thread A                         Thread B1A: Lock                         1B: Lock2A: Request                      2B: Sen...
Thread A                                    Thread B1A: Lock                                    1B: Lock2A: Create & Resum...
Solution    forMy Problem
Game Client                 Room               Lobby              방 입장 RPC 호출                                   인증 RPC 호출 ...
룸 Thread       로비 서비스1R: 인증 요청      1L: 인증 요청 처리2R: 인증 응답 대기   2L: 인증 응답 보내기3R: 방 입장 처리
룸 Thread                                   로비 서비스1R: Create & Resume     Coroutine          1L: 인증 요청 처리                  ...
Request & WaitRequest & Yield
RPC의 장점인순차적 코드 작성Non-Blocking
Coroutine(Fiber)                                      User-mode Scheduling                                    Kernel-mode ...
RPCCoroutine                              Execution  Pool                             Thread Pool            RPC Task Queu...
Network I/O             RPC Task             RPC Execution                                      Coroutine      Thread     ...
Network I/O             RPC Task             RPC Execution                  RPC Execution                  Coroutine      ...
RPC::Result* JoinRoom(…){   …   RPC::Result answer = RPC::SyncCall(“VerifyLobbyUserToken”, …);   ….   return result;}
RPC::Result* JoinRoom(…){   …   RPC::Result answer = RPC::SyncCallYield(“VerifyLobbyUserToken”, …);   ….   return result;}
TPS    쓰래드 갯수
Wrap-up
“The free lunch  is OVER.”   Write Multithreaded        Application       CONCURRENCY
Thread Blocking is Evil  Starvation   Deadlock
AsynchronousProgramming      +  Coroutine
Non-Blocking      +    WritingSequential Code
Request & WaitRequest & Yield
Inspired by  Jeffrey Richter ‘Simplified APM WithThe AsyncEnumerator’
완벽함이란더 이상 추가할 것이 없을때가 아니라더 이상 버릴 것이 없을때 완성된다.        „성당과 시장‟에서
A4 thread blockingisevil
A4 thread blockingisevil
A4 thread blockingisevil
A4 thread blockingisevil
Upcoming SlideShare
Loading in …5
×

A4 thread blockingisevil

2,253 views

Published on

Published in: Technology, Health & Medicine
  • Be the first to comment

A4 thread blockingisevil

  1. 1. Thread Blocking Is Evil 게임네트웍컴포넌트팀 김준현
  2. 2. ThreadBlocking
  3. 3. Non-Blocking &순차적 코드 작성
  4. 4. Why doesMulti-Thread matter?
  5. 5. “The Free Lunch is OVER.” Herb Sutter December 2004
  6. 6. Clock speedExecution optimizationCache
  7. 7. HyperthreadingMulticoreCache
  8. 8. Write Multithreaded Application
  9. 9. MULTITHREAD
  10. 10. CONCURRENCY
  11. 11. 하지만현실은?
  12. 12. 줄을 서서기다린다
  13. 13. 도대체왜?
  14. 14. ThreadBlocking
  15. 15. Starvation Deadlock
  16. 16. Starvation
  17. 17. Task A Task B1: Lock 1: Sleep 1msec2: Sleep 2msec3: Unlock
  18. 18. Deadlock Hold & Wait
  19. 19. Thread A Thread B1A: Lock 1B: Lock2A: Request 2B: Send Response3A: Wait for Response 3B: Unlock4A: Do something with Response5A: Unlock
  20. 20. Thread A Thread B1A: Lock 1B: Lock2A: Request 2B: Send Response3A: Wait for Response 3B: Unlock4A: Do something with Response5A: Unlock
  21. 21. MyProblem
  22. 22. 로비-룸 형태의 게임을 제작
  23. 23. Remote Procedure Call
  24. 24. 처리 로직을 함수 단위로짜기 때문에 개발이 쉽다
  25. 25. 방 입장 RPC 인증 RPCGame Client Room Lobby
  26. 26. Game Client Room Lobby 방 입장 RPC 호출 인증 RPC 호출 방 입장 RPC 인증 RPC 처리 로직 처리 로직 인증 RPC 반환 방 입장 RPC 반환
  27. 27. Game Client Room Lobby 방 입장 RPC 호출 인증 RPC 호출 방 입장 RPC 인증 RPC 처리 로직 처리 로직 인증 RPC 반환 방 입장 RPC 반환
  28. 28. Game Client Room Lobby 방 입장 RPC 호출 인증 RPC 호출 Lobby 응답 지연 방 입장 RPC 인증 RPC 처리 로직 처리 로직 인증 RPC 반환 방 입장 RPC 반환
  29. 29. Game Client Room Lobby 방 입장 RPC 호출 인증 RPC 호출 Lobby 응답 지연 방 입장 RPC 인증 RPC 처리 로직 처리 로직Room서버 throughput 방 입장 RPC 반환 인증 RPC 반환 저하
  30. 30. 악의 축은?
  31. 31. Game Client Room Lobby 방 입장 RPC 호출 인증 RPC 호출 Thread Blocking 인증 RPC 반환 방 입장 RPC 반환
  32. 32. RPC의 태생적 한계
  33. 33. 처리 로직을 함수 단위로짜기 때문에 개발이 쉽다
  34. 34. 처리 로직을 함수 단위로짜기 때문에 찢을 수 없다
  35. 35. RPC::Result* JoinRoom(…){ … RPC::Result answer = RPC::SyncCall(“VerifyLobbyUserToken”, …); …. return result;}
  36. 36. 우리가 원하는 것
  37. 37. RPC의 장점인순차적 코드 작성Non-Blocking
  38. 38. 가능한 해결책은?
  39. 39. RPC 이원화
  40. 40. 방 입장 요청 RPC 인증 요청 RPCGame Client Room Lobby 방 입장 응답 RPC 인증 응답 RPC
  41. 41. Non-Blocking O 방 입장 요청 RPC 인증 요청 RPCGame Client Room Lobby 방 입장 응답 RPC 인증 응답 RPC 순차적 코딩 X
  42. 42. RPC 이원화
  43. 43. Thread Pool 분리
  44. 44. Room 방 입장 RPC 인증 RPCGame Client TP#1 Lobby TP#2 기타 RPCs
  45. 45. 순차적 코딩 O Room 방 입장 RPC 인증 RPCGame Client TP#1 Lobby TP#2 기타 RPCs Non-Blocking X
  46. 46. Thread Pool 분리
  47. 47. 이대로 끝인 거야?
  48. 48. Solution
  49. 49. AsynchronousProgramming
  50. 50. Request(callback, …)
  51. 51. Pros:Non-Blocking
  52. 52. Cons:Can’t Write Sequential CodeCan’t Use Stack VariableCan’t Split Programming Construct…
  53. 53. 어렵다!
  54. 54. 이대로 끝인 거야?
  55. 55. Coroutine
  56. 56. Similar to Thread
  57. 57. Line of Execution
  58. 58. Stack &Local Variable
  59. 59. But
  60. 60. Non-preemptive
  61. 61. Instruction:YieldYield BreakResume
  62. 62. Coroutine을제공하는 언어는?
  63. 63. C# Erlang HaskellJavaScript(since 1.7) Lua Perl Python(since 2.5) Ruby …
  64. 64. C++은?
  65. 65. 손수 구현해야 한다
  66. 66. Windows: FiberLinux:getcontext/setcontextmakecontextswapcontext
  67. 67. AsynchronousProgramming + Coroutine
  68. 68. Non-Blocking &순차적 코드 작성
  69. 69. Solution forStarvation
  70. 70. Task A Task B1: Lock 1: Sleep 1msec2: Sleep 2msec3: Unlock
  71. 71. Task A Task BThread A 1: Sleep 1msec1: Create & Resume Coroutine 2: Request Lock 3: Yield Non-BlockingThread A‟4: Resume 5: Sleep 2msec 6: Yield Break7: Unlock Sequential Code
  72. 72. Solution forDeadlock Hold & Wait
  73. 73. Thread A Thread B1A: Lock 1B: Lock2A: Request 2B: Send Response3A: Wait for Response 3B: Unlock4A: Do something with Response5A: Unlock
  74. 74. Thread A Thread B1A: Lock 1B: Lock2A: Create & Resume Coroutine 2B: Send Response 3A: Request 3B: Unlock 4A: Yield Non-Blocking5A: UnlockThread A‟(invoked by response)6A’: Lock7A’: Resume 8A’: Do something with response 9A’: Yield Break10A’: Unlock Sequential Code
  75. 75. Solution forMy Problem
  76. 76. Game Client Room Lobby 방 입장 RPC 호출 인증 RPC 호출 Thread Blocking 인증 RPC 반환 방 입장 RPC 반환
  77. 77. 룸 Thread 로비 서비스1R: 인증 요청 1L: 인증 요청 처리2R: 인증 응답 대기 2L: 인증 응답 보내기3R: 방 입장 처리
  78. 78. 룸 Thread 로비 서비스1R: Create & Resume Coroutine 1L: 인증 요청 처리 2R: 인증 요청 2L: 인증 응답 보내기 3R: Yield Non-Blocking룸 Thread‟(invoked by response)4R’: Resume 5R’: 방 입장 처리 6R’: Yield Break Sequential Code
  79. 79. Request & WaitRequest & Yield
  80. 80. RPC의 장점인순차적 코드 작성Non-Blocking
  81. 81. Coroutine(Fiber) User-mode Scheduling Kernel-mode SchedulingThread CPU CPU CPU CPU
  82. 82. RPCCoroutine Execution Pool Thread Pool RPC Task Queue Network I/O Thread Pool
  83. 83. Network I/O RPC Task RPC Execution Coroutine Thread Queue Thread PoolNetwork Event task enqueue task dequeue acquire coroutine coroutine RPC start Execution yield returnNetwork resume Event task resume enqueue task dequeue resume yield break release coroutine pooling
  84. 84. Network I/O RPC Task RPC Execution RPC Execution Coroutine Thread Queue Thread 1 Thread 2 PoolNetwork Event task enqueue task dequeue acquire coroutine coroutine RPC resume Execution yield returnNetwork resume Event task resume enqueue task dequeue resume yield break release coroutine pooling
  85. 85. RPC::Result* JoinRoom(…){ … RPC::Result answer = RPC::SyncCall(“VerifyLobbyUserToken”, …); …. return result;}
  86. 86. RPC::Result* JoinRoom(…){ … RPC::Result answer = RPC::SyncCallYield(“VerifyLobbyUserToken”, …); …. return result;}
  87. 87. TPS 쓰래드 갯수
  88. 88. Wrap-up
  89. 89. “The free lunch is OVER.” Write Multithreaded Application CONCURRENCY
  90. 90. Thread Blocking is Evil Starvation Deadlock
  91. 91. AsynchronousProgramming + Coroutine
  92. 92. Non-Blocking + WritingSequential Code
  93. 93. Request & WaitRequest & Yield
  94. 94. Inspired by Jeffrey Richter ‘Simplified APM WithThe AsyncEnumerator’
  95. 95. 완벽함이란더 이상 추가할 것이 없을때가 아니라더 이상 버릴 것이 없을때 완성된다. „성당과 시장‟에서

×