SlideShare una empresa de Scribd logo
1 de 3
Single Thread * # of Work ( Before )

[Diagram]
AsyncWorkProcessor : IAsyncWorkProcessor
┗━ (has) Thread
     ┗━ (using) Work
          ┗━ (is-a) DerivedRealWork

[Thread State]
① Unstarted → ② Thread.Start() → ③ Running → (④ AbortRequested, ⑤ Aborted) → ⑥ Stopped


[Work State]
①② Standby → ③ Run → (④⑤ Abort) → ⑥ Finish


[단점]
1.Thread 생성 및 종료시 오버헤드 (메모리 및 시간, 생성 및 종료 0~15ms)
2.단시간에 부하가 집중될 수 있음 (많은 요청이 들어오면 각 요청을 모두 수락)
3.작업 분산이 힘들기 때문에 급속한 FPS 변화
4.Thread Abort 및 Remove 관련 작업 불안정 (→ 수정 후 Abort 삭제)




Pool (=Work Queue) + Consumer (=Worker) Model
( After )

[Diagram]
Agent : IAsyncWorkProcessor
┗━ (has) WorkPool
┗━ (has) Worker1, Worker2, …
     ┗━ (has) Thread
            ┗━ (using) Work
                 ┗━ (is-a) : DerivedRealWork

[API]
1.lock : 특정 객체를 Locker로 lock을 시도한다. 다른 쓰레드가 Locker를 붙잡고 있으
면 Locker가 Release 될 때까지 블록된다.
2.[Synchronization] : 해당 Property가 설정된 클래스 전체를 Thread Safe하게 보장
한다. 반드시 ContextBoundObject 클래스를 상속받아야 한다.
3.Monitor.Enter() : Locker로 lock을 시도한다. lock과 비슷하지만 Exit를 수동으로
해주어야 한다.
4.Monitor.TryEnter() : Enter()는 Locker를 얻을 때 까지 대기를 하지만 이 함수는
Locker의 획득 여부를 바로 반환해 준다.
5.Monitor.Wait() : 현재 분기에서 Locker를 Release하고 Pulse 되기 전까지 대기한
다.
6.Monitor.Pulse() : Wait()하고 있는 쓰레드를 깨운다. Pulse를 받은 쓰레드는 다시
Locker로 lock을 시도하며 성공할 경우 Wait()한 이후 구문부터 진행한다.
7.Monitor.Exit() : Enter()나 TryEnter()로 획득한 lock을 해제한다.
[Main Idea]
Agent는 작업에 대한 요청(Add, Remove, Wait, WaitAll)을 받아들여 WorkPool(List로
만든 Queue)을 업데이트한다. Worker들은 일이 없으면 Wait(Sleep과 다름) 하다가
WorkPool에 작업이 들어오면 깨어나(=Pulse) 경쟁적으로 작업을 수행한다. (Thread
Safe)

[Thread State]
① Unstarted → ② Thread.Start() → (④ Monitor.Wait() → ⑤ Monitor.Pulse()) → ⑥ Running → ④ 반복


[Worker State]
①② Initializing → ③ Prepare → (④ Idle → ⑤ Prepare) → ⑥ Working → ③ 반복


[Work State]
①②③ Standby → ④ Run → ⑥ Finish


[장점]
1.Thread나 Work의 상태가 아닌 C#의 Lock 관련 API로 분기 제어가 가능
2.Thread를 미리 생성하고 프로그램이 종료될 때까지 유지하므로 Thread 생성 및 종료에
따른 오버헤드가 없음 (Abort 상태 삭제)
3.최대 Thread 갯수만큼의 작업이 진행되므로 부하가 나누어짐
4.while (조건) Sleep 대신 Monitor.Wait()와 Pulse()를 사용하여 쓰레드가 쉬고 있는 중
에는 CPU나 리소스를 거의 사용하지 않음

[Code : Worker.cs]
m_thread = new Thread(DoWork);

private void DoWork()
{
        lock (this)
       {
                m_state = State.Prepare;
                while (true)
                {
                       lock (m_currWorkLock) m_currWork = m_pool.Pop();
                       if (m_currWork == null)
                       {
                               m_state = State.Prepare;
                               Monitor.Wait(this); // Release Lock and Sleep Until Pulse
(Idle)
                               continue; // Pulsed and Get Lock again (Prepare)
                       }
                       m_state = State.Working;
                       m_currWork.WorkProcessing();
                }
        }
}


[기타]
1.Worker 쓰레드의 Priority는 Lowest
2.Worker의 수는 Environment.ProcessCount +1 (조정 중)
3.volatile 키워드 사용 (최적화 방지)

Más contenido relacionado

La actualidad más candente

비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기jeong seok yang
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6SukYun Yoon
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Ji Hun Kim
 
Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본ssuser0c2478
 
Scope and Closure of JavaScript
Scope and Closure of JavaScript Scope and Closure of JavaScript
Scope and Closure of JavaScript Dahye Kim
 
[하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기 [하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기 인권 김
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
스레드
스레드스레드
스레드xxbdxx
 
11 윈도우스레드풀
11 윈도우스레드풀11 윈도우스레드풀
11 윈도우스레드풀ssuser0c2478
 
[Gpg2권 박민근] 1.13 스택 와인딩
[Gpg2권 박민근] 1.13 스택 와인딩[Gpg2권 박민근] 1.13 스택 와인딩
[Gpg2권 박민근] 1.13 스택 와인딩MinGeun Park
 
취약점 점검도구 실습 보고서
취약점 점검도구 실습 보고서 취약점 점검도구 실습 보고서
취약점 점검도구 실습 보고서 Dong-Jin Park
 
07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도ssuser3fb17c
 
Windows kernel basic exploit
Windows kernel basic exploitWindows kernel basic exploit
Windows kernel basic exploitKyoungseok Yang
 
Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장HolyTak
 

La actualidad más candente (20)

비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기
 
tcp ip study
tcp ip studytcp ip study
tcp ip study
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5
 
Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본
 
Scope and Closure of JavaScript
Scope and Closure of JavaScript Scope and Closure of JavaScript
Scope and Closure of JavaScript
 
[하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기 [하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
Race condition
Race conditionRace condition
Race condition
 
스레드
스레드스레드
스레드
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
 
11 윈도우스레드풀
11 윈도우스레드풀11 윈도우스레드풀
11 윈도우스레드풀
 
[Gpg2권 박민근] 1.13 스택 와인딩
[Gpg2권 박민근] 1.13 스택 와인딩[Gpg2권 박민근] 1.13 스택 와인딩
[Gpg2권 박민근] 1.13 스택 와인딩
 
취약점 점검도구 실습 보고서
취약점 점검도구 실습 보고서 취약점 점검도구 실습 보고서
취약점 점검도구 실습 보고서
 
Storm 훑어보기
Storm 훑어보기Storm 훑어보기
Storm 훑어보기
 
07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도
 
fengfengfeng
fengfengfengfengfengfeng
fengfengfeng
 
Windows kernel basic exploit
Windows kernel basic exploitWindows kernel basic exploit
Windows kernel basic exploit
 
Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장
 

Destacado

D2 Depth of field
D2 Depth of fieldD2 Depth of field
D2 Depth of fieldYoupyo Choi
 
GPU Gems3 Vegetation
GPU Gems3 VegetationGPU Gems3 Vegetation
GPU Gems3 VegetationYoupyo Choi
 
D2 Horizon Occlusion
D2 Horizon OcclusionD2 Horizon Occlusion
D2 Horizon OcclusionYoupyo Choi
 
How to Write the Fastest JSON Parser/Writer in the World
How to Write the Fastest JSON Parser/Writer in the WorldHow to Write the Fastest JSON Parser/Writer in the World
How to Write the Fastest JSON Parser/Writer in the WorldMilo Yip
 

Destacado (8)

D2 Depth of field
D2 Depth of fieldD2 Depth of field
D2 Depth of field
 
D2 Rain (1/2)
D2 Rain (1/2)D2 Rain (1/2)
D2 Rain (1/2)
 
D2 Rain (2/2)
D2 Rain (2/2)D2 Rain (2/2)
D2 Rain (2/2)
 
GPU Gems3 Vegetation
GPU Gems3 VegetationGPU Gems3 Vegetation
GPU Gems3 Vegetation
 
D2 Havok
D2 HavokD2 Havok
D2 Havok
 
D2 Horizon Occlusion
D2 Horizon OcclusionD2 Horizon Occlusion
D2 Horizon Occlusion
 
D2 Hdr
D2 HdrD2 Hdr
D2 Hdr
 
How to Write the Fastest JSON Parser/Writer in the World
How to Write the Fastest JSON Parser/Writer in the WorldHow to Write the Fastest JSON Parser/Writer in the World
How to Write the Fastest JSON Parser/Writer in the World
 

Similar a D2 Job Pool

03.실행환경 교육교재(배치처리)
03.실행환경 교육교재(배치처리)03.실행환경 교육교재(배치처리)
03.실행환경 교육교재(배치처리)Hankyo
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?NAVER D2
 
제 7회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 7회 엑셈 수요 세미나 자료 연구컨텐츠팀제 7회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 7회 엑셈 수요 세미나 자료 연구컨텐츠팀EXEM
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQLI Goo Lee
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System상현 조
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍흥배 최
 
Tizen main loop 이해
Tizen main loop 이해Tizen main loop 이해
Tizen main loop 이해Hermet Park
 
PPL: Composing Tasks
PPL: Composing TasksPPL: Composing Tasks
PPL: Composing Tasks용준 김
 
Undertow RequestBufferingHandler 소개
Undertow RequestBufferingHandler 소개Undertow RequestBufferingHandler 소개
Undertow RequestBufferingHandler 소개Ted Won
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Kwen Won Lee
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해Nam Hyeonuk
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumerChang Yoon Oh
 

Similar a D2 Job Pool (13)

03.실행환경 교육교재(배치처리)
03.실행환경 교육교재(배치처리)03.실행환경 교육교재(배치처리)
03.실행환경 교육교재(배치처리)
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
 
제 7회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 7회 엑셈 수요 세미나 자료 연구컨텐츠팀제 7회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 7회 엑셈 수요 세미나 자료 연구컨텐츠팀
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQL
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 
Tizen main loop 이해
Tizen main loop 이해Tizen main loop 이해
Tizen main loop 이해
 
PPL: Composing Tasks
PPL: Composing TasksPPL: Composing Tasks
PPL: Composing Tasks
 
Undertow RequestBufferingHandler 소개
Undertow RequestBufferingHandler 소개Undertow RequestBufferingHandler 소개
Undertow RequestBufferingHandler 소개
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
 

Último

A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 

Último (6)

A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 

D2 Job Pool

  • 1. Single Thread * # of Work ( Before ) [Diagram] AsyncWorkProcessor : IAsyncWorkProcessor ┗━ (has) Thread ┗━ (using) Work ┗━ (is-a) DerivedRealWork [Thread State] ① Unstarted → ② Thread.Start() → ③ Running → (④ AbortRequested, ⑤ Aborted) → ⑥ Stopped [Work State] ①② Standby → ③ Run → (④⑤ Abort) → ⑥ Finish [단점] 1.Thread 생성 및 종료시 오버헤드 (메모리 및 시간, 생성 및 종료 0~15ms) 2.단시간에 부하가 집중될 수 있음 (많은 요청이 들어오면 각 요청을 모두 수락) 3.작업 분산이 힘들기 때문에 급속한 FPS 변화 4.Thread Abort 및 Remove 관련 작업 불안정 (→ 수정 후 Abort 삭제) Pool (=Work Queue) + Consumer (=Worker) Model ( After ) [Diagram] Agent : IAsyncWorkProcessor ┗━ (has) WorkPool ┗━ (has) Worker1, Worker2, … ┗━ (has) Thread ┗━ (using) Work ┗━ (is-a) : DerivedRealWork [API] 1.lock : 특정 객체를 Locker로 lock을 시도한다. 다른 쓰레드가 Locker를 붙잡고 있으 면 Locker가 Release 될 때까지 블록된다. 2.[Synchronization] : 해당 Property가 설정된 클래스 전체를 Thread Safe하게 보장 한다. 반드시 ContextBoundObject 클래스를 상속받아야 한다. 3.Monitor.Enter() : Locker로 lock을 시도한다. lock과 비슷하지만 Exit를 수동으로 해주어야 한다. 4.Monitor.TryEnter() : Enter()는 Locker를 얻을 때 까지 대기를 하지만 이 함수는 Locker의 획득 여부를 바로 반환해 준다. 5.Monitor.Wait() : 현재 분기에서 Locker를 Release하고 Pulse 되기 전까지 대기한 다. 6.Monitor.Pulse() : Wait()하고 있는 쓰레드를 깨운다. Pulse를 받은 쓰레드는 다시 Locker로 lock을 시도하며 성공할 경우 Wait()한 이후 구문부터 진행한다.
  • 2. 7.Monitor.Exit() : Enter()나 TryEnter()로 획득한 lock을 해제한다. [Main Idea] Agent는 작업에 대한 요청(Add, Remove, Wait, WaitAll)을 받아들여 WorkPool(List로 만든 Queue)을 업데이트한다. Worker들은 일이 없으면 Wait(Sleep과 다름) 하다가 WorkPool에 작업이 들어오면 깨어나(=Pulse) 경쟁적으로 작업을 수행한다. (Thread Safe) [Thread State] ① Unstarted → ② Thread.Start() → (④ Monitor.Wait() → ⑤ Monitor.Pulse()) → ⑥ Running → ④ 반복 [Worker State] ①② Initializing → ③ Prepare → (④ Idle → ⑤ Prepare) → ⑥ Working → ③ 반복 [Work State] ①②③ Standby → ④ Run → ⑥ Finish [장점] 1.Thread나 Work의 상태가 아닌 C#의 Lock 관련 API로 분기 제어가 가능 2.Thread를 미리 생성하고 프로그램이 종료될 때까지 유지하므로 Thread 생성 및 종료에 따른 오버헤드가 없음 (Abort 상태 삭제) 3.최대 Thread 갯수만큼의 작업이 진행되므로 부하가 나누어짐 4.while (조건) Sleep 대신 Monitor.Wait()와 Pulse()를 사용하여 쓰레드가 쉬고 있는 중 에는 CPU나 리소스를 거의 사용하지 않음 [Code : Worker.cs] m_thread = new Thread(DoWork); private void DoWork() { lock (this) { m_state = State.Prepare; while (true) { lock (m_currWorkLock) m_currWork = m_pool.Pop(); if (m_currWork == null) { m_state = State.Prepare; Monitor.Wait(this); // Release Lock and Sleep Until Pulse (Idle) continue; // Pulsed and Get Lock again (Prepare) } m_state = State.Working; m_currWork.WorkProcessing(); } } } [기타] 1.Worker 쓰레드의 Priority는 Lowest
  • 3. 2.Worker의 수는 Environment.ProcessCount +1 (조정 중) 3.volatile 키워드 사용 (최적화 방지)