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

스레드 풀을 어떻게 구현할까요? “스레드 풀”에 대해 위키피디아에서 읽었지만 여전히이 질문을 해결하기 위해 무엇을해야하는지 파악할 수 없습니다 (스레드 풀이 무엇인지 이해하지 못했기 때문일 수 있음).

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

답변

스레드 풀은 작업을받을 준비가되어있는 사전 인스턴스화 된 유휴 스레드 그룹입니다. 짧은 작업이 적은 작업이 아닌 짧은 작업이 많은 경우 각 작업에 대해 새 스레드를 인스턴스화하는 것보다 선호됩니다. 이렇게하면 스레드를 여러 번 생성하는 오버 헤드가 발생하지 않습니다.

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

  • 스레드를 생성하고 유휴 상태로 유지하는 방법입니다. 이는 풀이 작동 할 때까지 각 스레드가 장벽에서 대기하도록하여 수행 할 수 있습니다 (뮤텍스를 사용하여 수행 할 수 있음). 또한.)
  • 풀에 스레드를 추가하고 풀에 스레드를 추가하는 방법이있는 큐 또는 기타 구조와 같이 생성 된 스레드를 저장하는 컨테이너입니다.
  • 스레드가 작업을 수행하는 데 사용할 표준 인터페이스 또는 추상 클래스입니다. 작업을 수행 한 다음 반환하는 execute() 메서드가있는 Task라는 추상 클래스 일 수 있습니다.

스레드 풀이 생성되면 구현의 필요에 따라 특정 수의 스레드를 인스턴스화하거나 필요에 따라 새 스레드를 생성합니다.

풀이 Task, 컨테이너에서 스레드를 가져 와서 (또는 컨테이너가 비어있는 경우 사용할 수있을 때까지 기다립니다) Task를 전달합니다. 장벽을 충족합니다. 이로 인해 유휴 스레드가 실행을 재개하고 주어진 Taskexecute() 메소드를 호출합니다. 실행이 완료되면 스레드는 재사용을 위해 컨테이너에 넣을 수 있도록 풀로 되돌아 간 다음 장벽에 도달하여주기가 반복 될 때까지 자체적으로 절전 상태를 유지합니다.

댓글

  • 스레드 풀은 작업을받을 준비가되어있는 사전 인스턴스화 된 유휴 스레드 그룹입니다. […] 이렇게하면 스레드를 여러 번 생성하는 오버 헤드를 방지 할 수 있습니다. -누군가가 " 스레드를 검색 할 때마다 Google에서이를 침을 뱉어야합니다. pool "
  • 스레드 풀 생성에는 내부적으로 장벽이 포함됩니까? 이 줄에서 참조를 공유 할 수 있습니까?
  • @overexchange 아니요, 그렇지 않습니다. 이 질문에 대한 저의 언급은 장벽 질문 을 다시 작성하는 더 좋은 방법의 예입니다. (그렇다면 답변을 작성하겠습니다.)
  • 가장 짧은 답변 중 하나입니다.

답변

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

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

스레드 풀은 실제로 필요한 것보다 더 많은 스레드를 생성하거나 파괴하지 않도록 도와줍니다.

p>

나는 스레드 대기열과 작업 대기열이있는 클래스를 만드는 것으로 시작합니다. 그런 다음 작업 대기열에 작업을 추가하고 거기에서 이동하는 메서드를 구현합니다. 당연히 스레드 풀에서 허용되는 최대 스레드를 설정할 수도 있습니다.

Answer

Real Life Example;

  1. 시설 : 운영 체제
  2. 섹션 : 애플리케이션
  3. 사람 : 스레드

시설이 있습니다. 12 명이 일하고 있습니다. 이 시설에는 3 개의 섹션이 있습니다. 주방, 화장실 및 보안. 스레드 풀 기술을 사용하지 않는 경우 작동 방식입니다. 12 명 모두가 회의실에 서고 신규 고객이 시설에 와서 작업을 요청하면 사람들을 그룹으로 분리하여 작업을 수행하도록 보냅니다. 업무를 시작하기 전에 준비 단계가 있습니다. 올바른 유니폼을 입고 특정 장비를 장비하고 해당 구역으로 걸어가 작업을 마치고 돌아와야합니다. 작업을 마칠 때마다 (스레드 종료) 회의실로 돌아가 유니폼을 벗고 장비를 꺼내 다음 작업을 기다려야합니다. 이는 스레드 컨텍스트 생성, 즉 OS 별 메모리 할당 및 추적 정보를 의미합니다.OS가 새로운 스레드 요구 사항을 재구성하는 데 너무 많은 시간이 소요됩니다.

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

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

Answer

다중 스레드 애플리케이션에서 스레드 풀은 애플리케이션에서 사용할 수있는 “사용 가능한 스레드 풀”입니다. 일반적으로 예 : .NET에서는 모두 관리되므로 작업을 할당하고 스레드가 사용 가능 해지면 작업을 수행합니다. 따라서 스레드 풀을 구현하기 위해 각 작업에 대한 명시적인 스레드 생성없이 자유 스레드가 작업을 자동으로 취하는 개념을 만들 것으로 예상합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다