Реальность такова, что программное обеспечение не имеет ни малейшего представления, сколько времени это займет - мой ЦП работает с «номинальной скоростью», отличной от вашего ЦП, и наши ЦП меняют свою скорость по соображениям управления питанием, а также скорость программного обеспечения, выполняемогона оба наших процессора влияют такие вещи, как то, что делают другие процессоры (особенно для SMT / гиперпоточности) и что другие устройства делают в данный момент (их влияние на кеши, пропускную способность разделяемой памяти и т. д.);и программное обеспечение не может предсказать будущее (например, угадать, когда произойдет IRQ, потребуется некоторое время и нарушить содержимое кэша, угадать, когда чтение из памяти займет 10 раз дольше, потому что произошла ошибка в один бит, которую ECC необходимо исправить,угадайте, когда процессор нагреется и уменьшит скорость, чтобы избежать таяния и т. д.).Можно записывать такие вещи, как «время начала, время всплеска и время окончания», как это происходит (для создания исторических данных из прошлого, которые можно проанализировать), но обычно эти вещи можно увидеть только в сфабрикованных академических упражнениях, которые не имеют ничего общего среальность.
Примечание: я не говорю, что сфабрикованные академические упражнения плохие - это полезный инструмент, помогающий изучить основную теорию, прежде чем перейти к более продвинутой (и более реалистичной) теории.
Вместо;для неперекачивающего планировщика задачи не пытаются сообщить планировщику, сколько времени, по их мнению, они могут занять - задача не может знать эту информацию, и планировщик не может ничего сделать с этой информацией (например, без упреждающегопланировщик не может выгрузить задачу, если она занимает больше времени, чем предполагалось).Для не вытесняющего планировщика;задача просто выполняется до тех пор, пока она не вызовет функцию ядра, которая ожидает чего-то (например, read()
, которая ожидает данные с диска или сети, sleep()
, которая ожидает время для передачи и т. д.) и когда это произойдет, функция ядра, которая была вызваназаканчивает тем, что сообщает планировщику, что задача находится в ожидании и ей не нужен процессор, и планировщик находит другую задачу для запуска, которая может использовать процессор;и если задача никогда не вызывает функцию ядра, которая ожидает чего-то, то задача выполняется «навсегда».
Конечно, «задача выполняется вечно» может быть плохо (не только для вредоносного кода, который намеренно загружает все процессорное время)как атака типа «отказ в обслуживании», но также и для обычных задач, в которых есть ошибки), поэтому (почти?) никто не использует планировщики без вытеснения.Например;если одна задача (с более низким приоритетом) выполняет много тяжелой обработки (например, тратит часы на создание фотореалистичного изображения с использованием методов трассировки лучей), а другая задача (с более высоким приоритетом) перестает ждать (например, потому что она ждала нажатия пользователеми пользователь нажал клавишу), затем вы хотите, чтобы задача с более высоким приоритетом выгрузила задачу с более низким приоритетом "немедленно" (например, потому что большинству пользователей это не нравится, когда программное обеспечение реагирует на их действия часами).