Я совершенно ничего не понимаю о внутренней работе операционной системы, но могу более или менее догадаться о приблизительном поведении многих функций. Одна вещь, которую я не могу понять, это многозадачность.
Теоретически, операционная система управляет временем, в соответствии с процессором, с небольшими интервалами, для запуска различных программ. Но не ясно, как это действительно работает.
Скажем, операционная система хочет запустить мою программу. Машинный код загружается где-то в ОЗУ, начиная с определенного адреса. Я думаю, что тогда следует выполнить переход по этому адресу, чтобы мой код мог выполняться. Но таким образом ОС не может восстановить контроль, пока я не отскочу назад.
В принципе, я могу представить только два способа сделать эту работу, но ни один из них не кажется действительно подходящим:
Операционная система может читать машинные инструкции, которые я хочу выполнить, и эмулировать их вместо непосредственного выполнения. Я намеренно расплывчато, так как я не знаю, как это будет работать, но похоже, что это значительно замедлит программу.
Кроме того, операционная система может подождать, пока я не сделаю системный вызов. В этот момент он восстанавливает контроль и может проверить, как долго я бегаю, и делиться своими делами. Это может сработать, но это кажется ненадежным, поскольку я мог бы сделать длинный расчет, который не включает системные вызовы и повесил все на некоторое время.
Таким образом, кажется, ни один механизм не будет работать очень хорошо. Как на самом деле выполняется многозадачность?
источник
interrupt
INT
инструкцию. Что-то все еще таинственно для меняОтветы:
ОС программирует таймер на каждые несколько микросекунд (или миллисекунд, в зависимости от скорости системы). Этот таймер вызывает аппаратное прерывание, которое заставляет ЦП останавливать все, что он в данный момент делает, сбрасывает все свое содержимое в стек и обрабатывает процедуру прерывания, указанную по адресу, предоставленному контроллером прерывания. Эта подпрограмма может проверять стек и различные другие переменные, чтобы принять решение о том, какой запущенный процесс затем должен быть снова введен в действие. Если это тот же процесс, процедура прерывания просто возвращается. Если он другой, соответствующие части стека сохраняются, а затем заменяются содержимым ранее прерванного процесса, поэтому, когда процедура прерывания возвращается, этот процесс продолжается. Кроме того, что прошло некоторое время,
Это (для современных процессоров) ОЧЕНЬ ОЧЕНЬ упрощенная версия того, что происходит, но это объясняет принцип. В дополнение к этим управляемым ОС прерываниям, существуют также прерывания, вызванные внешними событиями (мышь, клавиатура, последовательные порты, сетевые порты и т. Д.), Которые обрабатываются отдельными подпрограммами обработки прерываний, которые обычно подключаются к обработчикам событий.
Очень часто переключение процессов / задач / контекстов также основано на доступности внешних ресурсов. Обычно процесс, которому требуются данные из хранилища (то есть не в ОЗУ), помещает запрос в очередь, устанавливает обработчик событий для аппаратного прерывания, указывающего, что запрос был обработан, и затем передает управление планировщику задач (так как нет точка в ожидании). Опять же, очень упрощенное описание того, что на самом деле происходит, но оно должно служить целям этого ответа.
источник
Это зависит от системы к системе.
В непревзойденных многозадачных системах (таких как оригинальный Oberon или оригинальный Apple Macintosh) операционная система периодически «опрашивает» все задачи, предоставляя им возможность выполнять работу. Ожидается, что задачи будут хорошо играть вместе. Если им просто нужно немного поработать, они делают это и возвращаются в ОС. Если у одной задачи есть БОЛЬШОЙ кусок, ожидается, что он разбит его на маленькие кусочки и будет обрабатывать один маленький кусочек при каждом опросе.
Аппаратные прерывания (завершение работы DMA на диске, прерывания последовательного порта, что у вас есть) приводят к выполнению подпрограмм прерывания. Эти подпрограммы прерывания могут, в свою очередь, уведомлять задачи о работе, которая должна быть выполнена, когда задача в следующий раз запускается.
В невыполняющих многозадачных системах возникновение или отсутствие прерывания не влияет на то, какая задача выполняется после завершения процедуры прерывания.
В вытесняющих многозадачных системах подпрограмма прерывания может вызвать изменение расписания. В традиционной многозадачной системе с циклическим циклическим прерыванием периодическое прерывание по таймеру делает именно это. Прерывание таймера срабатывает, подпрограмма прерывания таймера делает некоторую чёрную магию, чтобы заставить инструкцию возврата из прерывания вернуться к приоритетному расписанию операционной системы, а не к выполняющейся задаче, отводя процессор от текущей задачи, и (ВОЗМОЖНО ) отдавая это другому заданию. Если никакая другая задача не готова к выполнению в этот момент, текущая задача снова получит процессор, потеряв лишь некоторое время.
Упреждающая многозадачность может вызвать много проблем. Весь этот раздражающий материал о мьютексах и критических секциях, смертельных объятиях и инверсиях приоритетов и ... обнаруживается, когда процессор отнимается у вас без предупреждения. Вы должны использовать все эти вещи, чтобы сообщить операционной системе, что вы находитесь в процессе смешивания нитроглицерина и отнимания у вас процессора прямо сейчас, что может привести к большой дыре для курения в середине этажа серверной комнаты.
источник
Аппаратное обеспечение компьютера может генерировать прерывания по таймеру для прерывания процессора. Таким образом, на основе алгоритма планирования, используемого операционной системой, ОС может решить, продолжать ли выполнение текущей программы или переключение контекста на другую, готовую к запуску.
источник