Какая из схем управления памятью подходит для организации виртуальной памяти

Обновлено: 04.07.2024

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

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

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

Обмен

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

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

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

Защита памяти

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

Распределение памяти

Распределение памяти – это процесс, посредством которого компьютерным программам выделяется память или пространство. Он бывает трех типов:

Первая достаточно большая дыра выделяется для программы.

Наименьшее достаточно большое отверстие выделяется для программы.

Для программы выделяется самая большая дыра, которая достаточно велика.

Фрагментация

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

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

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

Пейджинг

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

Таблица страниц

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

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

Сегментация

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

Сегментация с разбивкой по страницам

Как разбиение на страницы, так и сегментация имеют свои преимущества и недостатки, лучше объединить эти две схемы, чтобы улучшить каждую из них. Комбинированная схема известна как «Page the Elements». Каждый сегмент в этой схеме разделен на страницы, и каждый сегмент хранится в таблице страниц. Таким образом, логический адрес делится на следующие 3 части:

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

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

  • Что такое основная память?
  • Что такое управление памятью?
  • Для чего необходимо управление памятью
  • Логическое адресное пространство и физическое адресное пространство
  • Статическая и динамическая загрузка
  • Статическая и динамическая привязка
  • Обмен
  • Распределение непрерывной памяти
    • Распределение памяти
      • Первая подгонка
      • Наилучшее соответствие
      • Наихудший вариант
      • Внутренняя фрагментация
      • Внешняя фрагментация

      Теперь перед тем, как начать управление памятью, сообщите нам, что такое основная память.

      Что такое основная память:

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


      Рисунок 1. Иерархия памяти

      Что такое управление памятью:

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

      Для чего необходимо управление памятью:

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

      Теперь мы обсудим концепцию логического адресного пространства и физического адресного пространства:

      Логическое и физическое адресное пространство:

      Логическое адресное пространство. Адрес, генерируемый ЦП, называется «логическим адресом». Он также известен как виртуальный адрес. Логическое адресное пространство можно определить как размер процесса. Логический адрес можно изменить.

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

      Статическая и динамическая загрузка:

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

      Статическая и динамическая привязка:

      • Статическое связывание. При статическом связывании компоновщик объединяет все необходимые программные модули в одну исполняемую программу. Таким образом, нет никакой зависимости во время выполнения. Некоторые операционные системы поддерживают только статическую компоновку, при которой библиотеки системных языков обрабатываются как любой другой объектный модуль.
      • Динамическое связывание. Основная концепция динамического связывания аналогична динамической загрузке. При динамической компоновке «заглушка» включается в каждую соответствующую библиотечную подпрограмму. Заглушка — это небольшой фрагмент кода. Когда заглушка выполняется, она проверяет, находится ли уже нужная подпрограмма в памяти или нет. Если она недоступна, программа загружает подпрограмму в память.

      Обмен:

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

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

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

      Распределение памяти:

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

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

      Фиксированное распределение разделов. В этом методе операционная система ведет таблицу, в которой указывается, какие части памяти доступны, а какие заняты процессами. Изначально вся память доступна для пользовательских процессов и считается одним большим блоком доступной памяти. Эта доступная память известна как «дыра». Когда прибывает процесс и ему требуется память, мы ищем дыру, достаточно большую для хранения этого процесса. Если требование выполняется, мы выделяем память для обработки, в противном случае оставляем остальную часть доступной для удовлетворения будущих запросов. При выделении памяти иногда возникают проблемы с динамическим выделением памяти, которые касаются того, как удовлетворить запрос размера n из списка свободных дыр. Есть несколько решений этой проблемы:

      Первое соответствие:-

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

      Здесь, на этой диаграмме, блок памяти размером 40 КБ является первой доступной свободной дырой, в которой может храниться процесс A (размер 25 КБ), поскольку в первых двух блоках не было достаточно места в памяти.

      Наиболее подходящий:-

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

      Здесь, в этом примере, сначала мы просматриваем весь список и находим последнюю дыру 25 КБ, которая лучше всего подходит для процесса A (размер 25 КБ).

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

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

      В этом примере процессу A (размер 25 КБ) выделяется самый большой доступный блок памяти, равный 60 КБ. Неэффективное использование памяти является серьезной проблемой в худшем случае.

      Фрагментация:

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

      Внутренняя фрагментация:

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

      Пример: предположим, что для распределения памяти используется фиксированное разбиение и различный размер блока 3 МБ, 6 МБ и 7 МБ пространства в памяти. Теперь приходит новый процесс p4 размером 2MB и требует блок памяти. Он получает блок памяти размером 3 МБ, но память блока 1 МБ является пустой тратой, и она не может быть выделена другим процессам. Это называется внутренней фрагментацией.

      Внешняя фрагментация:

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

      Пример. Предположим (рассмотрите приведенный выше пример), что три процесса p1, p2, p3 имеют размер 2 МБ, 4 МБ и 7 МБ соответственно. Теперь им выделяются блоки памяти размером 3 МБ, 6 МБ и 7 МБ соответственно. После выделения процесса процесса p1 и процесса p2 осталось 1 МБ и 2 МБ. Предположим, приходит новый процесс p4 и требует блок памяти размером 3 МБ, который доступен, но мы не можем его выделить, поскольку свободное пространство памяти не является непрерывным. Это называется внешней фрагментацией.

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

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

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

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

      Эти общие заметки в значительной степени основаны на представлении в главе 7 книги Столлингса. Пожалуйста, смотрите в книге полное текстовое объяснение большинства пунктов плана. Здесь приводятся подробные примечания лишь по нескольким пунктам, в которых мы хотим выйти за пределы Столлинга.

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

      <УЛ>
    • часть памяти зарезервирована для ОС
    • остальная память, выделенная ОС для процессов
    • цель: эффективное распределение
      максимизация пропускной способности системы => загрузка ЦП => размещение как можно большего количества процессов

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

    Иерархия реализации памяти

    <УЛ>
  • Кэш (также может иметь несколько уровней)
    обычно управляется аппаратно
  • Основная память (RAM)
    управляется ОС
  • Дополнительное хранилище (например, диск), также известное как пространство подкачки,
    управляемое ОС

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

Требования к управлению памятью

<УЛ>
  • Переезд
  • Защита
  • Общий доступ
  • Логическая организация
  • Физическая организация
  • Сталлингс цитирует и более ранний учебник (Lister & Eager), характеризующий проблему управления памятью с точки зрения пяти требований, каждое из которых мы рассмотрим более подробно.

    Требования к управлению памятью: перемещение

    <УЛ>
  • Программист (компилятор, ассемблер, компоновщик) не знает, где программа будет размещена в памяти при ее выполнении
  • Во время выполнения программа может быть перенесена на диск и возвращена в оперативную память в другое место (перемещена)
  • Ссылки на память должны быть преобразованы в коде в реальный адрес физической памяти.
  • Удовлетворение требований к процессу

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

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

    Требования к управлению памятью: защита

    <УЛ>
  • Запретить ссылки на ячейки памяти в другом процессе без разрешения
  • Невозможно предсказать и проверить адреса ссылок на память перед выполнением, так как
    • Программа может быть перемещена
    • Программы могут динамически вычислять адреса

    Требования к управлению памятью: совместное использование

    <УЛ>
  • Должен разрешать нескольким процессам доступ к одной и той же части памяти с соответствующей защитой.
  • Разрешить процессам совместно использовать доступ (только для выполнения) к одной копии программы в памяти
  • Разрешить процессам совместно использовать доступ для чтения и записи к некоторому региону, например , база данных
  • Механизмы перемещения могут быть адаптированы для совместного использования.
  • Требования к управлению памятью: логическая организация

    <УЛ>
  • Программы пишутся в модулях
  • Модули можно писать и компилировать независимо в библиотеки
  • Модули можно динамически загружать в память, если это необходимо
  • Копии модулей могут быть общими для процессов
  • Модулям могут быть присвоены различные степени защиты (только для чтения, только для выполнения).
  • Это требование является основной причиной использования архитектуры сегментированной памяти.
  • Требования к управлению памятью: физическая организация

    <УЛ>
  • Память разделена на уровни: основная память и дополнительная память.
  • Основная память: быстрая, компактная, единственная, доступная напрямую
  • Вторичная память: медленнее, больше, перед использованием необходимо скопировать данные в основную память.
  • Может быть недостаточно основной памяти для программы и ее данных
  • Это означает, что данные и код должны динамически переноситься между уровнями.
  • ОС, а не прикладная программа, должна управлять этим
    • Наложение под управлением приложения слишком сложно и чревато ошибками.
    • Программист не знает, сколько места будет доступно или где оно будет находиться.

    Историческая эволюция, ведущая к системам виртуальной памяти

    <УЛ>
  • Фиксированное разделение
  • Динамическое разбиение
  • Простой пейджинг
  • Простая сегментация
  • Виртуальная память с подкачкой
  • Виртуальная память с сегментацией
  • Виртуальная память с подкачкой и сегментацией
  • Мы рассмотрим историческую эволюцию управления памятью в операционных системах, которая привела к организации виртуальной памяти, характерной для большинства современных систем.

    Фиксированное разделение

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

    Решите, какой из свободных разделов памяти выделить для выполнения запроса

    <УЛ>
  • Разделы одинакового размера
    • поскольку все разделы имеют одинаковый размер, не имеет значения, какой раздел используется
    • можно назначить каждому процессу наименьший раздел, в котором он может поместиться
    • очередь для каждого раздела
    • процессы назначаются таким образом, чтобы свести к минимуму потери памяти в разделе

    Алгоритмы размещения

    Динамическое разбиение

    <УЛ>
  • Разделы имеют переменную длину и количество.
  • Процессу выделяется ровно столько памяти, сколько требуется
  • В конце концов получить дыры в памяти. Это называется внешней фрагментацией.
  • Необходимо использовать сжатие для смещения процессов, чтобы они были непрерывными, а вся свободная память находилась в одном блоке.
  • Для этого требуется динамическое перемещение.
  • Динамическое разбиение

    Динамическое перемещение

    <УЛ>
  • При загрузке программы в память определяются фактические (абсолютные) ячейки памяти
  • Если процесс может занимать разные разделы (после подкачки), это означает разные абсолютные ячейки памяти во время выполнения
  • Сжатие также приводит к тому, что программа занимает другое место в памяти.
  • Перемещение в другую абсолютную ячейку памяти означает перемещение
  • Различные типы адресов

    <УЛ>
  • Логический
    • ссылка на ячейку памяти, которая не зависит от текущего расположения кода процесса и данных в памяти
    • перевод должен быть выполнен на текущий физический адрес
    • частный случай логического адреса
    • адрес, выраженный как расположение относительно некоторой известной "нулевой" точки, например начала памяти, занимаемой процессом
    • абсолютный адрес или фактическое местоположение в оперативной памяти

    Чтобы точно обсудить динамическое перемещение, мы должны различать несколько разных типов адресов.

    Аппаратная поддержка динамического перемещения

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

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

    Есть ли веская причина для того, чтобы регистр границ указывал на место перед стеком?

    Три простых алгоритма размещения для динамического разбиения

    <УЛ>
  • Наилучшее соответствие
    • Выбирает блок, ближайший по размеру к запросу.
    • Самый низкий показатель
    • Остается фрагмент наименьшего размера, требуется
      • более длительный поиск
      • более частое сжатие памяти
      • Самый быстрый
      • В передней части памяти может быть загружено много процессов, которые необходимо просмотреть при попытке найти свободный блок.
      • Чаще выделяйте блок памяти в конце памяти, где находится самый большой блок
      • Самый большой блок памяти разбивается на более мелкие блоки.
      • Сжатие требуется для получения большого блока в конце памяти.

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

      Реализация C malloc() и C++ new должна решать те же проблемы управления памятью в пределах виртуального адресного пространства одного процесса, что и части управления памятью операционных систем для управления памятью между процессами до появления виртуальной памяти. Память. Другими словами, понимание доступных здесь алгоритмов и вопросов производительности поможет вам понять производительность программ и классов/библиотек, использующих динамическое выделение памяти. Одно большое отличие состоит в том, что внутри процесса мы, как правило, не можем сжимать свободную память (почему бы и нет?), поэтому внешняя фрагментация является более серьезной проблемой.

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

      Пример конфигурации памяти до и после выделения

      Проблема замены

      <УЛ>
    • Выберите, у какого процесса вытеснять память (т. е. выгружать), когда требуется место.

    Когда требуется замена динамического разделения памяти? То есть, при каких обстоятельствах ОС должна будет заменить процесс до того, как процесс завершит выполнение?

    Каковы разумные правила замены динамическим разделением памяти?

    Замена обсуждается более подробно в разделе о системах виртуальной памяти.

    Система друзей

    <УЛ>
  • Одна из нескольких схем управления памятью
  • Компромисс между фиксированным и динамическим секционированием
  • Имеет множество приложений, не ограничиваясь выделением основной памяти процессам
  • Все доступное пространство считается единым блоком размером 2 м.
  • Если запрос размера s такой, что 2k-1k, выделяется весь блок размером 2k
    • В противном случае блок будет разделен на двух равных друзей.
    • Процесс продолжается до тех пор, пока не будет сгенерирован наименьший блок размером больше или равным s

    Для сравнения см. схему граничных тегов для управления хранилищем, описанную в примечаниях по распределению памяти.

    Пример системы друзей

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

    Адреса блоков друзей, отображаемые как неявное дерево

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

    Нет необходимости строить явное дерево с помощью указателей.

    Адрес партнера блока размером 2k получается "переворачиванием" (то есть изменением с нуля на единицу или с единицы на ноль) k-го бита адреса блока.

    Например, партнер размера 4 (2 2 ) блока с адресом 01000 является блоком с адресом 01 1 00, и наоборот.

    Реализация Gnu malloc()

    Реализация malloc() в Gnu является примером полноценной реализации системы управления хранением. Эта версия не самая последняя, ​​но она все равно может быть полезна в качестве примера. Вам может быть полезно прочитать его, в частности, free.h и malloc.c .

    Пейджинг

    <УЛ>
  • Разделить память на небольшие фрагменты одинакового размера и разделить каждый процесс на фрагменты одинакового размера.
  • Фрагменты логического адресного пространства процесса называются страницами,
    а фрагменты реальной памяти называются фреймами
  • Операционная система поддерживает таблицу страниц для каждого процесса
    • содержит местоположение фрейма для каждой страницы в процессе
    • логический адрес = (номер_страницы, смещение_в_странице)
    • физический адрес = таблица_страниц[номер_страницы] * размер_страницы + смещение_внутри_страницы
    • ассоциативная память, иногда называемая резервным буфером перевода, ускоряет поиск
    • перехватывать ОС для несопоставленных страниц

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

    Назначение страниц процесса свободным фреймам

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

    Таблицы страниц для примера

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

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

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

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

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

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

    MMU использует информацию из таблицы страниц для поиска неиспользуемой страницы физической памяти (например, той, к которой в последнее время не обращались). Он записывает неиспользуемую страницу в зарезервированную область диска, называемую файлом подкачки. Затем MMU заставляет ЦП считать запрошенную страницу в физическую память либо из файла на диске, либо из файла подкачки. После этого MMU сопоставляет виртуальные и физические страницы и обновляет таблицы страниц.

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

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

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

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

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

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

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

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