2009-10-16 5 views
9

Multi-core usage, threads, thread-pools의 질문을 따릅니다.코어 사이의 .NET 스레드 이동

스레드가 수명 기간 동안 한 코어에서 다른 코어로 이동 했습니까?

물론. 듀얼 코어 시스템에서 3 개의 스레드가 있다고 가정 해보십시오. 에 정기적으로 스레드를 이동시키지 않는 공정한 일정을 코어 사이에 표시하십시오.

이 사이트에서는 이번이 처음이기 때문에 의견을 말할 수있는 충분한 담당자가 없었습니다. 나는 내가 논평하고 싶었던 것을 참조하는 새로운 질문을하기로 결정했다.

스레드를 이동할 코어를 선택하는 프로세스는 무엇입니까? 그것은 스케줄러가 처리 시간을 필요로하는 스레드 목록을 가지고 있으며, 하나가 끝나면 다른 스레드를 넣는 것과 같습니까?

또한 코어간에 스레드가 이동한다는 진술에 대한 참조가 있는지 궁금합니다. 아니면 그냥 "일반적인 지식"으로 간주됩니까?

감사합니다.

답변

6

스레드가 특정 코어에있는 것처럼 보이지 않으며 을 다른 코어로 이동하는 프로세스가 아닙니다.

운영 체제는 실행 준비가 된 스레드 (및/또는 프로세스) 목록을 가지고 있으며 사용 가능한 코어/CPU가 무엇이든지간에 디스패치합니다. 어떤 스마트 스케줄러가 가능한 한 동일한 코어에 스레드를 예약하려고합니다 말했다

- 간단하게 성능을 향상하기 위해 (데이터가 될 가능성이 높습니다 그 핵심의 캐시 등)

+0

"캐시가 이미이 핵심에 있었기 때문에이 스레드가 스레드를 다시 얻을 확률이 더 높습니다"라는 문제 만 있습니까? 스트롱 (Strong)과 툴센 (Tullsen)에 의한 "코어 간 스레드의 고속 스위칭"을 읽은 후보다 복잡해 보였다. "Constantinou, Sazeides et al.의"칩 멀티 코어에서의 단일 스레드 마이그레이션의 성능 의미 " 캐시 히스토리의 문제인 경우 "모든 스마트 스케줄러"그룹 아래의 Windows 스케줄러가 있습니까? 아니면 스케줄링이 "스마트"하도록주의해야합니까? – mphair

+0

"이 스레드는이 코어에서 실행되었고, CPU 캐시와 같은 이유로 인해이 코어에서 다시 스케줄을 잡으면 더 빨리 실행됩니다"와 비슷합니다. 나는 당신이 인용 할 수있는 논문을 읽지 않았으므로 나는 그것에 대해 논평 할 수 없다. Windows 및 다른 시스템의 스케줄링 알고리즘은 내가 일반화 한 것보다 훨씬 앞선다. 그러나 아이디어는 동일하다. 동일한 코어에서 스레드를 실행하는 것이 더 빠르므로 스케줄러가 스레드를 다시 배치 할 가능성이 큽니다. 그러나 스레드 연관 관계를 수동으로 설정하지 않으면 보장이 없습니다. –

3

MSDN에는 Scheduling PrioritiesMultiple Processors과 같은 몇 가지 항목이 포함되어 있습니다.

발췌 (예약 우선 순위) : 스레드가 예정되어

는 자신의 스케줄링 우선 순위에 따라 실행합니다. 각 스레드 에는 예약 우선 순위가 지정됩니다. 우선 순위 수준은 0에서 (최하위 우선 순위)에서 31 (최고 우선 순위)까지입니다. 제로 페이지 스레드 만 0의 우선 순위를 가질 수 있습니다. 합니다 ( 제로 페이지 스레드가 실행해야 다른 스레드가 없을 때 모든 가능한 페이지 영점 조정을 담당하는 시스템 스레드 입니다.)

시스템은 동일로 같은 우선 순위로 모든 스레드를 처리합니다. 시스템 은 라운드 로빈 방식으로 타임 슬랏을 의 우선 순위를 갖는 모든 스레드에 할당합니다. 이 스레드가 실행 준비가되어 있지 않으면 시스템 은 라운드 타일로 방식으로 시간 슬라 이스를 지정하여 다음 스레드가 모두 이고 우선 순위가 가장 높습니다. 더 높은 우선 순위 스레드를 실행할 수 없게되면 시스템 (그것의 시간 슬라이스를 사용하여 완료 할 수 있도록 않고) 낮은 우선 순위의 스레드를 실행 중지하고 높은 우선 순위에 풀 타임 슬라이스 를 할당 실. 다중 프로세서에

그리고 관해서 :

다중 프로세서는 일반적으로 두 아키텍처 중 하나에 대한 설계 컴퓨터로 : 비 균일 메모리 액세스 (NUMA) 또는 대칭 멀티 프로세싱 (SMP).

NUMA 컴퓨터에서 각 프로세서는 다른 일부보다 메모리 일부에 더 가깝기 때문에 메모리 일부를 다른 부분보다 빠르게 액세스 할 수 있습니다. NUMA 모델에서 시스템은 사용중인 메모리에 가까운 프로세서에서 스레드를 예약하려고 시도합니다. NUMA에 대한 자세한 내용은 NUMA 지원을 참조하십시오.

SMP 컴퓨터에서 두 개 이상의 동일한 프로세서 또는 코어가 단일 공유 주 메모리에 연결됩니다. SMP 모델에서 모든 스레드는 모든 프로세서에 할당 될 수 있습니다. 따라서 SMP 컴퓨터에서 스레드를 예약하는 것은 단일 프로세서로 컴퓨터에서 스레드를 예약하는 것과 유사합니다. 그러나 스케줄러에는 프로세서 풀이 있으므로 스레드가 동시에 실행되도록 예약 할 수 있습니다. 스케줄링은 여전히 ​​스레드 우선 순위에 의해 결정되지만이 항목에서 설명한 스레드 선호도 및 스레드 이상 프로세서를 설정하면 영향을받을 수 있습니다.

+0

그러나 좋은 링크는 실제로 스레드 마이그레이션 문제를 해결하지 못합니다. 스레드를 만들 때 우선 순위 또는 스레드 선호도 또는 스레드 이상적인 프로세서를 변경하면 스레드를 실행할 코어를 선택할 수 있지만 일부 다른 스레드가 해당 코어를 차단하면 어떻게됩니까? 그런 다음 스케줄러가이를 고려하여 내가 만든 스레드를 사용 가능한 코어로 이동합니까? – mphair

1

Windows는 thread affinity (즉,이 스레드를 예약해야하는 CPU를 설정) API를 제공합니다. 스레드가 항상 하나의 코어에서 실행되는 경우 그러한 API가 필요하지 않습니다.

2

인가 그것은 스케줄러가 처리 시간을 필요로하는 스레드 목록을 가지고 있으며 을 하나 완료하면 다른 하나를 넣습니다. ?

거의. 사용자가 설명하는 것은 cooperative multi-tasking이며 스레드는 정기적으로 실행을 다시 스케줄러로 반환해야합니다 (예 : 잠시만 살거나 정기적으로 Thread.Current.Sleep(0)을 호출). 이것은 하나의 악의적 인 비협조적인 스레드가 그러한 시스템에서 CPU를 먹을 수 있기 때문에 최신 소비자 운영 체제가 작동하는 방식이 아닙니다.

대신 일정한 시간 간격으로 context switch이 발생합니다. 실행중인 스레드가 마음에 들거나하지 않더라도 일시 중단됩니다. 여기에는 CPU 레지스터의 상태에 대한 스냅 샷을 메모리에 저장하는 작업이 포함됩니다. 그런 다음 커널의 스케줄러는 실행하고 상황을 다시 평가할 기회를 얻고 잠시 동안 다른 스레드가 실행되도록 결정할 수 있습니다. 이 방법으로 CPU 시간 조각 (밀리 초 또는 그 미만으로 측정 됨)이 다른 스레드에 제공됩니다. 이를 pre-emptive multitasking이라고합니다.

시스템에 둘 이상의 CPU 코어 또는 여러 CPU 코어가있는 경우 각 코어에 대해 동일한 작업이 수행됩니다. 각 코어에서의 실행은 정기적으로 중지되며 스케줄러는 다음 스레드에서 실행할 스레드를 결정합니다. 각 CPU 코어에는 동일한 레지스터가 있기 때문에 스케줄러는 시간 조각을 공평하게 할당하려고 시도하는 동안 코어 사이에서 스레드를 이동할 수 있고 이동할 것입니다.