스레드(Thread)

C#/CLR via 2020. 3. 25. 08:20
반응형

 

 

Thread 클래스 (System.Threading)

 

스레드를 만들고 제어하며, 해당 속성을 설정하고, 상태를 가져옵니다.Creates and controls a thread, s

docs.microsoft.com

 

모든 스레드는 다음에 나열하는 것들을 모두 하나씩 가지고 있다.

l  스레드 커널 객체
고유의 데이터 구조체를 할당하고 초기화
속성 중에는 스레드 컨텍스트(CPU 레지스터들의 값을 저장하는 메모리 블록) 포함

l  스레드 환경 블록(Thread Environment Block, TEB)
유저 모드(응용프로그램이 빠르게 접근할 수 있는 주소 공간)에 할당되고 초기화되는 메모리 블록
1
페이지 크기 4KB
스레드 로컬 저장소(Thread Local Storage, TLS), GDI, OpenGL 과련된 데이터 구조체를 가짐

l  유저 모드 스택
지역 변수와 함수의 매개변수를 저장할 용도로 사용
현재 수행 중 함수가 반환될 때 다음으로 수행할 위치 저장
1MB
할당
스레드가 실제로 더 많은 공간을 필요로 하는 경우 조금씩 나누어 물리적 저장소를 커밋

l  커널 모드 스택
매개변수를 저장해야 할 때.
유저 모드 스택의 내용을 해당 스택으로 복사해 넘겨주는 식(보안상의 이유)
복사 후 커널에서 저장
응용프로그램은 커널 모드 스택에 접근 X
커널 안에ㅐ서 함수 호출 시 매개변수 전달 용도, 함수의 지역 변수 저장, 수행 중 함수가 반환될 때 그 다음으로 수행해야 할 위치 저장
32bit – 12KB, 64bit – 24KB

l  DLL 스레드 attach/detach 통지
DllMain
함수를 DLL_THREAD_ATTACH 플래그 매개변수로 호출(로드)
DllMain
함수를 DLL_THREAD_DETACH 플래그 매개변수로 호출(종료)

컨텍스트 전환(context switch)

주어진 타임 슬라이스(Time-slice(Quantum)) 동안만 수행. 타임 슬라이스가 완료 후 다른 스레드로 컨텍스트 전환

1.      CPU 레지스터 값을 현재 수행 중 스레드 컨텍스트 구조체에 저장

2.      다음 수행할 스레드 선택
OS
는 수행할 코드 및 데이터 접근을 위해 가상 메모리 주소를 확인 및 전환

3.      선택된 스레드의 컨텍스트 구조체 내의 값을 CPU 레지스터로 로드

Window OS 30밀리초마다 컨텍스트 전환 수행

 

스레드가 줄어들수록의 이득

l  RAM이나 캐시메모리에 접근이 줄어들어 성능 향상

l  GC가 덜 일어나 성능 향상

l  되도록 스래드의 개수를 컴퓨터의 CPU수와 일치

스레드 사용 이유

l  응답성
응용프로그램이 무한루프에 빠지더라도 사용자가 다른 응용프로그램 사용

l  성능
CPU
가 각자에게 할당된 스레드를 동시에 수행 병렬 수행

스레드풀

CLR은 고유의 스레드 풀을 관리하는 코드를 가지고 있다. 응용프로그램에서 활용할 수 있는 일련의 스레드의 집합.

1.      CLR 초기화 시점에는 스레드가 존재하지 않음

2.      비동기 작업 수행 호출 시 스레드가 없으면 새로운 스레드 생성

3.      스레드 작업 완료 시 스레드 풀로 반환

4.      특정시간(CLR 마다 다름) 후 스레드풀이 스레드를 깨워 종료시킨다.

실행 컨텍스트(Excution Contexts)

l  보안 설정(압축 스택, 스레드의 Principal 속성, 윈도우 아이덴티티), 호스트 설정, 논리 호출 컨텍스트 데이터 포함

l  다른 스레드(헬퍼 스레드)에게 작업을 일부 부여할 경우 논리 호출 컨텍스트 데이터를 헬퍼스레드에 사용할 수 있다.

협조적 취소 패턴(Cooperative Cancellation)

코드를 이용해서 이 작업을 취소하려면 두 가지 타입을 반드시 사용.

System.Threading.CancellationTokenSource 객체를 생성해야 한다. IsCancellationRequested 속성 확인 해 작업 중단.

+CancellationToken 정적 속성 None을 매개변수로 전달하면 작업을 취소할 수 없게 한다.
+
취소시에는 매개변수로 지연시간 전달, CancelAfter 메서드 호출

 

 

 

태스크(Task)

 

Task 클래스 (System.Threading.Tasks)

 

비동기 작업을 나타냅니다.Represents an asynchronous operation.<

docs.microsoft.com

l  New 생성자로 태스크를 만들고 Start()로 스케줄링한다.

l  Action이나 delegate를 전달하여 수행 메서드를 전달한다.

l  Wait() 함수로 완료 시까지 대기할 수 있다.
수행에 들어가면서 블로킹을 실시하게 되는데 만약 테스크 내부에서 같은 Lock을 원할 경우 데드락이 발생

l  예외 유발 시에는 바로 발생시키지 않고 특정 컬렉션에 예외 저장 후, 스레드가 풀로 반환되도록 한다.

l  ContinueWit – 다른 테스크 이어서 수행

반응형

'C# > CLR via' 카테고리의 다른 글

I/O 중심의 비동기작업  (1) 2020.03.25
LINQ  (0) 2020.03.25
직렬화 serialization  (0) 2020.03.25
어셈블리 로딩과 리플렉션  (0) 2020.03.25
앱도메인  (0) 2020.03.25
Posted by Library of Lotus
,