45
뇌를 자극하는 TCP/IP 소켓 프로그래밍 스터디 번외. 윈도우 멀티스레딩 프로그래밍 스레드의 개념 권승진(Promotion)

뇌자T etc.windows multi threading programming

Embed Size (px)

Citation preview

Page 1: 뇌자T   etc.windows multi threading programming

뇌를 자극하는 TCP/IP 소켓 프로그래밍 스터디

번외. 윈도우 멀티스레딩

프로그래밍

스레드의 개념권승진(Promotion)

Page 2: 뇌자T   etc.windows multi threading programming

목 차

• 프로세스의 개념

• 스레드 개념

• 스케쥴링

• 우선순위

• 선호도

Page 3: 뇌자T   etc.windows multi threading programming

그 외 단어들

• Quantum : 이라고 하는 실행 가능 시간 단위

Page 4: 뇌자T   etc.windows multi threading programming

아 좋은 그림

Page 5: 뇌자T   etc.windows multi threading programming

Process

• 프로세스

Page 6: 뇌자T   etc.windows multi threading programming

Process

• 프로세스

- 프로세스는 틀 일뿐..

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

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

- 각 스레드들은 주소 공간 내에서 수행됨

Page 7: 뇌자T   etc.windows multi threading programming

Process• 각 스레드들은

– CPU레지스터 집합

– 스택

– 적어도 한 개의 스레드

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

Page 8: 뇌자T   etc.windows multi threading programming

Thread

• 스레드

Thread

Thread

Context

Page 9: 뇌자T   etc.windows multi threading programming

Thread

• 구성

– 스레드 커널 오브젝트.

– 스레드 스택

• 항상 프로세스의 컨텍스트 내에 생성됨

• 프로세스 안에서만 존재 가능

Thread

Thread

Context

Page 10: 뇌자T   etc.windows multi threading programming

Thread

• 역할

– 프로세스의 주소 공간 내에 있는 코드를 수행

하고 데이터를 다룬다.

– 프로세스 내에 둘 이상의 스레드가 있는 경우

는 단일 주소 공간을 공유하게 됨.

Page 11: 뇌자T   etc.windows multi threading programming

Process & Thread의 개념 정리

아 역시 좋은 그림이네

Page 12: 뇌자T   etc.windows multi threading programming

Process

• 한가지 짚고 넘어갈 것

- 프로세스는 틀 일뿐..

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

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

- 각 스레드들은 주소 공간

내에서 수행됨

Page 13: 뇌자T   etc.windows multi threading programming

Process

• 프로세스

- 프로세스는 틀 일뿐..

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

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

- 각 스레드들은 주소 공간

내에서 수행됨

Page 14: 뇌자T   etc.windows multi threading programming

운영체제 관점에서 보는 스레드

라운드 로빈방식너 10ms 준다ㅋ

Page 15: 뇌자T   etc.windows multi threading programming

다음은 너 10ms

운영체제 관점에서 보는 스레드

라운드 로빈방식

Page 16: 뇌자T   etc.windows multi threading programming

• Single Core - 스레드들은 라운드 로빈방식

으로 주어진 단위 시간만큼씩 수행됨

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

운영체제 관점에서 보는 스레드

Page 17: 뇌자T   etc.windows multi threading programming

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

• Multi Core - CPU별로 다른 스레드를

수행하도록 스케쥴링

운영체제 관점에서 보는 스레드

Page 18: 뇌자T   etc.windows multi threading programming

Multi Threading

• 왜 쓰냐?

Page 19: 뇌자T   etc.windows multi threading programming

Thread 생성

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

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

Page 20: 뇌자T   etc.windows multi threading programming

Thread 생성

Page 21: 뇌자T   etc.windows multi threading programming

Thread의 종료

• 스레드 함수가 반환

• 스레드 내에서 ExitThread 호출

• 동일, 혹은 아예 다른 프로세스에서TerminateThread 호출

• 스레드가 포함된 프로세스가 종료

Page 22: 뇌자T   etc.windows multi threading programming

Thread의 종료

• 스레드 함수가 반환 의 경우 이외에는• 스레드 내에서 ExitThread 호출

• 동일, 혹은 아예 다른 프로세스에서 TerminateThread 호출

• 스레드가 포함된 프로세스가 종료

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

Page 23: 뇌자T   etc.windows multi threading programming

Thread의 종료

• 스레드 함수가 반환 일 땐

1. 스레드 함수 내에서 생성된 모든 C++오브젝

트들 파괴자 호출 후 제거

2. 스레드 스택으로 사용되던 메모리 반환

Page 24: 뇌자T   etc.windows multi threading programming

Thread의 종료

• 스레드 함수가 반환 일 땐

3. 시스템은 스레드의 종료 코드를 스레드 함수

의 반환 값으로 설정

4. 스레드 커널 오브젝트의 사용 카운트 감소

Page 25: 뇌자T   etc.windows multi threading programming

Thread의 종료

• ExitThread 함수 호출 경우

– 운영체제 리소스는 반환되지만,

– C++리소스는 방치됨

– 이 함수는 반환되지 않으므로, 이 함수 호출 부

분 아래 코드는 실행 안됨

Page 26: 뇌자T   etc.windows multi threading programming

Thread의 종료

• TerminateThread 함수 호출 경우– 종료될 스레드 쪽은 자신이 곧 종료 될 것이라는 사실

을 모르기 때문에 적절한 정리 작업 수행이 불가능

– 종료 자체를 회피 할수도 없음

Page 27: 뇌자T   etc.windows multi threading programming

1. 스레드가 소유하던 모든 유저 오브젝트 핸들

이 삭제

2. 스레드의 종료코드는 STILL_ACTIVE에서

ExitThread나 TerminateThread에서 지정한

종료 코드로 변경

공통적으로 스레드 종료시 나타나는 일들

Page 28: 뇌자T   etc.windows multi threading programming

3. 스레드 커널 오브젝트의 상태 - 시그널 상태

로 변경

4. 스레드 커널 오브젝트의 사용 카운트가 1 감

공통적으로 스레드 종료시 나타나는 일들

Page 29: 뇌자T   etc.windows multi threading programming

스레드 내부

1. 커널 오브젝트 생성

2. 커널 오브젝트 초기화

3. 스레드 스택으로 활용

할 메모리 할당

4. 및 Param, StartAddr

추가

5. RtlUserThreadStart()

가 호출됨(OS에 의해)

Page 30: 뇌자T   etc.windows multi threading programming

beginthreadex

• 어떤 이유에 의해

Create/ExitThread 대신

begin/endthreadex를 호출해야 합니다.

• 어떤 이유일까요?

Page 31: 뇌자T   etc.windows multi threading programming

스레드 스케쥴링

• 컨텍스트 구조체

– 스레드가 마지막으로 수행되었을 때의 CPU레

지스터들의 정보를 가지고 있다.

– Context Switching

Page 32: 뇌자T   etc.windows multi threading programming

스레드 스케쥴링

• 컨텍스트 전환이 일어나면 Cpu시간을 할당받은 스레드는 프로세스의 주소 공간 내에위치한 코드를 수행하고 데이터를 사용하게 된다.

• 다시 20밀리초가 지나면 윈도우는 CPU레지스터 정보를 스레드의 컨텍스트로 저장하게 되고 스레드는 수행이 정지된다.

Page 33: 뇌자T   etc.windows multi threading programming

스레드의 정지와 계속 수행

• 스레드 커널 오브젝트 내에는 Suspend Count라는 값이 저장되어 있다.

• CreateThread가 불리는 순간 1로 초기화가 되고,

• CreateThread속에서 초기화가 모두 끝났을때,

• CREATE_SUSPENDED플래그만 켜져있지 않다면 정지카운트를 0으로 만들고 스케줄 가능한 상태가 된다.

• CREATE_SUSPENDED플래그가 켜져있었다면, 스케줄 불가능 상태가 된다.

Page 34: 뇌자T   etc.windows multi threading programming

스레드의 정지와 계속 수행

• ResumeThread()

• SuspendThread()

Page 35: 뇌자T   etc.windows multi threading programming

슬리핑

• Sleep()

• 스레드는 함수를 이용하여 일정시간동안

자신을 스케줄하지 않도록 운영체제에게

명령을 내릴수 있다.

Page 36: 뇌자T   etc.windows multi threading programming

다른 스레드로 강제 전환

• SwitchToThread()

Page 37: 뇌자T   etc.windows multi threading programming

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

• 시스템은 다음에 수행할 스레드를 선택할 때 31번 우선순위를 가진스케줄 가능한 스레드들을 선택하고 라운드 로빈 방식으로 이러한 스레드들을 수행한다.– 스레드에 할당된 Time Slice가 끝나면 시스템은 31번 우선순위를 가진

스레드 중 스케줄 가능한 스레드가 있는지 확인하고 있을경우 할당.

– 31번이 스케줄 가능일 경우는 0~30은 절대 CPU를 할당 받을 수 없다. (starvation state가 됨)

– 멀티 스레드일 경우는 31번과 30번이 동시에 돌아갈 수 있기 때문에 발생 빈도가 적은 편.

– CPU는 스케줄 가능한 스레드가 없는 경우에만 유휴 상태가 된다.

Page 38: 뇌자T   etc.windows multi threading programming

스레드 우선순위• 시스템 내의 대부분의 스레드들은 스케줄 불가능 상태를 유지한다.

• 예)– 프로세스의 주 스레드가 GetMessage를 했는데 Message가 없을때 프로세스를 정지시

킴.

– Message가 삽입되는 순간, 시스템은 해당 스레드가 더 이상 정지 상태로 있지 않아야한다는것을 알게 되고, 현재 스레드보다 높은 우선순위의 실행가능 스레드가 없을 때, CPU시간을 할당함.

– 낮은 우선 순위의 스레드가 어떤 작업을 하고 있든지, 높은 우선순위가의 스레드가 스케줄 가능 상태가 되면, 지체없이 높은 우선순위의 스레드에 CPU시간을 할당함.(Time Slice가 남았더라도 포기)

– 제로페이지 스레드• 시스템 전체에서 어떠한 스레드도 스케줄 가능 상태가 아닐때 램의 사용되지 않는 페이지를 0

으로 만들어주는 작업을 수행

• 시스템 전체에서 유일하게 0번 우선순위를 가진 스레드.

Page 39: 뇌자T   etc.windows multi threading programming

스레드 우선순위

• 우선순위 개념

Page 40: 뇌자T   etc.windows multi threading programming

스레드 우선순위

• 우선순위 개념

– 프로세스의 우선순위

• 운영체제 내의 다른 프로그램들과 순위 척도

– 스레드들의 우선순위

• 애플리케이션 내의 스레드들의 상대적 순위 척도

Page 41: 뇌자T   etc.windows multi threading programming

스레드 우선순위

• 높은 우선순위 레벨의 스레드는 오랫동안 스케줄 가능 상태로 남아 있지 않도록 하고,

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

• 전체적인 운영체제의 응답성이 개선된다.

Page 42: 뇌자T   etc.windows multi threading programming

스레드 우선순위

• SetPriorityClass

• SetThreadPriority

• CreateThread함수 호출시 항당 보통 스레드우선순위로 생성한다.

Page 43: 뇌자T   etc.windows multi threading programming

스레드 우선순위

• 동적인 우선순위 레벨 상승– 시스템은 I/O이벤트에 응답이나 디스크를 읽을 때 일시적으로 우선순위

레벨을 상승시킨다.• 프로세스/스레드 우선순위를 토대로 기본 우선순위 값이 정해진다.

• I/O 이벤트가 일어날 경우 일시적으로 우선순위레벨을 증가 시킬 수 있다.

• 1~15에서만 증감이 일어남.

• 기본 우선순위 값 밑으로는 떨어지지 않음

• 동적 변경이 싫다면,– Set/GetProcessPriorityBoost

– Set/GetThreadPriorityBoost

Page 44: 뇌자T   etc.windows multi threading programming

스레드 우선순위

• Foreground Process– 사용자는 당연히 현재 사용중인 프로세스가

BackgroundProcess보다 빨리 응답하길 원할 것이다.

– 그래서 윈도우는 Foreground에게는 일반적인 퀀텀시간보다 좀 더 긴 시간의 퀀텀을 제공할 수 있도록 한다.

– ForegroundProcess가 보통 우선순위 클래스일때만! 적용된다.

Page 45: 뇌자T   etc.windows multi threading programming

스레드 선호도

• 특정 시스템구조를 고려한 기능으로

• 어느 스레드를 어떤 CPU에서 수행할지 제어하는 방법을 제공하는 것

• 예)

– A스레드는 0번 CPU에서만,

– B스레드는 2번 CPU에서만 작동하도록