Компьютеры первых поколений выполняли только одну задачу. Если программа зависала, система переставала реагировать даже на клавиатуру. Чтобы этого не происходило, инженеры придумали прерывания. Контроллер прерываний принимает сигналы от устройств и передаёт их процессору. Процессор останавливает текущую задачу, обрабатывает событие и возвращается обратно. Так появилась возможность реагировать на внешние сигналы. Прерывания бывают внешними и внутренними: первые приходят от устройств, вторые возникают внутри процессора, например при делении на ноль или системном вызове. Чтобы защитить важные участки кода, система может временно блокировать менее важные прерывания, и это называется маскированием.
Прерывания решили проблему отклика, но не распределения времени. Когда на компьютере работало несколько программ, одна могла занять процессор полностью. Для этого в систему добавили таймер. Таймер подаёт регулярные сигналы, и планировщик проверяет, какой процесс должен выполняться дальше. Процессорное время делится на маленькие куски — кванты, и за счёт быстрого переключения создаётся иллюзия одновременной работы. Системные часы ведут отсчёт реального времени, синхронизируют работу процессов и дают точку отсчёта для планировщика.
Оставалась ещё одна задача — расставить приоритеты. Музыка и видео должны идти без задержек, а архивация или проверка текста могут подождать. Поэтому интерактивные процессы получают высокий приоритет и чаще получают процессор. Фоновые задачи выполняются в паузах. Планировщик меняет приоритеты на ходу: если процесс долго ждёт, его приоритет повышается, если он слишком активно грузит CPU, его понижают. В разных системах используются разные политики. В Linux это CFS, который делит процессорное время справедливо, и отдельные классы для реального времени — SCHED_FIFO и SCHED_RR. В Windows процессы тоже разделены на классы, и приоритеты работают похожим образом.
На практике это легко увидеть. В Windows при прослушивании музыки и одновременной распаковке архива плеер получает более высокий приоритет, а архиватор работает в обычном режиме. Музыка играет ровно, архиватор загружает процессор, но не мешает звуку. В «Диспетчере задач» на вкладке «Подробности» можно открыть контекстное меню и изменить приоритет. Если поставить архиватору «Высокий приоритет», музыка начнёт заикаться. Если назначить «Низкий», она будет звучать без сбоев, а архиватор станет работать медленнее. В Linux то же самое можно проверить с помощью nice и renice. Если запустить архиватор с nice=15, он получит низкий приоритет и будет выполняться только в паузы, а плеер с nice=0 продолжит звучать без задержек.
Вместе эти три механизма — прерывания, таймер и приоритеты — делают возможной многозадачность. Контроллер прерываний обеспечивает реакцию на события, таймер делит процессорное время на равные части, приоритеты определяют порядок задач. Всё это работает в связке и обеспечивает отзывчивость операционной системы. Для администрирования и эксплуатации добавляются инструменты управления: маскирование прерываний, команды nice, renice и chrt в Linux, настройка приоритетов в Windows, а в контейнерах и виртуальных машинах — cgroups и квоты, которые ограничивают использование CPU. Всё это позволяет тонко управлять нагрузкой и гарантировать, что важные процессы получают ресурсы вовремя.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.