왜 단일 스레드가 CPU에 퍼져 있습니까? OS는 다르게 작동합니까? 심층적

스케줄러가 CPU를 유지하지 않고 CPU간에 지속적으로 앱을 이동하는 이유가 궁금합니다. 100 %에서 1 개가 아닌 25 %에서 4 개의 코어를 갖는 것은 약간 어리석은 것처럼 보입니다.

그것은 열과 관련이 있습니까, 아니면 어떻게 든 더 효율적입니까? 다른 OS는 다르게 작동합니까?

심층적 인 내용에 대한 통찰력이나 링크가 좋을 것입니다. (내 자신을 많이 찾을 수 없습니다.)

최신 정보:

“확산”이라는 말은 한 번에 여러 CPU에서 실행되는 것이 아니라 초당 여러 번 다른 CPU로 이동하여 확산되는 것처럼 보이는 효과를 의미합니다.



답변

나는 wierob그 요점을 상당히 잘 묘사 했다고 생각 합니다.
여기입니다 오래된 기사 논의 processor affinity쿼드 코어로 설정을 QX6800은 .
링크는 해당 기사의 두 번째 페이지를 가리 킵니다.

프로세스 선호도를 코어에 강요하지 않으면 성능이 저하 됩니까?

  • Windows 스케줄러 는 캐시와
    의 스 래싱을 피하기 위해 이러한 선호도를 결정해야 하지만 프로세서 설계 자체도 그러한 사항을 고려합니다.
  • 인텔 QX6800 쿼드 코어 (이 답변의 앞부분에서 언급 했으므로)
    에는 4 개의 코어에서 8MB L3캐시가 공유 됩니다.

시스템에서이 하나의 단일 스레드 프로세스 만 실행하도록 선택했을 수 있지만 OS 자체에는 몇 가지 다른 작업이 실행 중이며 예약해야합니다. 스케줄러는 사용 가능한 프로세서 풀 (또는 코어)에서이 모든 활동의 균형을 유지합니다.


앞으로 Nehalem 아키텍처와 NUMA를 사용 하면
여러 소켓의 프로세서 가 액세스 스 래시를 더 잘 해결할 수 있습니다.
다음은 NUMAArsTechnica 페이지에서 가져온 빠른 그림입니다 .

네 할렘이 i7당신에게 관심이 있다면 , 이 답변에 더 많은 링크가 있습니다.


답변

스케줄러는 “무료”코어 / CPU에서 실행할 준비가 된 다음 스레드를 실행합니다.

Windows 작업 관리자를 통해 프로세스를 특정 CPU에 할당 할 수 있습니다.

25 %에 4 개의 코어가 있다는 것은 4 개의 스레드가 동시에 실행됨을 의미합니다. 반면 x %의 코어 하나는 스레드가 하나만 실행됨을 의미합니다. 따라서 어떤 경우에는 전자가 더 효율적입니다.

그러나 실행 중에 CPU 캐시는 스레드가 액세스하는 데이터로 채워집니다. 따라서 스레드가 다른 CPU에서 실행되면 더 많은 캐시 누락이 발생하며 데이터가이 CPU의 캐시에 없기 때문에 비용이 많이 듭니다.

스레드는 무엇을합니까? 스레드가 매우 짧은 시간 동안 “휴면”되면 이전에 실행 된 코어가 다른 위협에 의해 점유되어 스레드가 다음 사용 가능한 코어에서 실행됩니다. 프로세스에서 사용할 코어를 하나만 지정하면 어떻게됩니까 (예 : 작업 관리자)?


답변

그렇지 않습니다. 하나의 스레드는 하나의 프로세서에서만 실행할 수 있습니다. 그러나 일부 프로세스 에는 여러 스레드가 있으며이 스레드는 확장 될 수 있습니다.

추론, 믿거 나 말거나, 그것이 어떻게 보이는지 고려하지 마십시오. 시스템은 언제 스파이크 할 것인지 알 수 없기 때문에 스레드를 분산 시키려고합니다.


답변

OS는 CPU 코어에서 스레드를 빠르게 마이그레이션합니다 (초당 몇 번). 항상 동일한 코어에서 실행하는 것이 더 효율적입니다. 이 작업은 작업 관리자의 “호환 설정”상황에 맞는 메뉴 항목으로 시행 할 수 있습니다.

일반적으로 (일반적인 가정용) 차이는 몇 퍼센트 범위에 있습니다.

“25 % 사용량으로 각각 4 개의 코어”는 작업 관리자가 평균 사용량을 보여 주듯이 각 코어가 1/4의 시간을 완전히 활용하고 나머지 시간을 비운다는 것을 의미합니다.

설명은 Windows 용이지만 다른 운영 체제에서도 유사합니다.


답변

누군가가 여전히 이것을 읽고 있다면, 나는 이것도 알아 차렸고 그것이 단지 우연이 아닌지 확인하기 위해 몇 가지 테스트를 수행했습니다. 그렇지 않다는 것이 밝혀졌습니다! 여러 가지 이유로 단일 스레드를 모든 코어에 분산시키는 것이 더 효율적이라고 생각합니다.

  1. 모든 코어에 하나의 스레드를 펼치면 전력 소비가 줄어 듭니다. 대부분의 프로세서는 부하에 따라 주파수와 더 중요한 전압을 낮추므로, 예를 들어 Core 2 Quad는 하나의 코어를 사용하지 않고 4 개의 코어 전체에 하나의 스레드를 분산시켜 훨씬 적은 전력을 소비하고 적은 열을 생성합니다. 단 하나의 전압 레귤레이터 * 만 있기 때문에 모든 코어에서 전압이 증가하게됩니다.
  2. 스레드가 항상 최대 / 일정한 속도로 실행되도록합니다. 스레드가 갑자기 더 많은 처리 성능을 요구하면 하나의 코어가 오버로드되어 실행이 지연 될 수 있습니다. 코어 전체에 퍼지게함으로써 지연과 지연없이 갑작스런 스파이크가 매끄럽게 처리됩니다.

또한 위의 두 가지 관찰로 인해 Turbo Boost와 IDA가 효과적이지 않다고 믿었습니다. 이전 운영 체제에서는 유용 할 수 있지만 Linux 및 Windows 7은 모든 코어에 모든 것을 매우 효율적으로 분산시킵니다. 따라서 2.26 GHz에서 Core 2 Quad q9100은 거의 예외가 있습니다. 항상 예외가 있습니다 :-)는 항상 Core 2 Duo X9100 @ 3.06GHz보다 빠르며 IDA (기본적으로 Turbo boost의 전임자, 단일 스레드 앱의 경우 하나 또는 두 개의 코어에서 빈도가 증가합니다).

  • 코어 2 쿼드에는 두 개의 물리적 다이가 있기 때문에 두 개의 클럭 도메인이 있으므로 두 개의 코어가 전체 주파수에서 실행될 수 있고 두 개의 코어는 가장 낮은 주파수에 있습니다. 그래도 두 개의 전압 레귤레이터가 있는지 모르겠습니다. 전압이 4 코어 모두에서 균일하다는 것을 알았으므로 전체 패키지에 대해 하나의 레귤레이터 만 있어야합니다.