Windows에서 동시에 실행할 수 있는 스레드 수는 몇 개입니까?
다른 질문에 대한 코멘트에서는 "너무 많은" 스레드만 동시에 실행할 수 있다고 합니다. 이는 다른 곳에서 본 적이 있는 개념입니다.
스레드 초보자는 사용할 최대 스레드 수를 어떻게 결정할 수 있습니까?아니면 이것이 "끈 한 개의 길이" 질문입니까?그것은 무엇에 달려 있습니까?하드웨어 구성인가요?
(MS Visual Studio의 VB에서 사용).Net 3.5(중요한 경우)
업데이트: 많은 스레드(또는 작업)를 제안할 수 있는 소프트웨어 도구를 알고 있는 사람이 있습니까? 아니면 처리량이 떨어질 때까지 계속해서 다른 숫자를 시도하는 나만의 도구를 코딩해야 합니까?
[Upperdate] 거의 7년이 지난 지금 소프트웨어 추천 사이트가 있어서 이를 도와줄 툴이 있는지 문의했습니다.
이론적인 컴퓨터가 아닌 물리적인 컴퓨터를 사용하는 경우 하드웨어에 따라 다르므로 리소스가 제한됩니다.
읽기: Windows에는 프로세스당 스레드 수가 2000개로 제한됩니까?
또한 하드웨어에 따라 5000개 이상의 스레드를 실행할 수 있더라도 10개의 스레드에 해당하는 프로그램보다 훨씬 느리게 실행될 수 있습니다.저는 당신이 스레드 풀링을 살펴봐야 한다고 생각합니다.
일반적으로 실제로 동시에 실행되는 스레드의 수는 CPU 및 CPU 코어(하이퍼스레딩 포함)의 수에 따라 결정됩니다.즉, (운영 체제에서) 실행 중인 스레드의 수는 언제든지 "코어"의 수와 같습니다.
앱에서 동시에 실행할 수 있는 스레드 수는 많은 요인에 따라 달라집니다.가장 좋은 (레이먼의) 숫자는 기계의 코어 수이지만, 물론 다른 애플리케이션이 존재하지 않는 것처럼 가장하는 것과 같습니다.
솔직히, .NET/Windows의 멀티 스레드에 대해 훨씬 더 많은 연구를 해야 한다고 생각합니다. 왜냐하면 사람들은 제대로 이해하지 못했을 때 득보다 실이 많을 수 있기 때문입니다.NET에는 스레드 풀의 개념이 있으며 윈도우즈 외에도 이 풀이 어떻게 작동하는지 알아야 합니다.
.NET 3.5/4.0에서는 작업(작업 병렬 라이브러리)을 살펴보아야 합니다. 라이브러리가 생성할 스레드 수를 훨씬 더 잘 결정하기 때문입니다.TPL을 사용하면 스레드 풀이 크게 개선되고 스레드 생성 및 작업 도용 등에 대해 훨씬 현명해집니다.그러나 일반적으로 스레드가 아닌 태스크로 작업합니다.
이것은 복잡한 영역이며 그 결과 .NET 프레임워크는 스레드에서 프로그래머를 추상화하기 위해 Tasks를 도입하여 프로그래머가 원하는 것을 말하는 동안 런타임이 똑똑해질 수 있도록 했습니다.
집중적인 작업을 실행할 때는 물리적 코어 수와 동일한 수를 실행하는 것이 중요합니다.
예, 더 많은 작업을 실행할 수 있지만 리소스(또는 스레드 풀의 스레드)를 대기하게 되며 크기에 관계없이 백그라운드/기타 프로세스로 인해 모든 CPU 코어 리소스를 스레드에 100% 할당할 수 없습니다.따라서 많은 작업을 인스턴스화할수록 실제 가능한 동시 스레드(코어당 1개)를 능가하는 스레드가 생성되므로 리소스 관리, 큐잉 및 스왑이 더 많이 발생합니다.
추가 작업을 시작하기 위해 바이러스 패턴을 사용하여 현재 작업 중인 곳에서 수행한 테스트에서 최적의 CPU 수는 상한선에 거의 근접했습니다.물리적 코어 수와 1:1 비율로 시작된 작업은 완료하기 위해 작업당 약 1분에 실행되었습니다.CPU 수를 두 배로 설정하면 작업 시간이 평균 1분에서 완료되는 데 약 5분이 소요됩니다.코어 수를 초과하여 시작된 작업이 많을수록 기하학적으로 느려집니다.
예를 들어 물리적 코어가 8개인 경우 8개의 작업(및 TPL을 사용하는 경우에는 활성 프로세스에서 기본적으로 8개의 동시 스레드)이 가장 빨라야 합니다.다른 작업과 다른 백그라운드 프로세스를 생성하는 주요 스레드 또는 프로세스가 있지만, 리소스 활용을 위해 상자가 상당히 격리되어 있다면 이러한 프로세스는 상당히 미미할 것입니다.
큐 또는 목록에서 작업을 잘라낼 때 코어 수를 기준으로 작업 캡을 프로그래밍하면 다른 크기의 상자에 응용 프로그램을 배포할 때 자동으로 조정됩니다.
프로그래밍 방식으로 이를 결정하기 위해 다음을 사용합니다.
var CoreCount = System.Environment.ProcessorCount / 2;
왜 2로 나누냐고요?거의 모든 최신 프로세서가 논리 코어 또는 하이퍼스레딩을 사용하기 때문입니다.자체 테스트를 통해 논리 개수를 사용하면 작업당 전체 속도가 크게 저하되어 전체 프로세스가 크게 저하된다는 것을 확인해야 합니다.물리적 코어가 핵심입니다.물리적 솔루션과 논리적 솔루션을 빠르게 찾을 수 있는 방법은 없었지만, 당사의 박스를 빠르게 조사한 결과 이는 일관되게 사실로 나타났습니다.YMMV, 하지만 이것은 당신을 꽤 빠르게 할 수 있습니다.
각 스레드는 더 많은 메모리(커널 스택, 스레드 환경 블록, 스레드-로컬, 스택...)를 소비합니다. AFAIK에는 윈도우즈에 명시적인 제한이 없으므로 제약 조건은 메모리(아마도 각 스레드에 대한 스택)가 됩니다.
Linux에서 스레드는 (공유 메모리가 있는) 프로세스와 비슷하며 다음과 같은 제약을 받습니다.
cat /proc/sys/kernel/threads-max
CPU와 메모리가 주요 제한 요소입니다(OS 제한이 있을 수 있지만).
.NET과 관련하여 스레드 풀 구성도 실행됩니다.
제 경험에 따르면 CPU 바인딩 프로세스의 성능을 향상시키기 위해 스레드를 사용하는 경우 하이퍼스레딩 시스템의 경우를 제외하고 코어와 동일한 수의 스레드를 사용하는 것이 좋습니다.결론을 내릴 수 있는 또 다른 경험칙은 I/O 바인딩 프로세스에 대한 것입니다.이 규칙은 코어당 스레드 수를 4배로 늘리는 것입니다. 하이퍼스레딩 시스템의 경우를 제외하고 코어당 스레드 수를 4배로 늘릴 수 있습니다.
CPU 버저가 꺼지기 전에 EVGA의 CPU 버너를 사용하여 현재 사용 중인 이전 CPU에서 한 번에 4개의 스레드를 실행할 수 있었습니다(2005년). 즉, 90*c 이상을 기록했습니다.한 번에 작동하는 데이터 스레드에 대해 이야기하고 있습니다. 한 번에 여러 프로그램을 여는 것이 좋은 예입니다.그러나 전반적으로 CPU가 멀티태스킹을 얼마나 잘 처리하느냐에 달려 있습니다.(즉, 많은 활성 스레드를 처리할 수 있음) 안전한 테스트 방법은 "ocscanner(EVGA 기준)" 및 "CPU 온도계"를 다운로드하는 것입니다. 테스트하는 동안 온도가 90*c(또는 안전하다고 느끼는 온도) 이상으로 올라가지 않도록 하고 현재 실행 중인 CPU를 던진 스레드 수를 확인하십시오.2개의 스레드에서 시작하여 CPU 온도를 보면서 3-5분간 기다린 후 다른 스레드를 추가하고 반복합니다.(운을 추구하지 마!))(CPU 온도계가 사용자의 온도를 감지할 수 없는 경우 시도하지 마십시오!!!)
언급URL : https://stackoverflow.com/questions/4828296/how-many-threads-can-i-run-concurrently-on-windows
'programing' 카테고리의 다른 글
스키마 유효성 검사에 실패하고 다음 오류가 발생했습니다. 데이터 경로 ".builders['app-shell']"에는 필수 속성 'class'가 있어야 합니다. (0) | 2023.06.07 |
---|---|
C에서 ((c) + 1)의 유형은 무엇입니까? (0) | 2023.06.07 |
SQL에서 인덱스란 무엇입니까? (0) | 2023.06.02 |
용량이 아닌 특정 크기로 목록을 초기화하는 방법 (0) | 2023.06.02 |
루비에서 지도와 수집의 차이점은 무엇입니까? (0) | 2023.06.02 |