2015-01-20 2 views
0

예를 들어 1 C# 스레드가 1 CPU 스레드를 사용하면 궁금합니다 :1 C# 스레드 1 CPU 스레드입니까?

8 스레드 t.ex : 4790k의 CPU가 있고 2 개의 새로운 C# 스레드를 시작하면 2 개의 스레드를 잃게됩니까? 8 - 2 = 6?

+1

아니요, CPU 스레드는 "한 번에"수백 또는 수천 개의 소프트웨어 스레드를 실행합니다. –

답변

1

스레드는 코어가 아닙니다. 당신이 준 경우, 당신의 컴퓨터는 쓰레드를 처리 할 수있는 8 개의 코어 (물리적 4 개와 논리적 4 개)를 가지고 있습니다. 컴퓨터는 수백 개의 스레드를 동시에 처리하고 그 사이를 매우 빠르게 전환합니다. C# 응용 프로그램에서 Thread 클래스를 만들면 CPU의 코어에서 실행될 새 스레드가 만들어집니다. 더 많은 코어를 보유할수록 더 많은 스레드를 한 번에 처리 할 수 ​​있기 때문에 컴퓨터가 더 빠르게 작동합니다. 컴퓨터의 속도와 다른 코어를 가지고있을 수 있습니다.

+7

"더 많은 코어를 보유할수록 더 많은 스레드를 한 번에 처리 할 수 ​​있으므로 컴퓨터가 더 빨리 실행됩니다." 그 진술에 매우 조심하십시오. – Euphoric

+0

또한 여러 스레드에서 동시에 쓰거나 변경하기 위해 변수 나 개체를 공유하지 않으면 예상 한 결과를 얻지 못할 수도 있습니다. 예 변수 또는 개체의 읽기 또는 검사에 사용할 수 있습니다. –

1

가상 컴퓨터 (CLR)는 내가 올바르게 호출하면 원하는대로 자유롭게 수행 할 수 있습니다. 예를 들어 녹색 스레드라고하는 구현이 있으며 관리되는 스레드를 반드시 원시 스레드로 매핑하지는 않습니다. 물론 데스크톱 x86의 .NET에서는 실제로 시스템 스레드에 매핑하기가 어렵습니다.
이제는 하나의 계층이지만 여전히 CPU에 대해서는 아무 것도 말하지 않고 OS 스케줄러는 하드웨어 스레드 (하이퍼 스레딩 때문에 가상화 됨)가 OK를 결정할 때 네이티브 스레드를 실행하게합니다. 너무 많은 네이티브 스레드가 (OS의 스케줄러 ready queue에 있음) 실행하려고하는 오버 커밋을 알고 있지만, CPU에는 사용할 스레드 수가 많기 때문에 대기 할 때까지 대기합니다. 가중치 OS 스케줄러의 내부 척도 인이 스케줄러는 자신의 차례를 결정합니다.
당신은 더 많은 정보를 원하시면이 문서를 확인할 수 있습니다 https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt

그런 다음 CLR, 어쩌면이 질문에 대한 같은 : 토론에 참 https://social.msdn.microsoft.com/Forums/vstudio/en-US/e8cb1585-f6b9-424e-a41f-b3ae02d7f398/how-managed-thread-works-and-exists-on-native-platform-?forum=csharpgeneral

유용한 MSDN 페이지 링크 :
http://msdn.microsoft.com/en-us/library/74169f59(v=vs.110).aspx

설명 :

운영 체제 ThreadId는 관리되는와는 고정 된 관계가 없습니다. 관리되지 않는 호스트가 관리되는 스레드와 관리되지 않는 스레드 간의 관계를 제어 할 수 있기 때문에 스레드가이됩니다. 특히 정교한 호스트 은 파이버 API를 사용하여 동일한 운영 체제 스레드에 대해 많은 관리 스레드를 예약하거나 관리되는 스레드를 다른 운영 체제 스레드로 이동시킬 수 있습니다.

매우 흥미로운 이유로. 하나는 가상 머신 구현의 자유입니다. 그러나 또 다른 하나는이 페이지에서 설명한대로 유연성이 뛰어난 기본/관리 된 장벽을 통과 할 수있는 자유입니다. 특히 네이티브 스레드가 관리되는 appdomains BACKWARDS에 들어가고 가상 컴퓨터가 관리되는 스레드 개체를 자동으로 할당하는 것을 볼 수 있습니다. 이 관리는 스레드 ID 해시를 사용하여 유지 관리됩니다. 미친 것들 :

편집 : 실제로 우리는이 페이지에서 볼 수 있습니다 : CLR을 구성 할 스레드 API 매핑을 가지고
http://msdn.microsoft.com/en-us/magazine/cc163567.aspx#S3
합니다. 꽤 유연하고, 그게 실제로 당신이 수 없습니다 1C# 스레드 == 1 네이티브 스레드를 확실히 말할 수 없습니다.

0

@ JRLambert가 이미 접했기 때문에 동일한 코어에서 많은 스레드가 실행될 수 있습니다.

.NET 응용 프로그램에서 새 스레드를 생성 할 때 실제로 다중 "작업"이 아닙니다. 무슨 일이 일어나는지는 시간을 쪼개는 것입니다. CPU가 끊임없이 다른 스레드간에 전환하여 병렬로 작업하는 것처럼 보이게합니다. 그러나 코어는 주어진 시간에 단일 스레드에서만 작동 할 수 있습니다.

예를 들어 TPL (Task Parallel Library)을 구현할 때 시스템에 여러 코어가있는 경우 새 스레드를 생성 할 때보 다 코어의 작업로드가 균등하게 분산됩니다. 마이크로 소프트는 TPL을 사용하여 과거에 스레드 풀 및 동기화 프리미티브로 많은 노력을 기울이지 않고도 멀티 스레드 비동기 환경을 단순화하기 위해 환상적인 작업을 수행했습니다.

youtube video을 살펴 보겠습니다. 그는 타임 슬라이싱 대 멀티 태스킹을 아주 잘 설명합니다.

아직 TPL에 익숙하지 않은 경우 Sacha Barber는 CodeProject에 환상적인 시리즈를 제공합니다.