- •Основы построения операционных систем
- •Введение
- •1. Основные аспекты операционных систем
- •1.1. Программные системы
- •1.2. Ресурсы вычислительных систем
- •1.3. Функции операционных систем
- •1.3.1. Упрощение доступа к компьютеру
- •1.3.2. Повышение эффективности использования ресурсов
- •1.4. Классификация операционных систем
- •2. Управление файлами
- •2.1. Файлы
- •2.1.1. Имя файла
- •2.1.2. Типы файлов
- •2.1.3. Атрибуты файла
- •2.2. Функции системы управления файлами
- •2.3. Способы организации файлов
- •2.3.1. Последовательное размещение
- •2.3.2. Размещение с помощью сцепленных блоков
- •2.3.3. Организация файлов на основе таблиц размещения
- •2.3.4. Размещение с использованием таблицы индексов
- •2.3.5. Индексно-последовательное размещение
- •2.3.6. Библиотечная структура данных
- •2.4. Методы доступа к содержимому файлов
- •2.4.1. Последовательный доступ
- •2.4.2. Прямой доступ
- •2.4.3. Другие методы доступа
- •2.5. Способы организации файловой структуры
- •2.6. Манипулирование файловой структурой
- •3. Управление памятью
- •3.1. Простое непрерывное распределение
- •3.2. Распределение с несколькими непрерывными разделами
- •3.2.1. Мультипрограммирование и разбиение на разделы
- •3.2.2. Разделы с фиксированными границами
- •3.2.3. Разделы с подвижными границами
- •3.2.4. Своппинг
- •3.3. Организация виртуальной памяти
- •3.3.1. Основные концепции виртуальной памяти
- •3.3.2. Страничная организация памяти
- •3.3.3. Сегментная организация памяти
- •3.3.4. Сегментно-страничная организация памяти
- •3.4. Управление виртуальной памятью
- •3.4.1. Алгоритмы выталкивания страниц
- •3.4.2. Подкачка страниц по запросу
- •3.4.3. Подкачка страниц с опережением
- •3.4.4. Освобождение страниц
- •3.4.5. Размер страниц
- •4. Управление процессами
- •4.1. Концепции процесса
- •4.1.1. Понятие последовательного процесса
- •4.1.2. Состояния процесса
- •4.1.3. Блок управления процессом
- •4.1.4. Планирование процессов
- •4.1.5. Обработка прерываний
- •4.2. Синхронизация параллельных процессов
- •4.2.1. Параллельная обработка
- •4.2.2. Взаимное исключение
- •4.2.3. Алгоритм Деккера
- •4.2.4. Аппаратная реализация взаимного исключения
- •4.2.5. Семафоры
- •4.2.6. Мониторы
- •4.2.7. Передача сообщений
- •4.3. Тупиковые ситуации
- •4.3.1. Условия возникновения дедлоков
- •4.3.2. Основные направления исследований по проблеме тупиков
- •4.3.3. Предотвращение тупиков
- •4.3.4. Обход дедлоков
- •4.3.5. Алгоритм банкира
- •4.3.6. Распознавание дедлоков
- •4.3.7. Восстановление после тупиков
- •5. Управление процессором
- •5.1. Диспетчеризация процессов
- •5.2. Приоритеты
- •5.3. Алгоритмы диспетчеризации с одной очередью
- •5.3.1. Алгоритм fcfs (первый пришедший обслуживается первым)
- •5.3.2. Алгоритм spn (кратчайший процесс - следующий)
- •5.3.3. Алгоритм srt (по наименьшему остающемуся времени)
- •5.3.4. Алгоритм hrrn (по наибольшему относительному времени ответа)
- •5.3.5. Алгоритм циклической диспетчеризации rr
- •5.3.6. Сравнение алгоритмов диспетчеризации с одной очередью
- •5.4. Многоуровневые очереди с обратными связями
- •6. Управление устройствами
- •6.1. Общая организация ввода-вывода
- •6.2. Методы управления периферийными устройствами
- •6.3. Действия по вводу-выводу
- •6.3.1. Буферизация : прочитать и записать
- •6.3.2. Блокирование : получить и поместить
- •6.3.3. Подготовка : открыть и закрыть
- •6.4. Управление магнитными дисками
- •6.4.1. Физическая структура магнитного диска
- •6.4.2. Физическая структура формата данных дискеты
- •6.4.3. Логическая структура магнитного диска
- •6.4.4. Планирование работы с магнитными дисками
- •Заключение
- •Список используемых источников
- •Оглавление
3.2.3. Разделы с подвижными границами
Для того, чтобы избавиться от внутренней фрагментации, возникающей, когда размер процесса меньше размера раздела, необходимо формировать разделы, точно соответствующие размерам процесса. Для загрузки программы в память специальная программа, называемая планировщиком памяти, находит область памяти, достаточную для размещения данного процесса, и устанавливает границы, образуя тем самым раздел. Обычно, чтобы не возникало дополнительной фрагментации, одну из границ совмещают с некоторой уже существующей.
В функции планировщика памяти входит построение списка адресов свободной памяти, выделение раздела для каждого процесса, который нужно загрузить, и освобождение раздела, занимаемого завершившимся процессом.
Рассмотрим процесс распределения памяти, показанный на рис.3.6. Для каждого загружаемого процесса создается новый раздел с размерами, соответствующими размеру процесса. На рис.3.6,а система последовательно выделила память пяти процессам, и 1 000 байт памяти остались свободными, что недостаточно для загрузки очередного процесса. Когда завершается процесс 2, его раздел освобождается, и новый раздел отводится процессу 6. Как показано на рис.3.6,б, этот новый раздел занимает часть памяти, которая отводилась процессу 2. Остаток от прежнего раздела процесса 2 остается свободным.
Рис. 3.6. Распределение памяти с использование разделов
с подвижными границами
Таким образом, память оказалась разделена на разделы, размеры которых соответствуют размерам загруженных в данный момент времени процессам, и неиспользуемые фрагменты памяти, расположенные между разделами («дыры»). Это явление получило название внешняя фрагментация.
Часто неиспользуемые фрагменты в целом составляют значительный объем памяти. При этом, когда очередной процесс требует определенного объема основной памяти, то может оказаться, что нет ни одного индивидуального свободного участка, достаточно большого для размещения этого задания, несмотря на то, что сумма всех свободных участков превышает общий объем требуемой памяти.
Эта проблема решается при помощи метода, называемого уплотнением памяти (рис.3.7) и состоящего в перемещении всех занятых разделов к одному или другому краю основной памяти. Благодаря этому вместо многочисленных небольших «дыр», обычных для мультипрограммирования с переменными разделами, мы получаем единый большой свободный участок памяти. А уж если вся свободная память представлена одним участком, то ожидающее задание может выполняться, если ему требуется память, не превышающая размера этого единого полученного в результате уплотнения участка. Уплотнение памяти называют дефрагментацией памяти, а среди программистов бытует термин «сбор мусора».
Рис. 3.7. Уплотнение памяти
Уплотнение памяти имеет свои недостатки:
- оно отнимает ресурсы системы, которые можно было бы использовать продуктивно;
- во время уплотнения памяти система должна прекращать любые другие работы. Результатом этого могут стать непрогнозируемые времена ответа для пользователей диалогового режима и это может оказаться неприемлемым для систем реального времени;
- уплотнение предполагает перемещение заданий в памяти. Это означает, что информация, связанная с размещением программы и обычно теряющаяся после загрузки программы, теперь должна сохраняться в легкодоступной форме;
- в типичном случае быстро меняющейся смеси заданий возникает необходимость частого уплотнения памяти. Затрачиваемые на это системные ресурсы могут не оправдываться получаемыми при этом выгодами.
При использовании разделов переменного размера нет надобности выбирать размер раздела заранее. Однако операционной системе, которая отслеживает, какие области памяти уже распределены, а какие свободны, приходится проделывать большую работу. Обычно это делается при помощи поддерживаемого ею связанного списка свободных областей, который просматривается при выделении нового раздела. Если имеется несколько свободных областей, размеры которых позволяют разместить в них загружаемый процесс, операционная система должна решить, в какое именно место основной памяти следует помещать поступающие программы и данные. Как правило, решение принимается на основе одного из трех алгоритмов : первое подходящее размещение, наиболее подходящее размещение, наименее подходящее размещение, - приведенных на рис.3.8.
В случае первого подходящего размещения поступающий процесс помещается в первый встретившийся свободный участок основной памяти достаточного размера. Выбор первого подходящего по размеру свободного участка кажется интуитивно рациональным, поскольку он позволяет быстро принять решение о размещении процесса.
При наиболее подходящем размещении поступающий процесс помещается в тот свободный участок основной памяти, в котором ему наиболее «тесно», так что остается минимально возможное неиспользуемое пространство. Для многих людей выбор наиболее подходящего кажется интуитивно самым рациональным алгоритмом.
Наименее подходящее размещение на первый взгляд кажется весьма странным. Однако более тщательное рассмотрение показывает, что выбор наименее подходящего по размеру также имеет сильные интуитивные аргументы в свою пользу. Этот принцип говорит о том, что при помещении программы в основную память нужно занимать свободный участок, имеющий наиболее далекий размер, т. е. максимальный возможный свободный участок. Интуитивный аргумент в пользу такого подхода достаточно прост: после помещения программы в большой свободный участок остающийся свободный участок зачастую также оказывается большим и, таким образом, в нем можно разместить относительно большую новую программу.
Рис. 3.8. Размещение процесса D длиной 6000 байт в памяти
по принципу занятия
а) первого подходящего по размеру участка
б) наиболее подходящего по размеру участка
в) наименее подходящего по размеру участка