C#

C# 병렬화와 비동기 패턴

_dev_mu ㅣ 2023. 1. 9. 23:01

Thread : 스레드

Thread는 CPU의 가상화를 의미합니다.
Thread의 비용은 프로세스보다 가볍지만 매우 무거운 자원입니다.
공간 비용
- Thread Karnel Object (x86:700B, x64:1240B, ARM:350B)
- Thread Environment Block (4K) (메모리 블럭)
- User Mode stack(1M)
- Kernel Mode stack (32bits OS : 12KB, 64bits OS : 24KB) 

즉, 대략 1053KB 남짓 즉, 쓰레드 하나당 1MB가 사용됩니다.
시간 비용
- DLL Thread attach/detach notification
- Context Switching (스레드가 많아지면 Context Switching이 잦게 일어날 수 있습니다.)

→ 컴퓨터에서 가장 효과적인 스레드 개수는 몇개이냐의 답은 CPU 개수 만큼의 Working Thread를 만드는 것입니다.

DLL이 많으면 많을 수록, 스레드가 많으면 많을 수록 쓰레드가 새로 생성되면 DLL은 쓰레드를 위한 공간을 만듭니다.
쓰레드는 DLL을 순회탐색을 하게됩니다.
즉, DLL이 많으면 많을 수록 쓰레드가 많으면 많을 수록 시간비용이 상승합니다.
ex) C Runtime Library
⚠️ 스레드를 많이 사용하지만, 정작 CPU 사용률은 0%인 경우가 있다.

⚠️ 명시적으로 쓰레드를 생성하는 것은 좋지 않다.
예외
- 보통 스레드 우선 순위가 아닌 스레드가 필요한 경우.
- 포그라운드 스레드처럼 동작하는 스레드가 필요한 경우
- 계산 중심의 작업이 상당히 오랫동안 수행되어야 하는 경우.

⚠️ 가능한 Thread class를 이용하여 명시적으로 스레드를 생성하는 것은 좋지 않다.

여러 스레드를 사용하는 이유

응답성의 개선

1. 클라이언트 측 UI Application
2. 작업 스레드의 개수는 늘어나지만, 응답성이 개선되므로 전체적으로 좀 더 나은 응용 프로그램으로 판단됩니다.
성능

1. 클라이언트, 서버 측 Application.
2. 다중 CPU에 한해서 성능 개성.
스레드를 가장 잘 활용하는 방법은 스레드 풀을 이용하고 비동기로 작업을 수행하는 것입니다.

'C#' 카테고리의 다른 글

C# Type Conversion : 형변환  (0) 2023.01.10
C# Memory : 메모리  (0) 2023.01.10
반복문 : for, foreach, do 및 while  (0) 2023.01.09
if문 - switch문  (0) 2023.01.09
C# Operator_4 : 비교 연산자  (0) 2023.01.09