이것은 상당히 일반적인 컴퓨터 과학 문제이며 모든 OS 또는 프레임 워크에만 적용되는 것은 아닙니다.스레드 풀 및 컨텍스트 스위칭 (작업)?
그래서 스레드 풀에서 작업을 전환하는 것과 관련된 오버 헤드가 다소 혼란 스럽습니다. 대부분의 경우, 모든 작업에 고유 한 스레드 (하드웨어 스레드를 너무 많이 생성하지 않으려 고 함)를 제공하는 것은 이치에 맞지 않으므로 대신 이러한 작업을 스레드에서 실행되도록 예약 할 수있는 작업에 넣습니다. 우리는 스레드 풀을 설정 한 다음 스레드 풀에서 가져온 스레드에서 실행할 작업을 동적으로 할당합니다.
스레드 풀의 특정 스레드에서 작업을 전환하는 것과 관련된 오버 헤드에서 다소 혼란 스럽습니다 (깊이있는 답을 찾을 수 없음). DrDobbs 기사 (아래 소스)는 그렇지만 실제로 일어나고있는 것에 대한 심층적 인 대답이 필요합니다 (인용 할 수있는 소스가 환상적 일 수 있습니다 :)).
정의에 따라 SomeWork는 풀에 큐에 대기 한 다음 원래 스레드와 다른 스레드에서 실행해야합니다. 이는 우리가 반드시 대기열에 오버 헤드가 발생하고 작업을 풀로 이동하기위한 컨텍스트 스위치가 필요하다는 것을 의미합니다. 메시지 또는 Future 또는 이와 유사한 메시지를 통해 원래의 스레드에 대한 응답을 다시 전달해야 할 경우 다른 컨텍스트 전환이 발생합니다.
출처 : 실제로 http://www.drdobbs.com/parallel/use-thread-pools-correctly-keep-tasks-sh/216500409?pgno=1
을 전환하는 스레드의 어떤 구성 요소? 쓰레드 자체는 실제로 쓰레드를 스위칭하는 것이 아니라 쓰레드에 특정한 데이터이다. 이것과 관련된 오버 헤드는 (더 많거나 적거나 같은) 무엇입니까?
더 많은 의미를 갖기 시작했습니다 (다소). 오른쪽 그래서 "threadpool"스레드 실제로 컨텍스트 스위치 않습니다. 아티클에는 작업을 대기열로 보내는 컨텍스트 스위치가 있습니다 (즉, 작업을 스레드 풀로 이동). 너도 똑같이 말하는거야? 스레드 풀은 컨텍스트 전환을하지 않지만 작업은 수행합니까? 즉, 작업을 생성 한 스레드에서 작업을 실행할 스레드로 이동합니다. – smjpl
작업은 단지 데이터 구조 (함수 포인터) 일뿐입니다. 큐는 단지 데이터이기도합니다. 커널은 작업 대기열에 넣거나 실행하지 않습니다. 스위치가 없습니다. – usr
그래서 우리는 대기열 작업과 스레드 풀에서 작업 실행과 관련된 오버 헤드가 없으면 작업이 충분히 큰지 확인해야합니까? 기사 (1 페이지) : "반면에 스레드 풀 작업으로 작업을 실행하는 데 실제 비용이 들기 때문에 작업이 너무 짧지 않아야합니다." – smjpl