스레드의 경험상 규칙은 컴퓨터에서 사용할 수있는 각 "실행 단위"에 대해 하나 이상의 "활성"(CPU 시간에 따라 명령을 즉시 실행할 수 있음) 작업자 스레드를 원한다는 것입니다. "실행 단위"는 하나의 논리적 명령어 프로세서이므로 쿼드 칩, 쿼드 코어 Xeon 하이퍼 스레딩 서버에는 32 EU (4 개의 칩, 칩당 4 개의 코어, 각 하이퍼 스레드)가 있습니다. 평균 Core i7은 8입니다.
스레드가 항상 실행 상태에있는 경우 EU 당 하나의 스레드가 CPU 성능을 최대한 활용합니다. 스레드는 캐시되지 않은 메모리, 하드 디스크, 네트워크 포트 등에 액세스해야하기 때문에 기다려야하며 CPU의주의가 필요하지 않습니다. 따라서 더 많은 스레드가 대기하고 갈수록 늘어남으로써 전반적인 효율성을 더욱 높일 수 있습니다. 이것은 비용이 든다. CPU가 스레드를 전환 할 때 스레드의 레지스터, 실행 포인터 및 EU의 가장 내부 작업에 일반적으로 유지되고 매우 빠르게 액세스되는 기타 상태 정보를 캐시해야합니다. 따라서 CPU 칩의 다른 EU가이를 가져올 수 있습니다. 또한 전환 할 스레드를 결정하려면 OS의 스레드가 필요합니다. 마지막으로 EU가 스레드를 전환하면 대부분의 프로세서 아키텍처에서 사용하는 파이프 라이닝의 성능 이점을 잃습니다. 스레드를 전환하기 전에 파이프 라인을 플러시해야합니다. 그러나이 모든 것이 여전히 하드 드라이브 나 RAM이 정보를 제공하기를 기다리는 것보다 평균 시간이 훨씬 덜 걸리기 때문에 비용이 든다.
그러나 일반적으로 EU로서 "활성"스레드 수의 두 배를 넘어 서면 OS는 EU의 시간 스케줄링 스레드보다 더 많은 시간을 소비하기 시작하고 EU는 실제로 활성 스레드를 실행하는 데 소비되는 것보다 더 많은 시간을 소비합니다. 프로그램의. 이것은 규모의 경제의 비결입니다. 이 시점에서 추가 스레드를 추가하는 경우 멀티 스레드 알고리즘을 실행하는 데 실제로 시간이 더 걸립니다.
따라서 전반적으로 컴퓨터에 EU가있는 것보다 최소한 스레드를 프로그램에 유지하려고하지만 대기하거나 잠자 지 않는 수보다 두 배 이상 많은 수의 스레드를 피하고 싶습니다.