스레드 풀이 란 무엇입니까?


62

스레드 풀을 어떻게 구현할까요? "스레드 풀"에 대한 위키 백과를 읽었지만 여전히이 질문을 해결하기 위해 어떻게해야하는지 파악할 수 없습니다 (스레드 풀이 간단한 용어로 무엇인지 이해하지 못했을 수도 있습니다).

누군가 스레드 풀이 무엇인지 일반 영어로 설명 할 수 있습니까?이 질문에 어떻게 대답 할 수 있습니까?

답변:


96

스레드 풀은 작업 준비가 된 사전 인스턴스화 된 유휴 스레드 그룹입니다. 적은 수의 긴 작업 대신 짧은 수의 짧은 작업이 수행 될 때 각 작업에 대해 새 스레드를 인스턴스화하는 것보다 선호됩니다. 이렇게하면 스레드를 여러 번 만드는 오버 헤드가 발생하지 않습니다.

구현은 환경에 따라 다르지만 간단히 말하면 다음이 필요합니다.

  • 스레드를 작성하여 유휴 상태로 유지하는 방법입니다. 풀이 작업을 처리 할 때까지 각 스레드가 장벽을 기다리도록하여 수행 할 수 있습니다. (이것은 뮤텍스로도 가능합니다.)
  • 큐 또는 스레드를 풀에 추가하고 하나를 뽑을 수있는 다른 구조와 같이 작성된 스레드를 저장하는 컨테이너입니다.
  • 스레드가 작업을 수행하는 데 사용할 표준 인터페이스 또는 추상 클래스입니다. 이것은 작업을 수행 한 다음 리턴 Task하는 execute()메소드로 호출 된 추상 클래스 일 수 있습니다 .

스레드 풀이 작성되면 구현의 요구에 따라 사용 가능한 스레드 수를 인스턴스화하거나 필요에 따라 새 스레드를 작성합니다.

풀이 a를 전달 Task하면 컨테이너에서 스레드를 가져 오거나 컨테이너가 비어있는 경우 스레드를 사용할 수있을 때까지 기다렸다가 a Task를 전달하고 장벽을 충족시킵니다. 이로 인해 유휴 스레드가 실행을 재개 하고 주어진 스레드의 execute()메소드를 호출합니다 Task. 실행이 완료되면 스레드가 풀을 다시 풀로 가져 와서 재사용을 위해 컨테이너에 넣은 다음 장벽을 만나 사이클이 반복 될 때까지 잠자기 상태가됩니다.


19
스레드 풀은 작업 준비가 된 사전 인스턴스화 된 유휴 스레드 그룹입니다. [...] 이렇게하면 스레드를 여러 번 만드는 오버 헤드가 발생하지 않습니다. - 누군가가 "스레드 풀"을 검색 할 때마다이 구글에서 침을해야한다
라파엘 Eyng을

합니까 스레드 풀의 생성이 내부적으로 장벽을 포함한다? 이 라인에서 참조를 공유 할 수 있습니까?
overexchange

@overexchange 아니오, 그렇지 않습니다. 이 질문에 대한 나의 언급은 당신의 장벽 질문 을 다시 쓰는 더 좋은 방법의 예입니다 . (그렇다면 대답을 드리겠습니다.)
Blrfl

가장 짧은 대답 중 하나입니다.
Blood-HaZaRd

10

스레드 풀은 일반적으로 대기열로 구성된 관리되는 스레드 모음으로, 작업 대기열에서 작업을 실행합니다.

비동기 적으로 무언가를 실행해야 할 때마다 새로운 스레드 객체를 생성하는 것은 비용이 많이 듭니다. 스레드 풀에서는 비동기 적으로 실행하려는 작업을 작업 대기열에 추가하기 만하면 스레드 풀은 해당 작업에 사용 가능한 스레드를 할당합니다. 작업이 완료 되 자마자 현재 사용 가능한 스레드는 다른 작업을 요청합니다 (남은 것이 있다고 가정).

스레드 풀을 사용하면 실제로 필요한 것보다 많은 스레드를 만들거나 제거하지 않아도됩니다.

스레드 대기열과 작업 대기열로 클래스를 만드는 것으로 시작합니다. 그런 다음 작업을 작업 대기열에 추가하고 거기서부터 작업을 추가하는 방법을 구현하십시오. 분명히 스레드 풀에서 허용되는 최대 스레드를 설정할 수 있어야합니다.


1

다중 스레드 응용 프로그램에서 스레드 풀은 응용 프로그램에서 사용할 수있는 "사용 가능한 스레드 풀"입니다. 일반적으로 예를 들어 .NET은 모두 관리되므로 작업을 할당하고 스레드가 해제되면 수행하게됩니다. 따라서 스레드 풀을 구현하려면 각 작업에 대해 명시적인 스레드를 만들지 않고 빈 스레드가 작업을 자동으로 수행하는 개념을 만들어야합니다.


1

실제 예;

  1. 시설 : 운영 체제
  2. 섹션 : 응용
  3. 사람들 : 실

12 명이 근무하는 시설이 있습니다. 이 시설에는 3 개의 섹션이 있습니다. 주방, 화장실 및 보안. 스레드 풀 기술을 사용하지 않는 경우 작동 방식 : 12 명 모두 회의실에 서있을 것 회의실로 돌아옵니다. 그러나 그들이 의무를 다하기 전에 준비 단계가 있습니다. 그들은 올바른 유니폼을 착용하고, 특정 장치를 장착하고, 해당 구역으로 걸어 가고, 작업을 마치고 돌아와야합니다. 따라서 일을 마칠 때마다 (실이 끊어짐) 회의실로 돌아가 유니폼을 벗고 장비를 꺼내 다음 작업을 기다려야합니다. 이것은 스레드 컨텍스트를 생성하는 것으로, OS별로 메모리 할당 및 추적 정보입니다.

스레드 풀링을 사용하는 경우 이른 아침에는 부엌에 6 명, 화장실에 2 명, 보안에 4 명을 할당합니다. 그래서 그들은 하루에 한 번만 준비를 할 것입니다. 부엌에 고객이 없더라도 다가오는 작업을 위해 유휴 상태에있는이 4 명이 방문합니다. 부엌이 닫힐 때까지 회의실로 돌아갈 필요가 없습니다 (앱 종료). 이 4 명은 키친 앱 풀에 있으며 빠르게 서비스 할 수 있습니다. 그러나 부엌이 때때로 유휴 상태가 될 수 있기 때문에 하루 종일 일한다고 약속 할 수는 없습니다. 화장실과 보안에도 동일한 논리가 적용됩니다.

첫 번째 시나리오에서는 모든 작업에 스레드를 낭비하지 않지만 각 작업에 대해 모든 단일 스레드를 준비하는 데 시간이 오래 걸립니다. 두 번째 단계에서는 미리 스레드를 준비하므로 모든 작업에 모든 스레드를 사용한다고 보장 할 수는 없지만 OS는 대부분 그에 대한 최적화를 수행하므로 안전하게 신뢰할 수 있습니다.

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