Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция2.о.с..docx
Скачиваний:
1
Добавлен:
19.11.2019
Размер:
21.38 Кб
Скачать

Взаимодействие процессора и ОС

Многозадачность

Многозадачным называется такой режим работы компьютера, когда одновременно на нем может выполняться не одна программа, а много. Посмотрим, какие требования в связи с этим возникают, и как они выполняются.

Переключение между задачами

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

Первый (добровольный) вариант использовался в DOS и ранних Windows. ОС при запуске программы передавала ей управление и теряла над ней контроль. Затем программа, либо закончившись, либо обратившись к устройству, либо вообще галантно, без собственной причины отдавала контроль обратно ОС (чтоб можно было одновременно еще и другим программам работать). Дальше ОС, сделав свои дела, передавала управление либо обратно этой, либо другой запущенной программе.

Надеяться на корректность поведения программ при разработке ОС неестественно, поэтому как только появились для этого аппаратные возможности, Microsoft перешла на второй способ переключения программ -- давно принятый в мире -- автоматический с разделением времени.

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

Затем и эта вторая задача будет прервана, а управление когда-нибудь будет передано первой задаче. Таким образом, для человека все выглядит как одновременное выполнение многих задач. Ничто не мешает при этом одной задаче быть, например, рабочим столом и принимать команды пользователя, а другой,-- допустим, веб-сервером.

Виртуальная память

Виртуальной адресацией называется такое обращение к памяти, когда указываемый в программе адрес отличается от физического адреса, к которому на самом деле происходит обращение. Физический адрес при этом вычисляется процессором из виртуального при помощи некоторого алгоритма и некоторых таблиц в памяти, предоставляемых ОС.

Виртуализация обращения к памяти нужна для того, чтобы а) изолировать задачи друг от друга; б) обеспечить независимость программного кода от реального размещения программы в памяти; в) использовать подкачку.

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

Обратная задача обеспечения доступа двух и более задач к одной области данных легко реализуется через предоставление обеим задачам виртуальных адресов ссылающихся на один и тот же реальный адрес. Изолированные от других задачи принято называть процессами; задачи, разделяющие одну область данных, принято называть потоками одного процесса.

Любая программа, кроме самых элементарных, содержит команды управления ходом выполнения программы, то есть условные и безусловные переходы, а также вызовы процедур где-то в другом месте кода. Поэтому большинство программ использует явные адреса. На самом деле, можно было бы этого избежать, если бы использовать везде относительную адресацию (то есть, например, перейти на 200 байтов вперед и т.п.), однако реализовать это сложнее, а иногда и невозможно (см. системные вызовы далее).

Если бы использовались физические адреса, то одна программа, у которой по некоторому адресу должна располагаться некоторая процедура, не могла бы выполняться вместе с другой программой, которая тоже как-то использует этот адрес. Виртуализация обращения к памяти приводит к тому, что программа грузится в произвольные физические адреса в памяти, а таблицы для вычисления физического адреса из виртуального содержат те физические адреса, в которые загружена программа.

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

Такой механизм называется подкачкой. Благодаря ему, одновременно может выполняться совокупность программ, требующая суммарно больше памяти, чем доступная оперативная память. Правда, существенно медленнее.

Системные вызовы

Обеспечение многозадачности - не единственная роль ОС. Она по-прежнему предоставляет доступ к устройствам, запуск одной программой других и др. действия. Для этого часть кода операционной системы должна быть доступна выполняющимся программам, а это значит, полностью изолировать некоторые адреса компонентов ОС от других задач нельзя.

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

В принципе, оба эти условия можно было бы удовлетворить исполнением системных функций отдельным процессом. Однако, во-первых, переключение между процессами требует значительно больше времени, чем прямой вызов процессом кода операционной системы. И, во-вторых, при возникновении особых ситуаций, бывает, что эти особые ситуации должен обрабатывать сам процесс, бывает, что этот процесс следует принудительно завершить, поэтому, опять-таки, удобнее при выполнении системных вызовов оставаться в рамках вызвавшего процесса.

Поэтому, чтобы реализовать ограниченный доступ к памяти, используемой ОС, используется механизм привилегий. То есть, мы должны ограничить некоторые возможности обычных программ. Чтобы отличать ОС от обычной задачи, процессор должен где-то у себя хранить информацию о текущем уровне привилегий и не давать его изменять обычным программам.

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

Первое осуществляется процессором без помощи ОС. Второе и третье -- добавлением поля привилегий доступа в записи таблиц для перевода виртуальных адресов в реальные. Если текущий уровень привилегий слабее уровня привилегий строчки в таблице перевода виртуального адреса в реальный, процессор устраивает себе прерывание для обработки этой особой ситуации, которое опять-таки обрабатывает процедура, предоставленная ОС. Таким образом, и безопасность ОС обеспечивается, и ОС по-прежнему предоставляет код для выполнения системных операций.

В UNIX используется два уровня привилегий - суперюзер (система) и обычная программа. Процессоры Intel (начиная, с i286) допускают таких уровней 4,-- для ядра безопасности ОС, остальной ОС, систем, работающих со своим набором прав (например, СУБД) и остальных программ. Используется ли это в Windows, я не знаю, но почему бы и нет.