Er. Dinesh Sharma Ответов: 1

Сколько пулов потоков в TPL? С каким-то непонятным вопросом, пришедшим мне в голову?


Привет Эксперты,
Я использую .Net на 5.0 и с помощью библиотеки параллельных задач (TPL).У меня есть некоторая путаница в управляемом пуле потоков, который использует TPL.

1)Сколько пулов потоков в машине, имеющей 4-ядерный процессор?Зависит ли количество пулов потоков от операционной системы, процессора или приложения ?
2 )Когда мы запускаем приложение либо консольное, либо оконное, либо веб-и т. д. затем они создают свой собственный пул потоков или используют существующий?

3) где глобальная очередь находится в пуле потоков или где-то еще?где находится локальная очередь?
сколько глобальных очередей и сколько локальных очередей, которые зависят от фабрики, подсчитывают это.?
4) Когда задача переходит в локальную очередь.? Каждая работа, которую рабочий поток берет из глобальной очереди, сначала добавляет в локальную очередь назначение рабочему потоку в пуле потоков или она выполняется непосредственно рабочим потоком.?
5) Почему кража работы выполняется из глобальной очереди в FIFO и локальной очереди в порядке LIFO, каковы преимущества?

Первые два вопроса меня очень смутили.Пожалуйста, помогите?..

Что я уже пробовал:

Картина, которая возникает у меня в голове после прочтения пары статей, такова.
для 4-х основных машин. здесь GQ= & gt;глобальная очередь

Базовый-1 Базовый-2 Базовый-3 Базовый-4
--- --------------- --- ---------- ----------- -----------
|Г| -------------------
|Вопрос|
--- /Пул потоков |=== = = = = >аналогичная структура.
-------------------
/ Рабочий поток-1..n|
--------------------
/ Рабочий поток имеет|
/ локальная очередь |
--------------------
Each core have own thread pool and thread pool have worker thread and worker thread have local queue which pick up task from global queue.
<b>That's my imagination.</b>

1 Ответов

Рейтинг:
6

Jon McKee

1) пул потоков - это просто удобный менеджер потоков. Он увеличивает и уменьшает количество используемых потоков в зависимости от нагрузки и может повторно использовать потоки, чтобы свести на нет некоторые накладные расходы. Он также поддерживает работу неработающих потоков для дальнейшего повышения производительности при повторных быстро выполняемых задачах. Максимальное количество потоков устанавливается на ThreadPool объект. Абсолютный предел зависит от используемого оборудования - в основном от доступного пространства стека. Для большинства 32-битных систем вы, вероятно, могли бы выжать около 2000.

2) каждый процесс имеет пул потоков по умолчанию. Вы можете сделать больше, если вам нужны пулы с разными атрибутами. Однако ни одна ситуация сразу не приходит на ум, когда это было бы полезно. На самом деле ThreadPool является static в C# потому что, если вы не знаете, как написать свой собственный пул потоков, вы, вероятно, не должны использовать больше. Если вам нужно больше холостых потоков, вы можете установить это на ThreadPool объект.

3-4) глобальная очередь предназначена для процесса. Локальная очередь предназначена для рабочих потоков. Например, процесс помещает Task1 в свою глобальную очередь, которая затем выполняется WorkerThread1. Затем эта задача порождает Task2. Эта задача 2 помещается в локальную очередь WorkerThread1. Когда WorkerThread1 закончен, он извлекает самую последнюю задачу (LIFO) из своей локальной очереди. Это происходит потому, что у этой задачи есть самый высокий шанс все еще быть кэшированной рабочим потоком. Когда локальная очередь пуста, рабочий поток проверяет глобальную очередь.

5) процесс, описанный выше, не является кражей работы. Это просто нормальная работа. Кража работы - это когда рабочий поток после проверки глобальной очереди проверяет локальные очереди других рабочих потоков. Он сначала вытягивает задачи из конца списка (стиль FIFO), потому что это уменьшает конкуренцию с рабочим потоком, который фактически владеет этой локальной очередью, поскольку локальный поток вытягивает задачи из передней части списка (стиль LIFO). Если оптимизация кэша действительно вступит в игру, это также гарантирует, что кража работы берет на себя задачи, которые с большей вероятностью не будут кэшироваться локальным потоком, владеющим очередью.

Другие заметки: Одним из больших преимуществ TPL является то, что вам не нужно знать все эти вещи. Тем не менее, я могу понять любопытство - это единственная причина, по которой я знаю все это, ха-ха =)

Правка: я забыл ответить на один из ваших вопросов! То ThreadPool класс-это то, что управляет глобальной очередью, локальными очередями и позволяет красть работу.

Ваша фотография была бы более точной:

| Process | -> Queues -> |  ThreadPool  |
-----------              ----------------
                         | Global Queue | <- ThreadPool has one
                         ----------------
                         |    Worker    | <- ThreadPool can have multiple
                         |--------------|
                         || Local Queue|| <- Each Worker has one
                         ----------------


Er. Dinesh Sharma

Спасибо Макки...за то, что дал мне какое-то направление для вышеописанных недостающих пробелов.
Так вот что я понимаю.
1) означает, что каждое приложение (процесс) имеет собственный пул потоков. если мы запускаем десять приложений (процессов), то существует 10 пулов потоков.
Разве я не прав?
2) существует ли какая-либо роль ядра процессора системы в пуле потоков?

Jon McKee

1) Да. ThreadPool - это просто класс, который управляет фоновыми потоками.

2) Сорта? Я никогда не видел внутреннего устройства, но полагаю, что ThreadPool использует класс Thread вместо того, чтобы заново изобретать колесо. Поток - это просто легкий процесс. Это отдельный путь выполнения от пути выполнения по умолчанию (обычно называемого основным потоком), автоматически запускаемого основным процессом. Эти пути выполнения должны выполняться процессором. Ядра могут запускать несколько потоков - это зависит от технологии. Если я правильно помню, i5 с 4 ядрами может одновременно запускать 4 потока (2 на ядро ​​с гиперпоточностью). Есть много других вещей, которые вступают в игру с этим, хотя, например, переключение контекста между потоками, когда есть задержка, такая как ввод-вывод, что означает, что вы можете эффективно запускать больше.

Правка: неправильно прочитанная часть №2, исправленный ответ соответственно.