2014-10-10 4 views
3

이것은 상당히 일반적인 컴퓨터 과학 문제이며 모든 OS 또는 프레임 워크에만 적용되는 것은 아닙니다.스레드 풀 및 컨텍스트 스위칭 (작업)?

그래서 스레드 풀에서 작업을 전환하는 것과 관련된 오버 헤드가 다소 혼란 스럽습니다. 대부분의 경우, 모든 작업에 고유 한 스레드 (하드웨어 스레드를 너무 많이 생성하지 않으려 고 함)를 제공하는 것은 이치에 맞지 않으므로 대신 이러한 작업을 스레드에서 실행되도록 예약 할 수있는 작업에 넣습니다. 우리는 스레드 풀을 설정 한 다음 스레드 풀에서 가져온 스레드에서 실행할 작업을 동적으로 할당합니다.

스레드 풀의 특정 스레드에서 작업을 전환하는 것과 관련된 오버 헤드에서 다소 혼란 스럽습니다 (깊이있는 답을 찾을 수 없음). DrDobbs 기사 (아래 소스)는 그렇지만 실제로 일어나고있는 것에 대한 심층적 인 대답이 필요합니다 (인용 할 수있는 소스가 환상적 일 수 있습니다 :)).

정의에 따라 SomeWork는 풀에 큐에 대기 한 다음 원래 스레드와 다른 스레드에서 실행해야합니다. 이는 우리가 반드시 대기열에 오버 헤드가 발생하고 작업을 풀로 이동하기위한 컨텍스트 스위치가 필요하다는 것을 의미합니다. 메시지 또는 Future 또는 이와 유사한 메시지를 통해 원래의 스레드에 대한 응답을 다시 전달해야 할 경우 다른 컨텍스트 전환이 발생합니다.

출처 : 실제로 http://www.drdobbs.com/parallel/use-thread-pools-correctly-keep-tasks-sh/216500409?pgno=1

을 전환하는 스레드의 어떤 구성 요소? 쓰레드 자체는 실제로 쓰레드를 스위칭하는 것이 아니라 쓰레드에 특정한 데이터이다. 이것과 관련된 오버 헤드는 (더 많거나 적거나 같은) 무엇입니까?

답변

0

아마도이 기사는 작업이 풀에 게시되고 그 결과가 대기중인 경우에 대해 설명합니다. 일반적으로 스레드 풀에서 작업을 실행해도 문맥 전환 오버 헤드가 발생하지 않습니다.

대기열 작업 항목 1000 개를 상상해보십시오. 쓰레드 풀 쓰레드는 그것들을 하나씩 실행합니다. 이 모든 것들은 단일 컨텍스트없이 전환됩니다.

대기/차단에 전환이 발생합니다.

+0

더 많은 의미를 갖기 시작했습니다 (다소). 오른쪽 그래서 "threadpool"스레드 실제로 컨텍스트 스위치 않습니다. 아티클에는 작업을 대기열로 보내는 컨텍스트 스위치가 있습니다 (즉, 작업을 스레드 풀로 이동). 너도 똑같이 말하는거야? 스레드 풀은 컨텍스트 전환을하지 않지만 작업은 수행합니까? 즉, 작업을 생성 한 스레드에서 작업을 실행할 스레드로 이동합니다. – smjpl

+0

작업은 단지 데이터 구조 (함수 포인터) 일뿐입니다. 큐는 단지 데이터이기도합니다. 커널은 작업 대기열에 넣거나 실행하지 않습니다. 스위치가 없습니다. – usr

+0

그래서 우리는 대기열 작업과 스레드 풀에서 작업 실행과 관련된 오버 헤드가 없으면 작업이 충분히 큰지 확인해야합니까? 기사 (1 페이지) : "반면에 스레드 풀 작업으로 작업을 실행하는 데 실제 비용이 들기 때문에 작업이 너무 짧지 않아야합니다." – smjpl

2

let's 여기 처음 5 개 키의 개념을 명확히하고 그 때 스레드 풀 문맥에 상관 관계 방법에 대해 설명 :

  • 스레드 :이 프로그램의 실행 컨텍스트로 설명 될 수있는 간단한 이력서에서 , 주어진 실행중인 코드, CPU 레지스트리의 데이터 및 스택. 스레드가 생성되면 해당 스레드 컨텍스트에서 실행되어야하는 코드가 할당됩니다. 각 CPU 사이클에서 스레드는 실행 명령과 CPU 레지스트리의 데이터를 가져 와서 주어진 상태로 스택합니다.

  • 태스크 : 작업 단위를 나타냅니다. 이것은 실행될 쓰레드에 할당 된 코드입니다.

  • 문맥 스위치 (위키 백과에서) : 나중에 같은 지점에서 실행을 다시 시작할 수 있도록 스레드의 상태 (컨텍스트)를 저장하고 복원하는 프로세스입니다. 이를 통해 여러 프로세스가 단일 CPU를 공유 할 수 있으며 멀티 태스킹 운영 체제의 필수 기능입니다. 문맥을 구성하는 것은 위에 설명 된대로 실행중인 코드, cpu 레지스트리 및 스택입니다.

스레드 전환이란 무엇입니까? 작업은 실행될 스레드에 할당 할 수있는 작업의 평화를 나타냅니다. 주어진 순간에 스레드가 작업을 실행할 수 있습니다. (위키 백과에서)

  • 스레드 풀 : 스레드의 수는 일반적으로 큐에 구성되어 작업의 번호를 수행하기 위해 만든 곳 컴퓨터 프로그래밍에서 는 스레드 풀이다.

  • 스레드 풀 대기열 : 작업이 풀의 스레드에 의해 실행되도록 배치됩니다. 이 데이터 구조는 쓰레드가 큐/큐에서 경쟁 할 수있는 메모리의 공유 된 평화 로움으로 고부하 시나리오에서 경합을 일으킬 수 있습니다.

스레드 풀 사용 시나리오 예시 하나 : 당신의 프로그램에서

  • 를 (결국 메인 스레드에서 실행), 당신은 작업과 일정이 스레드 풀에서 실행되는을 만들 수 있습니다.
  • 작업이 스레드 풀 대기열에 대기 중입니다.
  • 풀에서 스레드가 실행될 때 풀에서 작업을 대기열에서 제외하고이를 실행하기 시작합니다.
  • 풀에서 스레드를 실행할 자유 CPU가없는 경우 운영 체제는 스레드 스케줄러 정책 및 스레드 우선 순위에 따라 스레드 실행을 중단하고 다른 스레드로 컨텍스트를 전환합니다.

운영 체제는 언제든지 스레드의 실행을 중지하고 다른 스레드로 컨텍스트를 전환 할 수 있으며 중지 한 위치에서 계속하려면 후자를 반환합니다.

cpus와 경쟁하는 활성 스레드의 수가 증가하면 컨텍스트 전환의 오버 헤드가 증가합니다. 따라서 이상적으로 스레드 풀은 시스템에서 사용 가능한 모든 CPU를 차지하기 위해 필요한 최소 스레드를 사용하려고합니다.

당신의 작업은 시스템에서 사용 가능한 CPU보다 더 많은 스레드를 사용하지 않기 때문에 블록 어딘가에, 컨텍스트 전환을 최소화하는 코드를하지 않은 경우.

물론 코어가 하나만 있으면 기본 스레드와 스레드 풀이 동일한 CPU를 놓고 경쟁하게됩니다.