Пулы потоков и переключение контекста (задачи)?

Это довольно общий вопрос информатики, не относящийся к какой-либо ОС или фреймворку.

Поэтому меня немного смущают накладные расходы, связанные с переключением задач в пуле потоков. Во многих случаях не имеет смысла выделять каждому заданию отдельный поток (мы не хотим создавать слишком много аппаратных потоков), поэтому вместо этого мы помещаем эти задания в задачи, выполнение которых можно запланировать в потоке. Мы настраиваем пул потоков, а затем динамически распределяем задачи для выполнения в потоке, взятом из пула потоков.

Я просто немного запутался (не могу найти подробный ответ) в накладных расходах, связанных с переключением задач в определенном потоке (в пуле потоков). В статье DrDobbs (источник ниже) говорится, что это так, но мне нужен более подробный ответ на то, что на самом деле происходит (источник, который можно цитировать, был бы фантастическим :)).

По определению SomeWork должен быть поставлен в очередь в пуле, а затем запущен в другом потоке, отличном от исходного. Это означает, что мы обязательно несем накладные расходы на очередность плюс переключение контекста только для того, чтобы переместить работу в пул. Если нам нужно передать ответ обратно в исходный поток, например, через сообщение или Future или что-то подобное, мы будем использовать для этого другое переключение контекста.

Источник: http://www.drdobbs.com/parallel/use-thread-pools-correctly-keep-tasks-sh/216500409?pgno=1

Какие компоненты потока на самом деле переключаются? Сам поток на самом деле не переключается, а только данные, относящиеся к потоку. Какие накладные расходы связаны с этим (больше, меньше или столько же)?


person smjpl    schedule 10.10.2014    source источник


Ответы (2)


давайте проясним здесь первые 5 ключевых понятий, а затем обсудим, как они коррелируют в контексте пула потоков:

  • поток: В кратком резюме его можно описать как контекст выполнения программы, заданный исполняемым кодом, данными в реестрах процессора и стеком. при создании потока ему назначается код, который должен выполняться в контексте этого потока. В каждом цикле процессора у потока есть инструкция для выполнения, а данные в реестрах процессора и стеке находятся в заданном состоянии.

  • задача: представляет единицу работы. Это код, который назначается потоку для выполнения.

  • переключение контекста (из Википедии): это процесс сохранения и восстановления состояния (контекста) потока, чтобы выполнение можно было возобновить с той же точки в более позднее время. Это позволяет нескольким процессам совместно использовать один ЦП и является важной функцией многозадачной операционной системы. Что составляет контекст, как объяснялось выше, так это исполняемый код, реестры процессора и стек.

Что такое переключение контекста, так это поток. Задача представляет собой только часть работы, которая может быть назначена потоку для выполнения. В данный момент поток может выполнять задачу.

  • Пул потоков (из Википедии): в компьютерном программировании пул потоков — это место, где создается несколько потоков для выполнения ряда задач, которые обычно организованы в очередь.

  • Очередь пула потоков: размещаются задачи для выполнения потоками в пуле. Эта структура данных представляет собой общий участок памяти, в котором потоки могут конкурировать за постановку в очередь/изъятие из очереди, что может привести к конфликтам в сценариях с высокой нагрузкой.

Иллюстрация сценария использования пула потоков:

  • В вашей программе (в конечном итоге работающей в основном потоке) вы создаете задачу и планируете ее выполнение в пуле потоков.
  • Задача поставлена ​​в очередь в очереди пула потоков.
  • Когда поток из пула выполняется, он удаляет задачу из пула и начинает ее выполнять.
  • Если нет свободного процессора для выполнения потока из пула, операционная система в какой-то момент (в зависимости от политики планировщика потоков и приоритетов потоков) остановит выполнение потока, переключив контекст на другой поток.

операционная система может остановить выполнение потока в любое время, переключив контекст на другой поток, вернув последний для продолжения с того места, где он остановился.

Накладные расходы на переключение контекста увеличиваются, когда количество активных потоков, конкурирующих за процессор, увеличивается. Таким образом, в идеале пул потоков пытается использовать минимально необходимые потоки, чтобы занять все доступные процессоры в машине.

Если в ваших задачах нет кода, который где-то блокируется, переключение контекста сводится к минимуму, потому что оно использует не больше потоков, чем доступный процессор на машине.

Конечно, если у вас только одно ядро, ваш основной поток и пул потоков будут конкурировать за один и тот же процессор.

person Diogo Machado    schedule 17.10.2014

В статье, вероятно, речь идет о случае, когда работа размещена в пуле и ожидается результат по ней. Запуск задачи в пуле потоков в целом не требует переключения контекста.

Представьте себе очередь из 1000 рабочих элементов. Поток пула потоков будет выполнять их один за другим. И все это без единого переключения контекста между ними.

Переключение происходит до ожидания/блокировки.

person usr    schedule 10.10.2014
comment
Это начинает иметь больше смысла (вроде). Так что поток пула потоков фактически не переключает контекст. В статье говорится, что существует переключатель контекста для постановки задачи в очередь (т.е. перемещение задачи в пул потоков). Вы говорите то же самое? Пул потоков не переключает контекст, но задача делает? то есть переместить задачу из потока, который создал задачу, в поток, который будет запускать задачу - person smjpl; 10.10.2014
comment
Задача — это просто структура данных (указатель на функцию). Очередь — это тоже просто данные. Ядро не участвует в постановке задач в очередь или их выполнении. Нет переключателя. - person usr; 10.10.2014
comment
Итак, почему нам нужно убедиться, что задачи достаточно велики, если нет накладных расходов, связанных с очередями и выполнением задачи в пуле потоков? Из статьи (стр. 1): С другой стороны, задачи не должны быть слишком короткими, потому что выполнение работы в качестве задачи пула потоков сопряжено с реальными затратами. - person smjpl; 10.10.2014
comment
Существуют накладные расходы, связанные с работой по обработке. Блокированные операции и другой код инфраструктуры. Это просто немного. Представьте себе выполнение задач только с одной инструкцией. Очевидно, что накладные расходы будут преобладать. - person usr; 10.10.2014