ݺߣ

ݺߣShare 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

뇌자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에서만 작동하도록