모든 스레드는 다음에 나열하는 것들을 모두 하나씩 가지고 있다.
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)
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 |