2011-01-28 6 views
16

another of my questions에 대한 의견은 내가 "너무 많은"스레드를 동시에 실행할 수 있다고 말한다. 나는 다른 곳에서 본 개념을 concurretnly로만 실행할 수있다.몇 개의 스레드를 동시에 실행할 수 있습니까?

스레딩 초보자로서 사용할 최대 스레드 수를 어떻게 결정합니까? 아니면 "문자열의 길이가 얼마나 걸리 나"라는 질문입니까? 그것은 무엇에 달려 있습니까? 하드웨어 구성 또는 무엇?

(그 중요한 경우 닷넷 3.5과 MS Visual Studio에서 VB)


업데이트 : 스레드 (또는 작업)의 숫자를 제안 할 수있는 도구 w 임의의 인식 사람이 /, 또는 처리량이 떨어질 때까지 다른 숫자를 계속 사용하는 코드를 작성해야합니까? 이에 도움이되는 도구가있는 경우


[Upperdate] 거의 나중에 7 년 & 우리는 지금 askeda software recommendations site를, 그래서.

+2

스레드는 무엇을하고 있습니까? –

+1

+1 좋은 질문입니다. 그들은 각각 하나의 SOAP 호출을 만들어 soem 데이터를 전송하고 반환 할 때까지 기다립니다. – Mawg

+1

"return"은 asynch이므로 물론 기다리지 않습니다. 다른 스레드는 SOAP 요청 (fcuntion 호출)이 HTTP를 통해 전송되는 즉시 실행할 수 있습니다. – Mawg

답변

9

이론적 인 컴퓨터를 사용하지 않고 실제 하드웨어를 사용하지 않으므로 하드웨어에 따라 다르므로 리소스가 제한적입니다.

읽기 : 당신이 5000 개 스레드를 실행할 수 있습니다 경우에도 Does Windows have a limit of 2000 threads per process?

또한, 하드웨어에 따라, 즉 10 스레드 상응하는 프로그램보다 훨씬 느리게 실행할 수 있습니다. 나는 thread pooling을 봐야한다고 생각합니다.

+1

+1 감사합니다. 그것은 저를 이해하고 이해하려고 시도하는 어떤 일을합니다. 많은 스레드를 제안 할 수있는 s/w 도구를 알고 있습니까? – Mawg

+2

CPU 코어 당 하나의 스레드를 사용하는 것이 현명한 선택이지만, 실제로 해결하려는 문제에 달려 있다고 생각합니다. – Trinidad

+1

+1 코어 당 하나의 장치로 수백 개의 장치를 시뮬레이트하기가 어려울 것입니다. – Mawg

2

이것은 컴퓨터에 크게 의존합니다 - CPU와 메모리가 주요 제한 요소입니다 (OS 제한이 들어올 수도 있음).

.NET과 관련하여 thread pool 구성도 적용됩니다.

+0

+1 피드백에 감사드립니다. – Mawg

8

일반적으로 실행되는 스레드 수는 실제로 CPU의 수와 하이퍼 스레딩을 포함한 CPU 코어 수에 따라 결정됩니다. 즉, 주어진 시간에 (운영 체제에서) 실행중인 스레드의 수가 "코어"의 수와 같습니다.

앱에서 동시에 실행할 수있는 스레드의 수는 많은 요인에 따라 다릅니다. 가장 좋은 (평신도의) 숫자는 기계의 코어 수이지만 다른 사람이없는 것처럼 가장하는 것입니다. :).

솔직히 말해서 .NET/Windows에서 멀티 스레딩에 대한 더 많은 연구를 해야겠다. 왜냐하면 사람이 정말로 확실한 이해를하지 못하면 좋은 것보다 "손상"을 많이하는 경향이 있기 때문입니다. .NET에는 스레드 풀이라는 개념이 있으며 Windows 이외에 어떻게 작동하는지 알아야합니다.

.NET 3.5/4.0에서는 라이브러리가 스폰 할 스레드 수를 결정하는 훨씬 더 나은 작업을 수행하므로 작업 (Task Parallel Library)을 확인해야합니다. TPL을 사용하면 스레드 풀이 중요한 정밀 검사를 수행하고 스레드 생성 및 작업 도용에 대해 훨씬 더 똑똑합니다.하지만 일반적으로 스레드가 아닌 작업으로 작업합니다.

이것은 복잡한 영역이므로 결과적으로 .NET Framework에서 Tasks를 도입하여 프로그래머가 스레드에서 추상화 할 수있게하여 프로그래머가 원하는 것을 말하면서 런타임에 대해 현명한 시간을 허용합니다. 그것을하는 방법.

+1

+1 그래, 나는 내가 좋은 것보다 더 많은 피해를 줄 우려가있다. 또한 작업을 살펴볼 것입니다. 감사합니다. – Mawg

+2

"동시성"과 "병렬성"(즉, "동시 적"이라고도 함)이라는 용어를 구별하는 것이 유용합니다. – skaffman

+0

+1 좋은 지적, 덕분에 – Mawg

7

각 스레드는 더 많은 메모리 (커널 스택, 스레드 환경 블록, 스레드 로컬, 스택 ....)를 소비합니다.AFAIK Windows에는 명시적인 제한이 없으므로 제한 사항은 메모리 (아마도 각 스레드의 스택)가됩니다. 리눅스 스레드에서

더 (공유 메모리) 프로세스처럼 당신을 제약하고 있습니다 :

cat /proc/sys/kernel/threads-max 
+0

+ tahnks 정보에 대한 – Mawg

+0

굉장한 답장, +1 명령 행 힌트에 대한 – ShellFish

0

나는 EVGA의 CPU를 사용하여 내 현재 기존 CPU (2005)에 한 번에 4 개 스레드를 실행 할 수 있었다 내 CPU 버저가 울리기 전에 버너가 켜짐 (BIOS 프로그램 내 프로그래밍 됨) 의미 i가 90을 초과 함 * c. 한 번에 모든 데이터 스레드가 작동한다는 것을 염두에 두십시오. 좋은 예는 한 번에 여러 프로그램을 열어 놓는 것입니다. 그러나 전반적으로 전반적으로 CPU가 멀티 태스킹으로 얼마나 좋은지에 달려 있습니다. (즉, 많은 활성 스레드를 처리 할 수 ​​있습니다) 테스트하는 안전한 방법은 "ocscanner (By EVGA)"및 "CPU 온도계"를 OC 스캐너 내부에서 CPU 버너를 사용하는 것입니다 테스트하는 동안 온도가 90 * c (또는 안전하다고 느끼는 온도)를 확인하고 현재 실행중인 스레드 수를 확인하여 CPU를 폐기하십시오. 2 스레드에서 시작, CPU 온도를 보면서 3-5 분 기다린 후 다른 스레드를 추가하고 반복하십시오. (당신의 운을 푸십시오!) (CPU 온도계가 온도를 감지 할 수 없다면 시도하지 마십시오 !!!)

3

집중적 인 작업을 실행할 때 엄지 손가락의 규칙은 실제 코어와 동일한 숫자를 실행하는 것입니다 카운트.

예, 더 많은 작업을 실행할 수 있지만 크기에 관계없이 모든 CPU 코어 리소스를 100 % 할당 할 수없는 리소스 나 스레드 풀의 스레드와 상자를 기다립니다. 배경/기타 프로세스로 인한 스레드 그래서 당신이 인스턴스화하는 작업이 많을수록, 가능한 실제 동시 스레드 (코어 당 1 개)를 초과 할 때 더 많은 스레드를 생성할수록 더 많은 자원 관리, 대기열 및 스와핑이 발생합니다.

바이러스 성 패턴을 사용하여 추가 작업을 시작하여 최적으로 CPU 뚜껑을 닫을 수있는 것으로 나타났습니다. 실제 코어 수와 일대일 비율로 시작된 작업은 완료 할 작업 당 약 1 분에 실행되었습니다. CPU 수를 두 배로 설정하면 작업 시간은 평균 1 분에서 완료까지 평균 5 분 정도 소요됩니다. 코어 수가 과거에 시작된 작업이 많을수록 기하학적으로 느려집니다.

예를 들어, 8 개의 물리적 코어가있는 경우 8 개의 작업 (그리고 TPL을 사용하면 활성 프로세스에서 본질적으로 8 개의 동시 스레드)이 가장 빠릅니다. 다른 작업과 다른 백그라운드 프로세스를 만드는 주 스레드 또는 프로세스가 있지만 리소스 추출 기쁨을 위해 상자가 꽤 격리되어 있으면 상당히 작습니다.

다른 대기열 상자에 응용 프로그램을 배포 할 때 대기열이나 목록에서 작업을 씹을 때 코어 수를 기반으로 작업 뚜껑을 프로그래밍하는 것이 좋습니다. 자동으로 조정됩니다.

, 우리는 왜 두 가지로 나누어, 당신이 물어

var CoreCount = System.Environment.ProcessorCount/2;

를 사용하여 프로그래밍 방식을 확인하려면? 거의 모든 최신 프로세서가 논리 코어 또는 하이퍼 스레딩을 사용하기 때문입니다. 논리 카운트를 사용하면 작업 당 전체 속도와 전체 프로세스가 크게 저하된다는 것을 자체 테스트를 통해 확인해야합니다. 물리적 코어가 핵심입니다. 논리적 인 물리적 대 논리적 인 것을 빨리 발견 할 수는 없었지만, 우리의 상자에 대한 빠른 조사는 이것이 사실이라는 것을 발견했습니다. YMMV,하지만 이것은 꽤 빨리 꽤 빨라질 수 있습니다.

1

내 경험에 비추어 볼 때, CPU를 사용하는 프로세스의 성능 향상을위한 좋은 경험 법칙은 하이퍼 스레드 시스템의 경우를 제외하고 코어와 동일한 수의 스레드를 사용하는 것입니다. 두 배의 코어를 사용하십시오. 결론적으로 볼 수있는 다른 규칙은 I/O 바인딩 프로세스입니다.이 규칙은 하이퍼 스레드 시스템의 경우를 제외하고는 코어 당 스레드 수를 4 배로 늘린 다음 코어 당 스레드 수를 4 배로 늘릴 수 있습니다.

+0

Lolx - 내가 처음 게시했을 때, 멀티 코어 CPU와 같은 그런 건 없었다 :-) 조언 주셔서 감사합니다 +1 – Mawg

관련 문제