가상 CPU가 4 개인 경우 1805 스레드를 사용하려면 어떻게해야합니까?


10

누군가 내 활동 모니터에서 현재 1805 개의 스레드가 있음을 어떻게 설명 할 수 있는지 궁금합니다. OS X 활동 모니터의 스크린 샷

그러나 내 컴퓨터에는 4 개의 가상 코어 만 있습니다 (즉, 4 개의 스레드 만 가질 수 있음). 스레드 수는 실행할 스레드를 결정할 때 CPU가 처리하는 모든 스레드를 의미합니까?

편집 : 내 컴퓨터에 4 개의 스레드 만있을 수 있다고 생각하는 이유는이 대답 에서 비롯됩니다 . 나는 나의 오해가 다른 맥락에서 사용되는 '실'이라는 단어에서 비롯된 것이라고 생각합니다.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
bmike

답변:


24

스케줄링

1,805 개의 스레드가 동시에 실행되지 않습니다 . 그들은 거래합니다. 한 코어는 약간의 스레드를 실행 한 다음 다른 스레드를 약간 실행하도록 따로 설정합니다. 다른 코어도 마찬가지입니다. 빙글 빙글 스레드는 한 번에 조금씩 실행되며 한 번에 모두 실행되는 것은 아닙니다.

운영 체제 (Darwin 및 macOS)의 주요 책임은 어느 스레드에서 어떤 코어를 얼마나 오랫동안 실행할지 스케줄링하는 것입니다.

많은 스레드가 수행 할 작업이 없으므로 휴면 상태 및 예약되지 않은 상태로 남아 있습니다. 마찬가지로 많은 스레드가 스토리지에서 데이터를 검색하거나 네트워크 연결을 완료하거나 데이터베이스에서 데이터를로드하는 등의 일부 자원을 대기 중일 수 있습니다. 대기중인 자원의 상태를 확인하는 것 외에는 아무 것도 할 일이 없기 때문에 그러한 스레드는 아주 짧게 예약됩니다.

앱 프로그래머는 외부 리소스에 대한 대기 시간이 다소 걸린다는 것을 알고있을 때 일정 시간 동안 스레드를 휴면하여이 예약 작업을 지원할 수 있습니다. 그리고 외부 리소스를 기다릴 이유없이 CPU를 많이 사용하는 "꽉"루프를 실행하는 경우 프로그래머는 코어를 호그하지 않도록 다른 자원을 실행할 수 있도록 자원 봉사자에 대한 호출을 잠깐 동안 따로 넣을 수 있습니다.

자세한 내용 은 멀티 스레딩 Wikipedia 페이지를 참조하십시오 .

동시 멀티 스레딩

연결된 Question에 관해서는 스레드가 실제로 여기와 동일합니다.

한 가지 문제는 OS에서 예약 할 때 스레드 간 전환에 드는 오버 헤드 비용입니다. 코어에서 현재 스레드의 명령어와 데이터를 언로드 한 다음 예약 된 스레드의 명령어와 데이터를로드하는 데 상당한 시간이 소요됩니다. 운영 체제 작업의 일부는이 오버 헤드 비용을 최적화하기 위해 스레드를 예약하는 데 현명하게 노력하는 것입니다.

일부 CPU 제조업체는이 시간을 단축하여 한 쌍의 스레드간에 훨씬 빠르게 전환 할 수있는 기술을 개발했습니다. 인텔은 기술을 하이퍼 스레딩이라고 합니다. 일반적으로 동시 멀티 스레딩 (SMT)이라고 합니다.

한 쌍의 스레드가 실제로 동시에 실행되지는 않지만 스위칭이 매끄럽고 빠르므로 두 스레드가 거의 동시에 나타납니다. 이것은 각 코어가 OS에 가상 코어 쌍으로 표시되도록 잘 작동합니다. 예를 들어 물리적 코어가 4 개인 SMT 가능 CPU는 8 코어 CPU로 OS에 표시됩니다.

이러한 최적화에도 불구하고 여전히 이러한 가상 코어 간 전환에 약간의 오버 헤드 가 있습니다 . 코어에서 실행 시간을 예약해야하는 CPU 집약적 인 스레드가 너무 많으면 하나의 스레드로 많은 작업을 수행하지 않고도 시스템을 비효율적으로 만들 수 있습니다. 운동장에있는 3 개의 공이 9 명의 어린이들 사이에서 공유되는 것과 비교 하여, 어떤 어린이도 실제로 공을 가지고 노는 시간이없는 9 백명의 어린이들 과 공유 하는 것.

따라서 CPU 펌웨어에는 시스템 관리자가 SMT를 비활성화하기 위해 시스템에 스위치를 던질 수있는 옵션이 있습니다.

이 경우 우리는 원래의 질문으로 돌아갑니다.이 특별한 상황에서는 실제로 실제 코어보다 더 많은 하이퍼 활성 스레드가 없도록 작업을 제한하려고합니다. 그러나 반복하겠습니다. 이것은 특수한 과학적 데이터 처리 프로젝트와 같은 상황에서 발생할 수 있지만 일반적인 비즈니스 / 기업 / 기업 시나리오에는 거의 적용되지 않는 매우 이례적인 상황입니다.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
bmike

또한 yield()Classic MacOS에서 협력적인 멀티 태스킹의 레거시 코드가 아닌 한 , 아무도 CPU를 많이 사용하는 스레드 에 시스템 호출을 넣지 않습니다. 스레드가 타임 슬라이스를 사용한 후 선점 형 멀티 태스킹 일정이 변경됩니다.
Peter Cordes

하이퍼 스레딩에 대한 설명이 잘못되었습니다. 하드웨어 스레드! = 소프트웨어 스레드는 실행 컨텍스트 / 논리 코어입니다. 실제 코어의 두 논리 코어는 실제로 동시에 명령을 실행합니다. 프런트 엔드는 스레드 (각주기)를 번갈아 가며 비 순차적 실행 코어는 동일한 주기로 두 스레드에서 명령 / Uops를 실행할 수 있습니다. 이것은 실행 레벨에 작업을 더 잘 공급하기 위해 두 스레드에서 OoO 실행으로 명령 레벨 병렬 처리를 노출시킵니다 (이것은 기본적으로 SMT의 요점입니다). "최적화 된 컨텍스트 전환"이 아닙니다.
Peter Cordes


7

예전에는 메모리가 가상화되거나 보호되지 않았으며 모든 코드가 어디서나 쓸 수있었습니다. 당시에는 하나의 스레드에서 하나의 CPU 디자인이 의미가있었습니다. 그 이후 수십 년 동안 메모리는 먼저 보호 된 다음 가상화되었습니다. 스레드를 가상 코어로 생각하십시오-언젠가는 데이터와 코드가 준비되면 스레드가 실제 CPU에 푸시 ( 또는 스케줄링 알고리즘에 대한 연구를 수행하는 PHD 엔지니어 및 수학자로 예약 됨) 할 것을 약속합니다. 실제 작업을 수행하십시오.

여기에 이미지 설명을 입력하십시오

타이밍 차이의 크기 때문에 CPU와 캐시는 스토리지 또는 네트워크에서 데이터를 가져 오는 것에 비해 너무 빠르게 작동하여 한 스레드가 www.google.com이 실제 CPU보다 더 많은 스레드를 보는 이유입니다.

블랙 / 블루 시간 규모에서 발생하는 스레드 작업을 변환하고 1 초 = 1ns로 변환하면 디스크 IO가 걸리는 데 100 마이크로 초가 4 일 정도 걸리고 200ms 인터넷 왕복은 CPU 시간 단위로 초를 세는 경우 20 년 지연. 거의 모든 경우 에 열 가지 연습의 많은 힘 과 마찬가지로 CPU는 매우 느린 외부 세계에서 의미있는 작업을 기다리는 "개월"동안 유휴 상태로 있습니다.

게시 한 이미지에서 아무 것도 잘못 보이지 않으므로 스레드에 대해 궁금해하여 얻는 내용을 잘못 이해했을 수 있습니다.

상단의 헤더 행에있는 단어 스레드를 마우스 오른쪽 버튼으로 클릭 (제어 클릭)하면 앱의 상태를 추가하면 대부분의 스레드가 유휴 상태이거나 휴면 상태이며 특정 순간에 실행되지 않을 수 있습니다.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
bmike

1

"CPU에 코어가 4 개 밖에 없을 때 어떻게 290 개의 프로세스를 가질 수 있습니까?"라는 더 근본적인 질문은하지 않습니다. 이 답변은 약간의 역사입니다. 구체적인 질문에 이미 답변을했지만 큰 그림을 이해하는 데 도움이 될 수 있습니다. 따라서 TL; DR 버전을 제공하지 않을 것입니다.

옛날 옛적에 (1950 ~ 60 년대) 컴퓨터는 한 번에 한 가지 일만 할 수있었습니다. 그들은 매우 비싸고, 방 전체가 가득 차 있었고, 우리는 여러 사람 사이에 그것들을 공유함으로써 그것들을 효율적으로 사용할 수있는 방법이 필요했습니다. 이 작업을 수행하는 첫 번째 방법은 사용자가 컴퓨터에 작업을 제출하고 대기하고, 차례로 실행되고 결과가 사용자에게 다시 전송되는 배치 처리 입니다. 괜찮 았지만 며칠이 걸리는 계산을 원한다면 그 시간 동안 아무도 컴퓨터를 사용할 수 없다는 것을 의미했습니다.

다음 혁신 (1960 ~ 70 년대)은 시분할 이었습니다. 이제 한 작업 전체를 실행 한 다음 다음 작업 전체를 실행하는 대신 컴퓨터는 한 작업을 약간 실행 한 다음 일시 중지하고 다음 작업을 약간 실행합니다. 따라서 컴퓨터는 여러 프로세스를 동시에 실행하고 있다는 인상을 줄 것입니다. 이 방법의 가장 큰 장점은 이제 며칠이 걸리는 계산을 실행할 수 있으며, 계속 중단되기 때문에 더 오랜 시간이 걸리더라도 다른 사람들은 여전히 ​​그 시간 동안 기계를 사용할 수 있다는 것입니다.

이 모든 것이 거대한 메인 프레임 스타일 컴퓨터를위한 것이 었습니다. 개인용 컴퓨터가 인기되기 시작했을 당시부터, 그들은 처음에, 헤이, 매우 강력하고되지 않은 개인 (1980) 생각 한 번에 - 하나의 응용 프로그램을 실행 - 그것은 그들에게 단 한 가지 및 NBDP을 할 수 있으려면 확인을 보였다. 그러나 그들이 더 강력 해지면서 (1990 년대부터 현재까지) 사람들은 개인용 컴퓨터도 시분할하기를 원했습니다.

그래서 우리는 여러 개의 프로세스를 동시에 한 번에 하나씩 잠시 실행 한 후 일시 중지하여 여러 프로세스를 동시에 실행한다는 착각을 일으킨 개인용 컴퓨터로 끝났습니다. 스레드는 본질적으로 동일합니다. 결국 사람들은 개별 프로세스조차도 여러 작업을 동시에 수행한다는 착시를 원했습니다. 처음에는 응용 프로그램 작성자가 스스로 처리해야했습니다. 그래픽을 업데이트하는 동안 조금만 보내고, 일시 중지하고, 계산하는 동안 조금만 보내고, 일시 중지하고, 다른 것을하면서 약간을 보내십시오 ...

그러나 운영 체제는 이미 여러 프로세스를 관리하는 데 능숙했으며 이러한 하위 프로세스 (스레드)를 관리하도록 확장하는 것이 합리적이었습니다. 이제 모든 프로세스 (또는 응용 프로그램)에 하나 이상의 스레드가 포함되어 있지만 일부는 여러 개 또는 여러 개가 포함 된 모델이 있습니다. 이러한 각 스레드는 다소 독립적 인 하위 작업에 해당합니다.

그러나 최상위 수준에서 CPU는 여전히이 스레드가 모두 동시에 실행되고 있다는 착각을 나타냅니다. 실제로는 조금씩 실행하고 잠시 멈추고 조금만 실행할 다른 것을 선택하는 등의 작업을 수행합니다. 최신 CPU는 한 번에 둘 이상의 스레드를 실행할 수 있습니다. 그래서에서 실제 현실, 운영 체제는 동시에 모든 코어의 "비트에 대한 다른 실행, 조금, 일시에 출마 뭔가, 일시 중지"이 게임을하고있다. 따라서 원하는만큼 많은 스레드를 가질 수 있지만 응용 프로그램 디자이너는 언제든지 스레드를 거의 일시 중지합니다.

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