Почему рабочий поток CLR ThreadPool использует порядок LIFO для обработки задач из локальной очереди? - PullRequest
0 голосов
/ 24 ноября 2018

Фон:

Когда задачи планируются неработающим потоком для обработки рабочими потоками в пуле потоков, они попадают в глобальную очередь.Рабочие потоки используют эту глобальную очередь для извлечения задач для обработки в порядке FIFO («первым пришел - первым вышел»).Это имеет смысл, поскольку задача, которая была запланирована первой, должна завершиться первой.

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

[Редактировать] Источники:

  1. CLR через C #, 4-е издание Джеффри Рихтера (стр. 725)
  2. Задача MicrosoftДокументация планировщика

Вопрос:

Каково обоснование использования заказа LIFO с локальной очередью?

1 Ответ

0 голосов
/ 24 ноября 2018

Это явно упомянуто в документации Microsoft для планировщика задач :

Локальные очереди доступны по порядку «последний пришел - первым вышел» (LIFO), чтобысохранить локальность кэша и уменьшить конкуренцию.

Джо Даффи также обсуждает это подробнее здесь .Он говорит:

1) Выполнив работу, которая в последний раз помещается в очередь в порядке LIFO, существует вероятность того, что связанная с ней память все еще будет горячей в кэше.

2) При краже в порядке FIFO есть вероятность, что будет похищен больший «кусок» работы (возможно, уменьшая вероятность необходимости дополнительных краж).Причина этого заключается в том, что многие рабочие кражи рабочих нагрузок носят характер «разделяй и властвуй»;в таких случаях рекурсия образует дерево, а самые старые элементы в очереди располагаются ближе к корню;следовательно, кража одного из них неявным образом также крадет (потенциально) большое поддерево вычислений, которые развернутся, как только этот кусок работы будет украден и запущен.

...