이 질문에는 이미 답변이 있습니다.
나는 방금 스레드로 작업하기 시작했고, 얼마나 많은 스레드가 너무 많은지에 관한 매우 일반적인 질문에 빨리 다가갔습니다.
몇 가지 조사를 한 후에 나는 더 혼란스러워졌습니다.
태스크
나는 16 개의 코어와 1000 개의 객체를 생성하는 애플리케이션을 가지고 있으며, 일관된 구성 매개 변수에도 불구하고 존재합니다. 1000 개의 스레드를 생성하면 일반적으로 msdn 설명서에 따라 다중 스레드의 성능 이점을 파괴하는 엄청난 오버 헤드가 발생합니다.최대 스레드 수. 또한 3.5 NET 32 비트 제한 (.NET 응용 프로그램의 최대 스레드 수는 얼마입니까?).
질문 1
이와 같은 일방적 인 작업을 수행하면 컴퓨터에 코어보다 많은 스레드를 만들 수 있습니까? .NET은 거기에 최적화되어 있습니까? 내가 사용해야하는 최대 스레드 수는 얼마입니까?
질문 2
제한된 리소스로 큐에 넣는 것 이외에 간단한 솔루션이 있습니까? 내가 모든 1000 개의 스레드를 만들지 만 즉시 스레드를 비활성화하여 기본 스레드 스택을 할당하지 않는 세마포어 같은 것이 있습니까?
예, 운영 체제 스케줄러 (운영 체제 스케줄러)가 코어보다 많은 스레드를 생성 할 수 있습니다.의지활성 스레드 간 스왑 인터럽트,그 핵심을 기다리고있는 사람이 없을지라도. 그러나 1000 개의 별도 스레드를 만들고 싶지는 않습니다. 대신 많은 수의 스레드를 만들고 스레드를 분할하여 각 스레드가 전체 작업에서 하나 이상의 항목을 처리하도록하십시오.
엄지 손가락의 좋은 규칙은 논리적 코어 당 2 개의 스레드 (하이퍼 스레드 코어를 계산합니다 ... 16 개의 논리적 코어에 대해 하이퍼 스레딩이있는 8 코어 CPU가있는 경우 32 스레드 생성)입니다. 아이디어는 가능한 한 적은 스케쥴러 인터럽트 / 컨텍스트 스왑을 원하지만 동시에 모든 코어를 주로 작업에 집중시켜야합니다. 주어진 스케줄러가 인터럽트 됨의지논리적 코어에서 아무 것도 활성화되지 않은 경우에도 해당 코어에 대해 두 개의 활성 스레드가있는 경우 스케줄러가 프로그램에서 유휴 스레드를 넣을 가능성이 높습니다. 그 코어에 대해 다른 것들이 활성화되어 있다고 할지라도, 여전히 실행을 위해 선택된 스레드 일 가능성이 높습니다. 이보다 높게 설정하면 필요한 것보다 컨텍스트 전환을 권장 할 수 있으며 성능이 저하 될 수 있습니다.
짧은 버전은 컨텍스트 스위치가 여전히 발생하기 때문에 코어 당 두 번째 스레드의 비용이 낮지 만 결과는 잠재적으로 높습니다 (전체 스케줄러는 CPU가 다른 작업 대신 앱에서 작동하는 것을 차단합니다). 코어 당 스레드를 추가 할 때 비용이 증가하고 잠재적 인 이점이 줄어 듭니다.
하지만 그건 내 경험 일뿐입니다. 그매우일반화 된 것, 시작점보다 훨씬 좋지는 않습니다. 너 정말 필요해.윤곽앱이 다른 스레드 번호로 어떻게 작동하는지보고 가장 좋은 실적을 내기 위해이를 조정하는 방법에 대한 아이디어를 얻으십시오.
마지막으로 .Net 세계에서ThreadPool
과비동기 작업. 이 주제에 대한 전체 자습서를 읽는 가장 좋은 장소는 아니지만 시간을 들여 읽을 가치가 있습니다.
컴퓨터에 코어보다 많은 스레드를 만들 수 있습니까?
예, 가능합니다.
.NET은 거기에 최적화되어 있습니까? 내가 사용해야하는 최대 스레드 수는 얼마입니까?
실제로 99.99 %의 경우 스레드 수를 고려하지 않아야합니다. 99.99 %의 경우 수동으로 스레드를 생성해서는 안되기 때문입니다. 용도ThreadPool
대신 .NET 3.5에 있어야하는 경우. 용도과제, 버전이 4.0 이상인 경우.
제한된 리소스로 큐에 넣는 것 이외에 간단한 솔루션이 있습니까?
사실, 아니야. 육체적으로 이용 가능한 자원을 뛰어 넘을 수는 없습니다. 이것은 병 목입니다.
기본적으로 새로운 스레드에서 더 많은 성능을 얻습니다. 10 개의 스레드가 1 개의 스레드보다 10 배 빠릅니다. 또한 코어가 실행되는 것보다 많은 스레드가 실행되면 얻을 수없는 코어가 있습니다.무엇이든 의미있는그것에서.
엄지 손가락 규칙은 UI 응답 성을 차단하지 않도록 UI 스레드 대신 백그라운드에서 실행되도록 성능이 무거운 코드에 스레드를 사용하는 것입니다. 이미 UI 블록이 아닌 코드를 최적화하려면 target-machine의 코어 수를보고 많은 스레드를 만들어 무거운 알고리즘을 이해하는 데 도움이 될 수 있습니다. 디버그하는 것이 훨씬 어렵고 멀티 스레드 코드를 유지 관리하고 작성하는 것이 훨씬 더 어렵다는 것을 기억하십시오.
따라서 응용 프로그램에 약간의 추가 전력을 쏟아 붓을 필요가있을 때만 실험하고 배우기 위해 수행하십시오.
답변 1 :그렇습니다. 코어보다 많은 스레드를 만들 수는 있지만, 그것이 0에 가깝습니다.
답변 2 :1000 개의 스레드를 만들어 1000 개의 객체를 만들지 마십시오! 그건 아름다워.