Управление памятью в ос реферат

Обновлено: 05.07.2024

Управление памятью — это процесс управления и координации памяти компьютера, назначение частей, известных как блоки, различным запущенным программам для оптимизации общей производительности системы.

Это самая важная функция операционной системы, которая управляет основной памятью. Это помогает процессам перемещаться вперед и назад между основной памятью и исполнительным диском. Это помогает ОС отслеживать каждую область памяти, независимо от того, выделена она для какого-либо процесса или остается свободной.

Из этого руководства по операционной системе вы узнаете:

Зачем использовать управление памятью?

Вот причины использования управления памятью:

  • Это позволяет вам проверить, сколько памяти должно быть выделено процессам, которые решают, какой процессор должен получить память в какое время.
  • Отслеживает всякий раз, когда инвентарь становится свободным или нераспределенным. По нему будет обновляться статус.
  • Он выделяет пространство для подпрограмм приложения.
  • Также убедитесь, что эти приложения не мешают друг другу.
  • Помогает защитить разные процессы друг от друга
  • Он помещает программы в память, чтобы память использовалась в полной мере.

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

Вот некоторые наиболее важные методы управления памятью:

Одно смежное распределение

Это самый простой метод управления памятью. В этом методе все типы памяти компьютера, за исключением небольшой части, зарезервированной для ОС, доступны для одного приложения. Например, операционная система MS-DOS выделяет память таким образом. Встроенная система также работает в одном приложении.

Разделенное Распределение

Он делит первичную память на различные разделы памяти, которые в основном являются смежными областями памяти. Каждый раздел хранит всю информацию для конкретной задачи или работы. Этот метод состоит из выделения раздела для задания при его запуске и нераспределения при его завершении.

Управление постраничной памятью

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

Управление сегментированной памятью

Сегментированная память — единственный метод управления памятью, который не предоставляет программе пользователя линейное и непрерывное адресное пространство.

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

Что такое обмен?

Обмен — это метод, при котором процесс должен быть временно перенесен из основной памяти в резервное хранилище. Позже он будет возвращен в память для продолжения выполнения.

Резервное хранилище — это жесткий диск или другое вспомогательное запоминающее устройство, которое должно быть достаточно большого размера для размещения копий всех образов памяти для всех пользователей. Он также способен предложить прямой доступ к этим образам памяти.


Преимущества обмена

Вот основные преимущества / плюсы обмена:

  • Он предлагает более высокую степень мультипрограммирования.
  • Позволяет динамическое перемещение. Например, если используется привязка адреса во время выполнения, то процессы можно менять в разных местах. Иначе в случае привязки времени компиляции и загрузки процессы должны быть перемещены в одно и то же место.
  • Это помогает лучше использовать память.
  • Минимальная потеря процессорного времени при завершении, поэтому его можно легко применить к методу планирования на основе приоритетов для повышения его производительности.

Что такое распределение памяти?

Выделение памяти — это процесс, с помощью которого компьютерным программам выделяется память или пространство.

Здесь основная память делится на два типа разделов

  1. Недостаточно памяти — Операционная система находится в этом типе памяти.
  2. High Memory — пользовательские процессы хранятся в верхней памяти.

Распределение разделов

Память делится на разные блоки или разделы. Каждый процесс распределяется в соответствии с требованием. Распределение разделов — это идеальный способ избежать внутренней фрагментации.

Ниже приведены различные схемы распределения разделов:

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

Что такое пейджинг?

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

Что такое фрагментация?

Процессы сохраняются и удаляются из памяти, что создает свободное место в памяти, которое слишком мало для использования другими процессами.

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

Два типа методов фрагментации:

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

Что такое сегментация?

Метод сегментации работает почти так же, как пейджинг. Единственное различие между ними состоит в том, что сегменты имеют переменную длину, тогда как в методе подкачки страницы всегда имеют фиксированный размер.

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

Что такое динамическая загрузка?

Динамическая загрузка — это программа программы, которая не загружается до тех пор, пока программа ее не вызовет. Все подпрограммы должны содержаться на диске в перемещаемом формате загрузки. Основная программа будет загружена в память и будет выполнена. Динамическая загрузка также обеспечивает лучшее использование памяти.

Что такое динамическое связывание?

Связывание — это метод, который помогает ОС собирать и объединять различные модули кода и данных в один исполняемый файл. Файл может быть загружен в память и выполнен. ОС может связывать библиотеки системного уровня в программу, которая объединяет библиотеки во время загрузки. В методе динамического связывания библиотеки связываются во время выполнения, поэтому размер программного кода может оставаться небольшим.

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

Прикрепленные файлы: 1 файл

Память.docx

Выполнила: Оржеховская Анна

Управление памятью

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

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

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

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

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

Подсистема управления памятью в этом случае выполняет следующие задачи:

  • сравнивая размер программы, поступившей на выполнение, и свободных разделов, выбирает подходящий раздел,
  • осуществляет загрузку программы и настройку адресов.

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

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

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

Задачами операционной системы при реализации данного метода управления памятью является:

  • ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти,
  • при поступлении новой задачи - анализ запроса, просмотр таблицы свободных областей и выбор раздела, размер которого достаточен для размещения поступившей задачи,
  • загрузка задачи в выделенный ей раздел и корректировка таблиц свободных и занятых областей,
  • после завершения задачи корректировка таблиц свободных и занятых областей.

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

Выбор раздела для вновь поступившей задачи может осуществляться по разным правилам, таким, например, как "первый попавшийся раздел достаточного размера", или "раздел, имеющий наименьший достаточный размер", или "раздел, имеющий наибольший достаточный размер". Все эти правила имеют свои преимущества и недостатки.

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

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

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

Хотя процедура сжатия и приводит к более эффективному использованию памяти, она может потребовать значительного времени, что часто перевешивает преимущества данного метода.

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

Понятие виртуальной памяти

Виртуальная память - это совокупность программно-аппаратных средств, позволяющих пользователям писать программы, размер которых превосходит имеющуюся оперативную память; для этого виртуальная память решает следующие задачи:

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

Все эти действия выполняются автоматически, без участия программиста, то есть механизм виртуальной памяти является прозрачным по отношению к пользователю.

Наиболее распространенными реализациями виртуальной памяти является страничное, сегментное и странично-сегментное распределение памяти, а также свопинг.

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

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

Вся оперативная память машины также делится на части такого же размера, называемые физическими страницами (или блоками).

Размер страницы обычно выбирается равным степени двойки: 512, 1024 и т.д., это позволяет упростить механизм преобразования адресов.

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

При активизации очередного процесса в специальный регистр процессора загружается адрес таблицы страниц данного процесса.

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

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

  • дольше всего не использовавшаяся страница,
  • первая попавшаяся страница,
  • страница, к которой в последнее время было меньше всего обращений.

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

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

На производительность системы со страничной организацией памяти влияют временные затраты, связанные с обработкой страничных прерываний и преобразованием виртуального адреса в физический. При часто возникающих страничных прерываниях система может тратить большую часть времени впустую, на свопинг страниц. Чтобы уменьшить частоту страничных прерываний, следовало бы увеличивать размер страницы. Кроме того, увеличение размера страницы уменьшает размер таблицы страниц, а значит уменьшает затраты памяти. С другой стороны, если страница велика, значит велика и фиктивная область в последней виртуальной странице каждой программы. В среднем на каждой программе теряется половина объема страницы, что в сумме при большой странице может составить существенную величину. Время преобразования виртуального адреса в физический в значительной степени определяется временем доступа к таблице страниц. В связи с этим таблицу страниц стремятся размещать в "быстрых" запоминающих устройствах. Это может быть, например, набор специальных регистров или память, использующая для уменьшения времени доступа ассоциативный поиск и кэширование данных.

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

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

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

Недостатком данного метода распределения памяти является фрагментация на уровне сегментов и более медленное по сравнению со страничной организацией преобразование адреса.

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

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

С приходом 32-разрядной Windows управление памятью стало гораздо более приятным, чем раньше. Огромная путаница с сегментами и другими параметрами управления памятью в 16-разрядном режиме сегментной архитектуры Intel-процессоров полностью и бесповоротно ушла в прошлое

Отдельные адресные пространства

Win32 предусматривает более совершенную схему управления памятью. Двумя ее наиболее отличительными чертами являются возможности

запускать приложения в отдельных адресных пространствах

и расширять объем доступной для выделения памяти, используя файлы подкачки (свопирование).

Адреса, используемые приложениями Win32, часто называются логическими . Для каждого процесса Win32 доступен полный диапазон 32-разрядных адресов (с определенными ограничениями для некоторых операционных систем, причем эти ограничения не одинаковы для разных платформ Win32).

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

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

С другой стороны

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

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

Не все логические адреса приложения действительно отображаются в физическую память .

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

Причина, по которой файлы подкачки могут эффективно использоваться , заключается в том, что большинство приложений выделяют редко используемые блоки памяти.

ОС и аппаратное обеспечение компьютера выполняют отображение логических адресов . Таблица, часто называемая таблицей страниц , содержит информацию о всех блоках или страницах памяти. В действительности эта таблица отображает блоки логических адресов приложения в блоки физической памяти или участки файла подкачки. Когда логический адрес отображается в реальную физическую память , отображение разыменовывается, и данные считываются или записываются соответственно запросу.

Поскольку эта операция поддерживается аппаратным обеспечением процессора, она не требует никакого дополнительного времени для вычисления адреса памяти.

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

Все это остается незаметным для приложения; единственным признаком того, что блок не находился в физической памяти, является задержка, вызванная операцией подкачки .

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

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

Для выделения блоков неперемещаемой памяти в Win32 можно использовать как библиотечные функции C и операторы С++, так и функции Windows , предоставляемые для этих целей системой Win32.

Для примера рассмотрим способы выделения блока неперемещаемой памяти для хранения массива целых чисел размерностью 256 элементов :

Определим в программе указатель на массив целых чисел следующим образом (указатель p - 32-разрядное число, которое неинициализировано):

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

Можно выделить блок памяти , на который будет указывать p, следующим образом:

p=(int *)malloc(N*sizeof(int)); // или p=(int *)сalloc(N,sizeof(int));

При этом c помощью функции malloc выделяется блок памяти размером 1024 байта (1 КБ), который может хранить 256 32-разрядных целых. Указатель, равный NULL, показывает, что выделение памяти не было успешным.

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

Доступ к i-тому элементу массива , хранящегося в блоке памяти, на который ссылается p, осуществляется при помощи операции []:

Если необходимо увеличить размер блока памяти (например, удвоить его), то можно вызвать функцию:

p=(int *) realloc (p, N_new*sizeof(int));

Указатель является параметром функции, и указатель (возможно, отличающийся по значению от первого, особенно, если блок увеличивается) является возвращаемым значением функции realloc . Этот пример показывает, что операционная система может перемещать блок в рамках виртуальной памяти .

После окончания работы с памятью необходимо вызвать функцию, освобождающую блок памяти :

Замечание. Только указанные четыре функции ( malloc, calloc, realloc, free ) определены в стандарте ANSI языка C. Часто производители компиляторов реализуют несколько большее количество функций, наиболее распространенной из которых является функция _msize , возвращающая размер выделенного блока.

Помимо библиотечных функций С для выделения блоков неперемещаемой памяти и работы с ними можно использовать и операторы языка C++.

Приведем пример их использования :

p=new int[N]; // выделение блока памяти и инициализация указателя

. . . p[i] . . . // использование значений элементов массива

delete []p; // освобождение блока памяти

Для выделения блоков неперемещаемой памяти и работы с ними можно использовать вызовы функций ядра Windows. Ниже приведена функция Windows для выделения блока неперемещаемой памяти для указателя на целые:

int *p; // объявление указателя

p=(int *) GlobalAlloc (GPTR, N*sizeof(int));

Функция GlobalAlloc имеет два параметра: набор флагов и размер выделяемого блока в байтах. Если первый параметр функции GlobalAlloc задать нулевым, то это аналогично использованию флага GMEM_FIXED (равен нулю). Такой вызов функции GlobalAlloc эквивалентен вызову функции malloc . Можно также использовать флаг GMEM_ZEROPOINT для обнуления всех байтов выделяемого блока памяти. Флаг GPTR включает в себя флаги GMEM_FIXED и GMEM_ZEROPOINT.

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

Для каждой функции (за исключением одной), начинающейся со слова Global , существует другая, начинающаяся со слова Local . Эти два набора в Win32 идентичны . Два различных слова сохранены для совместимости с предыдущими версиями Windows, где функции Global возвращали дальние указатели, а функции Local - ближние.

Доступ к i-тому элементу массива , хранящегося в блоке памяти, на который ссылается p, осуществляется при помощи операции []:

Имеется также функция изменения размера блока памяти :

p=(int *) GlobalReAlloc (p, N_new*sizeof(int), GMEM_FIXED);

Можно использовать флаг GMEM_ZEROPOINT для обнуления добавляющихся в блок памяти байтов, если блок расширяется.

Существует функция, возвращающая размер блока памяти и функция освобождения памяти :

DWORD dwSize= GlobalSize (p);

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

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

Блок перемещаемой памяти характеризуется тем, что его виртуальный адрес может в любое время измениться даже без физического перемещения блока памяти. Блок перемещаемой памяти можно выделить при помощи функция GlobalAlloc, передавая ей в качестве первого параметра GMEM_MOVEABLE или комбинированный флаг GHND, включающий в себя флаги GMEM_ MOVEABLE и GMEM_ZEROPOINT для обнуления блока памяти.

Флаг GMEM_MOVEABLE позволяет перемещать блок памяти в виртуальной памяти . Это не обязательно означает, что блок памяти будет перемещен в физической памяти, но адрес, которым пользуется программа для чтения и записи, может измениться .

Рассмотрим, как создается и используется блок перемещаемой памяти . Первым делом определяются указатель и переменная типа GLOBALHANDLE (описатель, селектор блока памяти ):

int *p; GLOBALHANDLE hGlobal; // указатель и описатель (неинициализированные)

Затем выделяется память , например, так:

hGlobal= GlobalAlloc (GHND, N*sizeof(int));

Перед тем, как обратиться к памяти, нужно зафиксировать блок с использованием вызова:

p=(int *) GlobalLock (hGlobal);

Эта функция преобразуе т описатель памяти в указатель . Пока блок зафиксирован, Windows не изменяет его виртуальный адрес .

Доступ к i-тому элементу массива , хранящегося в блоке памяти, на который теперь ссылается p, осуществляется при помощи операции []:

После работы с зафиксированным блоком с него необходимо снять фиксацию :

Когда нужно освободить память , следует вызвать функцию GlobalFree с параметром-описателем, а не с указателем (к этому времени с блока должна быть снята фиксация, если она производилась):

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

Перемещение блока в виртуальной памяти не есть перемещение байтов с одного места на другое - производятся только манипуляции с таблицами страниц . Единственной причиной для выделения перемещаемой памяти служит предотвращение фрагментации виртуальной памяти .

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

Совместно с флагом GMEM_MOVEABLE при выделении памяти можно использовать опцию GMEM_DISCARDABLE . Блок памяти, выделенный с этим флагом , может быть удален из физической памяти ядром Windows, когда необходима свободная память .

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

Если память выделяется для неизменных данных, которые могут быть легко регенерированы (обычно загрузкой из файла), то можно сделать этот блок удаляемым . О том, что данные были сброшены, можно узнать, вызвав функцию GlobalLock и получив в ответ NULL . Теперь данные можно восстановить

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

Отображаемые в память файлы

При работе с Win32 существует возможность читать и записывать данные в файл так, как будто это блок памяти. Этот прием часто рекомендуется использовать также при разделении памяти между двумя и более процессами .

Сначала создается обычный файл hFile с использованием функции CreateFile .а Если необходимо осуществить доступ к части файла , то вызывается функция MapViewOfFile . После этого можно использовать указатель , возвращаемый функцией, для доступа или модификации данных в файле, отображаемом в память.

Замечание. Возникает вопрос , не излишне ли использовать дисковый файл, если необходимо лишь передать несколько байт между приложениями ? В действительности нет необходимости явно открывать и использовать дисковый файл для получения отображения в памяти .

Приложения могут передать специальное значение дескриптора равное 0хFFFFFFFF в функцию CreateFileMapping для получения отображения непосредственно в системный страничный файл. Это, по сути, создает блок разделяемой между приложениями памяти .

Другие функции работы памятью

Win32 также содержит следующие функции для работы с памятью:

FillMemory -заполнение конкретным байтом,

ZeroMemory - обнуление памяти,

CopyMemory и MoveMemory - копируют данные из одной области в другую (если эти области перекрываются, то функция CopyMemory может работать некорректно, вместо нее нужно использовать функцию MoveMemory ).

Для того чтобы проверить, возможен ли доступ по какому-либо указателю (т.е. действителен тот или иной указатель) есть ряд функций: IsBadCodePtr, IsBadReadPtr, IsBadWritePtr и IsBadStringPtr. Первая из этих функций просто принимает указатель в качестве параметра и возвращает ненулевое значение, если указатель действителен. Другие три функции получают указатель в качестве первого параметра и длину блока памяти в качестве второго параметра. Четвертая функция, кроме того, осуществляет проверку до тех, пока не встретит нулевой ограничитель строки

Похожие страницы:

Управление памятью на уровне пользователя

Управление памятью на уровне пользователя На этапе . диалога из фильма "Свой среди чужих, чужой среди своих") Память у компьютера одна . подключаемой библиотеки malloc.h на alloc.h в среде Borland C++ 3.1 закончил работу, как только .

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

. одновременного выполнения в одной и той же среде процесса не­скольких достаточно независимых программ . непосредственно, исполнительная система Windows вызывает функции HAL. 2. Управление памятью Память представляет собой важный .

Многозначительная среда Windows 98. Панель задач.

. сделали операционную среду более эффективной, универсальной, надёжной и лёгкой в управлении. В ОС Windows гораздо лучше . . Решено также большинство проблем с распределением памяти. Встроенная сетевая поддержка делает тривиальной .

Управление процессами (2)

. (см. раздел 2.3."Средства аппаратной поддержки управления памятью и многозадачной среды в микропроцессорах Intel 80386, 80486 . сравнению с многозадачной обработкой. Например, в многозадачной среде Windows можно одновременно работать с электронной таблицей .

Windows Microsoft Word и Microsoft Excel

. пиктограммы выпол­няют в среде Windows. Windows - приложения Windows — интегрированная программа. Под управлением оболочки Windows могут работать не . использует изображения символов, хранящиеся в его памяти, а управляет каждой отдельной точкой на .

С понятием управления паметью в ОС связаны следующие технологии:

  • Функции управления памятью в ОС
  • Типы адресов
  • Методы распределения памяти в ОС
  • Принцип кэширования данных в ОС

Содержание

Функции управления памятью в ОС

Операционная система решает следующие задачи:

  • Отслеживание свободной и занятой памяти.
  • Выделение и освобождение памяти по запросам процессов.
  • Обеспечение настройки адресов.
  • Поддержка механизма виртуальной памяти

Типы адресов

Для идентификации переменных и команд используются символьные имена (метки), виртуальные адреса и физические адреса.

Символьные имена

Символьные имена присваивает пользователь при написании программы.

Виртуальные адреса

Виртуальные адреса вырабатывает компилятор. Так как не известно, в какое место оперативной памяти будет загружена программа, то компилятор присваивает переменным и командам виртуальные (условные) адреса, обычно считая по умолчанию, что программа будет размещена, начиная с нулевого адреса. Совокупность виртуальных адресов процесса называется виртуальным адресным пространством. Каждый процесс имеет собственное виртуальное адресное пространство.

Физические адреса

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

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

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

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

Иногда (обычно в специализированных системах) заранее точно известно, в какой области оперативной памяти будет выполняться программа, и компилятор выдает исполняемый код сразу в физических адресах.

Читайте также: