Давайте разберем это на несколько частей ..
Таймеры
Многие современные ядра "тикают".Это означает (вместо того, чтобы иметь таймер, генерирующий IRQ на фиксированной частоте), таймер / ы работают в режиме «один выстрел» (один IRQ, генерируемый, когда истекает запрошенное время), и ядро определяет, когда необходимо следующее событие временипроисходит и устанавливает время для генерации IRQ, когда должно произойти следующее время.Этот подход имеет преимущества для управления питанием (нет ненужных прерываний IRQ, которые в противном случае приводят к простоям CPU / s из состояний энергосбережения) и преимущества для точности (например, если таймер работает на тактовой частоте 1 МГц, тогда ядро может запросить таймер для IRQ.с 1 микросекундной гранулярностью без накладных расходов в 1 миллион IRQ, которые потребовались бы для получения той же гранулярности с фиксированной частотой).Конечно, существует много применений для таймеров (тайм-ауты сети, sleep () и т. Д.), Поэтому «самое быстрое событие времени» может не иметь ничего общего с тем, когда текущая задача использует свой временной интервал.
Примечание: Современное оборудование может также иметь таймер / с, работающий на частоте ЦП (например, «Режим крайнего срока TSC» в локальном таймере APIC последних чипов 80x86), где «тиканье» означает, что вы обычно можете получить точность «лучше чем 1 наносекунда».
Конечно, для «тиканья», потому что ядро устанавливает новый счетчик для таймера (для нового «самого быстрого» временного события) каждый раз, когда происходит IRQ, планировщик чрезвычайно легко использоватьЛюбая длина отрезка времени, которая ему нравится, по любой причине.
Причины переключения задач
Для реальной ОС большинство переключений задач вызваны тем, что текущая задача должнаждать чего-либо (ждать данных из файла или пространства подкачки, ждать пакета из сети, ждать, пока буфер не станет «не заполненным», чтобы он мог поместить в него больше данных, wДля получения данных из другого процесса.канал или сообщение, ожидание освобождения мьютекса и т. д.);или потому что что-то, что ждала задача, произошло.Таймер планировщика используется только для того, чтобы обеспечить верхнюю границу для вредоносных загрузок ЦП и редких задач, связанных с ЦП, которым не нужно ничего ждать.
Обратите внимание, что (для чего-то вроде циклического планировщика, использующего фиксированную частоту)таймер) это вызывает проблемы.Например, если каждой задаче дается интервал времени 10 мс, но переключение задачи должно произойти через 4,321 мс, поскольку задача должна чего-то ждать, тогда вы не хотите тратить 5,679 мс времени процессора на ожидание следующеготаймер IRQ, но вы также не хотите давать следующему заданию 5,679 мс вместо 10 мс, которые он должен был получить.Вместо этого вы можете настроить таймер на генерацию IRQ каждые 1 мс, чтобы время следующей задачи можно было округлить до ближайшего (например, дать следующей задаче 9,679 мс вместо 5,679 мс и вместо 10 мс).Однако это увеличивает накладные расходы на обработку ненужных IRQ и снижает производительность и является одной из причин использования «без галочек» (чтобы избавиться от ненужных IRQ и уменьшить ошибку «округление до ближайшего»).
Задержка в циклическом циклическом интервале
Для планировщиков циклического перебора "задержка под нагрузкой" - шутка, и это не имеет никакого отношения к таймеру.Проблема состоит в том, что задача, для которой требуется низкая задержка, должна ждать неизвестного числа других задач, чтобы получить свою очередь.Например, если есть 200 задач, которые, как предполагается, получают до 10 мс процессорного времени каждая, и каждая из этих 200 задач фактически потребляет в среднем 5 мс процессорного времени каждая (потому что большинство блокируют / ждут чего-то до своего интервала временизаканчивается);тогда задаче «с низкой задержкой» может потребоваться до 1000 мс, прежде чем она получит процессорное время.Изменение интервала таймера с 10 мс до 5 мс может означать, что эти 200 задач потребляют в среднем по 4 мс процессорного времени каждая, а задача «с низкой задержкой» все еще должна ждать 800 мс.
Примечание: теоретически;Один из способов избежать этой проблемы - поместить задачу, которая недавно перестала ждать, в заголовок списка «какая задача получает время ЦП в следующий раз», чтобы она получала время ЦП, как только текущая выполняемая задача заканчивает использовать ЦП.На практике это позволяет задаче преднамеренно увеличить нагрузку на процессор за счет очень короткого ожидания в конце каждого временного интервала, чтобы быстро получить новый новый интервал времени, и с помощью пары взаимодействующих задач вредоносное программное обеспечение может гарантировать, что никакие другие задачи не получат никакого процессоравремя.По этой причине вы никогда не ставите задачу во главе списка «какая задача получает время ЦП в следующий раз».
Приоритеты задач
Что если вы назначилиприоритет каждой задачи, чтобы планировщик знал, насколько важна задача?
В этом случае, если задаче требуется низкая задержка, вы можете указать планировщику, что она имеет высокий приоритет, и когда задачи перестают ждатьчто-то (например, ожидание нажатия клавиши пользователем, ожидание прибытия сетевого пакета и т. д.) планировщик может сравнить приоритет задачи с приоритетом выполняющейся в данный момент задачи, понять, что задача «с низкой задержкой» имеет более высокий приоритет, инемедленно переключайтесь между заданиями (не дожидаясь, пока их очередь будет 200 других).В этом случае задержка может быть «почти нулевой», даже когда ОС находится под большой нагрузкой.
Это создает потенциальную проблему (высокоприоритетные нагрузки на ЦП), но эту проблему тривиально устранить другими способами.(например, если высокоприоритетная задача занимает слишком много времени ЦП без выполнения каких-либо действий, которые могут привести к ее блокировке / ожиданию, либо уменьшите ее приоритет, либо прекратите ее как «не отвечающую»).
Если вы посмотрите на планировщики вВ современных операционных системах вы обнаружите, что ни одна из них сама по себе не использует Round Robin.Часто «круговой прием» используется только тогда, когда 2 или более задач имеют одинаковый приоритет (но это не очень хорошая идея, и я расскажу вам почему в следующем разделе).Кроме того, большинство операционных систем предоставляют несколько политик планирования (например, может быть, ОС может предоставлять мягкую политику планирования в реальном времени, которая использует «самый ранний срок в первую очередь», плюс политика планирования с «малой задержкой», которая использует «выигрыши с наивысшим приоритетом плюс плюс»)приоритет общего использования «политика, которая может использовать» определяет количество временных интервалов », плюс политика« простоя задачи », которая может использовать« приоритет определяет размер временного интервала »);где планировщик отдает время ЦП задачам с наилучшей политикой (например, если есть задача в реальном времени, которая требует ЦП, то незанятые задачи даже не рассматриваются) и имеет разные правила для каждой политики.
Среднее время выполнения задания
Предположим, что есть только один ЦП;что одна задача хочет обработать сетевой пакет и отправить ответ, и эта обработка займет 50 мс процессорного времени;и в то же время другой процесс хочет обработать нажатие клавиши от пользователя, и соответствующая обработка также займет 50 мс.Если планировщик переключается между задачами каждые 1 мс, то первая задача завершится через 99 мс, а вторая задача завершится через 100 мс, а среднее время, необходимое для выполнения задачи, составит 99,5 мс.Однако, если планировщик не переключается между задачами через какое-то время (например, просто позволяет текущей запущенной задаче работать, пока она не завершит свою работу и не дождется следующей задачи), то первая задача завершится через 50 мс, ивторая задача завершится через 100 мс, а среднее время, необходимое для выполнения задачи, составит 75 мс (вместо 99,5 мс).
Другими словами, для задач, управляемых событиями (например, где-топроисходит, и задача выполняется во время обработки, затем ждет следующего события), циклический планировщик (переключение задач с фиксированной частотой) может сделать среднее время завершения почти на 50% хуже, чем в большинстве других алгоритмов планирования (например, «самое раннее время начала сначала»"," выигрывает самый высокий приоритет ", ...).
Выводы
a) Да, вполне возможно отрегулировать длину временного среза, либо с помощью схемы без тиканья, либо с помощью различных значений для "IRQ на временной интервал" конструкции таймера с фиксированной частотой.
b) Для планировщиков циклического перебора регулировка длины временного интервала не сильно поможет задержке (особенно под нагрузкой).
c) Вводные курсы являются вводными - они предназначены для предоставления информации, которая (в какой-то моментв будущем) поможет вам изучить более продвинутые концепции (и не предназначены для предоставления информации, которая используется «как есть» на практике).Планирование циклического перебора - одна из вещей, которые часто вводят во введение, отчасти потому, что они просты, но отчасти потому, что они естественным образом приводят к дискуссии о том, почему они сосут и как избежать проблем (что является началом большинствапередовые концепции).