Лекция 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 позволяла как отдельные процессы запускать ОСы. Одновременно на одной машине запускалось несколько виртуальных ОС.

Режим V86

Режим, в котором как задачи запускаются ОСы реального режима. Полная корреляция с VM360.

V86 - операционные системы реального режима в виртуальном режиме.

Что такое виртуальная машина? Виртуальная машина - кажущаяся. Любая ОС, установленная на голое железо, предоставляет совсем другую машину => другие возможности. Мы можем поставить разные ОСы.

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

Иерхическая машина

В книге IBM360 изложили идею такой машины.

На схеме изображена структура системы (иерархическая структура опреационной системы).

Над ядром есть еще несколько уровней

Структура ядра:

alt text image

Медник-Донованн - первопроходцы, предложили иерархию, описанные ниже.

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

  • нижний уровень - аппаратная часть
  • уровень 1 - управление процессорами (нижний уровень; диспетчеризация - выделение процессу процессорного времени);
  • уровень 2 - (P, V) - семафорные операции, контр. доступа к разд. рес, планировщик процессов (операция более выс. уровня. постановка процессов в очередь к процессору или другим ресурсам), управление памятью; Процессор, оперативка, внешние устройства - аппаратные устройства
  • уровень 3 - управление процессорами (верхний уровень -- создание и удаление процессов. Система принимает решение об этом, более высокоур. операция);
  • уровень 4 - управление устройствами (подсистема ввода/вывода);
  • уровень 5 - управление информацией (файловая система). Система предоставляет такие средства как наименование файлов, построения дерева катологов, удобных для пользователя.

На более высоких уровнях находятся пользовательские процессы, которые запускаются в системе из командной строки или могут пользоваться другими высокоуровневыми процессами для своего запуска

Эта структура определяет содержание монолитных ядер

33:00

Структура ядра операционной системы UNIX BSD 4.4

На самом нижнем уровне находится аппаратура.

Непосредственно над аппаратной частью находятся коды операционной системы, которые непосредственно взаимодействуют с аппаратной частью. Мы здесь видим драйверы устройств.

В системе устройства бывают только двух типов:

  • символьные
  • блочные

Драйверы делятся на сивмольные драйверных устройств и блочных устройств.

Кроме символьных и блочных устройств появились сетевые драйверы (драйверы сетевых устройств)

Создание и завершение процессов, здесь находится обработка сигналов

alt text image

Заштрих. области - аппаратные прерывания

Без штриха - системные вызовы.

Цифры на схеме:

  • 1: символьный уровень
  • 2: именование файлов
  • 3: отображение адреса
  • 4: страничные прерывания

Исторически важным для UNIX важно понятие teletype. Использовался для разработки системы UNIX. Части кода для управления телетайпом никуда не делись из UNIX. Стивен Раго (сл. семестр). Самые запутанные коды в UNIX связана с ТТ. На более высоком уровне управление ТТ переходит в управление терминалами.

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

Имя файла в UNIX не является идентификатором, только inode!

Как видите, и эта иерархическая схема аккумулирует всю рассмотренную информацию.

55:00

Архитектура ядер ОС (структура ядер)

(Монолитные и микроядра)

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

Монолитное ядро (monolitic kernel)

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

Микроядро

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

Все ОС семейства Windows/UNIX - системы с монолитными ядрами.

Все функции, которые изображены в таблице выше (указывает на таблицу BSD 4.4), реализованы в ядре и такое ядро называется монолитным. Структура struct proc содержит ссылки на другие структуры. Программа, состоящая из подпрограмм - монолитное ядро. Одни подпрограммы могут вызывать другие. Современные монолитные ядра многопоточные - каждый запущенный драйвер - отдельный поток.

Windows - ООП.

Unix, Linux - классический подход (очень интересно Таненбаум сравнивает эти ОС)

Система прерываний

Важнейшей для работы систем с монолитным ядром является система прерываний. В нее входят:

  1. системные вызовы (часто используется термин API - те функции, которые может запросить пользователь у системы)
  2. исключения - аварийные ситуации в системе (исправимые - page fault, неисправимые)
  3. аппаратные прерывания - ассинхронное событие, пред. 2 - синхронные. Предназначены для информирования процессора об окончании операции ввода-вывода.

1-2 - синхронные события, 3 - асинхронное событие.

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

Давайте посмотрим подробно всю последовательность действий в системе при запросе системы на ввод/вывод:

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

Книга Шоу -- Логическое проектирование ОС (настаивает заглянуть туда..)

Чем больше кода, тем больше ошибок, поэтому в UNIX все есть файл: меньше системных вызовов => меньше кода.

Ввод-вывод

alt text image

Стадии:

  1. Запрос ввода-вывода

  2. SVC - supervisor call, код операционной системы в стадии выполнения, переход в ядро (штриховая линия - передаются данные) (выполняется IH (interrupt handler))

  3. Вызывается драйвер соотвествующего устройства (в нужном формате).

    StartIO
    Прерывание

  4. IH (получает данные от драйвера и в результате будут сформированы данные, которые передадутся обратно в драйвер)

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

  6. Чтобы приложение могло продолжить выполняться, оно должно быть выведено из состояния непрерываемого сна.

  7. После выхода из сна данные записываются из буфера ядра в буфер приложения.

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

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

При таком построении ядра (как в UNIX BSD), существует два уровня взаимодействия ОС - прозрачный и непрозрачный уровень. Между ними определен интерфейс - функция, которая может вызывать другие (функции) уровни, что позволяет сократить время разработки.

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

Прозрачный интерфейс - (противоположно прошлому) возможно обращение через уровень.

Микроядерная архитектура

Отдельные составляющие такой ОС могут выполняться в собственных адресных пространствах.

Первая ОС с микроядром была названа Mach. первыми реализовали идею микроядерной архитектуры (у системы есть микроядро).

UNIX, Linux являются минимизированными, графика вынесена из ядра.

Вся микроядерная архитектура построена по модели клиент-сервер.

Подпрограммы (планировщик, файловая подсистема) рассматриваются в системе как серверы.

Приложения обращаются к соотвествующим серверам. Сервера отвечают сообщениями.

Во главу угла встает надежная передача сообщений. Взаимодействие идет по строгим протоколам. В них важнейшей составляющей является подтверждение получения запроса.

Диаграмма: три состояния блокировки процесса при передаче сообщения (заблокирован при посылке, при ответе, при приеме). Это влияет на отзывчивость, скорость работы такой системы.

⚠️ **GitHub.com Fallback** ⚠️