Операционные системы Основы управления памятью. Методы управления памятью.

Презентация:



Advertisements
Похожие презентации
Управление памятью. Память является важнейшим ресурсом, требующим тщательного управления со стороны мультипрограммной операционной системы. Распределению.
Advertisements

Лекция 5 Управление памятью Виртуальное адресное пространство.
Управление памятью. В ИРТУАЛЬНАЯ ПАМЯТЬ Основная идея заключается в разбиении программы на части, и в память эти части загружаются по очереди. Программа.
Лекция 5 Управление памятью Виртуальное адресное пространство Непрерывное…..
Операционные системы, среды и оболочки Управление памятью.
Физические модели баз данных Файловые структуры, используемые для хранения информации в базах данных.
Операционные системы Управление памятью Скрипов Сергей Александрович 2009.
Дисциплина: Операционные системы § 7. Организация памяти компьютера План: 1.Физическая память компьютера. 2.Логическая память компьютера. 3.Функции системы.
1 Управление памятью Системное и прикладное программное обеспечение Малышенко Владислав Викторович.
Лекция 6. Способы адресации в микропроцессорных системах.
Распределение памяти. Динамическое выделение памяти.
Основы операционных систем.
Сложные структуры данных Связные списки. Структуры, ссылающиеся на себя struct node { int x; struct node *next; };
Процессоры Intel в защищенном режиме. Недостатки реального режима Невозможно адресовать пространство памяти свыше 1-го Мб Невозможно работать с массивами,
Операционные системы и среды. Схема устройства жесткого диска Дорожка N Сектор (блок) Пластина 1 Пластина 2 Цилиндр 0 сторона Диск – одна или несколько.
Алгоритмы замещения страниц
Исполнение программы Энциклопедия учителя информатики Газета «Первое сентября»
Основные виды ресурсов и возможности их разделения.
Архитектура операционных систем. Архитектура ОС Состав модулей (компонент) ОС Структура связей между отдельными модулями ОС Принципы взаимодействия модулей.
Архитектура операционных систем Семестр 2, Лекция 1.
Транксрипт:

Операционные системы Основы управления памятью

Методы управления памятью

Основы управления памятью Методы распределения памяти без использования дискового пространства

Распределение памяти фиксированными разделами а - с общей очередью; б - с отдельными очередями Эта схема была реализована в IBM OS/360, DEC RSX-11 и ряде других систем.

Распределение памяти фиксированными разделами Самым простым способом управления оперативной памятью является разделение ее на несколько разделов фиксированной величины. Это может быть выполнено вручную оператором во время старта системы или во время ее генерации. Очередная задача, поступившая на выполнение, помещается либо в общую очередь (рисунок а), либо в очередь к некоторому разделу (рисунок б). Подсистема управления памятью в этом случае выполняет следующие задачи: сравнивая размер программы, поступившей на выполнение, и свободных разделов, выбирает подходящий раздел, осуществляет загрузку программы и настройку адресов.

Распределение памяти фиксированными разделами При очевидном преимуществе - простоте реализации - данный метод имеет существенный недостаток - жесткость. Так как в каждом разделе может выполняться только одна программа, то уровень мультипрограммирования заранее ограничен числом разделов не зависимо от того, какой размер имеют программы. Другим существенным недостатком является то, что предлагаемая схема сильно страдает от внутренней фрагментации – потери части памяти, выделенной процессу, но не используемой им. Фрагментация возникает потому, что процесс не полностью занимает выделенный ему раздел или потому, что некоторые разделы слишком малы для выполняемых пользовательских программ.

Распределение памяти разделами переменной величины

В этом случае память машины не делится заранее на разделы. Сначала вся память свободна. Каждой вновь поступающей задаче выделяется необходимая ей память. Если достаточный объем памяти отсутствует, то задача не принимается на выполнение и стоит в очереди. После завершения задачи память освобождается, и на это место может быть загружена другая задача. Таким образом, в произвольный момент времени оперативная память представляет собой случайную последовательность занятых и свободных участков (разделов) произвольного размера. На рисунке показано состояние памяти в различные моменты времени при использовании динамического распределения. Так в момент t0 в памяти находится только ОС, а к моменту t1 память разделена между 5 задачами, причем задача П4, завершаясь, покидает память. На освободившееся после задачи П4 место загружается задача П6, поступившая в момент t3.

Распределение памяти разделами переменной величины Задачами операционной системы при реализации данного метода управления памятью является: ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти, при поступлении новой задачи - анализ запроса, просмотр таблицы свободных областей и выбор раздела, размер которого достаточен для размещения поступившей задачи, загрузка задачи в выделенный ей раздел (настройка адресов) и корректировка таблиц свободных и занятых областей, после завершения задачи корректировка таблиц свободных и занятых областей. Программный код не перемещается во время выполнения, то есть может быть проведена единовременная настройка адресов посредством использования перемещающего загрузчика.

Распределение памяти разделами переменной величины В какой раздел помещать процесс? Наиболее распространены три стратегии. Стратегия первого подходящего (First fit). Процесс помещается в первый подходящий по размеру раздел. Стратегия наиболее подходящего (Best fit). Процесс помещается в тот раздел, где после его загрузки останется меньше всего свободного места. Стратегия наименее подходящего (Worst fit). При помещении в самый большой раздел в нем остается достаточно места для возможного размещения еще одного процесса. Моделирование показало, что доля полезно используемой памяти в первых двух случаях больше, при этом первый способ несколько быстрее. Попутно заметим, что перечисленные стратегии широко применяются и другими компонентами ОС, например для размещения файлов на диске.

Распределение памяти разделами переменной величины По сравнению с методом распределения памяти фиксированными разделами данный метод обладает гораздо большей гибкостью, но ему присущ очень серьезный недостаток - фрагментация памяти. Фрагментация - это наличие большого числа несмежных участков свободной памяти очень маленького размера (фрагментов). Настолько маленького, что ни одна из вновь поступающих программ не может поместиться ни в одном из участков, хотя суммарный объем фрагментов может составить значительную величину, намного превышающую требуемый объем памяти.

Перемещаемые разделы

Одним из методов борьбы с фрагментацией является перемещение всех занятых участков в сторону старших либо в сторону младших адресов, так, чтобы вся свободная память образовывала единую свободную область (слайд). В дополнение к функциям, которые выполняет ОС при распределении памяти переменными разделами, в данном случае она должна еще время от времени копировать содержимое разделов из одного места памяти в другое, корректируя таблицы свободных и занятых областей. Эта процедура называется "сжатием". Сжатие может выполняться либо при каждом завершении задачи, либо только тогда, когда для вновь поступившей задачи нет свободного раздела достаточного размера. В первом случае требуется меньше вычислительной работы при корректировке таблиц, а во втором - реже выполняется процедура сжатия. Так как программы перемещаются по оперативной памяти в ходе своего выполнения, то преобразование адресов из виртуальной формы в физическую должно выполняться динамическим способом. Хотя процедура сжатия и приводит к более эффективному использованию памяти, она может потребовать значительного времени, что часто перевешивает преимущества данного метода.

Основы управления памятью Методы распределения памяти с использованием дискового пространства

Понятие виртуальной памяти Виртуальная память (ВП) – это совокупность программно-аппаратных средств, позволяющих использовать программы, размер которых превосходит имеющуюся оперативную память. Для этого менеджер ВП решает следующие задачи: размещает данные в запоминающих устройствах разного типа, например, часть программы в оперативной памяти, а часть на диске; перемещает по мере необходимости данные между запоминающими устройствами разного типа, например, подгружает нужную часть программы с диска в оперативную память; преобразует виртуальные адреса в физические.

Физические и виртуальные адреса Суть концепции виртуальной памяти заключается в том, что адреса, к которым обращается выполняющийся процесс, отделяются от адресов, реально существующих в первичной памяти: адреса, на которые делает ссылки выполняющийся процесс, называются виртуальными адресами (ВА). Диапазон ВА, к которым может обращаться выполняющийся процесс, называется пространством виртуальных адресов V этого процесса. адреса, которые существуют в первичной памяти, называются реальными (или физическими) адресами (ФА). Диапазон ФА, существующих в конкретной ЭВМ, называется пространством реальных адресов R этой ВС.

Отображение адресов Для установления соответствия между ВА и ФА разработаны различные способы. Так, механизмы динамического преобразования адресов (DAT - Dynamic Address Translation) обеспечивают преобразование ВА в ФА время выполнения процесса. Все подобные системы обладают общим свойством: смежные адреса виртуального адресного пространства процесса не обязательно будут смежными в реальной памяти, это свойство называют искусственной смежностью.

Страничное распределение

Страничное распределение : преобразования ВА в ФА 1.на основании начального адреса таблицы страниц, номера виртуальной страницы и длины записи в таблице страниц определяется адрес нужной записи в таблице, 2.из этой записи извлекается номер физической страницы, 3.к номеру физической страницы присоединяется смещение.

Сегментное распределение

Странично-сегментное распределение

Алгоритмы замещения страниц (свопинга) Замещение случайной страницы FIFO (First In First Out) – замещение первой использованной страницы LRU (Least Recently Used) – замещение дольше всех неиспользовавшихся страниц NRU (Not Recently Used) или clock – замещение не использовавшихся в последнее время страницы LFU (Least Frequently Used) – замещение наименее часто используемых страниц

Операционные системы Архитектура памяти в Win32 API. Общие принципы

Архитектура API управления памятью

Менеджер виртуальной памяти VMM (Virtual Memory Manager) управление виртуальным адресным пространством процесса; разделение памяти между процессами; защита виртуальной памяти одного процесса от других процессов.

Адресное пространство процесса Windows NT 4.0 Windows NT 4.0 Enterprise

Средства защиты памяти Отдельное адресное пространство для каждого процесса. Аппаратура запрещает процессу доступ к физическим адресам другого процесса. Два режима работы: режим ядра, в котором процессам разрешен доступ к системным данным, и пользовательский режим, в котором это запрещен. Страничный механизм защиты. Каждая виртуальная страница имеет набор признаков, который определяет разрешенные типы доступа в пользовательском режиме и в режиме ядра. Объектно-ориентированная защита памяти. Каждый раз, когда процесс открывает указатель на секцию, монитор ссылок безопасности проверяет, разрешен ли доступ процесса к данному объекту.

Операционные системы Управление виртуальной памятью в Win32

Каталог страниц и свопинг Каждому процессу назначается свой каталог страниц. Именно поэтому адресное пространство каждого процесса изолировано, что очень хорошо с точки зрения защиты процессов друг от друга. Для того, чтобы обеспечить все линейное адресное пространство процесса физическими ячейками памяти. Windows NT-2003 применяет свопинг (swapping). Организацией свопинга занимается VMM. При генерации системы на диске образуется специальный файл свопинга, куда записываются те страницы, которым не находится места в физической памяти. Процессы могут захватывать память в своем 32-битном адресном пространстве и, затем, использовать ее. Страница может иметь различные состояния. VMM использует алгоритм LRU (Least Recently Used) – замещение дольше всех неиспользовавшихся страниц.

Страничное преобразование Элемент таблицы страниц (Page Table Element)

Элемент таблицы страниц Защита – Win32 API поддерживает ряд значений, в том числе: PAGE_NOACCESS, PAGE_READONLY, PAGE_READWRITE, PAGE_EXECUTE. Базовый физический адрес страницы в памяти. Pagefile – индекс используемого файла подкачки (один из 16 возможных в системе файлов). State – состояние страницы в системе: T (Transition) – отмечает страницу как переходную; D (Dirty) – страница, в которую была произведена запись; P (Present) – страница присутствует в ОП или находится в файле подкачки.

Отдельные состояния страниц Valid – страница используется процессом. Она реально существует в ОП и помечена в PTE как присутствующая в рабочем множестве процесса (P=1, D=0,1). Modified – содержимое страницы было изменено (D=1). В PTE страница помечена как отсутствующая (P=0) и переходная (T=1). Standby – содержимое страницы не изменялось (D=0). В PTE страница помечена как отсутствующая (P=0) и переходная (T=1). Free – страница, на которую не ссылается ни один PTE. Страница свободна, но подлежит обнулению, прежде чем будет использована. Zeroed – свободная и обнуленная страница, пригодная к непосредственному использованию любым процессом. Bad – страница, которая вызывает аппаратные ошибки и не может быть использована ни одним процессом.

Отдельные состояния страниц TDPPage state 0-0Invalid page (Free) -01Valid page -11Valid dirty page 100Invalid page in transition (Standby) 110Invalid dirty page in transition (Modified)

Реализация свопинга С понятием свопинга связаны три стратегии: выборка (fetch); размещение (placement); замещение (replacement).

Переходы между состояниями страниц

Архитектура памяти в Win32 API Организация «статической» виртуальной памяти

Работа приложений с виртуальной памятью Блок адресов в адресном пространстве процесса может находиться в одном из трех состояний Выделен (committed) – блоку адресов назначена физическая память либо часть файла подкачки. Зарезервирован (reserved) – блок адресов помечен как занятый, но физическая память не распределена. Свободен (free) – блок адресов не выделен и не зарезервирован.

Функции API для работы виртуальной памятью VirtualAlloc VirtualFree VirtualQuery VirtualLock VirtualUnlock VirtualProtect VirtualProtectEx

Функции API для работы виртуальной памятью LPVOID VirtualAlloc ( // адрес, по которому надо зарезервировать или выделить память LPVOID lpAddress, // размер выделяемого региона DWORD dwSize, // тип распределения памяти DWORD flAllocationType, // тип защиты доступа DWORD flProtect );

Функции API для работы виртуальной памятью Параметр flAllocationType может принимать следующие значения: MEM_RESERVE - резервирует блок адресов без выделения памяти; MEM_COMMIT - отображает ранее зарезервированный блок адресов на физическую память или файл подкачки, выделяя при этом память. Может комбинироваться с флагом MEM_RESERVE для одновременного резервирования и выделения; MEM_TOP_DOWN - выделяет память по наибольшему возможному адресу. Имеет смысл только при lpAddress = NULL. В Windows 95 игнорируется. MEM_DECOMMIT - освободить выделенную память; MEM_RELEASE - освободить зарезервированный регион. При использовании этого флага параметр dwSize должен быть равен нулю. flProtect - тип защиты доступа выделяемого региона: PAGE_READONLY - допускается только чтение; PAGE_READWRITE - допускается чтение и запись; PAGE_EXECUTE - допускается только выполнение; PAGE_EXECUTE_READ - допускается исполнение и чтение; PAGE_EXECUTE_READWRITE - допускается выполнение, чтение и запись; PAGE_GUARD - дополнительный флаг защиты, который комбинируется с другими флагами. При первом обращении к странице этот флаг сбрасывается и возникает исключение STATUS_GUARD_PAGE. Этот флаг используется для контроля размеров стека с возможностью его динамического расширения; PAGE_NOCACHE - запрещает кэширование страниц. Может быть полезен при разработке драйверов устройств (например, данные в видеобуфер должны переписываться сразу, без кэширования).

LPVOID VirtualAllocEx( HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect); BOOL WriteProcessMemory( HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T* lpNumberOfBytesWritten);

Функции API для работы виртуальной памятью BOOL VirtualFree ( // адрес региона, который надо освободить LPVOID lpAddress, // размер освобождаемого региона DWORD dwSize, // тип освобождения DWORD dwFreeType ); dwSize - размер, если мы будем использовать тип освобождения, как MEM_RELEASE, то размер должен быть установлен в 0. dwFreeType - будет определять какая операция произойдет с памятью: MEM_RELEASE - освобождена MEM_DECOMMIT - зарезервированные, но не используемые. При успешном выполнении функция вернет ненулевое значение.

Функции API для работы виртуальной памятью Функция VirtualLock() позволят предотвратить запись памяти на диск. BOOL VirtualLock ( LPVOID lpAddress, // адрес начала памяти SIZE_T dwSize // количество байтов ); Если фиксация больше не нужна, то ее можно убрать функцией VirtualUnlock(). BOOL VirtualUnlock ( LPVOID lpAddress, // адрес начала памяти SIZE_T dwSize // количество байтов ); При успешном выполнении обе функции возвращают ненулевое значение.

Функции API для работы виртуальной памятью Процессу не разрешается блокировать более 30 страниц. Для настройки рабочего множества процесса может использоваться и функция SetProcessWorkingSetSize(), которая может снять ограничение.

SetProcessWorkingSetSize дескриптор должен иметь права доступа PROCESS_SET_QUOTA Если значения или dwMinimumWorkingSetSize или dwMaximumWorkingSetSize больше, чем текущий размер рабочего множества памяти процессов, заданный процесс должен иметь привилегию SE_INC_BASE_PRIORITY_NAME.

Архитектура памяти в Win32 API Организация «динамической» виртуальной памяти

Кучи (heaps) Кучи (heaps) – это динамически распределяемые области данных. HANDLE GetProcessHeap( VOID ) – для получения дескриптора кучи по умолчанию; LPVOID HeapAlloc( HANDLE hHeap, DWORD dwFlags, DWORD dwSize ) – для выделения из кучи блока памяти заданного размера и возвращения указателя; LPVOID HeapReAlloc( HANDLE hHeap, DWORD dwFlags, LPVOID lpOldBlock, DWORD dwSize) – для изменения размера выделенного блока памяти с возможностью перемещения блока при необходимости; BOOL HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem ) – для освобождения выделенного блока памяти кучи.

Создание новых куч для защиты друг от друга различных структур данных; для повышения эффективности управления памятью. В системах со страничной организацией отсутствует проблема фрагментации физической памяти. Однако существует проблема фрагментации адресного пространства. В 4Gb адресном пространстве эта проблема не актуальна, но она имеет значение в 1Mb куче. Если элементы какой-либо структуры имеют один размер, а элементы другой структуры - другой размер, то полезно размещать эти структуры в разных кучах. для уменьшения рабочего множества процесса. В соответствии с принципом локальности, работа с разными структурами, чаще всего, происходит не одновременно. Границы элементов разных структур не выровнены на границу страницы. Обращение к элементам одной структуры вызывает подкачку всей страницы, а, значит и элементов другой структуры. Это увеличивает рабочее множество процесса. для повышения эффективности работы многонитевых приложений; для быстрого освобождение всей памяти в куче.

Создание новых куч HANDLE HeapCreate (DWORD dwFlags, DWORD dwInitialSize, DWORD dwMaximumSize). Параметр fdwOptions модифицирует способ выполнения операций над кучей. В нем можно указать 0, HEAP_NO_SERIALIZE, HEAP_GENERATE_EXCEPTIONS или комбинацию последних двух флагов. BOOL HeapDestroy ( HANDLE hHeap);

ФлагНазначение HEAP_GENERATE_EXCE PTIONS 1) 1) Указывает системе на то, что в случае возникновения ошибки необходимо генерировать исключительную ситуацию. Это будет происходить во всех случаях, когда функция должна была бы возвратить значение nil. HEAP_NO_SERIALIZE 1) 1) Указывает, что пока выполняется текущий вызов HeapAlloc, к куче не будут происходить обращения из других потоков. Важно! Это значение не может быть указано при обращении к куче процесса. Система может создавать свои собственные потоки без участия приложения, например такие, как обработчик нажатия Ctrl+C, которые могут выполнять доступ к куче процесса. HEAP_ZERO_MEMORY 1) 1) Указывает, что выделяемая память должна инициализироваться нулями. В противном случае память не обязатльно инициализируется нулями.

Дополнительные возможности по управлению кучами UINT HeapCompact( HANDLE hHeap, DWORD fdwFlags); BOOL HeapLock(HANDLE hHeap); BOOL HeapUnlock(HANDLE hHeap); BOOL HeapWalk( HANDLE hHeap, PPROCESS_HEAP_ENTRY pHeapEntry);

Архитектура памяти в Win32 API Файлы, проецируемые в память

Проецируемые файлы Как и виртуальная память, проецируемые файлы позволяют резервировать регион адресного пространства и передавать ему физическую память. Различие между этими механизмами состоит в том, что в последнем случае физическая память не выделяется из системного страничного файла, а берется из файла, уже находящегося на диске. Как только файл спроецирован в память, к нему можно обращаться так, как будто он в нее целиком загружен. (Джеффри Рихтер. Windows для профессионалов.)

Применение проецируемых файлов Этот механизм имеет три применения в Win32: Для запуска исполняемых файлов (EXE) и динамически связываемых библиотек (DLL). Для работы с файлами. Для одновременного использования одной области данных двумя процессами.

Запуск исполняемых файлов и DLL При исполнении функции CreateProcess система обращается к VMM для выполнения следующих действий 1.Создать адресное пространство процесса (размером 4Gb). 2.Резервировать в адресном пространстве процесса регион размером, достаточным для размещения исполняемого файла. Начальный адрес региона определяется в заголовке EXE-модуля. Обычно он равен 0x Отобразить исполняемый файл на зарезервированное адресное пространство. 4.Таким же образом отобразить на адресное пространство процесса необходимые ему динамически связываемые библиотеки. Информация о необходимых библиотеках находится в заголовке EXE-модуля. Желательное расположение региона адресов описано внутри библиотеки.

Запуск EXE-файлов и DLL- библиотек

Одновременное использование одной области данных двумя процессами

Файлы данных, проецируемые в память Проецирование файла данных в память: Создается объект ядра файл. Для создания объекта файл используется функция CreateFile. С помощью функции CreateFileMapping создается объект ядра проецируемый файл. При этом используется дескриптор файла, возвращенный функцией CreateFile. Производится отображение объекта проецируемый файл или его части на адресное пространство процесса. Для этого применяется функция MapViewOfFile. Завершение проецирования файла данных: Выполняется открепление файла от адресного пространства процесса с помощью функции UnmapViewOfFile. Выполняется уничтожение объектов файл и проецируемый файл с помощью функции CloseHandle.

HANDLE CreateFileMapping( HANDLE hFile, // дескриптор файла LPSECURITY_ATTRIBUTES lpAttributes, // защита DWORD flProtect, // атрибуты защиты DWORD dwMaximumSizeHigh, // старшее слово размера DWORD dwMaximumSizeLow, // младшее слово размера LPCTSTR lpName // имя объекта ); HANDLE OpenFileMapping( DWORD dwDesiredAccess, // режим доступа BOOL bInheritHandle, // флажок наследования LPCTSTR lpName // имя объекта );

typedef struct _SECURITY_ATTRIBUTES { DWORD nLength, LPVOID lpSecurityDescriptor; BOOL bInheritHandle; } SECURITY_ATTRIBUTES;

LPVOID MapViewOfFile( HANDLE hFileMappingObject, // дескр. объекта проецируемый файл DWORD dwDesiredAccess, // режим доступа DWORD dwFileOffsetHigh, // старшее DWORD смещения DWORD dwFileOffsetLow, // младшее DWORD смещения SIZE_T dwNumberOfBytesToMap // число отображаемых байтов ); LPVOID MapViewOfFileEx( HANDLE hFileMappingObject, // дескриптор отображаемого объекта DWORD dwDesiredAccess, // режим доступа DWORD dwFileOffsetHigh, // старшее DWORD смещения DWORD dwFileOffsetLow, // младшее DWORD смещения SIZE_T dwNumberOfBytesToMap, // число отображаемых байтов LPVOID lpBaseAddress // начальный адрес );

BOOL UnmapViewOfFile( LPCVOID lpBaseAddress // начальный адрес );

Пример работы с проецированными файлами HANDLE hFile, hFileMapping; PVOID pMassive; hFile = CreateFile( File Name,... ); hFileMapping = CreateFileMapping( hFile,... ); CloseHandle( hFile ) ; pMassive = MapViewOfFile( hFileMapping,... ); //Здесь производится работа с массивом pMassive UnmapViewOfFile( pMassive );

Взаимодействие процессов через общую область данных Для обеспечения когерентности процессы должны работать с одним объектом проецируемый файл, а не с одним файлом.