Управление виртуальной памятью кратко
Управление памятью – это процесс управления и координации памяти компьютера, назначение частей, известных как блоки, различным запущенным программам для оптимизации общей производительности системы.
Это самая важная функция операционной системы, которая управляет основной памятью. Это помогает процессам перемещаться вперед и назад между основной памятью и исполнительным диском. Это помогает ОС отслеживать каждую область памяти, независимо от того, выделена она для какого-либо процесса или остается свободной.
Из этого руководства по операционной системе вы узнаете:
Что такое динамическое связывание?
Связывание – это метод, который помогает ОС собирать и объединять различные модули кода и данных в один исполняемый файл. Файл может быть загружен в память и выполнен. ОС может связывать библиотеки системного уровня в программу, которая объединяет библиотеки во время загрузки. В методе динамического связывания библиотеки связываются во время выполнения, поэтому размер программного кода может оставаться небольшим.
Привет, Хабрахабр!
В предыдущей статье я рассказал про vfork() и пообещал рассказать о реализации вызова fork() как с поддержкой MMU, так и без неё (последняя, само собой, со значительными ограничениями). Но прежде, чем перейти к подробностям, будет логичнее начать с устройства виртуальной памяти.
Конечно, многие слышали про MMU, страничные таблицы и TLB. К сожалению, материалы на эту тему обычно рассматривают аппаратную сторону этого механизма, упоминая механизмы ОС только в общих чертах. Я же хочу разобрать конкретную программную реализацию в проекте Embox. Это лишь один из возможных подходов, и он достаточно лёгок для понимания. Кроме того, это не музейный экспонат, и при желании можно залезть “под капот” ОС и попробовать что-нибудь поменять.
Любая программная система имеет логическую модель памяти. Самая простая из них — совпадающая с физической, когда все программы имеют прямой доступ ко всему адресному пространству.
При таком подходе программы имеют доступ ко всему адресному пространству, не только могут “мешать” друг другу, но и способны привести к сбою работы всей системы — для этого достаточно, например, затереть кусок памяти, в котором располагается код ОС. Кроме того, иногда физической памяти может просто не хватить для того, чтобы все нужные процессы могли работать одновременно. Виртуальная память — один из механизмов, позволяющих решить эти проблемы. В данной статье рассматривается работа с этим механизмом со стороны операционной системы на примере ОС Embox. Все функции и типы данных, упомянутые в статье, вы можете найти в исходном коде нашего проекта.
Будет приведён ряд листингов, и некоторые из них слишком громоздки для размещения в статье в оригинальном виде, поэтому по возможности они будут сокращены и адаптированы. Также в тексте будут возникать отсылки к функциям и структурам, не имеющим прямого отношения к тематике статьи. Для них будет дано краткое описание, а более полную информацию о реализации можно найти на вики проекта.
- Расширение реального адресного пространства. Часть виртуальной памяти может быть вытеснена на жёсткий диск, и это позволяет программам использовать больше оперативной памяти, чем есть на самом деле.
- Создание изолированных адресных пространств для различных процессов, что повышает безопасность системы, а также решает проблему привязанности программы к определённым адресам памяти.
- Задание различных свойств для разных участков участков памяти. Например, может существовать неизменяемый участок памяти, видный нескольким процессам.
Одно смежное распределение
Это самый простой метод управления памятью. В этом методе все типы памяти компьютера, за исключением небольшой части, зарезервированной для ОС, доступны для одного приложения. Например, операционная система MS-DOS выделяет память таким образом. Встроенная система также работает в одном приложении.
Размер страницы
В реальных (то есть не в учебных) системах используются страницы от 512 байт до 64 килобайт. Чаще всего размер страницы определяется архитектурой и является фиксированным для всей системы, например — 4 KiB.
С одной стороны, при меньшем размере страницы память меньше фрагментируется. Ведь наименьшая единица виртуальной памяти, которая может быть выделена процессу — это одна страница, а программам очень редко требуется целое число страниц. А значит, в последней странице, которую запросил процесс, скорее всего останется неиспользуемая память, которая, тем не менее, будет выделена, а значит — использована неэффективно.
С другой стороны, чем меньше размер страницы, тем больше размер страничных таблиц. Более того, при отгрузке на HDD и при чтении страниц с HDD быстрее получится записать несколько больших страниц, чем много маленьких такого же суммарного размера.
Отдельного внимания заслуживают так называемые большие страницы: huge pages и large pages [вики] .
Платформа | Размер обычной страницы | Размер страницы максимально возможного размера |
x86 | 4KB | 4MB |
x86_64 | 4KB | 1GB |
IA-64 | 4KB | 256MB |
PPC | 4KB | 16GB |
SPARC | 8KB | 2GB |
ARMv7 | 4KB | 16MB |
Действительно, при использовании таких страниц накладные расходы памяти повышаются. Тем не менее, прирост производительности программ в некоторых случаях может доходить до 10% [ссылка] , что объясняется меньшим размером страничных директорий и более эффективной работой TLB.
В дальнейшем речь пойдёт о страницах обычного размера.
Как это работает?
Работа с Page Table Entry
Для работы с записей в таблице страниц, а так же с самими таблицами, есть ряд функций:
Эти функции возвращают 1, если у соответствующей структуры установлен бит MMU_PAGE_PRESENT
Преимущества обмена
Вот основные преимущества / плюсы обмена:
- Он предлагает более высокую степень мультипрограммирования.
- Позволяет динамическое перемещение. Например, если используется привязка адреса во время выполнения, то процессы можно менять в разных местах. Иначе в случае привязки времени компиляции и загрузки процессы должны быть перемещены в одно и то же место.
- Это помогает лучше использовать память.
- Минимальная потеря процессорного времени при завершении, поэтому его можно легко применить к методу планирования на основе приоритетов для повышения его производительности.
Программная поддержка
- Выделение физических страниц из некоторого зарезервированного участка памяти
- Внесение соответствующих изменений в таблицы виртуальной памяти
- Сопоставление участков виртуальной памяти с процессами, выделившими их
- Проецирование региона физической памяти на виртуальный адрес
Устройство Page Table Entry
В реализации проекта Embox тип mmu_pte_t — это указатель.
Каждая запись PTE должна ссылаться на некоторую физическую страницу, а каждая физическая страница должна быть адресована какой-то записью PTE. Таким образом, в mmu_pte_t незанятыми остаются MMU_PTE_SHIFT бит, которые можно использовать для сохранения состояния страницы. Конкретный адрес бита, отвечающего за тот или иной флаг, как и набор флагов в целом, зависит от архитектуры.
- MMU_PAGE_WRITABLE — Можно ли менять страницу
- MMU_PAGE_SUPERVISOR — Пространство супер-пользователя/пользователя
- MMU_PAGE_CACHEABLE — Нужно ли кэшировать
- MMU_PAGE_PRESENT — Используется ли данная запись директории
Можно установить сразу несколько флагов:
Здесь vmem_page_flags_t — 32-битное значение, и соответствующие флаги берутся из первых MMU_PTE_SHIFT бит.
Распределение разделов
Память делится на разные блоки или разделы. Каждый процесс распределяется в соответствии с требованием. Распределение разделов – это идеальный способ избежать внутренней фрагментации.
Ниже приведены различные схемы распределения разделов:
- Первая подгонка: при этой подгонке выделяется раздел, который является первым достаточным блоком с начала основной памяти.
- Best Fit: Распределяет процесс по разделу, который является первым наименьшим разделом среди свободных разделов.
- Наихудшая подгонка: он распределяет процесс по разделу, который является самым большим достаточным свободно доступным разделом в основной памяти.
- Следующая подгонка: в большинстве случаев она похожа на первую подгонку, но эта подгонка ищет первый достаточный раздел из последней точки размещения.
Что такое обмен?
Обмен – это метод, при котором процесс должен быть временно перенесен из основной памяти в резервное хранилище. Позже он будет возвращен в память для продолжения выполнения.
Резервное хранилище – это жесткий диск или другое вспомогательное запоминающее устройство, которое должно быть достаточно большого размера для размещения копий всех образов памяти для всех пользователей. Он также способен предложить прямой доступ к этим образам памяти.
Например:
Давайте предположим, что ОС требуется 300 МБ памяти для хранения всех запущенных программ. Однако в настоящее время в оперативной памяти хранится только 50 МБ доступной физической памяти.
- Затем ОС установит 250 МБ виртуальной памяти и будет использовать программу, называемую Virtual Memory Manager (VMM), для управления этими 250 МБ.
- Таким образом, в этом случае VMM создаст на жестком диске файл размером 250 МБ для хранения дополнительной необходимой памяти.
- Теперь ОС перейдет к адресной памяти, поскольку она считает 300 МБ реальной памяти, хранящейся в ОЗУ, даже если доступно только 50 МБ.
- Работа VMM заключается в управлении 300 МБ памяти, даже если доступно только 50 МБ реальной памяти.
Как работает виртуальная память?
В современном мире виртуальная память стала довольно распространенной в наши дни. Он используется всякий раз, когда некоторые страницы требуют загрузки в основную память для выполнения, и память не доступна для этих многих страниц.
Таким образом, в этом случае вместо предотвращения входа страниц в основную память, ОС ищет пространство ОЗУ, минимально используемое в последнее время или на которое не ссылаются во вторичной памяти, чтобы освободить место для новых страниц в основная память.
Давайте разберемся с управлением виртуальной памятью с помощью одного примера.
Что такое фрагментация?
Процессы сохраняются и удаляются из памяти, что создает свободное место в памяти, которое слишком мало для использования другими процессами.
После этого процесс, который не может быть выделен для блоков памяти, поскольку его небольшой размер и блоки памяти всегда остаются неиспользованными, называется фрагментацией. Этот тип проблемы возникает во время системы динамического выделения памяти, когда свободных блоков достаточно мало, поэтому она не может выполнить любой запрос.
Два типа методов фрагментации:
- Внешняя фрагментация
- Внутренняя фрагментация
- Внешнюю фрагментацию можно уменьшить, переставив содержимое памяти, чтобы разместить всю свободную память вместе в одном блоке.
- Внутренняя фрагментация может быть уменьшена путем назначения наименьшего раздела, который все еще достаточно хорош для выполнения всего процесса.
Зачем нужна виртуальная память?
Вот причины использования виртуальной памяти:
- Всякий раз, когда у вашего компьютера нет места в физической памяти, он записывает то, что ему нужно запомнить, на жесткий диск в файле подкачки в качестве виртуальной памяти.
- Если компьютеру под управлением Windows требуется больше памяти / оперативной памяти, а затем установленному в системе, он использует для этой цели небольшую часть жесткого диска.
Управление сегментированной памятью
Сегментированная память – единственный метод управления памятью, который не предоставляет программе пользователя линейное и непрерывное адресное пространство.
Сегменты нуждаются в аппаратной поддержке в виде таблицы сегментов. Он содержит физический адрес раздела в памяти, размер и другие данные, такие как биты защиты доступа и статус.
Что такое пейджинг?
Пейджинг – это механизм хранения, который позволяет ОС извлекать процессы из вторичного хранилища в основную память в виде страниц. В методе Paging основная память делится на небольшие блоки физической памяти фиксированного размера, которые называются кадрами. Размер кадра должен быть таким же, как и размер страницы, чтобы максимально использовать основную память и избежать внешней фрагментации. Пейджинг используется для более быстрого доступа к данным, и это логическая концепция.
Частота отказов
Частота отказов – это частота, с которой отказывает разработанная система или компонент. Это выражается в сбоях за единицу времени. Обозначается греческой буквой λ (лямбда).
Трансляция виртуального адреса в физический
Как уже писалось выше, при обращении к памяти трансляция адресов производится аппаратно, однако, явный доступ к физическим адресам может быть полезен в ряде случаев. Принцип поиска нужного участка памяти, конечно, такой же, как и в MMU.
Для того, чтобы получить из виртуального адреса физический, необходимо пройти по цепочке таблиц PGD, PMD и PTE. Функция vmem_translate() и производит эти шаги.
Сначала проверяется, есть ли в PGD указатель на директорию PMD. Если это так, то вычисляется адрес PMD, а затем аналогичным образом находится PTE. После выделения физического адреса страницы из PTE необходимо добавить смещение, и после этого будет получен искомый физический адрес.
Пояснения к коду функции.
mmu_paddr_t — это физический адрес страницы, назначение mmu_ctx_t уже обсуждалось выше в разделе “Виртуальный адрес”.
С помощью функции vmem_get_idx_from_vaddr() находятся сдвиги в таблицах PGD, PMD и PTE.
Особенности:
Оптимальный алгоритм
Оптимальный метод замены страницы выбирает эту страницу для замены, для которой время до следующей ссылки самое большое.
Типы методов замены страниц
Вот несколько важных методов замены страниц
- ФИФО
- Оптимальный алгоритм
- Замена страницы LRU
Виртуальный адрес
Page Global Directory (далее — PGD) — таблица (здесь и далее — то же самое, что директория) самого высокого уровня, каждая запись в ней — ссылка на Page Middle Directory (PMD), записи которой, в свою очередь, ссылаются на таблицу Page Table Entry (PTE). Записи в PTE ссылаются на реальные физические адреса, а также хранят флаги состояния страницы.
То есть, при трёхуровневой иерархии памяти виртуальный адрес будет выглядеть так:
Значения полей PGD, PMD и PTE — это индексы в соответствующих таблицах (то есть сдвиги от начала этих таблиц), а offset — это смещение адреса от начала страницы.
В зависимости от архитектуры и режима страничной адресации, количество битов, выделяемых для каждого из полей, может отличаться. Кроме того, сама страничная иерархия может иметь число уровней, отличное от трёх: например, на x86 нет PMD.
Для обеспечения переносимости мы задали границы этих полей с помощью констант: MMU_PGD_SHIFT, MMU_PMD_SHIFT, MMU_PTE_SHIFT, которые в приведённой выше схеме равны 24, 18 и 12 соответственно их определение дано в заголовочном файле src/include/hal/mmu.h. В дальнейшем будет рассматриваться именно этот пример.
На основании сдвигов PGD, PMD и PTE вычисляются соответствующие маски адресов.
Эти макросы даны в том же заголовочном файле.
Для работы с виртуальной таблицами виртуальной памяти в некоторой области памяти хранятся указатели на все PGD. При этом каждая задача хранит в себе контекст struct mmu_context, который, по сути, является индексом в этой таблице. Таким образом, к каждой задаче относится одна таблица PGD, которую можно определить с помощью mmu_get_root(ctx).
Что такое распределение памяти?
Выделение памяти – это процесс, с помощью которого компьютерным программам выделяется память или пространство.
Здесь основная память делится на два типа разделов
- Недостаточно памяти – Операционная система находится в этом типе памяти.
- High Memory – пользовательские процессы хранятся в верхней памяти.
Page Fault
Page fault — это исключение, возникающее при обращении к странице, которая не загружена в физическую память — или потому, что она была вытеснена, или потому, что не была выделена.
В операционных системах общего назначения при обработке этого исключения происходит поиск нужной странице на внешнем носителе (жёстком диске, к примеру).
В нашей системе все страницы, к которым процесс имеет доступ, считаются присутствующими в оперативной памяти. Так, например, соответствующие сегменты .text, .data, .bss; куча; и так далее отображаются в таблицы при инициализации процесса. Данные, связанные с потоками (например, стэк), отображаются в таблицы процесса при создании потоков.
Выталкивание страниц во внешнюю память и их чтение в случае page fault не реализовано. С одной стороны, это лишает возможности использовать больше физической памяти, чем имеется на самом деле, а с другой — не является актуальной проблемой для встраиваемых систем. Нет никаких ограничений, делающих невозможной реализацию данного механизма, и при желании читатель может попробовать себя в этом деле :)
Для виртуальных страниц и для физических страниц, которые могут быть использованы при работе с виртуальной памятью, статически резервируется некоторое место в оперативной памяти. Тогда при выделении новых страниц и директорий они будут браться именно из этого места.
Исключением является набор указателей на PGD для каждого процесса (MMU-контексты процессов): этот массив хранится отдельно и используется при создании и разрушении процесса.
Выделение страниц
Итак, выделить физическую страницу можно с помощью vmem_alloc_page
Функция page_alloc() ищет участок памяти из N незанятых страниц и возвращает физический адрес начала этого участка, помечая его как занятый. В приведённом коде virt_page_allocator ссылается на участок памяти, резервированной для выделения физических страниц, а 1 — количество необходимых страниц.
Выделение таблиц
Тип таблицы (PGD, PMD, PTE) не имеет значения при аллокации. Более того, выделение таблиц производится также с помощью функции page_alloc(), только с другим аллокатором (virt_table_allocator).
После добавления страниц в соответствующие таблицы нужно уметь сопоставлять участки памяти с процессами, к которым они относятся. У нас в системе процесс представлен структурой task, содержащей всю необходимую информацию для работы ОС с процессом. Все физически доступные участки адресного пространства процесса записываются в специальный репозиторий: task_mmap. Он представляет из себя список дескрипторов этих участков (регионов), которые могут быть отображены на виртуальную память, если включена соответствующая поддержка.
brk — это самый большой из всех физических адресов репозитория, данное значение необходимо для ряда системных вызовов, которые не будут рассматриваться в данной статье.
ctx — это контекст задачи, использование которого обсуждалось в разделе “Виртуальный адрес”.
struct dlist_head — это указатель на начало двусвязного списка, организация которого аналогична организации Linux Linked List.
За каждый выделенный участок памяти отвечает структура marea
Поля данной структуры имеют говорящие имена: адреса начала и конца данного участка памяти, флаги региона памяти. Поле mmap_link нужно для поддержания двусвязного списка, о котором говорилось выше.
Ранее уже рассказывалось о том, как происходит выделение физических страниц, какие данные о виртуальной памяти относятся к задаче, и теперь всё готово для того, чтобы говорить о непосредственном отображении виртуальных участков памяти на физические.
Отображение виртуальных участков памяти на физическую память подразумевает внесение соответствующих изменений в иерархию страничных директорий.
Подразумевается, что некоторый участок физической памяти уже выделен. Для того, чтобы выделить соответствующие виртуальные страницы и привязать их к физическим, используется функция vmem_map_region()
В качестве параметров передаётся контекст задачи, адрес начала физического участка памяти, а также адрес начала виртуального участка. Переменная flags содержит флаги, которые будут установлены у соответствующих записей в PTE.
Основную работу на себя берёт do_map_region(). Она возвращает 0 при удачном выполнении и код ошибки — в ином случае. Если во время маппирования произошла ошибка, то часть страниц, которые успели выделиться, нужно откатить сделанные изменения с помощью функции vmem_unmap_region(), которая будет рассмотрена позднее.
Рассмотрим функцию do_map_region() подробнее.
Макросы GET_PTE и GET_PMD нужны для лучшей читаемости кода. Они делают следующее: если в таблице памяти нужный нам указатель не ссылается на существующую запись, нужно выделить её, если нет — то просто перейти по указателю к следующей записи.
В самом начале необходимо проверить, выровнены ли под размер страницы размер региона, физический и виртуальный адреса. После этого определяется PGD, соответствующая указанному контексту, и извлекаются сдвиги из виртуального адреса (более подробно это уже обсуждалось выше).
Затем последовательно перебираются виртуальные адреса, и в соответствующих записях PTE к ним привязывается нужный физический адрес. Если в таблицах отсутствуют какие-то записи, то они будут автоматически сгенерированы при вызове вышеупомянутых макросов GET_PTE и GET_PMD.
После того, как участок виртуальной памяти был отображён на физическую, рано или поздно её придётся освободить: либо в случае ошибки, либо в случае завершения работы процесса.
Изменения, которые при этом необходимо внести в структуру страничной иерархии памяти, производятся с помощью функции vmem_unmap_region().
Все параметры функции, кроме последнего, должны быть уже знакомы. free_pages отвечает за то, должны ли быть удалены страничные записи из таблиц.
try_free_pte, try_free_pmd, try_free_pgd — это вспомогательные функции. При удалении очередной страницы может выясниться, что директория, её содержащая, могла стать пустой, а значит, её нужно удалить из памяти.
нужны как раз для случая двухуровневой иерархии памяти.
Конечно, данной статьи не достаточно, чтобы с нуля организовать работу с MMU, но, я надеюсь, она хоть немного поможет погрузиться в OSDev тем, кому он кажется слишком сложным.
Виртуа́льная па́мять (англ. virtual memory) — метод управления памятью компьютера, позволяющий выполнять программы, требующие больше оперативной памяти, чем имеется в компьютере, путём автоматического перемещения частей программы между основной памятью и вторичным хранилищем (например, жёстким диском).
Применение виртуальной памяти позволяет:
· освободить программиста от необходимости вручную управлять загрузкой частей программы в память и согласовывать использование памяти с другими программами
· предоставлять программам больше памяти, чем физически установлено в системе
· в многозадачных системах изолировать выполняющиеся программы друг от друга, путём назначения им непересекающихся адресных пространств
Виртуальным называется ресурс, который пользователю или пользовательской программе представляется обладающим свойствами, которыми он в действительности не обладает. В данном случае в распоряжение прикладного программиста предоставляется виртуальная оперативная память, размер которой намного превосходит всю имеющуюся в системе реальную оперативную память.
Понятно, однако, что работа такой «оперативной памяти» происходит значительно медленнее.
Виртуализация оперативной памяти осуществляется совокупностью программных модулей ОС и аппаратных схем процессора и включает решение следующих задач:
Ø размещение данных в запоминающих устройствах разного типа, например часть кодов программы — в оперативной памяти, а часть — на диске;
Ø выбор образов процессов или их частей для перемещения из оперативной памяти на диск и обратно;
Ø перемещение по мере необходимости данных между памятью и диском;
Ø преобразование виртуальных адресов в физические.
Виртуализация памяти может быть осуществлена на основе двух различных подходов:
ü свопинг (swapping) — образы процессов выгружаются на диск и возвращаются в оперативную память целиком,
ü виртуальная память (virtual memory) — между оперативной памятью и диском перемещаются части (сегменты, страницы и т. п.) образов процессов.
Реальная память делится на область идентичных адресов для резидентной ( постоянно находящейся в основной памяти) части управляющей программы системы ДОС-3 и область замещаемых страниц, участвующую в системе страничного обмена.
Реальная память выделяется динамически по мере необходимости расширения рабочей области программ. Выделение памяти производится сегментами произвольного размера ( не менее 16 слов) в любой доступной области памяти. Каждые 3 с служба памяти просматривает загрузку системы и осуществляет сборку мусора, снижая фрагментацию памяти.
Реальная память используется для размещения программ и управляющих блоков ЭВМ, а также страниц памятей ВМ.
Реальная память разбивается на взаимно недоступные области. Защита осуществляется в процессе выполнения программы путем управления доступом к этим областям. Исследуя содержимое РК, ЦП может указать адреса, необходимые для выполнения команды.
Основная память (ОП), в которой размещаются процессы и которая имеет ограниченный объем, представляет собой самый ограниченный и дорогостоящий ресурс. Поэтому организация и управление ОП ЭВМ является одним из самых важнейших факторов, определяющих построение и развитие ОС.
Именно организация и управление ОП во многом определяют фактический уровень мультипрограммирования ОС, то есть возможности выполнения нескольких параллельных процессов. Функциями ОС по управлению памятью являются: отслеживание свободной и занятой памяти, выделение памяти процессам и освобождение памяти при завершении процессов, вытеснение процессов из оперативной памяти на диск, когда размеры основной памяти не достаточны для размещения в ней всех процессов, и возвращение их в оперативную память, когда в ней освобождается место, а также настройка адресов программы на конкретную область физической памяти.
1 .Эффективное размещение процессов в ОП.
Основная цель УП - обеспечить максимальный уровень мультипрограммирования и тем самым максимальную загрузку ЦП.
Современные ЭВМ имеют 3-х уровневую, иерархическую организацию запоминающих устройств (ЗУ) (внутренние регистры процессора, различные типы сверхоперативной и оперативной памяти, диски, ленты), отличающихся средним временем доступа и стоимостью хранения данных в расчете на один бит (рисунок 1). Пользователю хотелось бы иметь и недорогую и быструю память. Кэш-память представляет некоторое компромиссное решение этой проблемы.
Кэш-память - это способ организации совместного функционирования двух типов запоминающих устройств, отличающихся временем доступа и стоимостью хранения данных, который позволяет уменьшить среднее время доступа к данным за счет динамического копирования в "быстрое" ЗУ наиболее часто используемой информации из "медленного" ЗУ.
Кэш-памятью часто называют не только способ организации работы двух типов запоминающих устройств, но и одно из устройств - "быстрое" ЗУ. Оно стоит дороже и, как правило, имеет сравнительно небольшой объем. Важно, что механизм кэш-памяти является прозрачным для пользователя, который не должен сообщать никакой информации об интенсивности использования данных и не должен никак участвовать в перемещении данных из ЗУ одного типа в ЗУ другого типа, все это делается автоматически системными средствами.
Рассмотрим частный случай использования кэш-памяти для уменьшения среднего времени доступа к данным, хранящимся в оперативной памяти. Для этого между процессором и оперативной памятью помещается быстрое ЗУ, называемое просто кэш-памятью. В качестве такового может быть использована, например, ассоциативная память. Содержимое кэш-памяти представляет собой совокупность записей обо всех загруженных в нее элементах данных. Каждая запись об элементе данных включает в себя адрес, который этот элемент данных имеет в оперативной памяти, и управляющую информацию: признак модификации и признак обращения к данным за некоторый последний период времени.
В системах, оснащенных кэш-памятью, каждый запрос к оперативной памяти выполняется в соответствии со следующим алгоритмом:
Просматривается содержимое кэш-памяти с целью определения, не находятся ли нужные данные в кэш-памяти; кэш-память не является адресуемой, поэтому поиск нужных данных осуществляется по содержимому - значению поля "адрес в оперативной памяти", взятому из запроса.
Если данные обнаруживаются в кэш - памяти, то они считываются из нее, и результат передается в процессор. Если нужных данных нет, то они вместе со своим адресом копируются из оперативной памяти в кэш-память, и результат выполнения запроса передается в процессор. При копировании данных может оказаться, что в кэш-памяти нет свободного места, тогда выбираются данные, к которым в последний период было меньше всего обращений, для вытеснения из кэш-памяти. Если вытесняемые данные были модифицированы за время нахождения в кэш-памяти, то они переписываются в оперативную память. Если же эти данные не были модифицированы, то их место в кэш-памяти объявляется свободным.
На практике в кэш-память считывается не один элемент данных, к которому произошло обращение, а целый блок данных, это увеличивает вероятность так называемого "попадания в кэш", то есть нахождения нужных данных в кэш-памяти.
В реальных системах вероятность попадания в кэш составляет примерно 0,9. Высокое значение вероятности нахождения данных в кэш-памяти связано с наличием у данных объективных свойств: пространственной и временной локальности.
Пространственная локальность . Если произошло обращение по некоторому адресу, то с высокой степенью вероятности в ближайшее время произойдет обращение к соседним адресам.
Временная локальность. Если произошло обращение по некоторому адресу, то следующее обращение по этому же адресу с большой вероятностью произойдет в ближайшее время.
Все предыдущие рассуждения справедливы и для других пар запоминающих устройств, например, для оперативной памяти и внешней памяти. В этом случае уменьшается среднее время доступа к данным, расположенным на диске, и роль кэш-памяти выполняет буфер в оперативной памяти.
Физически ОП имеет линейную организацию и представляет собой последовательность адресуемых ячеек (байт, 1 байт = 8 бит) от 0 до N, которая делится на слова, блоки, сегменты. Номер является адресом ячейки памяти. Размер ОП определяется в килобайтах (1Кб=1024б), мегабайтах (1Мб=1024Кб), гигабайтах (1Гб=1024Мб), терабайтах (1Тб=1024 Гб) и т.д.
Слово - это единица обмена ОП с ЦП, определяемое разрядностью с ЦП.
Блок - это непрерывная область памяти с общим ключом защиты. В EC ЭВМ - размер блока 2К, поэтому процессом выдается память, кратная 2К.
Сегмент - это некоторый участок памяти (для IBM PC от 16 б до 64Кб). Сегмент может содержать несколько блоков.
Для эффективного использования ОП необходимо определить стратегию управления памятью. ОС постоянно приходится решать задачу: когда, куда и за счет кого ввести в ОП процесс и данные.
Виртуальная память – это механизм хранения, который предлагает пользователю иллюзию наличия очень большой основной памяти. Это делается путем обработки части вторичной памяти в качестве основной памяти. В виртуальной памяти пользователь может хранить процессы большего размера, чем доступная основная память.
Поэтому вместо загрузки одного длинного процесса в основную память ОС загружает различные части более чем одного процесса в основную память. Виртуальная память в основном реализована с разбивкой по страницам и сегментации.
Из этого руководства по операционной системе вы узнаете:
Зачем использовать управление памятью?
Вот причины использования управления памятью:
- Это позволяет вам проверить, сколько памяти должно быть выделено процессам, которые решают, какой процессор должен получить память в какое время.
- Отслеживает всякий раз, когда инвентарь становится свободным или нераспределенным. По нему будет обновляться статус.
- Он выделяет пространство для подпрограмм приложения.
- Также убедитесь, что эти приложения не мешают друг другу.
- Помогает защитить разные процессы друг от друга
- Он помещает программы в память, чтобы память использовалась в полной мере.
Что такое пейджинг по требованию?
Механизм подкачки по требованию очень похож на систему подкачки с подкачкой, где процессы, хранящиеся во вторичной памяти и страницах, загружаются только по требованию, а не заранее.
Таким образом, когда происходит переключение контекста, ОС никогда не копирует ни одной из страниц старой программы с диска или страниц новой программы в основную память. Вместо этого он начнет выполнение новой программы после загрузки первой страницы и извлечет страницы программы, на которые имеются ссылки.
Во время выполнения программы, если программа ссылается на страницу, которая может быть недоступна в основной памяти, поскольку она была заменена, то процессор считает ее недопустимой ссылкой на память. Это происходит из-за сбоя страницы и передачи управления обратно из программы в ОС, что требует сохранения страницы обратно в память.
Особенности:
- Всякий раз, когда загружается новая страница, страница, которая недавно появилась в памяти, удаляется. Таким образом, легко решить, какую страницу необходимо удалить, поскольку ее идентификационный номер всегда находится в стеке FIFO.
- Самая старая страница в основной памяти – та, которая должна быть выбрана для замены первой.
Замена страницы FIFO
FIFO («первым пришел – первым вышел») – это простой метод реализации. В этом методе память выбирает страницу для замены, которая долгое время находилась в виртуальном адресе памяти.
Особенности:
- Оптимальный алгоритм приводит к наименьшему количеству ошибок страниц. Этот алгоритм сложно реализовать.
- Оптимальный метод алгоритма замены страниц имеет наименьшую частоту ошибок страниц среди всех алгоритмов. Этот алгоритм существует и который должен называться MIN или OPT.
- Замените страницу, которую не хотите использовать в течение более длительного периода времени. Используется только время, когда страница должна быть использована.
Управление постраничной памятью
Этот метод делит основную память компьютера на блоки фиксированного размера, известные как фреймы страниц. Этот аппаратный блок управления памятью отображает страницы в кадры, которые должны быть распределены на основе страниц.
Методы управления памятью
Вот некоторые наиболее важные методы управления памятью:
Разделенное Распределение
Он делит первичную память на различные разделы памяти, которые в основном являются смежными областями памяти. Каждый раздел хранит всю информацию для конкретной задачи или работы. Этот метод состоит из выделения раздела для задания при его запуске и нераспределения при его завершении.
Что такое сегментация?
Метод сегментации работает почти так же, как пейджинг. Единственное различие между ними состоит в том, что сегменты имеют переменную длину, тогда как в методе подкачки страницы всегда имеют фиксированный размер.
Программный сегмент включает в себя основную функцию программы, структуры данных, служебные функции и т. Д. ОС поддерживает таблицу сегментной карты для всех процессов. Он также включает в себя список свободных блоков памяти, а также его размер, номера сегментов и места в памяти в основной или виртуальной памяти.
Замена страницы LRU
Полной формой LRU является страница «Наименее недавно использованные». Этот метод помогает ОС найти страницу за короткий промежуток времени. Этот алгоритм должен быть реализован путем связывания счетчика с четной страницей.
Что такое динамическая загрузка?
Динамическая загрузка – это программа программы, которая не загружается до тех пор, пока программа ее не вызовет. Все подпрограммы должны содержаться на диске в перемещаемом формате загрузки. Основная программа будет загружена в память и будет выполнена. Динамическая загрузка также обеспечивает лучшее использование памяти.
Аппаратная поддержка
Обращение к памяти хорошо описанно в этой хабростатье. Происходит оно следующим образом:
Процессор подаёт на вход MMU виртуальный адрес
Если MMU выключено или если виртуальный адрес попал в нетранслируемую область, то физический адрес просто приравнивается к виртуальному
Если MMU включено и виртуальный адрес попал в транслируемую область, производится трансляция адреса, то есть замена номера виртуальной страницы на номер соответствующей ей физической страницы (смещение внутри страницы одинаковое):
Если запись с нужным номером виртуальной страницы есть в TLB [Translation Lookaside Buffer], то номер физической страницы берётся из нее же
Если нужной записи в TLB нет, то приходится искать ее в таблицах страниц, которые операционная система размещает в нетранслируемой области ОЗУ (чтобы не было промаха TLB при обработке предыдущего промаха). Поиск может быть реализован как аппаратно, так и программно — через обработчик исключения, называемого страничной ошибкой (page fault). Найденная запись добавляется в TLB, после чего команда, вызвавшая промах TLB, выполняется снова.
Таким образом, при обращении программы к тому или иному участку памяти трансляция адресов производится аппаратно. Программная часть работы с MMU — формирование таблиц страниц и работа с ними, распределение участков памяти, установка тех или иных флагов для страниц, а также обработка page fault, ошибки, которая происходит при отсутствии страницы в отображении.
В тексте статьи в основном будет рассматриваться трёхуровневая модель памяти, но это не является принципиальным ограничением: для получения модели с бóльшим количеством уровней можно действовать аналогичным образом, а особенности работы с меньшим количеством уровней (как, например, в архитектуре x86 — там всего два уровня) будут рассмотрены отдельно.
Читайте также: