Лекция 16 (24.12.20) - chrislvt/OS GitHub Wiki
Если обнаружено, что в тупике находится какой-то набор процессов, необходимо восстановить работоспособность системы, устранить тупик.
Не так много подходов.
Дорогое решение, так как будет потеряна вся проделанная незавершившимися процессами работа.
Для системы, работающей длительное время, такой подход невозможен.
В результате, процессы, работа которых завершается, вернут занимаемые ресурсы. Этих ресурсов может оказаться достаточно, чтобы другие процессы могли успешно продолжить работу.
Очевидный недостаток - проделанная работа завершаемого процесса будет потеряна.
То есть отнимать ресурсы у процессов, вернуть их системе, и мб того процессы, попавшие в тупик, смогут завершиться.
Решается на основе приоритетов.
(Новый план)
Сегодня виртуальная машина - развитие той идеи, которая была предложена фирмой IBM.
Сначала исторически были разработаны ОС мультипрограмной пакетной обработки, с появлением средств позволяющих пользователю взаимодействовать с системой (такие средства как мониторы, которые оперативно позволяли получать информацию о выполняемых программах, клавиатура, которая позволяла посылать команды управляющие выполнением программы).
В IBM система разделения времени, которая была написана ими, называлась TSS/360. Очень медленная и громоздкая. От нее сразу отказались. В это же время группой из IBM в Кембридже разрабатывалась система разделения времени. Называлась она CP/CMS. Позже переименовали в VM/370.
Тут появилась абривеатура Virtual Machine.
Понятие виртуальная машина появилось в середине 70 годов прошлого века в разработках IBM.
Чтобы проще понять саму идею VM, нарисуем схему.
Виртуальные 370 | Виртуальные 370 | Виртуальные 370 | Виртуальные 370 |
CMS | CMS | CMS | CMS |
VM/370 | |||
аппаратура |
Идея виртуальной машины - в коде ядра была реализована такая система, которая позволяла как задачи запускать другие операционные системы.
IBM 360 - третье поколение машин.
Можно было создать систему разделения времени. Но разработанная система TSS/360 не оправдала надежд. IBM создавла много групп, CP/CMS -> VM/370.
VM/370 позволяла как отдельные процессы запускать ОСы. Одновременно на одной машине запускалось несколько виртуальных ОС.
Режим, в котором как задачи запускаются ОСы реального режима. Полная корреляция с VM360.
V86 - операционные системы реального режима в виртуальном режиме.
Что такое виртуальная машина? Виртуальная машина - кажущаяся. Любая ОС, установленная на голое железо, предоставляет совсем другую машину => другие возможности. Мы можем поставить разные ОСы.
Существует целый набор виртуальных машин. Серьезные программы, которые дают пользователю в распоряжение виртуальное железо, на которое можно ставить другую ОС. DOSBox, VMWare, VirtualBox и прочее.
В книге IBM360 изложили идею такой машины.
На схеме изображена структура системы (иерархическая структура опреационной системы).
Над ядром есть еще несколько уровней
Структура ядра:
Медник-Донованн - первопроходцы, предложили иерархию, описанные ниже.
Структура ядра системы: Программное обеспечение ставится на голое железо, на аппаратную часть.
- нижний уровень - аппаратная часть
- уровень 1 - управление процессорами (нижний уровень; диспетчеризация - выделение процессу процессорного времени);
- уровень 2 - (P, V) - семафорные операции, контр. доступа к разд. рес, планировщик процессов (операция более выс. уровня. постановка процессов в очередь к процессору или другим ресурсам), управление памятью; Процессор, оперативка, внешние устройства - аппаратные устройства
- уровень 3 - управление процессорами (верхний уровень -- создание и удаление процессов. Система принимает решение об этом, более высокоур. операция);
- уровень 4 - управление устройствами (подсистема ввода/вывода);
- уровень 5 - управление информацией (файловая система). Система предоставляет такие средства как наименование файлов, построения дерева катологов, удобных для пользователя.
На более высоких уровнях находятся пользовательские процессы, которые запускаются в системе из командной строки или могут пользоваться другими высокоуровневыми процессами для своего запуска
Эта структура определяет содержание монолитных ядер
33:00
На самом нижнем уровне находится аппаратура.
Непосредственно над аппаратной частью находятся коды операционной системы, которые непосредственно взаимодействуют с аппаратной частью. Мы здесь видим драйверы устройств.
В системе устройства бывают только двух типов:
- символьные
- блочные
Драйверы делятся на сивмольные драйверных устройств и блочных устройств.
Кроме символьных и блочных устройств появились сетевые драйверы (драйверы сетевых устройств)
Создание и завершение процессов, здесь находится обработка сигналов
Заштрих. области - аппаратные прерывания
Без штриха - системные вызовы.
Цифры на схеме:
- 1: символьный уровень
- 2: именование файлов
- 3: отображение адреса
- 4: страничные прерывания
Исторически важным для UNIX важно понятие teletype. Использовался для разработки системы UNIX. Части кода для управления телетайпом никуда не делись из UNIX. Стивен Раго (сл. семестр). Самые запутанные коды в UNIX связана с ТТ. На более высоком уровне управление ТТ переходит в управление терминалами.
В части, связанной с процессами, видно полную корреляцию с машиной МД. Для хранения информации используются энергонезависимые устройства, все адресное пространство жесткого диска делятся на 2 части. Большей управляет файловая система (драйвер ЖД), но чтобы иметь возможность пользоваться этими файлами, их надо отрисовать, система предоставляет символьные наименование.
Имя файла в UNIX не является идентификатором, только inode!
Как видите, и эта иерархическая схема аккумулирует всю рассмотренную информацию.
55:00
(Монолитные и микроядра)
Если собрать всю информацию и проанализировать ее, то существует два вида ядер - монолитное и микроядро. Остальные названия подчеркивают большую минимизацию. Основная идея выражается понятием микроядро.
Такая структура ядра ОС, про которой все его компоненты являются модулем одной программы. Все компоненты ОС используют общие СД и взаимодействуют друг с другом путем вызова процедур. Все действия выполняются в одном адресном пространстве.
В противоположность в микроядре часть функций вынесена из ядра в другие программы, которые могут выполняться в собственных адресных пространствах.
Все ОС семейства Windows/UNIX - системы с монолитными ядрами.
Все функции, которые изображены в таблице выше (указывает на таблицу BSD 4.4), реализованы в ядре и такое ядро называется монолитным. Структура struct proc
содержит ссылки на другие структуры. Программа, состоящая из подпрограмм - монолитное ядро. Одни подпрограммы могут вызывать другие. Современные монолитные ядра многопоточные - каждый запущенный драйвер - отдельный поток.
Windows - ООП.
Unix, Linux - классический подход (очень интересно Таненбаум сравнивает эти ОС)
Важнейшей для работы систем с монолитным ядром является система прерываний. В нее входят:
- системные вызовы (часто используется термин API - те функции, которые может запросить пользователь у системы)
-
исключения - аварийные ситуации в системе (исправимые -
page fault
, неисправимые) - аппаратные прерывания - ассинхронное событие, пред. 2 - синхронные. Предназначены для информирования процессора об окончании операции ввода-вывода.
1-2 - синхронные события, 3 - асинхронное событие.
Реализована идея распараллеливания функций - внешними устройствами управляет не процессор. Канальные, шинные внешние устройства - контроллеры. Команды от процессора переводят контроллер в нужный режим. В результате нажатия клавиши она поступает в буфер клавиатуры, для этого необходимо проинформировать процессор и он запустит нужный обработчик прерывания.
Давайте посмотрим подробно всю последовательность действий в системе при запросе системы на ввод/вывод:
Приложение никогда не должно уметь обращаться напрямую к внешним устройствам, иначе оно бы смогло изменять код ОС и такую ОС невозможно было бы защитить. В операционной системе read/write главные системные вызовы. Чем код меньше и яснее - тем он лучше.
Книга Шоу -- Логическое проектирование ОС (настаивает заглянуть туда..)
Чем больше кода, тем больше ошибок, поэтому в UNIX все есть файл: меньше системных вызовов => меньше кода.
Стадии:
-
Запрос ввода-вывода
-
SVC - supervisor call, код операционной системы в стадии выполнения, переход в ядро (штриховая линия - передаются данные) (выполняется IH (interrupt handler))
-
Вызывается драйвер соотвествующего устройства (в нужном формате).
StartIO
Прерывание -
IH (получает данные от драйвера и в результате будут сформированы данные, которые передадутся обратно в драйвер)
-
Драйвер (будет вызвана другая часть драйвера (передачи полученных данных от внешнего устройства приложению: Read - код символа, write - информация об успехе/неуспехе вывода))
-
Чтобы приложение могло продолжить выполняться, оно должно быть выведено из состояния непрерываемого сна.
-
После выхода из сна данные записываются из буфера ядра в буфер приложения.
Выполняются разные части кода монолитного ядра операционной системе. Данный тип ввода-вывода, когда приложение блокируется (uninterruptable sleep), синхронный-блокирующий.
В опрационных системах стремятся сократить время работы приложений. Такой тип ввода-вывода тормозит приложения. Также существуют команды асинхронного ввода-вывода.
При таком построении ядра (как в UNIX BSD), существует два уровня взаимодействия ОС - прозрачный и непрозрачный уровень. Между ними определен интерфейс - функция, которая может вызывать другие (функции) уровни, что позволяет сократить время разработки.
Непрозрачный интерфейс - каждый уровень ОС может обратиться только к следующему уровню.
Прозрачный интерфейс - (противоположно прошлому) возможно обращение через уровень.
Отдельные составляющие такой ОС могут выполняться в собственных адресных пространствах.
Первая ОС с микроядром была названа Mach. первыми реализовали идею микроядерной архитектуры (у системы есть микроядро).
UNIX, Linux являются минимизированными, графика вынесена из ядра.
Вся микроядерная архитектура построена по модели клиент-сервер.
Подпрограммы (планировщик, файловая подсистема) рассматриваются в системе как серверы.
Приложения обращаются к соотвествующим серверам. Сервера отвечают сообщениями.
Во главу угла встает надежная передача сообщений. Взаимодействие идет по строгим протоколам. В них важнейшей составляющей является подтверждение получения запроса.
Диаграмма: три состояния блокировки процесса при передаче сообщения (заблокирован при посылке, при ответе, при приеме). Это влияет на отзывчивость, скорость работы такой системы.