- •Оглавление
- •Введение
- •1. Назначение и функции операционной системы
- •1. 1. Функциональные компоненты операционной системы автономного компьютера
- •1. 1. 1. Управление процессами
- •1. 1. 2. Управление памятью
- •1. 1. 3. Управление файлами и внешними устройствами
- •1. 1. 4. Защита данных и администрирование
- •1. 1. 5. Интерфейс прикладного программирования
- •1. 1. 6. Пользовательский интерфейс
- •Вопросы для самопроверки
- •Контрольные вопросы
- •1. 2. Сетевые операционные системы
- •1. 2. 1. Сетевые и распределенные ос
- •1. 2. 2. Два значения термина «сетевая ос»
- •1. 2. 3. Функциональные компоненты сетевой ос
- •1. 2. 4. Сетевые службы и сетевые сервисы
- •1. 2. 5. Встроенные сетевые службы и сетевые оболочки
- •1.3 Одноранговые и серверные сетевые операционные системы
- •1.3.1 Ос в одноранговых сетях
- •1.3.2 Ос в сетях с выделенными серверами
- •1. 4. Требования к современным операционным системам
- •Вопросы для самопроверки
- •Контрольные вопросы
- •2. Архитектура операционной системы
- •2. 1. Ядро и вспомогательные модули ос
- •2. 2. Ядро и привилегированный режим
- •2. 3. Многослойная структура ос
- •2. 4. Аппаратная зависимость и переносимость ос
- •2. 5. Переносимость операционной системы
- •Вопросы для самопроверки
- •Контрольные вопросы
- •2. 6. Микроядерная архитектура
- •2 .6. 1. Концепция
- •2. 6. 2. Преимущества и недостатки микроядерной архитектуры
- •2. 7. Совместимость и множественные прикладные среды
- •2. 7. 1. Двоичная совместимость и совместимость исходных текстов
- •2. 7. 2. Трансляция библиотек
- •2. 7. 3. Способы реализации прикладных программных сред
- •Вопросы для самопроверки
- •Контрольные вопросы
- •3. Процессы и потоки
- •3. 1. Мультипрограммирование
- •3. 1. 1. Мультипрограммирование в системах пакетной обработки
- •3. 1. 2. Мультипрограммирование в системах разделения времени
- •3. 1. 3. Мультипрограммирование в системах реального времени
- •Вопросы для самопроверки
- •Контрольные вопросы
- •3. 2. Мультипроцессорная обработка
- •Вопросы для самопроверки
- •Контрольные вопросы
- •3. 3. Планирование процессов и потоков
- •3. 4. Понятия «процесс» и «поток»
- •3 .4. 1. Создание процессов и потоков
- •3. 4. 2. Планирование и диспетчеризация потоков
- •3. 4. 3. Состояния потока
- •3. 4. 4. Вытесняющие и невытесняющие алгоритмы планирования
- •3. 4. 5. Алгоритмы планирования, основанные на квантовании
- •3. 4. 6. Алгоритмы планирования, основанные на приоритетах
- •3. 4. 7. Смешанные алгоритмы планирования
- •3.5 Мультипрограммирование на основе прерываний
- •3.5.1 Назначение и типы прерываний
- •3.5.2 Механизм прерываний
- •3.5.3 Программные прерывания
- •3.5.4 Диспетчеризация и приоритезация прерываний в ос
- •3.5.5 Функции централизованного диспетчера прерываний на примере Windows nt
- •3.5.6 Процедуры обработки прерываний и текущий процесс
- •3.5.7 Системные вызовы
- •3. 6. Синхронизация процессов и потоков
- •3. 5. 1. Цели и средства синхронизации
- •3.6.2 Необходимость синхронизации и гонки
- •3.6.3 Критическая секция
- •3.6.4 Блокирующие переменные
- •3.6.5 Семафоры
- •3.6.6 Тупики
- •3.6.7 Синхронизирующие объекты ос
- •3.6.8 Сигналы
- •Вопросы для самопроверки
- •Контрольные вопросы
- •4. Управление памятью
- •4. 1. Функции ос по управлению памятью
- •4. 2. Типы адресов
- •Вопросы для самопроверки
- •Контрольные вопросы
- •4. 3. Алгоритмы распределения памяти
- •4. 3. 1. Алгоритмы распределения без использования внешней памяти Распределение памяти динамическими разделами
- •Перемещаемые разделы
- •4. 3. 2. Алгоритмы распределения с использованием внешней памяти
- •Свопинг и виртуальная память
- •Страничное распределение
- •Сегментное распределение
- •Сегментно-страничное распределение
- •Разделяемые сегменты памяти
- •4.4 Кэширование данных
- •4. 4. 1 Иерархия запоминающих устройств
- •4.4.3 Проблема согласования данных
- •4.4.4 Способы отображения основной памяти на кэш
- •Вопросы для самопроверки
- •Контрольные вопросы
- •5. Ввод-вывод и файловая система
- •5. 1. Задачи ос по управлению файлами и устройствами
- •5. 2. Специальные файлы
- •5. 3. Логическая организация файловой системы
- •5. 3. 1. Цели и задачи файловой системы
- •5. 3. 2. Типы файлов
- •5. 3. 3. Иерархическая структура файловой системы
- •5. 3. 4. Имена файлов
- •5. 3. 5. Монтирование
- •5. 3. 6. Атрибуты файлов
- •5. 3. 7. Логическая организация файла
- •Вопросы для самопроверки
- •Контрольные вопросы
- •5. 4. Физическая организация файловой системы
- •5. 4. 1. Диски, разделы, секторы, кластеры
- •5. 4. 2. Физическая организация и адресация файла
- •2048 Записей
- •5. 5. Физическая организация fat
- •5. 6. Физическая организация s5 и ufs
- •5. 7. Физическая организация ntfs
- •5. 7. 1. Структура тома ntfs
- •5. 7. 2. Структура файлов ntfs
- •5. 7. 3. Каталоги ntfs
- •Вопросы для самопроверки
- •Контрольные вопросы
- •5. 8. Контроль доступа к файлам
- •5. 8. 1. Доступ к файлам как частный случай доступа к разделяемым ресурсам
- •5. 8. 2. Механизм контроля доступа
- •5. 8. 3. Организация контроля доступа в ос unix
- •Процесс
- •Запрос операции
- •Вопросы для самопроверки
- •Контрольные вопросы
- •5. 8. 4. Организация контроля доступа в ос Windows nt
- •Разрешения на доступ к каталогам и файлам
- •Вопросы для самопроверки
- •Контрольные вопросы
- •5.9 Отказоустойчивость файловых систем
- •5.9.1 Восстанавливаемость файловых систем Причины нарушения целостности файловых систем
- •5.9.2 Протоколирование транзакций
- •5.9.3 Восстанавливаемость файловой системы ntfs
- •5.9.4 Избыточные дисковые подсистемы raid
- •Библиографический список
- •Ответы на вопросы для самопроверки
3.6.6 Тупики
Приведенный выше пример позволяет также проиллюстрировать еще одну проблему синхронизации — взаимные блокировки, называемые также дедлоками (deadlocks), клинчами (clinch), или тупиками. Покажем, что если переставить местами операции Р(е) и Р(b) в потоке-писателе, то при некотором стечении обстоятельств эти два потока могут взаимно блокировать друг друга.
Итак, пусть поток-писатель начинает свою работу с проверки доступности критической секции — операции Р(b), и пусть он первым войдет в критическую секцию. Выполняя операцию Р(е), он может обнаружить отсутствие свободных буферов и перейти в состояние ожидания. Как уже было показано, из этого состояния его может вывести только поток-читатель, который возьмет очередную запись из буфера. Но поток-читатель не сможет этого сделать, так как для этого ему потребуется войти в критическую секцию, вход в которую заблокирован потоком-писателем. Таким образом, ни один из этих потоков не может завершить начатую работу и возникнет тупиковая ситуация, которая не может разрешиться без внешнего воздействия.
Рассмотрим еще один пример тупика. Пусть двум потокам, принадлежащим разным процессам и выполняющимся в режиме мультипрограммирования, для выполнения их работы нужно два ресурса, например принтер и последовательный порт. Такая ситуация может возникнуть, например, во время работы приложения, задачей которого является распечатка информации, поступающей по модемной связи.
На рис. 4.22, а показаны фрагменты соответствующих программ. Поток А запрашивает сначала принтер, а затем порт, а поток В запрашивает устройства в обратном порядке. Предположим, что после того, как ОС назначила принтер потоку А и установила связанную с этим ресурсом блокирующую переменную, поток А был прерван. Управление получил поток В, который сначала выполнил запрос на получение СОМ-порта, затем при выполнении следующей команды был заблокирован, так как принтер оказался уже занятым потоком А. Управление снова получил поток А, который в соответствии со своей программой сделал попытку занять порт и был заблокирован, поскольку порт уже выделен потоку В. В таком положении потоки А и В могут находиться сколь угодно долго.
В зависимости от соотношения скоростей потоков они могут либо взаимно блокировать друг друга (рис. 4.22, б), либо образовывать очереди к разделяемым ресурсам (рис. 4.22, в), либо совершенно независимо использовать разделяемые ресурсы (рис. 4.22, г).
Тупиковые ситуации надо отличать от простых очередей, хотя те и другие возникают при совместном использовании ресурсов и внешне выглядят похоже: поток приостанавливается и ждет освобождения ресурса. Однако очередь — это нормальное явление, неотъемлемый признак высокого коэффициента использования ресурсов при случайном поступлении запросов. Очередь появляется тогда, когда ресурс недоступен в данный момент, но освободится через некоторое время, позволив потоку продолжить выполнение. Тупик же, что видно из его названия, является в некотором роде неразрешимой ситуацией. Необходимым условием возникновения тупика является потребность потока сразу в нескольких ресурсах..
В рассмотренных примерах тупик был образован двумя потоками, но взаимно блокировать друг друга может и большее число потоков. На рис. 2.23 показано такое распределение ресурсов Ri между несколькими потоками Tj, которое привело к возникновению взаимных блокировок. Стрелки обозначают потребность потока в ресурсах. Сплошная стрелка означает, что соответствующий ресурс был выделен потоку, а пунктирная стрелка соединяет поток с тем ресурсом, который необходим, но не может быть пока выделен, поскольку занят другим потоком. Например, потоку Т1 для выполнения работы необходимы ресурсы R1 и R2, из которых выделен только один — R1, а ресурс R2 удерживается потоком Т2. Ни один из четырех показанных на рисунке потоков не может продолжить свою работу, так как не имеет всех необходимых для этого ресурсов.
В тех же случаях, когда тупиковую ситуацию не удалось предотвратить, важно быстро и точно ее распознать, поскольку блокированные потоки не выполняют никакой полезной работы. Если тупиковая ситуация образована множеством потоков, занимающих массу ресурсов, распознавание тупика является нетривиальной задачей. Существуют формальные, программно-реализованные методы распознавания тупиков, основанные на ведении таблиц распределения ресурсов и таблиц запросов к занятым ресурсам. Анализ этих таблиц позволяет обнаружить взаимные блокировки.
Если же тупиковая ситуация возникла, то не обязательно снимать с выполнения все заблокированные потоки. Можно снять только часть из них, освободив ресурсы, ожидаемые остальными потоками, можно вернуть некоторые потоки в область подкачки, можно совершить «откат» некоторых потоков до так называемой контрольной точки, в которой запоминается вся информация, необходимая для восстановления выполнения программы с данного места. Контрольные точки расставляются в программе в тех местах, после которых возможно возникновение тупика.