- •Раздел 5. Управление памятью в операционных средах
- •5.1. Классификация способов организации памяти
- •5.2. Управление физической памятью
- •5.2.1. Однозадачные системы
- •5.2.1.1. Простые и оверлейные системы
- •5.2.1.2. Сегментация памяти
- •5.2.1.3. Блочная организация памяти
- •5.2.1.4. Стратегии управления памятью (введение)
- •5.2.2. Многозадачные системы
- •5.2.2.1. Фиксированные разделы (неперемещаемые программы)
- •5.2.2.2. Фиксированные разделы (перемещаемые программы)
- •5.2.2.3. Переменные разделы
- •5.2.2.4. Свопинг
- •5.3. Управление виртуальной памятью
- •5.3.1. Общая характеристика виртуальной памяти
- •5.3.1.1. Определения виртуальной памяти и иерархия видов памяти
- •5.3.1.2. Особенности виртуальной памяти
- •5.3.1.3. Механизм отображения виртуальных адресов в физические
- •5.3.2. Страничная организация виртуальной памяти
- •5.3.2.1. Одноуровневая страничная организация
- •5.3.2.2. Двухуровневая страничная организация
- •5.3.2.3. Совместное использование страниц процессами
- •5.3.3. Сегментная организация виртуальной памяти
- •5.3.3.1. Одноуровневая сегментная организация
- •5.3.3.2. Комбинированная сегментно-страничная организация (вместе с таблицей процессов)
- •5.3.4. Стратегии управления виртуальной памятью
- •5.3.4.1. Главные задачи управления виртуальной памятью
- •5.3.4.2. Стратегии решения второй главной задачи
- •5.3.4.3. Стратегии выталкивания с постоянным распределением
- •1. Выталкивание случайной страницы.
- •2. Выталкивание первой пришедшей страницы.
- •3. Выталкивание реже всего используемой страницы.
- •4. Выталкивание дольше всех не использовавшейся страницы.
- •5.3.4.4. Стратегии выталкивания с переменным распределением
- •5.4. Управление памятью в современных ос
- •5.4.1. Архитектура управления памятью
- •5.4.2. Защита памяти
- •5.4.3. Распределение памяти
- •5.4.3.1. Типы программных интерфейсов для распределения памяти
- •5.4.3.2. Переносимые интерфейсы
- •5.4.3.3. Специфические интерфейсы
- •5.4.4. Совместное использование памяти
- •5.4.4.1. Способы совместного использования памяти
- •5.4.4.2. Пример реализации разделяемой памяти в Win32.
5.4.3. Распределение памяти
5.4.3.1. Типы программных интерфейсов для распределения памяти
Для работы с памятью обычно предоставляется два набора программных интерфейсов:
переносимые интерфейсы, удовлетворяющие стандартам ANSI;
специфические для ОС интерфейсы.
5.4.3.2. Переносимые интерфейсы
К переносимым интерфейсам относят четыре функции управления памятью:
выделить память заданного размера; malloc()
выделить память под массив элементов calloc();
перераспределить память realloc();
освободить память free().
5.4.3.3. Специфические интерфейсы
Специфические интерфейсы сильно привязаны к соответствующей ОС, поэтому сильно различаются между собой.
Специфические интерфейсы дают следующие преимущества:
позволяют использовать средства распределения памяти, соответствующие архитектуре ОС;
предоставляют большие возможности управления памятью на нижнем уровне;
используют конкретные схемы управления памятью;
оптимизируют производительность.
NetWare 3.1 имеет хорошо оптимизированный для файловых средств доступ к памяти через кэш-буфер, обеспечивающий очень высокую производительность файлового сервера. ОС поддерживает 5 различных пулов памяти, обладающих различными характеристиками времени доступа и размера. Пул кэш-буфера является наиболее используемым пулом.
Alloc - выделение заданного числа байтов памяти из пула краткосрочного распределения памяти.
Free - освобождение памяти, выделенной функцией Alloc.
AllocNonMovableCashMemory - выделение памяти из пула кэш-буфера.
FreeNonMovableCashMemory - освобождение памяти, выделенной предыдущей функцией.
AllocSemiPermMemory - выделение памяти из пула долгосрочной памяти.
FreeSemiPermMemory - освобождение памяти, выделенной предыдущей функцией.
NetWare 4.1 управление памятью полностью изменено. Схема пулов была очень запутанной и не очень эффективной из-за фрагментации. Новая ОС выделяет каждому процессу собственный пул памяти, с управлением запросами на основе рабочего множества. Запрос памяти осуществляется к общему пулу, спроектированному с учетом страничной архитектуры и защиты памяти.
Для управления памятью рекомендуется использовать интерфейс ANSI.
UnixWare обеспечивает очень широкий набор средств и полную управляемость памятью. В основном объекты памяти представляются в виде именованных или неименованных файлов, доступ к которым может быть произведен средствами файловой системы.
mmap - для виртуального объекта памяти задает отображение в адресном пространстве процесса;
munmap - отменяет отображение.
ОС семейства Windows NT к стандартным средствам управления памятью добавляет следующие интерфейсы:
функции Win32;
функции виртуальной памяти;
функции динамической памяти.
Win32 - это семейство интерфейсов, пригодных для программирования в любой Windows-среде.
Примеры функций Win32:
GlobalAlloc - выделяет в памяти заданное число байтов. Тип выделяемого блока задается атрибутом: FIXED - неперемещаемый, MOVEABLE - перемещаемый, DISCARDABLE - выгружаемый.
GlobalLock - блокирует блок, который становится неперемещаемым и невыгружаемым.
GlobalUnlock - разблокирует блок;
GlobalReAlloc - изменяет размер блока в сторону уменьшения или увеличения.
GlobalFree - освобождает блок.
Функции виртуальной памяти позволяют разработчику использовать все возможности Windows NT по управлению памятью.
VirtualAlloc - выделение памяти в пространстве виртуальных адресов.
VirtualFree - освобождает память, выделенную с помощью предыдущей функцией.
VirtualLock - физическая блокировка страниц в памяти;
VirtualUnlock - разблокировка памяти;
VirtualProtect - устанавливает атрибуты блока памяти, возможные значения атрибутов - PAGE_NOACCESS, PAGE_READONLY, PAGE_READWRITE.
Функции динамической памяти используются для вторичного распределения собственной памяти.
HeapCreate - используется для создания в виртуальном адресном пространстве процесса динамически распределяемой области.
HeapAlloc - выделяет память из области, созданной предыдущей функцией.
HeapReAlloc - перераспределяет память в локальной динамической области.
HeapFree - освобождает память;
HeapDestroy - уничтожает объект динамически распределенной области.
OS/2 имеет три класса API для управления памятью:
распределение собственной памяти;
вторичное распределение памяти;
распределение разделяемой памяти.
DosAllocMem - выделяет память в собственном виртуальном адресном пространстве вызывающего процесса;
DosFreeMem - освобождает память, ранее распределенную как собственную.
Функции вторичного распределения памяти, распределенной предварительно функцией DosAllocMem:
DosSubSetMem,
DosSubAllocMem,
DosSubFreeMem,
DosSubUnsetMem