다중 코어 프로세서에서 여러 스레드를 시작할 때 다른 코어에서 처리되도록 보장됩니까?


24

4 개의 코어가있는 펜티엄 코어 i5 프로세서가 있습니다. C # 콘솔 프로그램에서이 작업을 수행하면

var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();

t1 및 t2 스레드가 별도의 코어에서 실행되도록 보장됩니까?


1
C # 런타임이 동등한 네이티브 시스템 호출을 사용하여 다른 스레드를 생성한다고 가정하면 (정말로 병렬 적입니다. CPython의 악명 높은 Global Interpreter Lock 과 같은 모든 경우에는 해당되지 않습니다 ), 이는 운영 체제의 프로세스 / 작업 스케줄러 에만 의존 합니다. 당신이 가정하는 경우 그러나 일반적으로, 코드는 정말 안전 스레드 t1t2임의의 순서로 서로 다른 시간에 실행됩니다 (예를 들어이 가능합니다 t2시작 전에 t1 일부 모델).
획기적인

2
펜티엄 i5 프로세서가 있다는 것을 몰랐습니다. 어쩌면 Core i5를 의미 했습니까? 까다로운. 알아요 : D
JosephGarrone 1

답변:


18

.Net Thread에서 두 개의 개별 코어에서 두 개의 코어가 실행 된다고 보장 할 수는 없습니다 . 실제로, 하나의 코어 (!)에서만 실행될 것이라고 보장 할 수 없습니다Thread .

관리되는 스레드는 OS 스레드와 동일하지 않기 때문입니다 . 단일 관리 스레드는 여러 OS 스레드를 사용하여이를 지원할 수 있습니다. C #에서, 당신은 오직 관리와 직접 거래 Thread의이 (적어도, P 의지하지 않고 / 당신이 결코해야 WinAPI를 스레딩 기능을 호출하는 호출) .

그러나 .Net 및 Windows 스레드 스케줄러는 수행하는 작업이 매우 뛰어납니다. 단일 코어에서 두 개의 스레드를 실행하지 않고 두 번째 코어는 완전히 유휴 상태입니다. 따라서 일반적으로 걱정할 필요가 없습니다.


실제로, 닷넷 Thread입니다 OS 스레드. 그러나 단일 스레드가 항상 동일한 코어에서 실행될 것이라는 보장이없는 것은 아닙니다.
svick 2016 년

2
@ svick : 실제로 x86 에서는 사실입니다. 그러나 표준에 따르면이 동작에 의존 할 수 없으므로 향후 변경 될 수 있습니다. 실제로 XBox 360과 같은 다른 버전의 .Net CLR에서는 그렇지 않습니다 .
BlueRaja-대니 Pflughoeft

@BlueRaja-질문은 우리가 말하는 CLR의 버전에 관한 것입니다. 비동기 스레드를 사용하여 두 개의 별도 코어에 무언가가 존재한다는 것을 보장 할 수 있습니다. 현재 예제 코드는 기술적으로 동기화 호출입니다. 물론 운영 체제는 사용할 코어를 결정합니다.
Ramhound

@Ramhound "비동기 스레드를 사용하여 두 개의 분리 된 코어에 무언가 존재 함을 보장 할 수 있습니다 . " – 이는 거짓입니다. async키워드 ( "비동기 스레드"나는, 당신이 얘기 가정 무엇 중복) 사용하는 단지 구문 설탕입니다 BackgroundWorker다른 닷넷 스레드처럼 스레드를, - 당신은 그것에서 실행 여부를 보장 할 수 없습니다 별도의 코어 여부.
BlueRaja-대니 Pflughoeft

@BlueRaja-두 개의 비동기 스레드가 시작된 경우 CPU 코어가 2 개인 경우 모두 동시에 실행됩니다. 운영 체제가 하나만있는 경우 운영 체제는 각 스레드가 우선 순위를 받고 실행되는 시간을 예약하며 일반적인 단일 스레드 스 래싱 상황이 발생합니다. 이것이 CPU가 멀티 스레드를 처리하는 방법을 가르쳐 준 방법입니다.
Ramhound

15

아니요, OS와 CPU는 언제 무엇을 실행할 것인지 결정합니다. 간단한 예제에서 다른 작업을 제외하고는 별도의 코어에서 병렬로 실행될 가능성이 높지만 그럴 것이라는 보장은 거의 없습니다.

스레드 선호도 를 사용하여 지정된 스레드에 코어 할당을 제어 할 수 있습니다 .

또한 어떤 스레드가 완전히 병렬이어야하고 어떤 스레드가 대기해야하는지에 따라 데크를 쌓을 우선 순위예약하는 것도 고려하십시오 .


1
또한 가상화 기술을 사용하면 프로그램과 하드웨어 사이에 다른 계층이 있습니다. OS가 응용 프로그램에 제공하는 내용은 물리적으로 정확하지 않을 수 있습니다.
Keltari

1
관리 스레드가 아닌 OS 스레드에 대한 WinAPI 기능입니다. .Net 스레드 스케줄러를 심각하게 방해 할 수 있으므로 C #에서 호출하면 안됩니다.
BlueRaja-대니 Pflughoeft
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.