4

Насколько я могу сказать, оба используют:

  • Многоуровневая очередь обратной связи
  • Приоритетные уровни (различный диапазон)
  • Оба управляют потоками, а не процессом

Но каковы большие различия?

3 ответа3

6

В соответствии с приоритетами планирования на MSDN:

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

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

  • Приоритетный класс его процесса
  • Уровень приоритета потока в пределах класса приоритета его процесса

Я полагаю, что этот планировщик потока описывает алгоритм, называемый многоуровневой очередью, который является гораздо более простым алгоритмом планирования, чем многоуровневая очередь обратной связи. Обратите внимание, что планировщик процессов Windows использует многоуровневую очередь обратной связи, согласно Википедии. Начиная с Windows 7 и Windows Server 2008 R2, существует также планирование в режиме пользователя, которое позволяет процессам управлять своим собственным планированием потоков.

Как уже упоминалось, Linux рассматривает процессы и потоки одинаково с точки зрения планирования. Планирование процессов / потоков в Linux настраивается, существуют различные алгоритмы планирования, и некоторые из них можно настроить путем перекомпиляции ядра:

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

В дополнение к алгоритму планирования существуют также политики планировщика: SCHED_FIFO, SCHED_BATCH, SCHED_IDLE, SCHED_OTHER и SCHED_RR; который может быть изменен во время выполнения и описывает тип рабочей нагрузки, которую имеет процесс.

Текущий планировщик по умолчанию, «Полностью честный планировщик», использует красно-черное дерево для обеспечения честности планирования. Изнутри полностью честный планировщик Linux 2.6:

Основная идея CFS заключается в поддержании баланса (справедливости) в предоставлении процессорного времени для выполнения задач. Это означает, что процессам должно быть предоставлено достаточное количество процессора. Когда время для задач выходит из равновесия (это означает, что одной или нескольким задачам не предоставляется достаточное количество времени по сравнению с другими), тогда этим несбалансированным задачам следует дать время для выполнения.

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

Но вместо того, чтобы поддерживать задачи в очереди выполнения, как это делалось в предыдущих планировщиках Linux, CFS поддерживает упорядоченное по времени красно-черное дерево (см. Рисунок 1). Красно-черное дерево - это дерево с парой интересных и полезных свойств. Во-первых, это самобалансировка, что означает, что ни один путь в дереве никогда не будет более чем в два раза длиннее любого другого. Во-вторых, операции над деревом происходят за O (log n) (где n - количество узлов в дереве). Это означает, что вы можете вставить или удалить задачу быстро и эффективно.

Итак, основные отличия:

Windows

  • Планирование процессов с использованием многоуровневой очереди обратной связи + планирование потоков с использованием многоуровневой очереди. Планировщик потока просто выбирает поток с наивысшим приоритетом, планировщик процесса работает умнее и использует очередь обратной связи.

Linux

  • Унифицированный планировщик процессов и потоков, настраиваемый, по умолчанию использует CFS. Планировщик использует показатель справедливости и использует приоритет, чтобы искажать распределение ЦП для процессов с более высоким приоритетом.
1

C2H5OH, с чего бы вы сказали, что нет документации по внутренним компонентам Windows, когда все доступно? Бьет меня ... Вы можете прочитать большинство основ здесь, http://msdn.microsoft.com/en-us/library/windows/desktop/ms684259(v=vs.85).aspx

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

1

Если вы обращаетесь к планировщику ядра (а не к планировщику периодических задач, как предлагают некоторые комментарии), в Linux это довольно просто: с точки зрения планирования Linux не делает различий между потоками и процессами. С точки зрения ядра, они просто единицы планирования; Разница зависит от веса переключения контекста. Иногда это называют потоковой моделью один-к-одному.

Поскольку информации о внутренностях Windows меньше, мало что можно сказать. Тем не менее, Windows исторически различала процессы и потоки, поэтому более вероятно, что они рассматриваются по-разному с точки зрения планирования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .