첫째, 마케팅 크래프트가 주장하는 바에도 불구하고 CPU에 스레드가 없다. CPU 실행할 수 있습니다 한 번에 지정된 수의 스레드까지. 특히, 엔 활성화되지 않은 코어 및 하이퍼 스레딩을 실행할 수 있음 엔 스레드. CPU가있는 엔 코어 및 하이퍼 스레딩을 사용하면 2_n_ 개의 스레드를 실행할 수 있습니다. 기술적 인 측면에서 우리는 "스레드를 실행할 수있는 것"을 논리 프로세서 , 또는 LP. HT가 활성화되지 않은 머신에는 코어 당 하나의 LP가 있습니다. HT는 두 가지를 제공합니다.
일반적인 Windows 시스템은 한 번에 총 수백 또는 수천 개의 스레드를 포함합니다. 이것은 결정할 각 개별 프로그램의 코드에 달려 있습니다. 프로세스를 만들 때 프로세스는 항상 하나의 스레드로 시작됩니다. 일부 간단한 프로그램, 특히 명령 행 (문자 모드) 프로그램은 하나의 스레드 만 사용할 수 있습니다. 그러나 첫 번째 스레드에서 실행되는 코드는 다른 스레드를 생성 할 수 있으며 그 쓰레드는 다른 쓰레드를 생성 할 수 있으며, 거의 실용적인 제한이 없다. 단순히 많은 수의 스레드를 생성하지 않는 것이 좋은 이유가 있지만, 스레드를 생성하는 것보다 훨씬 많은 스레드를 생성하는 것이 불가능합니다.
x86에서 스레드 스택 크기의 기본값을 사용하면 프로세스 당 약 2000 개의 스레드에 한계가 있으며 이는 주소 공간 제한에 의해 결정됩니다.
작업 관리자의 세부 정보 탭에서 스레드 열을 활성화 할 수 있습니다. 스레드 열은 각 프로세스에 현재 얼마나 많은 스레드가 있는지 알려줍니다. 다음은 시스템의 모든 스레드를 셀 수있는 PowerShell 명령입니다.
($threads = get-ciminstance win32_thread).count
3437
이것은 4 개의 하이퍼 스레드 코어가있는 시스템에 총 8 개의 LP가 있습니다.
이러한 스레드가 실제로는 거의 순간적으로 실행되기를 원하지 않기 때문에 이것은 문제가되지 않습니다. 대부분의 프로세스에서 대부분의 스레드는 Windows가 "대기"상태를 호출하는 데 대부분의 시간을 소비 했으므로 CPU 시간을 전혀 사용하지 않거나 사용하지 못하도록하고 있습니다. 그들은 I / O (어쩌면 네트워크, 어쩌면 디스크 등)가 완료되기를 기다리고 있으며, 사용자 입력을 기다리고 있으며, 다른 스레드가 액세스해야하는 리소스를 해제 할 때까지 기다리고 있습니다. * nix 파생 시스템은 이것을 "차단"이라고 부릅니다.
대기중인 스레드 수를 원하면 다음을 시도하십시오.
PS C:\Users\jeh> ($threads = get-ciminstance win32_thread | where-object -Property ThreadState -EQ 5).count
3427
그래서 현재 LP를 사용하려고하는 스레드가 10 개 밖에없는 것처럼 보입니다. 그러나 그것은 그것보다 낫다. 8 개의 LP로, 그 중 8 개는 시스템의 유휴 스레드입니다. 각 LP 전용 유휴 스레드가 있습니다. 그들은 항상 달릴 준비가되어 있지만, LP를 원하는 사람은 아무도 없을 때만 뛰게됩니다. 그래서 저는 위의 명령을 사용하여 작업을하고 싶었던 "실제"두 개의 스레드 만있었습니다. 유휴 스레드의 활동은 다음과 같습니다. 아니 작업 관리자의 선 그래프에 포함 된 CPU 사용량을 표시합니다.
n .b .: PowerShell 및 WMI 작업이 OS의 기능과 내부적으로 동기화되지 않기 때문에이 수치는 정확하지 않습니다. 그러나 그들은 그 요점을 설명하기에 충분히 가깝습니다.
LP보다 유휴 스레드 이외의 스레드가 "준비"상태 인 경우 일반적으로 스케줄러는 가장 높은 우선 순위를 선택합니다 nLPs 스레드 - 누가 최근에 어떤 CPU를 실행했는지에 따라 약간 조정할 수 있습니다. 동일한 우선 순위에 여러 스레드가있는 경우 스케줄러가 LP 스위치를 다른 스레드로 전환하기 전에 20 또는 60 msec 동안 실행되도록 "라운드 로빈"방식으로 실행되는 "시간 분할"될 수 있습니다.
이리 Windows에서 스레드 우선 순위가 작동하는 방식에 대해 자세히 설명하는 대답입니다.