멀티 코어 프로세서에서 여러 스레드를 시작하면 다른 코어에서 처리된다는 것이 보장됩니까?

멀티 코어 프로세서에서 여러 스레드를 시작하면 다른 코어에서 처리된다는 것이 보장됩니까?

나는 4개의 코어를 가진 Pentium 코어 i5 프로세서를 가지고 있습니다. C# 콘솔 프로그램에서 이 작업을 수행하면

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

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

답변1

Thread.Net에서는 두 개의 s가 두 개의 개별 코어에서 실행된다는 것을 보장할 수 없습니다 . 사실은,Thread또한 하나의 코어에서만 실행된다는 보장도 없습니다 (!).

이 때문입니다관리되는 스레드는 OS 스레드와 동일하지 않습니다.- 단일 관리 스레드는 이를 지원하기 위해 여러 OS 스레드를 사용할 수 있습니다. C#에서는 관리되는 Threads 만 직접 처리합니다.(적어도 절대 수행해서는 안되는 WinAPI 스레딩 기능을 호출하기 위해 p/invoke를 사용하지 않고).

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

답변2

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

당신은 사용할 수 있습니다스레드 선호도주어진 스레드에 대한 코어 할당을 어느 정도 제어하려고 시도합니다.

또한 고려일정 우선순위어떤 스레드가 완전히 평행해야 하고 어떤 스레드가 대기할 수 있는지에 따라 데크를 쌓습니다.

관련 정보