하드웨어에 코어가 4 개이고 소프트웨어 응용 프로그램에 스레드가 4 개 이상인 경우 멀티 스레드는 어떻게 작동합니까?


0

4 개의 코어와 4 개의 스레드와 20 개의 스레드가있는 응용 프로그램을 사용하여 상수 점검 (이벤트라고 가정 해 봅시다), 프로세서가 제한된 양의 모든 스레드를 동시에 실행하는 방법 스레드? 프로세서가 하나의 스레드와 다른 스레드 사이에서 변경된다는 것을 알고 있습니다. 변경 사항이 너무 빠르므로이를 알지 못하지만,이 모든 일이 발생하거나 컴퓨터가 다른 작업을 수행합니다. 또한, 컴퓨터는 각 시점의 정보를 RAM 메모리에 저장하는 방법은 무엇입니까?


2
단일 스레드 프로세서가 어떻게 여러 스레드의 실행을 관리했는지 생각해보십시오.
dsstorefile1

답변:


2

20 개 이상의 코어가있는 시스템을 제외하고는 정확히 20 개의 스레드를 실행할 수 없습니다. 시스템이 할 수있는 것은 그것을 만드는 것입니다. 보기 같은 시간에 아주 가까이서 달리고있는 것처럼.

이것이 운영 체제 스케줄러입니다.

멀티 코어 프로세서 이전에는 운영 체제가 여러 프로세스에서 CPU 시간을 공유해야했습니다. 각 프로세스는 여러 개의 고유 한 스레드를 가질 가능성이있었습니다.

운영 체제는 각 스레드를 관리하고 CPU에 시간을 할당하고 상태를 복원하고 스레드를 실행하고 상태를 일시 중단하고 저장해야합니다. 다중 코어, 다중 CPU 또는 단일 코어간에 엄청난 차이가 없습니다.

변경된 사항은 복잡성 수준과 동시에 실행하도록 예약 할 수있는 항목 수입니다. 한 번에 하나의 스레드 만 실행할 수있는 곳에서는 이제 4 개의 스레드를 실행할 수 있습니다. 스레드 상태를 추적하는 동일한 프로세스 (프로그램 카운터 등)가 발생하며 프로그램에 얼마나 많은 스레드가 있는지는 중요하지 않습니다.

운영 체제는 수행해야 할 작업 (하드웨어 인터럽트 또는 디스크의 일부 데이터에서 대기 중일 수 있음), 프로세스 / 스레드의 우선 순위 및 실행중인 스레드의 우선 순위에 따라 CPU에서 모든 스레드를 공정하게 일정을 잡으려고 시도합니다. 다른 것들의 전체 뗏목. 쓰레드는 다양한 이벤트가 발생할 때까지 시간이 걸릴 때까지, 하드웨어 나 소프트웨어 이벤트 등이 될 때까지 아무 일도하지 않는다고 운영체제에 알릴 수 있습니다. 이 경우 운영 체제 스케줄러는 스레드를 준비 할 때까지 해당 스레드를 건너 뛸 수 있습니다.

현재 내가 사용하고있는 시스템은 실행중인 모든 프로세스에서 2,500 개의 스레드가 있다는 것을보고하고 있으며, 분명히 4 개 코어 프로세서에서 모두 동시에 실행하는 것은 불가능합니다.


0

첫째, 마케팅 크래프트가 주장하는 바에도 불구하고 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에서 스레드 우선 순위가 작동하는 방식에 대해 자세히 설명하는 대답입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.