SlideShare a Scribd company logo
11장 윈도우 스레드 풀
12장 파이버




       아꿈사(http://cafe.naver.com/architect1)
                김홍준(twitter.com/jun0683)
11장 윈도우 스레드 풀
 - 비동기 함수 호출(스레드)
 - 시간 간격을 두고 함수 호출(타이머)
 - 커널 오브젝트가 시그널 되면 함수 호출(이벤트)
 - 비동기 I/O 요청 완료되면 함수 호출(IOCP)


12장 파이버
11장 윈도우 스레드 풀
 - 비동기 함수 호출(스레드)
 - 시간 간격을 두고 함수 호출(타이머)
 - 커널 오브젝트가 시그널 되면 함수 호출(이벤트)
 - 비동기 I/O 요청 완료되면 함수 호출(IOCP)


12장 파이버
윈도우 스레드 풀이란?
 스레드 생성, 파괴, 관리작업을 좀 더 쉽게구
 현 할 수 있도록 제공(책에서는 비스타 이상)




         어렵지 않아요~
비동기 함수 호출(스레드)를 뙇!

 VOID NTAPI SimpleCallback(
    PTP_CALLBACK_INSTANCE     사용자 정의
 pInstance,
    PVOID pvContext
 );


 BOOL TrySubmitThreadpoolCallback(
    PTP_SIMPLE_CALLBACK pfnCallback,사용자 정의 함수

                                    작업 요청(비동기적으로)
    PVOID pvContext,
    PTP_CALLBACK_ENVIRON pcbe
 );
TrySubmitThreadpoolCallback()

이분을 쓰면 CreateThread X

스레드 일일이 생성 파괴 관리 X
 =>알아서 재사용
 =>알아서 스레드 개수 증가 감소
명시적 작업 항목 제어

TrySubmitThreadpoolCallback 실패시
(메모리 부족,메모리 할당제한등..)
명시적 작업 항목 제어

스레드 풀에서 작업 항목이 들어 가지
않는다면?

내부적으로 작업 항목을 새로 생성 한 후
작업 항목을 스레드 풀 큐에 넣음
 => 작업 항목 큐를 이용하자!
명시적으로 작업 항목을 제어 하려면
1.작업 항목 만들고
2.큐에 넣고
VOID CALLBACK WorkCallback(          0.작업 할 콜백함수 구현
 PTP_CALLBACK_INSTANCE Instance,
 PVOID Context,
 PTP_WORK Work);

PTP_WORK CreateThreadpoolWork(
 PTP_WORK_CALLBACK                   1.콜백 함수 원형 넣고
pfnWorkHandler,                      작업 항목 만듦
 PVOID pvContext,
 PTP_CALLBACK_ENVIRON pcbe);

VOID SubmitThreadpoolWork(PTP_WORK   2. 큐에 넣기
pWork);
명시적 작업 항목 제어

삽입한 장업항목을 취소하거나
처리될때까지 특정 스레드를 대기상태
 VOID WaitForThreadpoolWorkCallbacks(
 PTP_WORK pWork,
 BOOL bCancelPendingCallbacks);


True면 취소,처리중이라면 취소하지 않고 처리될때 까지 대기
False면 완전히 처리 될떄까지 대기
명시적 작업 항목 제어

VOID CloseThreadpoolWork(PTP_WORK pwk);



 작업 항목이 더 이상 필요 없다면
 작업 항목 제거
데모
11장 윈도우 스레드 풀
 - 비동기 함수 호출(스레드)
 - 시간 간격을 두고 함수 호출(타이머)
 - 커널 오브젝트가 시그널 되면 함수 호출(이벤트)
 - 비동기 I/O 요청 완료되면 함수 호출(IOCP)


12장 파이버
시간 간격을 두고 함수 호출(타이머)를 뙇!

 VOID CALLBACK TimeoutCallback(
 PTP_CALLBACK_INSTANCE pInstance,
 PVOID pvContext,                    타이머 함수 원형
 PTP_TIMER pTimer);


 PTP_TIMER CreateThreadpoolTimer(
                                     타이머 생성
 PTP_TIMER_CALLBACK
 pfnTimerCallback,
 PVOID pvContext,
 PTP_CALLBACK_ENVIRON pcbe)

 VOID SetThreadpoolTimer(
 PTP_TIMER pTimer,
 PFILETIME pftDueTime,              타이머 스레드 풀에 등록
 DWORD msPeriod,
 DWORD msWindowLength);
시간 간격을 두고 함수 호출

콜백 함수가 정확한 시간에 호출
해주는 것 보다 스레드를 깨웠다가
다시 대기 상태로 만드는 비용을
줄이는 것이 중요

타이머를 한번 만들고 SetThreadpoolTimer()
을 이용해서 시간 조작
시간 간격을 두고 함수 호출
VOID SetThreadpoolTimer(
PTP_TIMER pTimer,
PFILETIME pftDueTime,
DWORD msPeriod,
DWORD msWindowLength);




pftDueTime 을 NULL로 넣으면
타이머 호출 X
타이머 오브젝트를 파괴 하지 않고
타이머 정지 가능
시간 간격을 두고 함수 호출

삽입한 타이머을 취소하거나
처리될때까지 특정 스레드를 대기상태
 VOID WaitForThreadpoolTimerCallbacks(
 PTP_WORK pWork,
 BOOL bCancelPendingCallbacks);


True면 취소,처리중이라면 취소하지 않고 처리될때 까지 대기
False면 완전히 처리 될떄까지 대기
11장 윈도우 스레드 풀
 - 비동기 함수 호출(스레드)
 - 시간 간격을 두고 함수 호출(타이머)
 - 커널 오브젝트가 시그널 되면 함수 호출(이벤트)
 - 비동기 I/O 요청 완료되면 함수 호출(IOCP)


12장 파이버
커널 오브젝트가 시그널 되면 함수 호출
(이벤트)를 뙇!
VOID CALLBACK WaitCallback(
PTP_CALLBACK_INSTANCE pInstance,     시그널 대기 함수 원형
PVOID Context,
PTP_WAIT Wait,
TP_WAIT_RESULT WaitResult);


PTP_WAIT CreateThreadpoolWait(
PTP_WAIT_CALLBACK pfnWaitCallback,   시그널 대기 함수 생성
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);

VOID SetThreadpoolWait(
PTP_WAIT pWaitItem,
HANDLE hObject,                      스레드 풀에 등록
PFILETIME pftTimeout);
커널 오브젝트가 시그널 되면 함수 호출
VOID SetThreadpoolWait(
PTP_WAIT pWaitItem,
HANDLE hObject,
PFILETIME pftTimeout);


핸들 오브젝트를 사용
시그널 상태가 됬을 때 콜백 함수를 호출
커널 오브젝트가 시그널 되면 함수 호출

내부적으로 스레드 풀은
WaitForMultipleObjects을 이용하기 때문
64개만 대기 가능

동일한 커널 오브젝트를 동시에 여러 번
사용이 안되므로 DuplicateHandle을 이용
복사된 핸들을 각각 등록
커널 오브젝트가 시그널 되면 함수 호출

프로세스 커널 오브젝트는 한번 시그널이면
영원히 시그널 상태
SetThreadpoolWait 호출할때 다른 오브젝트
또는 Null값을 전달해서 해당 핸들을 제거
커널 오브젝트가 시그널 되면 함수 호출

콜백 함수 내에서 WaitForThreadpoolWork
호출 하면 데드락

SetThreadpoolWait 매개 변수로 전달한
커널 오브젝트는 삭제 하면 안됨!
커널 오브젝트가 시그널 되면 함수 호출

대기중인 커널 오브젝트에 대해
PulseEvent 같은 시그널 함수 호출도 안됨!
해당 이벤트가 호출한 시점에 대기 하고
있음을 보장을 못함!
11장 윈도우 스레드 풀
 - 비동기 함수 호출(스레드)
 - 시간 간격을 두고 함수 호출(타이머)
 - 커널 오브젝트가 시그널 되면 함수 호출(이벤트)
 - 비동기 I/O 요청 완료되면 함수 호출(IOCP)


12장 파이버
비동기 I/O 요청 완료되면 함수 호출(IOCP)
뙇!

10장에 대략적으로 다룸

어떤 함수를 호출 할지를 지정하기만
하면 됨
비동기 I/O 요청 완료되면 함수 호출(IOCP)

VOID CALLBACK
OverlappedCompletionRoutine(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext,
PVOID pOverlapped,        I/O 작업 완료시   호출되는 함수 원형
ULONG IoResult,
ULONG_PTR NumberOfBytesTransferred,
PTP_IO pIo);

                       스레드 풀 I/O 오브젝트 생성
PTP_IO CreateThreadpoolIo(
HANDLE hDevice,            파일/장치 핸들값을 넣어줌
PTP_WIN32_IO_CALLBACK
pfnIoCallback,
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
비동기 I/O 요청 완료되면 함수 호출(IOCP)

VOID StartThreadpoolIo(PTP_IO pio);   I/O 오브젝트와 스레드 풀 연동
                                      단,풀에 넣고 나서 READ/WRITE 할것



VOID CancelThreadpoolIo(PTP_IO pio); I/O 작업이 실패 하면 반드시 호출



VOID CloseThreadpoolIo(PTP_IO pio); 사용을 마치려면 …
                                    I/O 오브젝트 닫기
비동기 I/O 요청 완료되면 함수 호출(IOCP)

VOID WaitForThreadpoolIoCallbacks(
PTP_IO pio,
BOOL bCancelPendingCallbacks);

  I/O 작업이 완료 될때까지 다른 스레드가 대기 시킴

  True 면 시작 되지 않은 모든 요청을 취소
  완료 통지도 발생 X
+@ 콜백 종료 동작

콜백 함수가 종료 될때 쓰면 유용
 LeaveCriticalSectionWhenCallbackReturns

 ReleaseMutexWhenCallbackReturns

 ReleaseSemaphoreWhenCallbackReturns

 SetEventWhenCallbackReturns

 FreeLibraryWhenCallbackReturns


스레드 풀이 종료시 자동적으로 호출
스레드 풀 커스터마이징 뙇!

스레드 풀에서 동작하는
스레드의 최소 최대 개수를 설정
OR
스레드 풀을 각각 독립적으로 생성,파괴
스레드 풀 커스터마이징

PTP_POOL CreateThreadpool(PVOID reserved);

BOOL SetThreadpoolThreadMinimum(PTP_POOL pThreadPool,
DWORD cthrdMin);
BOOL SetThreadpoolThreadMaximum(PTP_POOL pThreadPool,
DWORD cthrdMost);

VOID CloseThreadpool(PTP_POOL pThreadPool);

   기본 스레드 풀은 최소 스레드 1개 최대 500개를 가짐
11장 윈도우 스레드 풀
 - 비동기 함수 호출(스레드)
 - 시간 간격을 두고 함수 호출(타이머)
 - 커널 오브젝트가 시그널 되면 함수 호출(이벤트)
 - 비동기 I/O 요청 완료되면 함수 호출(IOCP)


12장 파이버
파이버라 쓰고 코루틴이라 읽는다…

코루틴은 마치 예전 OS의
비선점형(non-preemptive) 쓰레드와
비슷하게 동작

프로그래머가 강제로 컨텍스트 스위칭
명령을 줘야 스위칭
파이버

기존 UNIX 프로그램을 포팅하기 위해서…
윈도우는 그냥 스레드 쓰면 됨….

유저모드에서 돌아서 가볍다
스케줄링을 직접 해야 함
파이버 함수 사용
      ConvertThreadToFiber
PVOID ConvertThreadToFiberEx(
PVOID pvParam,
DWORD dwFlags);

기존 스레드를 파이버로 변경

파이버 단위에는 부동소수점 상태 정보를 포함하지 않으므로
플래그에 FIBER_FLAG_FLOAT_SWITCH를 넣어줌
파이버 함수 사용
 VOID WINAPI FiberFunc(PVOID pvParam);   파이버 함수 원형




PVOID CreateFiberEx(
SIZE_T dwStackCommitSize,
SIZE_T dwStackReserveSize,
DWORD dwFlags,
PFIBER_START_ROUTINE pStartAddress,
PVOID pvParam);

 새로운 파이버를 생성
 리턴 받은 컨텍스트 정보를 저장 해두고 사용
파이버 함수 사용

VOID SwitchToFiber(PVOID pvFiberExecutionContext);

   바이퍼 간 스위칭

   컨텍스트 정보를 이용해서 스위칭을 함


PVOID GetCurrentFiber();      현재 컨텍스트 주소를 얻어옴
데모
끝!

More Related Content

What's hot

잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
흥배 최
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
Nam Hyeonuk
 
Free rtos seminar
Free rtos seminarFree rtos seminar
Free rtos seminar
Cho Daniel
 
04 프로세스
04 프로세스04 프로세스
04 프로세스
ssuser3fb17c
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
욱진 양
 
Blockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractBlockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart Contract
Fermat Jade
 
사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401guest91f89d83
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
Jong Wook Kim
 
[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California
Theori
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
상현 조
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
jongho jeong
 
GKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android Looper
GDG Korea
 
세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화
Jay JH Park
 
tcp ip study
tcp ip studytcp ip study
tcp ip study
준철 박
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GDG Korea
 
세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝
Jay JH Park
 
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - PerfornanceGCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
상현 조
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
Sangon Lee
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013Esun Kim
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
NAVER D2
 

What's hot (20)

잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
 
Free rtos seminar
Free rtos seminarFree rtos seminar
Free rtos seminar
 
04 프로세스
04 프로세스04 프로세스
04 프로세스
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
 
Blockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractBlockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart Contract
 
사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
 
[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
GKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android Looper
 
세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화
 
tcp ip study
tcp ip studytcp ip study
tcp ip study
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
 
세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝
 
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - PerfornanceGCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
 

Viewers also liked

11장 윈도우 스레드 풀 + 12장 파이버
11장 윈도우 스레드 풀 + 12장 파이버11장 윈도우 스레드 풀 + 12장 파이버
11장 윈도우 스레드 풀 + 12장 파이버홍준 김
 
Maria db
Maria dbMaria db
Maria db
ymtech
 
MariaDB Optimization
MariaDB OptimizationMariaDB Optimization
MariaDB Optimization
JongJin Lee
 
개발자가 도전하는 MariaDB 서버구축
개발자가 도전하는 MariaDB 서버구축개발자가 도전하는 MariaDB 서버구축
개발자가 도전하는 MariaDB 서버구축
정해 이
 
개발자도 알아야 하는 DBMS튜닝
개발자도 알아야 하는 DBMS튜닝개발자도 알아야 하는 DBMS튜닝
개발자도 알아야 하는 DBMS튜닝
정해 이
 

Viewers also liked (6)

11장 윈도우 스레드 풀 + 12장 파이버
11장 윈도우 스레드 풀 + 12장 파이버11장 윈도우 스레드 풀 + 12장 파이버
11장 윈도우 스레드 풀 + 12장 파이버
 
마리아Db
마리아Db마리아Db
마리아Db
 
Maria db
Maria dbMaria db
Maria db
 
MariaDB Optimization
MariaDB OptimizationMariaDB Optimization
MariaDB Optimization
 
개발자가 도전하는 MariaDB 서버구축
개발자가 도전하는 MariaDB 서버구축개발자가 도전하는 MariaDB 서버구축
개발자가 도전하는 MariaDB 서버구축
 
개발자도 알아야 하는 DBMS튜닝
개발자도 알아야 하는 DBMS튜닝개발자도 알아야 하는 DBMS튜닝
개발자도 알아야 하는 DBMS튜닝
 

Similar to 11장 윈도우 스레드 풀

Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706
Yong Joon Moon
 
Windows via C/C++ Chapter 10
Windows via C/C++ Chapter 10Windows via C/C++ Chapter 10
Windows via C/C++ Chapter 10iluvs
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
lactrious
 
11 윈도우스레드풀
11 윈도우스레드풀11 윈도우스레드풀
11 윈도우스레드풀
ssuser0c2478
 
Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10
hyun soomyung
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
Chang Yoon Oh
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
jinho park
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표
Kwen Won Lee
 
Spring Cloud Workshop
Spring Cloud WorkshopSpring Cloud Workshop
Spring Cloud Workshop
YongSung Yoon
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 patternjinho park
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
NAVER D2
 
.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기
Seong Won Mun
 
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
NAVER Engineering
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
NAVER Engineering
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링xxbdxx
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장SeongHyun Ahn
 
android_thread
android_threadandroid_thread
android_thread
handfoot
 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02
정출 김
 

Similar to 11장 윈도우 스레드 풀 (20)

Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706
 
Windows via C/C++ Chapter 10
Windows via C/C++ Chapter 10Windows via C/C++ Chapter 10
Windows via C/C++ Chapter 10
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
11 윈도우스레드풀
11 윈도우스레드풀11 윈도우스레드풀
11 윈도우스레드풀
 
Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표
 
Spring Cloud Workshop
Spring Cloud WorkshopSpring Cloud Workshop
Spring Cloud Workshop
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
 
.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기
 
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장
 
android_thread
android_threadandroid_thread
android_thread
 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02
 

More from 홍준 김

1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
홍준 김
 
Html5&css 3장
Html5&css 3장Html5&css 3장
Html5&css 3장홍준 김
 
Mongo db문서의생성,갱신,삭제
Mongo db문서의생성,갱신,삭제Mongo db문서의생성,갱신,삭제
Mongo db문서의생성,갱신,삭제
홍준 김
 
Taocp 2.3.5
Taocp 2.3.5Taocp 2.3.5
Taocp 2.3.5
홍준 김
 
Taocp 2.3
Taocp 2.3Taocp 2.3
Taocp 2.3
홍준 김
 
Taocp
TaocpTaocp
Taocp
홍준 김
 
재테크
재테크재테크
재테크
홍준 김
 
ManagingHumans/chap25~29
ManagingHumans/chap25~29ManagingHumans/chap25~29
ManagingHumans/chap25~29홍준 김
 
DebugIt/chapter9~11
DebugIt/chapter9~11DebugIt/chapter9~11
DebugIt/chapter9~11홍준 김
 
Holub on Patterns 1장 전
Holub on Patterns 1장 전Holub on Patterns 1장 전
Holub on Patterns 1장 전
홍준 김
 
2장 상태구도형 에이전트의 디자인
2장 상태구도형 에이전트의 디자인2장 상태구도형 에이전트의 디자인
2장 상태구도형 에이전트의 디자인홍준 김
 
프로그램은 왜 실패 하는가
프로그램은 왜 실패 하는가프로그램은 왜 실패 하는가
프로그램은 왜 실패 하는가홍준 김
 

More from 홍준 김 (14)

1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
 
Html5&css 3장
Html5&css 3장Html5&css 3장
Html5&css 3장
 
Mongo db문서의생성,갱신,삭제
Mongo db문서의생성,갱신,삭제Mongo db문서의생성,갱신,삭제
Mongo db문서의생성,갱신,삭제
 
Taocp 2.3.5
Taocp 2.3.5Taocp 2.3.5
Taocp 2.3.5
 
Taocp 2.3
Taocp 2.3Taocp 2.3
Taocp 2.3
 
Taocp 2.1~2.2
Taocp 2.1~2.2Taocp 2.1~2.2
Taocp 2.1~2.2
 
Taocp
TaocpTaocp
Taocp
 
재테크
재테크재테크
재테크
 
ManagingHumans/chap25~29
ManagingHumans/chap25~29ManagingHumans/chap25~29
ManagingHumans/chap25~29
 
DebugIt/chapter9~11
DebugIt/chapter9~11DebugIt/chapter9~11
DebugIt/chapter9~11
 
Holub on Patterns 1장 전
Holub on Patterns 1장 전Holub on Patterns 1장 전
Holub on Patterns 1장 전
 
2장 상태구도형 에이전트의 디자인
2장 상태구도형 에이전트의 디자인2장 상태구도형 에이전트의 디자인
2장 상태구도형 에이전트의 디자인
 
5장
5장5장
5장
 
프로그램은 왜 실패 하는가
프로그램은 왜 실패 하는가프로그램은 왜 실패 하는가
프로그램은 왜 실패 하는가
 

11장 윈도우 스레드 풀

  • 1. 11장 윈도우 스레드 풀 12장 파이버 아꿈사(http://cafe.naver.com/architect1) 김홍준(twitter.com/jun0683)
  • 2. 11장 윈도우 스레드 풀 - 비동기 함수 호출(스레드) - 시간 간격을 두고 함수 호출(타이머) - 커널 오브젝트가 시그널 되면 함수 호출(이벤트) - 비동기 I/O 요청 완료되면 함수 호출(IOCP) 12장 파이버
  • 3. 11장 윈도우 스레드 풀 - 비동기 함수 호출(스레드) - 시간 간격을 두고 함수 호출(타이머) - 커널 오브젝트가 시그널 되면 함수 호출(이벤트) - 비동기 I/O 요청 완료되면 함수 호출(IOCP) 12장 파이버
  • 4. 윈도우 스레드 풀이란? 스레드 생성, 파괴, 관리작업을 좀 더 쉽게구 현 할 수 있도록 제공(책에서는 비스타 이상) 어렵지 않아요~
  • 5. 비동기 함수 호출(스레드)를 뙇! VOID NTAPI SimpleCallback( PTP_CALLBACK_INSTANCE 사용자 정의 pInstance, PVOID pvContext ); BOOL TrySubmitThreadpoolCallback( PTP_SIMPLE_CALLBACK pfnCallback,사용자 정의 함수 작업 요청(비동기적으로) PVOID pvContext, PTP_CALLBACK_ENVIRON pcbe );
  • 6. TrySubmitThreadpoolCallback() 이분을 쓰면 CreateThread X 스레드 일일이 생성 파괴 관리 X =>알아서 재사용 =>알아서 스레드 개수 증가 감소
  • 7. 명시적 작업 항목 제어 TrySubmitThreadpoolCallback 실패시 (메모리 부족,메모리 할당제한등..)
  • 8. 명시적 작업 항목 제어 스레드 풀에서 작업 항목이 들어 가지 않는다면? 내부적으로 작업 항목을 새로 생성 한 후 작업 항목을 스레드 풀 큐에 넣음 => 작업 항목 큐를 이용하자!
  • 9. 명시적으로 작업 항목을 제어 하려면 1.작업 항목 만들고 2.큐에 넣고 VOID CALLBACK WorkCallback( 0.작업 할 콜백함수 구현 PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work); PTP_WORK CreateThreadpoolWork( PTP_WORK_CALLBACK 1.콜백 함수 원형 넣고 pfnWorkHandler, 작업 항목 만듦 PVOID pvContext, PTP_CALLBACK_ENVIRON pcbe); VOID SubmitThreadpoolWork(PTP_WORK 2. 큐에 넣기 pWork);
  • 10. 명시적 작업 항목 제어 삽입한 장업항목을 취소하거나 처리될때까지 특정 스레드를 대기상태 VOID WaitForThreadpoolWorkCallbacks( PTP_WORK pWork, BOOL bCancelPendingCallbacks); True면 취소,처리중이라면 취소하지 않고 처리될때 까지 대기 False면 완전히 처리 될떄까지 대기
  • 11. 명시적 작업 항목 제어 VOID CloseThreadpoolWork(PTP_WORK pwk); 작업 항목이 더 이상 필요 없다면 작업 항목 제거
  • 13. 11장 윈도우 스레드 풀 - 비동기 함수 호출(스레드) - 시간 간격을 두고 함수 호출(타이머) - 커널 오브젝트가 시그널 되면 함수 호출(이벤트) - 비동기 I/O 요청 완료되면 함수 호출(IOCP) 12장 파이버
  • 14. 시간 간격을 두고 함수 호출(타이머)를 뙇! VOID CALLBACK TimeoutCallback( PTP_CALLBACK_INSTANCE pInstance, PVOID pvContext, 타이머 함수 원형 PTP_TIMER pTimer); PTP_TIMER CreateThreadpoolTimer( 타이머 생성 PTP_TIMER_CALLBACK pfnTimerCallback, PVOID pvContext, PTP_CALLBACK_ENVIRON pcbe) VOID SetThreadpoolTimer( PTP_TIMER pTimer, PFILETIME pftDueTime, 타이머 스레드 풀에 등록 DWORD msPeriod, DWORD msWindowLength);
  • 15. 시간 간격을 두고 함수 호출 콜백 함수가 정확한 시간에 호출 해주는 것 보다 스레드를 깨웠다가 다시 대기 상태로 만드는 비용을 줄이는 것이 중요 타이머를 한번 만들고 SetThreadpoolTimer() 을 이용해서 시간 조작
  • 16. 시간 간격을 두고 함수 호출 VOID SetThreadpoolTimer( PTP_TIMER pTimer, PFILETIME pftDueTime, DWORD msPeriod, DWORD msWindowLength); pftDueTime 을 NULL로 넣으면 타이머 호출 X 타이머 오브젝트를 파괴 하지 않고 타이머 정지 가능
  • 17. 시간 간격을 두고 함수 호출 삽입한 타이머을 취소하거나 처리될때까지 특정 스레드를 대기상태 VOID WaitForThreadpoolTimerCallbacks( PTP_WORK pWork, BOOL bCancelPendingCallbacks); True면 취소,처리중이라면 취소하지 않고 처리될때 까지 대기 False면 완전히 처리 될떄까지 대기
  • 18. 11장 윈도우 스레드 풀 - 비동기 함수 호출(스레드) - 시간 간격을 두고 함수 호출(타이머) - 커널 오브젝트가 시그널 되면 함수 호출(이벤트) - 비동기 I/O 요청 완료되면 함수 호출(IOCP) 12장 파이버
  • 19. 커널 오브젝트가 시그널 되면 함수 호출 (이벤트)를 뙇! VOID CALLBACK WaitCallback( PTP_CALLBACK_INSTANCE pInstance, 시그널 대기 함수 원형 PVOID Context, PTP_WAIT Wait, TP_WAIT_RESULT WaitResult); PTP_WAIT CreateThreadpoolWait( PTP_WAIT_CALLBACK pfnWaitCallback, 시그널 대기 함수 생성 PVOID pvContext, PTP_CALLBACK_ENVIRON pcbe); VOID SetThreadpoolWait( PTP_WAIT pWaitItem, HANDLE hObject, 스레드 풀에 등록 PFILETIME pftTimeout);
  • 20. 커널 오브젝트가 시그널 되면 함수 호출 VOID SetThreadpoolWait( PTP_WAIT pWaitItem, HANDLE hObject, PFILETIME pftTimeout); 핸들 오브젝트를 사용 시그널 상태가 됬을 때 콜백 함수를 호출
  • 21. 커널 오브젝트가 시그널 되면 함수 호출 내부적으로 스레드 풀은 WaitForMultipleObjects을 이용하기 때문 64개만 대기 가능 동일한 커널 오브젝트를 동시에 여러 번 사용이 안되므로 DuplicateHandle을 이용 복사된 핸들을 각각 등록
  • 22. 커널 오브젝트가 시그널 되면 함수 호출 프로세스 커널 오브젝트는 한번 시그널이면 영원히 시그널 상태 SetThreadpoolWait 호출할때 다른 오브젝트 또는 Null값을 전달해서 해당 핸들을 제거
  • 23. 커널 오브젝트가 시그널 되면 함수 호출 콜백 함수 내에서 WaitForThreadpoolWork 호출 하면 데드락 SetThreadpoolWait 매개 변수로 전달한 커널 오브젝트는 삭제 하면 안됨!
  • 24. 커널 오브젝트가 시그널 되면 함수 호출 대기중인 커널 오브젝트에 대해 PulseEvent 같은 시그널 함수 호출도 안됨! 해당 이벤트가 호출한 시점에 대기 하고 있음을 보장을 못함!
  • 25. 11장 윈도우 스레드 풀 - 비동기 함수 호출(스레드) - 시간 간격을 두고 함수 호출(타이머) - 커널 오브젝트가 시그널 되면 함수 호출(이벤트) - 비동기 I/O 요청 완료되면 함수 호출(IOCP) 12장 파이버
  • 26. 비동기 I/O 요청 완료되면 함수 호출(IOCP) 뙇! 10장에 대략적으로 다룸 어떤 함수를 호출 할지를 지정하기만 하면 됨
  • 27. 비동기 I/O 요청 완료되면 함수 호출(IOCP) VOID CALLBACK OverlappedCompletionRoutine( PTP_CALLBACK_INSTANCE pInstance, PVOID pvContext, PVOID pOverlapped, I/O 작업 완료시 호출되는 함수 원형 ULONG IoResult, ULONG_PTR NumberOfBytesTransferred, PTP_IO pIo); 스레드 풀 I/O 오브젝트 생성 PTP_IO CreateThreadpoolIo( HANDLE hDevice, 파일/장치 핸들값을 넣어줌 PTP_WIN32_IO_CALLBACK pfnIoCallback, PVOID pvContext, PTP_CALLBACK_ENVIRON pcbe);
  • 28. 비동기 I/O 요청 완료되면 함수 호출(IOCP) VOID StartThreadpoolIo(PTP_IO pio); I/O 오브젝트와 스레드 풀 연동 단,풀에 넣고 나서 READ/WRITE 할것 VOID CancelThreadpoolIo(PTP_IO pio); I/O 작업이 실패 하면 반드시 호출 VOID CloseThreadpoolIo(PTP_IO pio); 사용을 마치려면 … I/O 오브젝트 닫기
  • 29. 비동기 I/O 요청 완료되면 함수 호출(IOCP) VOID WaitForThreadpoolIoCallbacks( PTP_IO pio, BOOL bCancelPendingCallbacks); I/O 작업이 완료 될때까지 다른 스레드가 대기 시킴 True 면 시작 되지 않은 모든 요청을 취소 완료 통지도 발생 X
  • 30. +@ 콜백 종료 동작 콜백 함수가 종료 될때 쓰면 유용 LeaveCriticalSectionWhenCallbackReturns ReleaseMutexWhenCallbackReturns ReleaseSemaphoreWhenCallbackReturns SetEventWhenCallbackReturns FreeLibraryWhenCallbackReturns 스레드 풀이 종료시 자동적으로 호출
  • 31. 스레드 풀 커스터마이징 뙇! 스레드 풀에서 동작하는 스레드의 최소 최대 개수를 설정 OR 스레드 풀을 각각 독립적으로 생성,파괴
  • 32. 스레드 풀 커스터마이징 PTP_POOL CreateThreadpool(PVOID reserved); BOOL SetThreadpoolThreadMinimum(PTP_POOL pThreadPool, DWORD cthrdMin); BOOL SetThreadpoolThreadMaximum(PTP_POOL pThreadPool, DWORD cthrdMost); VOID CloseThreadpool(PTP_POOL pThreadPool); 기본 스레드 풀은 최소 스레드 1개 최대 500개를 가짐
  • 33. 11장 윈도우 스레드 풀 - 비동기 함수 호출(스레드) - 시간 간격을 두고 함수 호출(타이머) - 커널 오브젝트가 시그널 되면 함수 호출(이벤트) - 비동기 I/O 요청 완료되면 함수 호출(IOCP) 12장 파이버
  • 34. 파이버라 쓰고 코루틴이라 읽는다… 코루틴은 마치 예전 OS의 비선점형(non-preemptive) 쓰레드와 비슷하게 동작 프로그래머가 강제로 컨텍스트 스위칭 명령을 줘야 스위칭
  • 35. 파이버 기존 UNIX 프로그램을 포팅하기 위해서… 윈도우는 그냥 스레드 쓰면 됨…. 유저모드에서 돌아서 가볍다 스케줄링을 직접 해야 함
  • 36. 파이버 함수 사용 ConvertThreadToFiber PVOID ConvertThreadToFiberEx( PVOID pvParam, DWORD dwFlags); 기존 스레드를 파이버로 변경 파이버 단위에는 부동소수점 상태 정보를 포함하지 않으므로 플래그에 FIBER_FLAG_FLOAT_SWITCH를 넣어줌
  • 37. 파이버 함수 사용 VOID WINAPI FiberFunc(PVOID pvParam); 파이버 함수 원형 PVOID CreateFiberEx( SIZE_T dwStackCommitSize, SIZE_T dwStackReserveSize, DWORD dwFlags, PFIBER_START_ROUTINE pStartAddress, PVOID pvParam); 새로운 파이버를 생성 리턴 받은 컨텍스트 정보를 저장 해두고 사용
  • 38. 파이버 함수 사용 VOID SwitchToFiber(PVOID pvFiberExecutionContext); 바이퍼 간 스위칭 컨텍스트 정보를 이용해서 스위칭을 함 PVOID GetCurrentFiber(); 현재 컨텍스트 주소를 얻어옴
  • 40. 끝!