- •Введение
- •Управление ресурсами: общие сведения
- •Управление процессами
- •2.1 Состояния процессов и переходы между ними
- •Стратегии и дисциплины планирования загрузки процессоров
- •Стратегия одинакового среднего времени ожидания
- •Дисциплина планирования fifo
- •Справедливая стратегия
- •Дисциплина планирования rr
- •Влияние величины кванта времени на величину средней задержки ответа
- •Стратегия максимальной пропускной способности
- •Дисциплина планирования sjf
- •Дисциплина планирования srt
- •Дисциплина планирования hrrn
- •Стратегия приоритетного планирования
- •Дисциплина лотерейного планирования
- •Дисциплины планирования с множеством очередей
- •Планирование с последовательным прохождением очередей
- •Дисциплина планирования vrr
- •Планирование на основе множества очередей с обратными связями
- •2.3 Планирование в многопользовательской системе – справедливое планирование
- •2.4 Планирование загрузки процессоров в операционных системах реального времени – частотно-монотонное планирование
- •2.5 Планирование загрузки процессоров в многопроцессорных системах
- •Многопроцессорная система с главным процессором
- •Организация с собственным планировщиком для каждого процессора
- •Симметричная многопроцессорная организация (smp)
- •Разбиение системных таблиц
- •Смещение моментов прерывания таймера
- •Стратегия планирования загрузки процессоров в многопроцессорной системе
- •Стратегия распределения загрузки
- •Стратегия максимальной производительности при параллельных вычислениях – бригадное планирование
- •Метод расщепление цикла
- •Метод редукции высоты дерева
- •Параллельное вычисление по альтернативным ветвям
- •Бригадное планирование процессов в многопроцессорной системе
- •2.6 Синхронизация выполнения процессов
- •Алгоритмы взаимоисключения с активным ожиданием
- •Алгоритм 1
- •Алгоритм 2
- •Алгоритм 3
- •Алгоритм 4
- •Алгоритм 5
- •Алгоритм Деккера
- •Алгоритм Петерсона
- •Алгоритм на основе команды процессора "проверить и установить"
- •Алгоритм на основе команды процессора "обменять данные"
- •Недостатки алгоритмов с активным ожиданием
- •Алгоритмы взаимоисключения с блокировкой процессов
- •Открытие объекта синхронизации
- •Закрытие объекта синхронизации
- •Вхождение в критическую секцию
- •Выход из критической секции
- •Замечания по реализации примитивов синхронизации
- •Мониторы
- •2.7 Взаимная блокировка процессов (тупики)
- •Необходимые условия возникновения тупика
- •Методы борьбы с тупиками
- •Предотвращение тупиков
- •Нарушение ожидания дополнительных ресурсов
- •Нарушение неперераспределимости ресурсов
- •Нарушение условия кругового ожидания
- •Устранение тупиков
- •Обнаружение тупиков
- •Управление памятью
- •3.1 Иерархическая модель памяти
- •Оценка среднего времени доступа к данным при использовании многоуровневой модели памяти
- •Локализация ссылок при обращении к памяти
- •3.2 Виртуальная память
- •Предпосылки создания виртуальной памяти
- •Архитектура виртуальной памяти
- •Подсистема трансляции адресов
- •Метод прямого отображения
- •Метод ассоциативного отображения
- •Метод комбинированного отображения
- •Архитектура виртуального адресного пространства
- •Сегментная организация виртуальной памяти
- •Страничная организация виртуальной памяти
- •Сегментно-страничная организация виртуальной памяти
- •Отображение файла на виртуальное адресное пространство
- •Совместное использование данных в оперативной памяти
- •3.3 Основные стратегии управления памятью
- •Стратегии выборки данных
- •Стратегии размещения данных
- •Выделение памяти по стратегии первого подходящего
- •Выделение памяти по стратегии наиболее подходящего
- •Выделение памяти по стратегии наименее подходящего
- •Стратегии замещения данных
- •Замещение с немедленной перезаписью и замещение с буферизацией
- •Замещение с локальной и глобальной областью видимости
- •3.4 Управление виртуальной памятью
- •Выборка в системе виртуальной памяти
- •Реализация выборки по требованию
- •Размещение в системе виртуальной памяти
- •Замещение в системе виртуальной памяти
- •Стратегия выталкивания случайной страницы
- •Оптимальная стратегия
- •Дисциплина fifo – выталкивание наиболее старой страницы
- •Дисциплина lru – выталкивание дольше всего неиспользуемой страницы
- •Дисциплина lfu – выталкивание страницы с наименьшей частотой обращений
- •Дисциплина nru – выталкивание страницы, не используемой в последнее время
- •Часовой алгоритм
- •Управление резидентным множеством страниц процесса
- •Понятие рабочего множества страниц процесса
- •Управление резидентными множествами на основе рабочих множеств
- •Глобальное замещение, динамическое резидентное множество
- •Локальное замещение, фиксированное резидентное множество
- •Локальное замещение, динамическое резидентное множество
- •Алгоритм на основе оценки частоты прерываний – дисциплина pff (Page Fault Frequency)
- •Алгоритм с переменным пробным интервалом – дисциплина vsws
- •Влияние размера страницы
- •Оптимизация работы дискового накопителя
- •Оптимизация механических перемещений головок диска
- •Основы устройства и функционирования дисковых накопителей
- •Стратегии оптимизации механических перемещений головок диска
- •Стратегия fcfs – Fist Come First Served
- •Стратегия sstf – Shortest Seek Time First
- •Стратегия scan – Scanning
- •Стратегия n-step scan – n-step Scanning
- •Системный дисковый кэш
- •Структура системного дискового кэша
- •Хэширование, хэш-функции и хэш-очереди
- •Структура блока и очередей дискового кэша
- •Работа системного дискового кэша
- •Упреждающее чтение
- •Реализация дискового кэша на основе виртуальной памяти
- •3.6 Надежность операционной системы при использовании системного дискового кэша
- •Буферизация ввода-вывода на пользовательском уровне
- •3.7 Процессорный кэш
- •Отображение участков озу на процессорный кэш
- •Случайное отображение участков озу в процессорный кэш
- •Детерминированное отображение участков озу в процессорный кэш
- •Комбинированное отображение участков озу в процессорный кэш
- •Работа процессорного кэша в режиме записи данных
- •3.8 Динамическое распределение памяти
- •Куча (heap)
- •Алгоритмы динамического распределения памяти
- •Отложенное объединение свободных блоков
- •Оптимизация списка свободных блоков
- •Метод парных меток для поддержания списка блоков кучи
- •Специальные алгоритмы динамического распределения памяти из кучи
- •Метод близнецов (или метод двойников)
- •Алгоритм выделения блоков памяти одинакового размера
- •Заключение
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
Буферизация ввода-вывода на пользовательском уровне
Файловые операции оказывают значительное влияние на скорость выполнения пользовательских процессов. Причем это влияние связано не только с ограниченной скоростью обмена данными с дисковым накопителем, но также с необходимостью выполнения системного вызова для передачи данных:
переключение в режим ядра и обратно, необходимое для выполнения системного вызова, занимает время;
в большинстве случаев процесс, инициировавший системный вызов, снимается с выполнения, и вынужден долго ждать процессор, чтобы продолжить работу.
При этом для большинства пользовательских программ характерны обращения к файлам для чтения или записи нескольких десятков байт. Переход в режим ядра ради удовлетворения такого запроса является слишком дорогим.
Поэтому стандартные библиотеки ввода-вывода современных языков высокого уровня поддерживают собственную буферизацию файлового обмена, которая позволяет сократить число системных вызовов при файловых операциях.
Рассмотрим буферизацию файлового обмена на примере библиотеки стандартного ввода-вывода языка C (заголовочный файл stdio.h).
Ключевым компонентом стандартной библиотеки ввода-вывода C является структура FILE:
struct FILE {
char _ptr; // указатель текущей позиции в буфере
int _cnt; // счетчик остатка (разный смысл при записи и чтении файла)
char *_base; // указатель на начало буфера
int _flag; // флаги состояния потока
int _file; // дескриптор файла
int _bufsiz; // размер буфера (в байтах)
char *_tmpfname; // имя файла, если он открыт как временный
}
При открытии файла средствами стандартной библиотеки ввода-вывода, создается новый экземпляр структуры FILE, и пользовательскому процессу возвращается указатель на него. Указатель на структуру FILE, полученный после открытия файла средствами библиотеки, затем используется при любой операции с этим файлом.
Если буферизация разрешена, то после первой же операции чтения или записи данных, будет создан новый буфер размером BUFSIZE (типично, 4096 байт). Указатель на начало буфера, и другие параметры, необходимые для буферизации данных файла, хранятся в экземпляре структуры FILE.
Структура буфера в режиме чтения файла и записи файла несколько различается. Эти различия поясняются на рис. 48 (режим чтения данных из файла) и рис. 49 (режим записи данных в файл).
Рис.48. Файловый буфер в режиме чтения файла
Рис.49. Файловый буфер в режиме записи файла
Если запрошена операция чтения, и требуемых данных нет в буфере, то библиотека ввода-вывода автоматически переадресует запрос к операционной системе, и из файла будет прочитан блок данных, соответствующий размеру буфера (или весь файл, если он целиком умещается в буфере). Причем чтение будет выполнено за одно обращение к операционной системе, т.е. за один системный вызов. При последующих запросах пользовательского процесса на чтение очередного символа ему будут передаваться данные из буфера, без обращения к средствам операционной системы. В поле _cnt структуры FILE при этом будет храниться число данных, еще не переданных из буфера пользовательскому процессу.
Если запрошена операция записи, то данные, переданные пользовательским процессом для записи в файл, будут помещены в файловый буфер. Обращение к операционной системе для реальной записи данных в файл будет автоматически сгенерировано библиотекой ввода-вывода в одном из следующих случаев:
буфер заполнен и при попытке размещения в нем новых данных не оказалось свободного места;
пользовательский процесс закрыл файл;
пользовательский процесс явно потребовал сбросить буфер в файл;
пользовательский процесс потребовал изменить режим буферизации или явно назначил новый буфер.
В режиме записи, в поле _cnt структуры FILE храниться число символов, которое еще можно разместить в буфере.
Стандартная библиотека ввода-вывода C поддерживает три режима буферизации:
_IOFBF – режим полной буферизации, как только что рассмотрели, этот режим включается по умолчанию;
_IOLBF – режим построчной буферизации, для работы с текстовыми файлами, при этом, в режиме чтения в буфер считывается блок данных, ограниченный символом перевода строки (строка символов), а в режиме записи буфер сбрасывается в файл, когда в него передается символ перевода строки;
_IONBF – режим отсутствия буферизации, может быть полезен, если обмен с файлом проводится программой крупными блоками, и дополнительная буферизация уже не требуется.