- •Министерство образования российской федерации
- •Содержание
- •Введение
- •Предмет и задачи курса
- •Рекомендации по литературе
- •Краткий очерк истории ос
- •Предыстория ос
- •Пакетные ос
- •Ос с разделением времени
- •Однозадачные ос для пэвм
- •Многозадачные ос для пк с графическим интерфейсом
- •Классификация ос
- •Критерии оценки ос
- •Надежность
- •Эффективность
- •Удобство
- •Масштабируемость
- •Способность к развитию
- •Мобильность
- •Основные функции и структура ос
- •Ос, используемые в дальнейшем изложении
- •Управление устройствами
- •Основные задачи управления устройствами
- •Классификация периферийных устройств и их архитектура
- •Прерывания
- •Архитектура подсистемы ввода/вывода
- •Способы организации ввода/вывода
- •Ввод/вывод по опросу и по прерываниям
- •Активное и пассивное ожидание
- •Синхронный и асинхронный ввод/вывод
- •Буферизация и кэширование
- •Понятие буферизации
- •Сглаживание неравномерности скоростей процессов
- •Распараллеливание ввода и обработки
- •Согласование размеров логической и физической записи
- •Редактирование при интерактивном вводе
- •Кэширование дисков
- •Опережающее чтение.
- •Драйверы устройств
- •Управление устройствами в ms-dos
- •Уровни доступа к устройствам
- •Драйверы устройств в ms-dos
- •Управление символьными устройствами
- •Управление блочными устройствами
- •Структура диска
- •Разделы и логические тома
- •Средства доступа к дискам
- •Управление устройствами вWindows
- •Драйверы устройств в Windows
- •Доступ к устройствам
- •Управление устройствами вUnix
- •Драйверы устройств вUnix
- •Устройство как специальный файл
- •Управление данными
- •Основные задачи управления данными
- •Характеристики файлов и архитектура файловых систем
- •Размещение файлов
- •Защита данных
- •Разделение файлов между процессами
- •Файловая системаFaTи управление данными вMs-dos
- •Общая характеристика системы fat
- •Структуры данных на диске
- •Структура записи каталога файловой системы fat
- •Создание и удаление файла
- •Работа с файлами в ms-dos
- •Системные функции
- •Доступ к данным
- •Структуры данных в памяти
- •Новые версии системы fat
- •Файловые системы и управление данными вUnix
- •Архитектура файловой системы unix
- •Жесткие и символические связи
- •Монтируемые тома
- •Типы и атрибуты файлов
- •Управление доступом
- •Структуры данных файловой системыUnix
- •Доступ к данным в unix
- •Развитие файловых системUnix
- •Файловая системаNtfSи управление данными вWindows
- •Особенности файловой системы ntfs
- •Структуры дисковых данных
- •Главная таблица файлов
- •Атрибуты файла
- •Доступ к данным
- •Защита данных
- •Аутентификация пользователя
- •Дескриптор защиты
- •Управление процессами
- •Основные задачи управления процессами
- •Реализация многозадачного режима
- •Понятия процесса и ресурса
- •Квазипараллельное выполнение процессов
- •Состояния процесса
- •Вытесняющая и невытесняющая многозадачность
- •Дескриптор и контекст процесса
- •Реентерабельность системных функций
- •Дисциплины диспетчеризации и приоритеты процессов
- •Проблемы взаимодействия процессов
- •Изоляция процессов и их взаимодействие
- •Проблема взаимного исключения процессов
- •Двоичные семафоры Дейкстры
- •Средства взаимодействия процессов
- •Целочисленные семафоры
- •Семафоры с множественным ожиданием
- •Сигналы
- •Сообщения
- •Общая память
- •Программные каналы
- •Проблема тупиков
- •Управление процессами вMs-dos
- •Процессы в ms-dos
- •Среда программы
- •Запуск программы
- •Завершение работы программы
- •Перехват прерываний и резидентные программы
- •Управление процессами вWindows
- •Понятие объекта в Windows
- •Процессы и нити
- •ПланировщикWindows
- •Процесс и нить как объекты
- •Синхронизация нитей
- •Способы синхронизации
- •Объекты синхронизации и функции ожидания
- •Типы объектов синхронизации
- •Критические секции
- •Сообщения
- •Управление процессами в unix
- •Жизненный цикл процесса
- •Группы процессов
- •Программные каналы
- •Сигналы
- •Средства взаимодействия процессов в стандарте posix
- •Планирование процессов
- •Состояния процессов в unix
- •Приоритеты процессов
- •Интерпретатор команд shell
- •Управление памятью
- •Основные задачи управления памятью
- •Виртуальные и физические адреса
- •Распределение памяти без использования виртуальных адресов
- •Настройка адресов
- •Распределение с фиксированными разделами
- •Распределение с динамическими разделами
- •Сегментная организация памяти
- •Страничная организация памяти
- •Сравнение сегментной и страничной организации
- •Управление памятью в ms-dos
- •Управление памятью вWindows
- •Структура адресного пространства
- •Регионы
- •Отображение исполняемых файлов
- •Файлы, отображаемые на память
- •Стеки и кучи
- •Управление памятью вUnix
- •Литература
- •Дроздов Сергей Николаевич операционные системы Конспект лекций
Стеки и кучи
Описанные выше средства управления памятью, основанные на выделении регионов, представляют собой мощный и красивый инструмент для работы с большими массивами памяти. Однако в практике программирования чаще встречаются прозаические задачи, связанные с использованием небольших участков памяти: вызов функций с передачей им параметров и выделением локальных переменных, создание и освобождение переменных в динамической памяти и т.п. Но зато эти мелкие операции могут выполняться очень много раз. Использовать выделение отдельного региона ради того, чтобы получить 10 – 20 байт памяти, это примерно то же самое, что применять ракетное оружие в борьбе с тараканами. Напомним, что минимальный размер региона равен 4 Кб.
Программисты привыкли, что для размещения параметров и локальных переменных функций используется стек, а выделение участков динамической памяти происходит из «кучи» – специально предназначенной для этого области памяти, управляемой исполняющей системой языка программирования. Оба этих механизма получают поддержку со стороны Windows.
При создании новой нити она получает свой собственный стек, размер которого, если он не указан явно, принимается равным 1 Мб. Эта величина может показаться явно избыточной для большинства программ. Стоит ли системе так швыряться памятью?
На самом деле, выделяется 1 Мб резервированнойпамяти. Реального расходования ресурсов памяти при этом не происходит, разве что от 2 Гб адресного пространства процесса отщипывается сравнительно небольшой кусочек. Размер «настоящей» памяти, закрепленной за стеком в страничном файле, равен поначалу двум страницам, размещенным в самом конце зарезервированного региона, как показано на рис. 5‑6.
Рис. 5‑26
Стек по своему обыкновению растет в направлении убывания адресов, поэтому, начиная рост с самого старшего адреса, он постепенно заполняет одну страницу, а затем переходит ко второй, с меньшими адресами. Эта страница выделяется с атрибутом PAGE_GUARD, который, напомним, означает, что при первом обращении к странице генерируется прерывание, оповещающее об этом систему. ДляWindowsэто сигнал, что пора передать стеку еще одну страницу памяти про запас, причем эта страница опять получает атрибутPAGE_GUARD, чтобы потом оповестить систему, что стек снова вырос. Так может продолжаться до тех пор, пока память не будет передана всем страницам региона стека, кроме самой младшей. Эта страница всегда остается зарезервированной и попытка записи на нее рассматривается как переполнение стека. Таким образом, младшая страница региона стека служит барьером, не позволяющим стеку выйти за начало региона.
А почему необходим такой барьер?
Для размещения динамических переменных удобно использовать объект «куча» (heap).Windowsпредоставляет каждому процессу собственную кучу, хэндл которой можно получить вызовом функцииGetProcessHeap. После этого нити процесса могут запрашивать блоки памяти из кучи, вызывая функциюHeapAlloc. Параметры этой функции включают в себя хэндл кучи, размер запрашиваемого блока и некоторые флаги. По истечении надобности в выделенном блоке он может быть возвращен в кучу вызовом функцииHeapFree.
Небольшая проблема возникает в связи с тем, что к одной и той же куче могут обращаться разные нити одного процесса. Не исключено их одновременное обращение к функциям, работающим с кучей. Возникает проблема взаимного исключения, и Windowsрешает ее, используя встроенный мьютекс. Это называетсясериализациейдоступа к куче, т.е. последовательным выполнением запросов (от «serial» – последовательный). Для программы пользователя этот мьютекс не виден и можно не обращать на него внимания. Однако в том случае, если программист уверен, что нити не могут помешать друг другу, он может отключить сериализацию, указав соответствующий флаг или при открытии кучи, или при запросе блока. Это несколько повышает производительность.
В некоторых случаях оказывается выгодно использовать не одну, а несколько куч для одного и того же процесса. Можно назвать, по крайней мере, две подобных ситуации.
Если с кучей работают две или более нитей процесса, то выделение отдельной кучи для каждой нити позволяет обойтись без сериализации, повысив таким образом производительность.
Если программа запрашивает из кучи блоки различного размера, то неизбежно такое знакомое нам явление, как фрагментация памяти. В данном случае она приведет к излишнему росту кучи и к замедлению работы. Иногда удается избежать фрагментации, выделив отдельную кучу для каждого используемого размера блоков. Например, из одной кучи будут запрашиваться блоки только размером 105 байт, а из другой – размером 72 байта. При выделении блоков одного размера фрагментации не возникает.
Windowsпозволяет процессу создать любое количество дополнительных куч. Для этого нужно вызвать функциюHeapCreate, передав ей два числа: начальный размер физической памяти, передаваемой куче при создании, и максимальный размер кучи, задающий размер региона зарезервированной памяти для кучи. Если максимальный размер задан равным 0, то куча может расти неограниченно.
Когда дополнительная куча перестает быть нужна, можно освободить занимаемую память, передав хэндл кучи функции HeapDestroy.