작업 관리자를 열고 "시스템"영역을보고 다음을 확인했습니다.
글타래 (쓰레드) : 1337
하이퍼 스레딩을 사용할 수 있는 듀얼 코어 프로세서 (4 개의 스레드를 의미 함)가 있으므로 프로세서에 4 개만 있으면 1000 개 이상의 스레드를 가질 수있는 방법은 무엇입니까?
작업 관리자를 열고 "시스템"영역을보고 다음을 확인했습니다.
글타래 (쓰레드) : 1337
하이퍼 스레딩을 사용할 수 있는 듀얼 코어 프로세서 (4 개의 스레드를 의미 함)가 있으므로 프로세서에 4 개만 있으면 1000 개 이상의 스레드를 가질 수있는 방법은 무엇입니까?
답변:
간단한 대답은 모든 스레드가 동시에 실행되는 것은 아닙니다. 자세한 설명은 계속 읽으십시오.
운영 체제의 작업 스케줄러는 일반적으로 응용 프로그램을 예약하는 것으로 생각되며, 이렇게하면 컴퓨터가 다른 작업을 수행하는 동안 한 작업을 수행 할 수 있습니다. 예전에는 멀티 태스킹에 대한 리트머스 테스트에서 다른 작업을 수행하면서 플로피 디스크를 포맷했습니다. 실제로 OS를 테스트에 사용하려면 직렬 포트에 연결된 모뎀을 통해 파일을 다운로드하는 동안 플로피 디스크를 포맷해야합니다. 하드웨어가 실제로 의미있는 방식으로 수행 할 수있을만큼 강력 해짐에 따라 비디오 재생에서도 이러한 테스트에 등장했습니다. OS의 작업 스케줄러가 이러한 작업을 원활하게 처리 할 수 있으면 무엇이든 처리 할 수 있습니다.
그러나 작업 스케줄러는 실제로 응용 프로그램 (프로세스)을 예약하지 않고 스레드를 예약 합니다 . 각 애플리케이션에는 하나 이상의 스레드가 있지만 잠재적으로 많은 수의 스레드를 사용하여 작업을 관련 또는 독립적 인 부분으로 분할 할 수 있습니다. 예를 들어, 응용 프로그램에서 사용자 인터페이스를 처리하는 하나의 스레드가 있고 사용자가 잠재적으로 장기 실행 작업 (인쇄, 스프레드 시트 재 계산, 개발 환경 등)을 시작할 때 다른 스레드를 만드는 것이 일반적입니다. 기호 조회 등). 일부 프로그래밍 환경에서는 프로그래머에게 보이지 않는 스레드가 발생합니다. 예를 들어, Java 및 .NET 은 가비지 콜렉션을 수행 할 수 있습니다.프로그래머가 즉시 제어 할 수없는 별도의 스레드에서. 새로운 스레드를 만드는 것은 비교적 비싼 작업이므로 필요할 때마다 스레드를 만들 필요는 없기 때문에 일부 프로그램은 초기에 여러 스레드를 생성하고 풀링합니다. 미리보기를 수행하는 모든 작업은 일반적으로 별도의 스레드에서 수행되므로 미리보기가 생성되는 동안 UI의 나머지 부분이 계속 반응합니다. 등등. 이 모든 것을 종합하면 시스템의 스레드 수는 언제든지 프로세스 수의 몇 배가 될 수 있습니다.
각 스레드는 몇 가지 가능한 상태 중 하나 일 수 있지만 가장 중요한 차이점은 실행 중 , 실행 가능 상태 및 대기 상태입니다. 용어는 약간 다를 수 있지만 이것이 일반적인 아이디어입니다. 한 번에 (때문에 하이퍼 스레딩 및 유사 기술) 가상 CPU 코어 당 하나의 스레드 만이 할 수 실행 (즉, 기계 코드 명령어 실행),하지만 스레드의 수하는 것이 될 수있다 실행 가능한 이 얻을 수있는 후보임을 의미 ( 다음에 스케줄러가 실행할 스레드를 결정해야 할 때 CPU). 기다리는 (차단이라고도 함) 스레드는 무언가를 기다리는 것입니다. 가장 일반적인 경우는 아마도 사용자, 디스크 또는 네트워크 I / O를 기다리는 것입니다 (특히 사용자 입력이 매우 느림).
작업 관리자에 표시되는 스레드 수 는 이러한 상태 의 총 스레드 수입니다 . 예를 들어, 이것을 입력하는 Windows 7 시스템에는 현재 약 70 개의 프로세스가 시작되었지만 거의 900 개의 스레드가 있습니다. 다양한 작업을 처리하기위한 모든 백그라운드 프로세스와 이들이 각각 여러 스레드로 세분화되는 방식을 고려할 때 이는 엄청난 숫자가 아닙니다.
선점 적으로 멀티 태스킹 운영 체제의 작업 스케줄러의 핵심 인 기술 구현의 깊이에 대해 좀 더 자세히 살펴보면 일반적으로 일종의 하드웨어 인터럽트 후크입니다. 이 수행 할 유용한 작업이없는 경우 커널이 CPU를 중단 할 수있는이 수단 (하지 않을 경우이 거의 확실히 이유 중 하나입니다 이유, 왜 리눅스가 확인 명령 부팅을에HLT
IA-32호환 CPU, 다른 아키텍처에서 유사한 검사를 수행 할 수 있음)는 향후 합리적으로 결정될 때 인터럽트가 발생하고 작업 스케줄러가 호출된다는 점에서 안전합니다. CPU가 수행하는 다른 작업 (인터럽트의 기본 개념)에 관계없이 인터럽트가 발생하므로 스케줄러가 정기적으로 실행되고 다음 시간 조각 동안 어떤 스레드를 실행할지 결정할 기회를 얻습니다. 컨텍스트 스위치는 상대적으로 비싸기 때문에 일반적으로 스케줄러가 스레드간에 얼마나 적극적으로 전환하는지 튜닝하는 것이 가능합니다 (적어도 소스 코드를 통해). 스레드를 전환하면 시스템의 응답 속도가 빨라지지만 전환 오버 헤드는 주어진 작업 세트를 완료하는 전체 시간이 더 길다는 것을 의미합니다. 그만큼빠른시스템은 실행중인 스레드가 더 이상 실행할 수 없을 때 스레드 간을 전환하는 것입니다 (즉, 무언가를 기다리는 동안 차단되거나 작업이 완료되었음을 의미 함). 그러면 오버 헤드가 최소화되므로 가장 반응이 빠른 시스템은 스레드간에 전환됩니다 스케줄러가 호출 될 때마다 특정 스레드가 CPU 시간을 가져 오기 전에 대기하는 평균 시간이 최소화되므로 스케줄러가 호출됩니다. 이상적인 설정은 일반적으로이 둘 사이의 어딘가에 있으며, 이러한 선택 사이의 상충 관계는 Linux가 커널 구성을 통해 일부 조정 매개 변수와 일부 조정 매개 변수를 선택할 수있는 큰 이유 중 하나 일 수 있습니다.
반면에 멀티 태스킹 운영 체제 및 환경 ( Windows 3.x 가 하나의 예)은 각 응용 프로그램을 사용하여 스케줄러에 대한 제어를 정기적으로 수행합니다. 일반적으로이를위한 API 함수가 있으며, 종종 많은 API 함수가 내부 실행 흐름의 일부로이를 수행 할 수 있습니다. 이는 사용자가보다 원활하게 경험할 수 있도록하기 때문입니다. 이 설계 방식은 모든 애플리케이션이 올바르게 작동하고 장기 실행 작업 (짧은 시간보다 1 초 이상 긴 장기 실행) 동안 짧은 간격으로 제어를 제어하는 한 잘 작동하지만 막을 수없는 애플리케이션 전체 시스템. 이것이 위에서 언급 한 멀티 태스킹 테스트에서 Windows 3.x가 그다지 좋지 않은 이유 중 하나입니다. OS / 2동일한 하드웨어에서 동일한 작업을 수행하는 동안 즐겁게 따라 다닐 수 있습니다. 응용 프로그램은 플로피 디스크 드라이브에 특정 섹터를 쓰도록 지시 할 수 있으며 호출이 실제로 반환되기까지 걸리는 시간 (수백에서 수백 밀리 초 또는 더); 선점 형 멀티 태스킹 시스템은 스케줄러가 다음 예약 된 호출에서 침입 할 수 있습니다. 현재 "실행중인"스레드는 실제로 쓰기 호출에 의해 차단되고 실행 가능한 다른 스레드로 전환됩니다. (실제로는 조금 더 복잡하지만 일반적인 아이디어입니다.)
선제 적으로 멀티 태스킹 및 협업 환경 모두에서, 다른 스레드가 다른 우선 순위를 가질 가능성이 있습니다. 예를 들어, 시스템 시간 표시를 업데이트하는 스레드보다 통신 링크를 통해 데이터를 수신하는 스레드를 적시에 실행하는 것이 더 중요하므로 수신 스레드의 우선 순위가 높고 시간 표시 업데이트 프로그램 스레드의 우선 순위가 낮습니다. . 스레드 우선 순위는 스케줄러가 어떤 스레드를 실행할 수 있는지 결정하는 역할을합니다 (예 : 매우 단순화 됨)우선 순위가 높은 스레드는 항상 우선 순위가 낮은 스레드보다 먼저 실행되어야합니다. 따라서 우선 순위가 낮은 스레드가 수행해야하는 경우에도 우선 순위가 높은 스레드 인 경우) 실행 가능해 지지만 우선 순위가 결정되지만 이러한 특정 일정 결정은 기본 메커니즘 설계에 영향을 미치지 않습니다.
1037 대의 차량이있는 4 대의 고속도로를 생각해보십시오.
OS는 많은 서비스를 위해 많은 프로세스를 실행해야합니다. 가장 간단한 그래픽 프로그램이라도 다중 스레드 프로그래밍이 필요합니다. 많은 프로그램이 열렸다고 생각하면 컴퓨팅 파워 리소스를 공유해야한다는 것을 알 수 있습니다.
작업 관리자가 보여주는 것은 현재 시스템로드입니다. comp 사양에 표시되는 것은 병렬 실행에 허용되는 스레드 수 (프론트 엔드)입니다. 보다 논리적 인 프론트 엔드 스레드를 허용하는 하이퍼 스레딩과 멀티 코어 기능의 차이를 크게 입력하지 않으면 시스템 성능이 향상됩니다.
DoEvents
처리하려면 메시지 큐를 처리하는을 호출 하지만 동일한 스레드에서 수행되었으며 모든 메시지가 처리 될 때까지 장기 실행 작업을 차단합니다. . (물론, Win32 API 함수를 호출하거나 추가 프로세스를 만들 수 있지만이 시점에서 하위 언어 중 하나를 사용할 수도 있습니다.)
우리는 물러서서 스스로에게 물어야합니다. 단일 CPU를 가진 컴퓨터가 어떻게 두 개의 스레드를 가질 수 있습니까?
스레드는 하드웨어가 아닌 소프트웨어 엔터티입니다. 다른 스레드를 가지려면 디스크립터 구조 및 스택과 같이 스레드를 구성하는 객체에 대한 메모리 만 있으면됩니다.
운영 체제는 특정 인터럽트 (예 : 타이머 인터럽트) 내부 또는 스레드가 운영 체제를 호출 할 때와 같이 여러 번 스레드간에 전환합니다.
시스템에 존재하는 모든 스레드 중에서 하위 집합 만 일반적으로 "실행 가능"이라고하는 상태에 있습니다. 실행 가능 스레드는 실행을 열망합니다. 실행 중이거나 "실행 큐"에 앉아 스케줄러에 의해 디스패치되기를 기다리고 있습니다. 실행할 수없는 스레드는 "차단됨", 일부 자원 확보 또는 입력 수신 대기 또는 "입력"이 시간의 흐름 인 입력시 차단되는 "잠자기"입니다. "컨텍스트 전환"은 운영 체제의 스케줄러 기능이 프로세서의 실행 큐를보고 실행할 다른 스레드를 선택할 때 발생합니다.
특정 하드웨어 기능에 대한 인텔의 이름 인 "hyperthreading" 과 혼동하지 마십시오 .