SlideShare a Scribd company logo
뇌를 자극하는 TCP/IP 소켓 프로그래밍 스터디

번외. 윈도우 멀티스레딩
    프로그래밍


                         스레드의 개념
                           권승진(Promotion)
목차
•   프로세스의 개념
•   스레드 개념
•   스케쥴링
•   우선순위
•   선호도
그 외 단어들
• Quantum : 이라고 하는 실행 가능 시간 단위
아 좋은 그림
Process
• 프로세스
Process
• 프로세스
         -   프로세스는 틀 일뿐..

         -   뭔가를 수행하기 위해서는       가 있어야 한다.

         -   하나의 프로세스는 다수의 스레드를 가질 수 있으며,

         -   각 스레드들은 주소 공간 내에서      수행됨
Process
• 각 스레드들은
  – CPU레지스터 집합
  – 스택
  – 적어도 한 개의 스레드


• 프로세스의 주소 공간 내에 코드를 수행할
  스레드가 없을 땐 시스템이 자동적으로 프
  로세스와 프로세스의 주소공간을 파괴!
Thread
• 스레드


                 Thread




                 Thread
                 Context
Thread
          • 구성
           – 스레드 커널 오브젝트.
Thread     – 스레드 스택

          • 항상 프로세스의 컨텍스트 내에 생성됨
Thread
Context
          • 프로세스 안에서만 존재 가능
Thread
• 역할
 – 프로세스의 주소 공간 내에 있는 코드를 수행
   하고 데이터를 다룬다.


 – 프로세스 내에 둘 이상의 스레드가 있는 경우
   는 단일 주소 공간을 공유하게 됨.
Process & Thread의 개념 정리
           아 역시 좋은 그림이네




 는
Process
• 한가지 짚고 넘어갈 것
         -   프로세스는 틀 일뿐..
         -   뭔가를 수행하기 위해서는 스레드가 있어야 한다.
         -   하나의 프로세스는 다수의 스레드를 가질 수 있으며,



         - 각 스레드들은 주소 공간
           내에서     수행됨
Process
• 프로세스
         -   프로세스는 틀 일뿐..
         -   뭔가를 수행하기 위해서는 스레드가 있어야 한다.
         -        ㅋ
             하나의 프로세스는 다수의 스레드를 가질 수 있으며,



         - 각 스레드들은 주소 공간
           내에서     수행됨
운영체제 관점에서 보는 스레드

           너 10ms 준다ㅋ
라운드 로빈방식
운영체제 관점에서 보는 스레드

           다음은 너 10ms
라운드 로빈방식
운영체제 관점에서 보는 스레드


• Single Core - 스레드들은 라운드 로빈방식
  으로 주어진 단위 시간만큼씩 수행됨

•   Multi Core - CPU별로 다른 스레드를 수행하도록 스케쥴링
운영체제 관점에서 보는 스레드


•   Single Core - 스레드들은 라운드 로빈방식으로 주어진 단위 시간만큼씩 수행됨

• Multi Core - CPU별로 다른 스레드를
                  수행하도록 스케쥴링
Multi Threading



• 왜 쓰냐?
Thread 생성


• CreateThread()
  – 인자 및 기본 사용 방법은 다 아시리라 생각함.

  – 스레드를 새로 생성해서 3번째 인자로 넣은
    Function의 코드를 수행
Thread 생성
Thread의 종료

• 스레드 함수가 반환
• 스레드 내에서 ExitThread 호출
• 동일, 혹은 아예 다른 프로세스에서
  TerminateThread 호출
• 스레드가 포함된 프로세스가 종료
Thread의 종료

• 스레드 함수가 반환 의 경우 이외에는
•   스레드 내에서 ExitThread 호출
•   동일, 혹은 아예 다른 프로세스에서 TerminateThread 호출
•   스레드가 포함된 프로세스가 종료



•비 추천              (이라기보단 되도록 이렇게 안되도록 해야함)
Thread의 종료

• 스레드 함수가 반환 일 땐
 1. 스레드 함수 내에서 생성된 모든 C++오브젝
    트들 파괴자 호출 후 제거
 2. 스레드 스택으로 사용되던 메모리 반환
Thread의 종료

• 스레드 함수가 반환 일 땐
 3. 시스템은 스레드의 종료 코드를 스레드 함수
    의 반환 값으로 설정
 4. 스레드 커널 오브젝트의 사용 카운트 감소
Thread의 종료
• ExitThread 함수 호출 경우
 – 운영체제 리소스는 반환되지만,
 – C++리소스는 방치됨
 – 이 함수는 반환되지 않으므로, 이 함수 호출 부
   분 아래 코드는 실행 안됨
Thread의 종료

• TerminateThread 함수 호출 경우
 – 종료될 스레드 쪽은 자신이 곧 종료 될 것이라는 사실
   을 모르기 때문에 적절한 정리 작업 수행이 불가능
 – 종료 자체를 회피 할수도 없음
공통적으로 스레드 종료시 나타나는 일들


1. 스레드가 소유하던 모든 유저 오브젝트 핸들
   이 삭제
2. 스레드의 종료코드는 STILL_ACTIVE에서
   ExitThread나 TerminateThread에서 지정한
   종료 코드로 변경
공통적으로 스레드 종료시 나타나는 일들


3. 스레드 커널 오브젝트의 상태 - 시그널 상태
   로 변경
4. 스레드 커널 오브젝트의 사용 카운트가 1 감
   소
스레드 내부
         1. 커널 오브젝트 생성
         2. 커널 오브젝트 초기화
         3. 스레드 스택으로 활용
            할 메모리 할당
         4. 및 Param, StartAddr
            추가
         5. RtlUserThreadStart()
            가 호출됨(OS에 의해)
beginthreadex
• 어떤 이유에 의해
  Create/ExitThread 대신
  begin/endthreadex를 호출해야 합니다.

• 어떤 이유일까요?
스레드 스케쥴링
• 컨텍스트 구조체
 – 스레드가 마지막으로 수행되었을 때의 CPU레
   지스터들의 정보를 가지고 있다.
 – Context Switching
스레드 스케쥴링
• 컨텍스트 전환이 일어나면 Cpu시간을 할당
  받은 스레드는 프로세스의 주소 공간 내에
  위치한 코드를 수행하고 데이터를 사용하
  게 된다.
• 다시 20밀리초가 지나면 윈도우는 CPU레
  지스터 정보를 스레드의 컨텍스트로 저장
  하게 되고 스레드는 수행이 정지된다.
스레드의 정지와 계속 수행
• 스레드 커널 오브젝트 내에는 Suspend Count라는 값이 저장되어 있
  다.

• CreateThread가 불리는 순간 1로 초기화가 되고,
• CreateThread속에서 초기화가 모두 끝났을때,
• CREATE_SUSPENDED플래그만 켜져있지 않다면 정지카운트를 0
  으로 만들고 스케줄 가능한 상태가 된다.

• CREATE_SUSPENDED플래그가 켜져있었다면, 스케줄 불가능 상태
  가 된다.
스레드의 정지와 계속 수행


• ResumeThread()
• SuspendThread()
슬리핑
• Sleep()

• 스레드는 함수를 이용하여 일정시간동안
  자신을 스케줄하지 않도록 운영체제에게
  명령을 내릴수 있다.
다른 스레드로 강제 전환


• SwitchToThread()
스레드 우선순위
• 모든 스레드들은 0~31의 우선순위 번호를 가짐

• 시스템은 다음에 수행할 스레드를 선택할 때 31번 우선순위를 가진
  스케줄 가능한 스레드들을 선택하고 라운드 로빈 방식으로 이러한 스
  레드들을 수행한다.
  – 스레드에 할당된 Time Slice가 끝나면 시스템은 31번 우선순위를 가진
    스레드 중 스케줄 가능한 스레드가 있는지 확인하고 있을경우 할당.
  – 31번이 스케줄 가능일 경우는 0~30은 절대 CPU를 할당 받을 수 없다.
    (starvation state가 됨)
  – 멀티 스레드일 경우는 31번과 30번이 동시에 돌아갈 수 있기 때문에 발
    생 빈도가 적은 편.
  – CPU는 스케줄 가능한 스레드가 없는 경우에만 유휴 상태가 된다.
스레드 우선순위
•   시스템 내의 대부분의 스레드들은 스케줄 불가능 상태를 유지한다.
•   예)
    – 프로세스의 주 스레드가 GetMessage를 했는데 Message가 없을때 프로세스를 정지시
      킴.
    – Message가 삽입되는 순간, 시스템은 해당 스레드가 더 이상 정지 상태로 있지 않아야
      한다는것을 알게 되고, 현재 스레드보다 높은 우선순위의 실행가능 스레드가 없을 때,
      CPU시간을 할당함.
    – 낮은 우선 순위의 스레드가 어떤 작업을 하고 있든지, 높은 우선순위가의 스레드가 스케
      줄 가능 상태가 되면, 지체없이 높은 우선순위의 스레드에 CPU시간을 할당함.(Time
      Slice가 남았더라도 포기)
    – 제로페이지 스레드
       •   시스템 전체에서 어떠한 스레드도 스케줄 가능 상태가 아닐때 램의 사용되지 않는 페이지를 0
           으로 만들어주는 작업을 수행
       •   시스템 전체에서 유일하게 0번 우선순위를 가진 스레드.
스레드 우선순위
• 우선순위 개념
스레드 우선순위
• 우선순위 개념
 – 프로세스의 우선순위
  • 운영체제 내의 다른 프로그램들과 순위 척도
 – 스레드들의 우선순위
  • 애플리케이션 내의 스레드들의 상대적 순위 척도
스레드 우선순위

• 높은 우선순위 레벨의 스레드는 오랫동안 스
  케줄 가능 상태로 남아 있지 않도록 하고,
• 낮은 우선순위 레벨 스레드는 가능한 오랫동
  안 스케줄 가능한 상태를 유지해서 가능한 오
  랫동안 CPU를 잡고 있도록 하는게 좋다.

• 전체적인 운영체제의 응답성이 개선된다.
스레드 우선순위

• SetPriorityClass

• SetThreadPriority

• CreateThread함수 호출시 항당 보통 스레드
  우선순위로 생성한다.
스레드 우선순위
• 동적인 우선순위 레벨 상승
  – 시스템은 I/O이벤트에 응답이나 디스크를 읽을 때 일시적으로 우선순위
    레벨을 상승시킨다.
      •   프로세스/스레드 우선순위를 토대로 기본 우선순위 값이 정해진다.
      •   I/O 이벤트가 일어날 경우 일시적으로 우선순위레벨을 증가 시킬 수 있다.
      •   1~15에서만 증감이 일어남.
      •   기본 우선순위 값 밑으로는 떨어지지 않음
• 동적 변경이 싫다면,
  – Set/GetProcessPriorityBoost
  – Set/GetThreadPriorityBoost
스레드 우선순위
• Foreground Process
  – 사용자는 당연히 현재 사용중인 프로세스가
    BackgroundProcess보다 빨리 응답하길 원할 것이
    다.
  – 그래서 윈도우는 Foreground에게는 일반적인 퀀
    텀시간보다 좀 더 긴 시간의 퀀텀을 제공할 수 있
    도록 한다.
  – ForegroundProcess가 보통 우선순위 클래스일때
    만! 적용된다.
스레드 선호도
• 특정 시스템구조를 고려한 기능으로
• 어느 스레드를 어떤 CPU에서 수행할지 제어
  하는 방법을 제공하는 것

• 예)
  – A스레드는 0번 CPU에서만,
  – B스레드는 2번 CPU에서만 작동하도록

More Related Content

What's hot

Introduction to Parallel Programming
Introduction to Parallel ProgrammingIntroduction to Parallel Programming
Introduction to Parallel Programming
UNIST
 
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장SukYun Yoon
 
스레드
스레드스레드
스레드xxbdxx
 
Apache ZooKeeper 소개
Apache ZooKeeper 소개Apache ZooKeeper 소개
Apache ZooKeeper 소개
중선 곽
 
Redis
RedisRedis
화성에서 온 개발자, 금성에서 온 기획자
화성에서 온 개발자, 금성에서 온 기획자화성에서 온 개발자, 금성에서 온 기획자
화성에서 온 개발자, 금성에서 온 기획자
Yongho Ha
 
LockFree Algorithm
LockFree AlgorithmLockFree Algorithm
LockFree Algorithm
Merry Merry
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
내훈 정
 
Asynchronous 101 - (1)
Asynchronous 101 - (1)Asynchronous 101 - (1)
Asynchronous 101 - (1)
MinChul Lee
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
준혁 이
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7
JinWoo Lee
 
[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스종빈 오
 
Redis basicandroadmap
Redis basicandroadmapRedis basicandroadmap
Redis basicandroadmapDaeMyung Kang
 
Concurrency in action - chapter 5
Concurrency in action - chapter 5Concurrency in action - chapter 5
Concurrency in action - chapter 5
JinWoo Lee
 
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
jieun kim
 
Asynchronous 101 (2)
Asynchronous 101 (2)Asynchronous 101 (2)
Asynchronous 101 (2)
MinChul Lee
 
Ch9 프로세스의 메모리 구조
Ch9 프로세스의 메모리 구조Ch9 프로세스의 메모리 구조
Ch9 프로세스의 메모리 구조
Minchul Jung
 
07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도
ssuser3fb17c
 

What's hot (20)

Introduction to Parallel Programming
Introduction to Parallel ProgrammingIntroduction to Parallel Programming
Introduction to Parallel Programming
 
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
 
스레드
스레드스레드
스레드
 
Apache ZooKeeper 소개
Apache ZooKeeper 소개Apache ZooKeeper 소개
Apache ZooKeeper 소개
 
Redis
RedisRedis
Redis
 
화성에서 온 개발자, 금성에서 온 기획자
화성에서 온 개발자, 금성에서 온 기획자화성에서 온 개발자, 금성에서 온 기획자
화성에서 온 개발자, 금성에서 온 기획자
 
LockFree Algorithm
LockFree AlgorithmLockFree Algorithm
LockFree Algorithm
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
Asynchronous 101 - (1)
Asynchronous 101 - (1)Asynchronous 101 - (1)
Asynchronous 101 - (1)
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7
 
[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스
 
Redis basicandroadmap
Redis basicandroadmapRedis basicandroadmap
Redis basicandroadmap
 
Concurrency in action - chapter 5
Concurrency in action - chapter 5Concurrency in action - chapter 5
Concurrency in action - chapter 5
 
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
 
Asynchronous 101 (2)
Asynchronous 101 (2)Asynchronous 101 (2)
Asynchronous 101 (2)
 
Bootchart 송형주
Bootchart 송형주Bootchart 송형주
Bootchart 송형주
 
Ch9 프로세스의 메모리 구조
Ch9 프로세스의 메모리 구조Ch9 프로세스의 메모리 구조
Ch9 프로세스의 메모리 구조
 
Redis edu 3
Redis edu 3Redis edu 3
Redis edu 3
 
07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도
 

Similar to 뇌자T etc.windows multi threading programming

Windows via c++ chapter6
Windows via c++   chapter6Windows via c++   chapter6
Windows via c++ chapter6
Shin heemin
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdf
Seokju Hong
 
CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기
YEONG-CHEON YOU
 
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdfOS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
Ho Jeong Im
 
SQL-on-Hadoop with Apache Tajo, and application case of SK Telecom
SQL-on-Hadoop with Apache Tajo,  and application case of SK TelecomSQL-on-Hadoop with Apache Tajo,  and application case of SK Telecom
SQL-on-Hadoop with Apache Tajo, and application case of SK Telecom
Gruter
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
Yong Joon Moon
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
KwangSeob Jeong
 
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
YEONG-CHEON YOU
 
AWS EMR Cost optimization
AWS EMR Cost optimizationAWS EMR Cost optimization
AWS EMR Cost optimization
SANG WON PARK
 
Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014
Gruter
 
운영 체제 Sig
운영 체제 Sig운영 체제 Sig
운영 체제 SigYoungGun Na
 
Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
Byeongsu Kang
 
Linux reversing study_basic_4
Linux reversing study_basic_4Linux reversing study_basic_4
Linux reversing study_basic_4
Jinkyoung Kim
 
프로그래머가 알아야 하는 메모리 관리 기법
프로그래머가 알아야 하는 메모리 관리 기법프로그래머가 알아야 하는 메모리 관리 기법
프로그래머가 알아야 하는 메모리 관리 기법
중선 곽
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
System+os study 3
System+os study 3System+os study 3
System+os study 3
Jinkyoung Kim
 
Warp
WarpWarp
Network researching
Network researchingNetwork researching
Network researching
hyeok gyu Kwon
 
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
Minchul Jung
 

Similar to 뇌자T etc.windows multi threading programming (20)

Windows via c++ chapter6
Windows via c++   chapter6Windows via c++   chapter6
Windows via c++ chapter6
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdf
 
CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기
 
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdfOS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
 
SQL-on-Hadoop with Apache Tajo, and application case of SK Telecom
SQL-on-Hadoop with Apache Tajo,  and application case of SK TelecomSQL-on-Hadoop with Apache Tajo,  and application case of SK Telecom
SQL-on-Hadoop with Apache Tajo, and application case of SK Telecom
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
 
AWS EMR Cost optimization
AWS EMR Cost optimizationAWS EMR Cost optimization
AWS EMR Cost optimization
 
Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014
 
운영 체제 Sig
운영 체제 Sig운영 체제 Sig
운영 체제 Sig
 
Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
 
Linux reversing study_basic_4
Linux reversing study_basic_4Linux reversing study_basic_4
Linux reversing study_basic_4
 
프로그래머가 알아야 하는 메모리 관리 기법
프로그래머가 알아야 하는 메모리 관리 기법프로그래머가 알아야 하는 메모리 관리 기법
프로그래머가 알아야 하는 메모리 관리 기법
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
System+os study 3
System+os study 3System+os study 3
System+os study 3
 
Warp
WarpWarp
Warp
 
Network researching
Network researchingNetwork researching
Network researching
 
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
 

More from cancan21st

Lua script
Lua scriptLua script
Lua script
cancan21st
 
기본 회전 공식
기본 회전 공식 기본 회전 공식
기본 회전 공식 cancan21st
 
Factory method
Factory methodFactory method
Factory methodcancan21st
 

More from cancan21st (6)

Lua script
Lua scriptLua script
Lua script
 
기본 회전 공식
기본 회전 공식 기본 회전 공식
기본 회전 공식
 
삼각비
삼각비삼각비
삼각비
 
반사벡터
반사벡터반사벡터
반사벡터
 
Factory method
Factory methodFactory method
Factory method
 
투영 공식
투영 공식투영 공식
투영 공식
 

뇌자T etc.windows multi threading programming

  • 1. 뇌를 자극하는 TCP/IP 소켓 프로그래밍 스터디 번외. 윈도우 멀티스레딩 프로그래밍 스레드의 개념 권승진(Promotion)
  • 2. 목차 • 프로세스의 개념 • 스레드 개념 • 스케쥴링 • 우선순위 • 선호도
  • 3. 그 외 단어들 • Quantum : 이라고 하는 실행 가능 시간 단위
  • 6. Process • 프로세스 - 프로세스는 틀 일뿐.. - 뭔가를 수행하기 위해서는 가 있어야 한다. - 하나의 프로세스는 다수의 스레드를 가질 수 있으며, - 각 스레드들은 주소 공간 내에서 수행됨
  • 7. Process • 각 스레드들은 – CPU레지스터 집합 – 스택 – 적어도 한 개의 스레드 • 프로세스의 주소 공간 내에 코드를 수행할 스레드가 없을 땐 시스템이 자동적으로 프 로세스와 프로세스의 주소공간을 파괴!
  • 8. Thread • 스레드 Thread Thread Context
  • 9. Thread • 구성 – 스레드 커널 오브젝트. Thread – 스레드 스택 • 항상 프로세스의 컨텍스트 내에 생성됨 Thread Context • 프로세스 안에서만 존재 가능
  • 10. Thread • 역할 – 프로세스의 주소 공간 내에 있는 코드를 수행 하고 데이터를 다룬다. – 프로세스 내에 둘 이상의 스레드가 있는 경우 는 단일 주소 공간을 공유하게 됨.
  • 11. Process & Thread의 개념 정리 아 역시 좋은 그림이네 는
  • 12. Process • 한가지 짚고 넘어갈 것 - 프로세스는 틀 일뿐.. - 뭔가를 수행하기 위해서는 스레드가 있어야 한다. - 하나의 프로세스는 다수의 스레드를 가질 수 있으며, - 각 스레드들은 주소 공간 내에서 수행됨
  • 13. Process • 프로세스 - 프로세스는 틀 일뿐.. - 뭔가를 수행하기 위해서는 스레드가 있어야 한다. - ㅋ 하나의 프로세스는 다수의 스레드를 가질 수 있으며, - 각 스레드들은 주소 공간 내에서 수행됨
  • 14. 운영체제 관점에서 보는 스레드 너 10ms 준다ㅋ 라운드 로빈방식
  • 15. 운영체제 관점에서 보는 스레드 다음은 너 10ms 라운드 로빈방식
  • 16. 운영체제 관점에서 보는 스레드 • Single Core - 스레드들은 라운드 로빈방식 으로 주어진 단위 시간만큼씩 수행됨 • Multi Core - CPU별로 다른 스레드를 수행하도록 스케쥴링
  • 17. 운영체제 관점에서 보는 스레드 • Single Core - 스레드들은 라운드 로빈방식으로 주어진 단위 시간만큼씩 수행됨 • Multi Core - CPU별로 다른 스레드를 수행하도록 스케쥴링
  • 19. Thread 생성 • CreateThread() – 인자 및 기본 사용 방법은 다 아시리라 생각함. – 스레드를 새로 생성해서 3번째 인자로 넣은 Function의 코드를 수행
  • 21. Thread의 종료 • 스레드 함수가 반환 • 스레드 내에서 ExitThread 호출 • 동일, 혹은 아예 다른 프로세스에서 TerminateThread 호출 • 스레드가 포함된 프로세스가 종료
  • 22. Thread의 종료 • 스레드 함수가 반환 의 경우 이외에는 • 스레드 내에서 ExitThread 호출 • 동일, 혹은 아예 다른 프로세스에서 TerminateThread 호출 • 스레드가 포함된 프로세스가 종료 •비 추천 (이라기보단 되도록 이렇게 안되도록 해야함)
  • 23. Thread의 종료 • 스레드 함수가 반환 일 땐 1. 스레드 함수 내에서 생성된 모든 C++오브젝 트들 파괴자 호출 후 제거 2. 스레드 스택으로 사용되던 메모리 반환
  • 24. Thread의 종료 • 스레드 함수가 반환 일 땐 3. 시스템은 스레드의 종료 코드를 스레드 함수 의 반환 값으로 설정 4. 스레드 커널 오브젝트의 사용 카운트 감소
  • 25. Thread의 종료 • ExitThread 함수 호출 경우 – 운영체제 리소스는 반환되지만, – C++리소스는 방치됨 – 이 함수는 반환되지 않으므로, 이 함수 호출 부 분 아래 코드는 실행 안됨
  • 26. Thread의 종료 • TerminateThread 함수 호출 경우 – 종료될 스레드 쪽은 자신이 곧 종료 될 것이라는 사실 을 모르기 때문에 적절한 정리 작업 수행이 불가능 – 종료 자체를 회피 할수도 없음
  • 27. 공통적으로 스레드 종료시 나타나는 일들 1. 스레드가 소유하던 모든 유저 오브젝트 핸들 이 삭제 2. 스레드의 종료코드는 STILL_ACTIVE에서 ExitThread나 TerminateThread에서 지정한 종료 코드로 변경
  • 28. 공통적으로 스레드 종료시 나타나는 일들 3. 스레드 커널 오브젝트의 상태 - 시그널 상태 로 변경 4. 스레드 커널 오브젝트의 사용 카운트가 1 감 소
  • 29. 스레드 내부 1. 커널 오브젝트 생성 2. 커널 오브젝트 초기화 3. 스레드 스택으로 활용 할 메모리 할당 4. 및 Param, StartAddr 추가 5. RtlUserThreadStart() 가 호출됨(OS에 의해)
  • 30. beginthreadex • 어떤 이유에 의해 Create/ExitThread 대신 begin/endthreadex를 호출해야 합니다. • 어떤 이유일까요?
  • 31. 스레드 스케쥴링 • 컨텍스트 구조체 – 스레드가 마지막으로 수행되었을 때의 CPU레 지스터들의 정보를 가지고 있다. – Context Switching
  • 32. 스레드 스케쥴링 • 컨텍스트 전환이 일어나면 Cpu시간을 할당 받은 스레드는 프로세스의 주소 공간 내에 위치한 코드를 수행하고 데이터를 사용하 게 된다. • 다시 20밀리초가 지나면 윈도우는 CPU레 지스터 정보를 스레드의 컨텍스트로 저장 하게 되고 스레드는 수행이 정지된다.
  • 33. 스레드의 정지와 계속 수행 • 스레드 커널 오브젝트 내에는 Suspend Count라는 값이 저장되어 있 다. • CreateThread가 불리는 순간 1로 초기화가 되고, • CreateThread속에서 초기화가 모두 끝났을때, • CREATE_SUSPENDED플래그만 켜져있지 않다면 정지카운트를 0 으로 만들고 스케줄 가능한 상태가 된다. • CREATE_SUSPENDED플래그가 켜져있었다면, 스케줄 불가능 상태 가 된다.
  • 34. 스레드의 정지와 계속 수행 • ResumeThread() • SuspendThread()
  • 35. 슬리핑 • Sleep() • 스레드는 함수를 이용하여 일정시간동안 자신을 스케줄하지 않도록 운영체제에게 명령을 내릴수 있다.
  • 36. 다른 스레드로 강제 전환 • SwitchToThread()
  • 37. 스레드 우선순위 • 모든 스레드들은 0~31의 우선순위 번호를 가짐 • 시스템은 다음에 수행할 스레드를 선택할 때 31번 우선순위를 가진 스케줄 가능한 스레드들을 선택하고 라운드 로빈 방식으로 이러한 스 레드들을 수행한다. – 스레드에 할당된 Time Slice가 끝나면 시스템은 31번 우선순위를 가진 스레드 중 스케줄 가능한 스레드가 있는지 확인하고 있을경우 할당. – 31번이 스케줄 가능일 경우는 0~30은 절대 CPU를 할당 받을 수 없다. (starvation state가 됨) – 멀티 스레드일 경우는 31번과 30번이 동시에 돌아갈 수 있기 때문에 발 생 빈도가 적은 편. – CPU는 스케줄 가능한 스레드가 없는 경우에만 유휴 상태가 된다.
  • 38. 스레드 우선순위 • 시스템 내의 대부분의 스레드들은 스케줄 불가능 상태를 유지한다. • 예) – 프로세스의 주 스레드가 GetMessage를 했는데 Message가 없을때 프로세스를 정지시 킴. – Message가 삽입되는 순간, 시스템은 해당 스레드가 더 이상 정지 상태로 있지 않아야 한다는것을 알게 되고, 현재 스레드보다 높은 우선순위의 실행가능 스레드가 없을 때, CPU시간을 할당함. – 낮은 우선 순위의 스레드가 어떤 작업을 하고 있든지, 높은 우선순위가의 스레드가 스케 줄 가능 상태가 되면, 지체없이 높은 우선순위의 스레드에 CPU시간을 할당함.(Time Slice가 남았더라도 포기) – 제로페이지 스레드 • 시스템 전체에서 어떠한 스레드도 스케줄 가능 상태가 아닐때 램의 사용되지 않는 페이지를 0 으로 만들어주는 작업을 수행 • 시스템 전체에서 유일하게 0번 우선순위를 가진 스레드.
  • 40. 스레드 우선순위 • 우선순위 개념 – 프로세스의 우선순위 • 운영체제 내의 다른 프로그램들과 순위 척도 – 스레드들의 우선순위 • 애플리케이션 내의 스레드들의 상대적 순위 척도
  • 41. 스레드 우선순위 • 높은 우선순위 레벨의 스레드는 오랫동안 스 케줄 가능 상태로 남아 있지 않도록 하고, • 낮은 우선순위 레벨 스레드는 가능한 오랫동 안 스케줄 가능한 상태를 유지해서 가능한 오 랫동안 CPU를 잡고 있도록 하는게 좋다. • 전체적인 운영체제의 응답성이 개선된다.
  • 42. 스레드 우선순위 • SetPriorityClass • SetThreadPriority • CreateThread함수 호출시 항당 보통 스레드 우선순위로 생성한다.
  • 43. 스레드 우선순위 • 동적인 우선순위 레벨 상승 – 시스템은 I/O이벤트에 응답이나 디스크를 읽을 때 일시적으로 우선순위 레벨을 상승시킨다. • 프로세스/스레드 우선순위를 토대로 기본 우선순위 값이 정해진다. • I/O 이벤트가 일어날 경우 일시적으로 우선순위레벨을 증가 시킬 수 있다. • 1~15에서만 증감이 일어남. • 기본 우선순위 값 밑으로는 떨어지지 않음 • 동적 변경이 싫다면, – Set/GetProcessPriorityBoost – Set/GetThreadPriorityBoost
  • 44. 스레드 우선순위 • Foreground Process – 사용자는 당연히 현재 사용중인 프로세스가 BackgroundProcess보다 빨리 응답하길 원할 것이 다. – 그래서 윈도우는 Foreground에게는 일반적인 퀀 텀시간보다 좀 더 긴 시간의 퀀텀을 제공할 수 있 도록 한다. – ForegroundProcess가 보통 우선순위 클래스일때 만! 적용된다.
  • 45. 스레드 선호도 • 특정 시스템구조를 고려한 기능으로 • 어느 스레드를 어떤 CPU에서 수행할지 제어 하는 방법을 제공하는 것 • 예) – A스레드는 0번 CPU에서만, – B스레드는 2번 CPU에서만 작동하도록