Похожие презентации:
16. Разработка, реализация и сегментация страничной реализации памяти (2)
1. Разработка, реализация и сегментация страничной реализации памяти
2. Страничная организация памяти
Разработка, реализация и сегментация страничной организации памятиявляются важными аспектами проектирования современных компьютерных
систем. Эти механизмы позволяют эффективно управлять памятью компьютера,
обеспечивая оптимальное использование ресурсов и повышая
производительность системы.
3. Страничная организация памяти
Страничная организация памятипредставляет собой метод
управления виртуальной памятью,
при котором физическая память
делится на фиксированные блоки
(страницы). Каждая страница
имеет одинаковый размер, обычно
равный нескольким килобайтам
(например, 4 КБ).
4. Основные компоненты страничного механизма
• Виртуальное адресное пространство:Это непрерывное адресное пространство, доступное процессу. Оно разделено
на страницы виртуальных адресов.
• Физическое адресное пространство:
Физическая память также разделяется на страницы физического адреса.
• Таблица страниц:
Таблица, хранящая отображение виртуальных страниц на физические страницы.
Каждый элемент таблицы включает номер физической страницы и
дополнительную информацию (например, бит присутствия, права доступа).
• Механизм трансляции адресов:
Аппаратура процессора транслирует виртуальные адреса в физические,
используя таблицу страниц.
5. Виртуальное адресное пространство
Виртуальное адресное пространство — это абстрактное представлениеадресного пространства процессов в оперативной памяти вычислительной
системы. Оно используется операционной системой для эффективного
распределения и управления ресурсами памяти.
Суть виртуального
адресного пространства
заключается в
предоставлении каждому
процессу иллюзии наличия
собственной независимой
области памяти, что
позволяет избежать
конфликтов и упрощает
разработку программного
обеспечения.
6. Виртуальное адресное пространство
Особенности виртуального адресного пространства:• Каждое приложение видит собственную копию адресного пространства,
независимо от реальных физических адресов.
• Обеспечивает изоляцию процессов друг от друга.
• Уменьшает фрагментацию памяти благодаря возможности динамического
размещения страниц в физической памяти.
• Поддерживает разделение виртуальной памяти между несколькими
приложениями посредством механизмов свопинга и разделения файлов
подкачки.
7. Виртуальное адресное пространство
Адрес виртуального пространства состоит из двух компонентов:• Номер виртуальной страницы (VPN): определяет страницу виртуальной
памяти.
• Смещение внутри страницы (Offset): указывает позицию конкретного байта
в пределах одной страницы.
Процессор
автоматически
преобразует
виртуальные адреса в
реальные физические
адреса перед
обращением к данным.
8. Виртуальное адресное пространство
Типичный размер виртуального адресного пространства зависит от архитектурыпроцессора:
• x86 (32-bit): 4 ГБ (от 0x00000000 до 0xFFFFFFFF)
• x86_64 (64-bit): примерно 128 ТБ (реально используемый диапазон
ограничен характеристиками конкретной ОС и оборудования)
Однако большинство современных операционных систем используют намного
меньшие диапазоны, ограничивая доступные процессы размерами порядка
десятков гигабайт.
9. Реализация страничного механизма
Реализация страничного механизма требует аппаратной поддержки иоперационной системы. Рассмотрим основные шаги реализации:
1. Определение размера страницы:
Размер страницы должен быть выбран таким образом, чтобы минимизировать
потери пространства (фрагментацию) и обеспечить эффективное использование
кэш-памяти.
2. Создание таблиц страниц:
Для каждого процесса создается таблица страниц, содержащая записи для
каждой виртуальной страницы.
3. Поддержка многоуровневых таблиц страниц:
Чтобы уменьшить объем памяти, занимаемый таблицами страниц,
используются многоуровневые структуры (двухуровневая, трехуровневая и т.д.).
4. Аппаратная поддержка:
Процессор должен поддерживать механизм трансляции адресов, включая
кэширование записей таблицы страниц (TLB) для ускорения доступа.
5. Обработка ошибок:
Если запрашиваемая страница отсутствует в физической памяти, генерируется
исключение (page fault), которое обрабатывается операционной системой путем
загрузки нужной страницы из вторичной памяти (обычно диска).
10. Сегментация памяти
Сегментация является альтернативным методом управления памятью, прикотором память делится на сегменты переменного размера. Каждый сегмент
соответствует определенной части программы (например, код, данные, стек).
Преимущества сегментации:
• Возможность защиты отдельных частей программы друг от друга.
• Упрощенное управление большими структурами данных.
Недостатки сегментации:
• Фрагментация внешней памяти.
• Сложность управления памятью по сравнению со страничной организацией.
11. Сегментация памяти
Сегментация памяти — это способ организации и управления оперативнойпамятью, при котором вся память делится на отдельные участки произвольного
размера, называемые сегментами.
Каждый сегмент представляет собой самостоятельную единицу хранения
данных, соответствующую определённому компоненту программы (например,
исполняемый код, данные, стек, куча). Этот подход отличается от традиционных
методов деления памяти на однородные блоки (таких как постраничная
организация), поскольку здесь сегменты имеют различную длину и
располагаются последовательно, заполняя всю физическую память.
Сегмент памяти в компьютере — это логическая единица распределения
памяти, предназначенная для размещения в памяти одного модуля
программного кода или данных. Сегменты создаются пользователями, которые
могут обращаться к ним по символическому имени.
12. Сегментация памяти
При сегментации каждая программа рассматривается как совокупностьлогически отделённых блоков — сегментов. К примеру, один сегмент может
содержать инструкции (код), второй — статические данные, третий — кучу для
динамически выделяемых объектов, четвёртый — стек для локальных
переменных функций. Таким образом, каждый сегмент фактически становится
отдельным адресным пространством, имеющим своё начало и конец.
13. Сегментация памяти
Достоинства сегментации памяти:• Простота программирования: программе удобно иметь логически
раздельные блоки данных и инструкций.
• Защита памяти: легче организовать защиту отдельных участков памяти от
несанкционированного доступа.
• Совместное использование: можно легко реализовать совместное
использование сегментов разными процессами.
• Расширяемость: новые сегменты могут создаваться и удаляться
динамически.
Несмотря на преимущества, сегментация сталкивается с рядом трудностей:
• Фрагментация памяти: Возникают свободные промежутки между
сегментами, приводящие к неэффективному использованию памяти.
• Проблема большой длины описания: Поскольку длина сегментов заранее
неизвестна, приходится резервировать большое количество регистров или
сложной структуры данных для отслеживания всех активных сегментов.
• Медленная обработка обращений: Постоянное переключение между
сегментами замедляет выполнение программ.
14. Способы реализации страничной организации памяти
Способы реализации страничной организации памяти зависят главным образомот особенностей архитектуры самой операционной системы и уровня
абстракции, предоставляемого языком программирования. Однако языки
программирования предлагают инструменты и методы, позволяющие
разработчикам косвенно взаимодействовать с механизмами страничной
организации памяти.
15. Низкоуровневый контроль памяти (ассемблер и C/C++)
Низкоуровневые языки предоставляют наибольший контроль над управлениемпамятью, хотя прямой доступ к физическим адресам практически невозможен
ввиду изоляции прикладных процессов и механизмов виртуализации памяти.
• Работа с сегментированными регистрами.
В некоторых старых архитектурных моделях, таких как Intel x86, существуют
специальные сегментные регистры (CS, DS, SS и др.). Они помогают
организовывать сегменты виртуальной памяти. Но данная техника постепенно
утрачивает популярность с развитием продвинутых схем управления памятью.
• Использование библиотек и API.
Библиотеки вроде mmap() (POSIX-интерфейсы) или WinAPI-функции
(VirtualAlloc()) позволяют выделить большие куски виртуальной памяти и
управляют ими вручную. Разработчик может создавать большие буферы,
распределённые по страницам, вручную вызывая необходимые системные
вызовы.
16. Языки высокого уровня (Python, JavaScript, Java)
Высокоуровневые языки предоставляют менее прямые средства контроляпамяти, однако некоторые техники всё же позволяют влиять на распределение
памяти и обработку страниц:
• Объектно-ориентированный подход.
Использование классов и экземпляров объектов естественным образом
распределяет память в рамках виртуальной машины (VM). Объекты создаются
динамически, и VM автоматически выделяет новые страницы памяти по мере
необходимости.
• Сборщик мусора (GC).
Большинство высокоуровневых языков (Java, Python, JavaScript) применяют
сборщики мусора для автоматического освобождения неиспользуемой памяти.
GC следит за объектами, создаёт временные копии и перемещает объекты
между различными областями памяти, иногда перенося их между страницами.
• Аллокация массивов большого объёма.
В языках типа Python, выделение массива большого объема заставляет
интерпретатор создавать новую страницу памяти и размещать объект в неё.
17. Прямые манипуляции с памятью (Rust, Go)
Некоторые современные языки программирования, такие как Rust и Go,стремятся предложить баланс между производительностью и безопасностью,
сохраняя высокий уровень контроля над памятью.
• Go runtime;
Внутренне среда исполнения Go управляет распределением памяти и
автоматическим освобождением (GC). Однако разработчики могут задать
ограничения на выделение памяти, что влияет на распределение новых страниц
памяти.
• Rust:
Rust реализует концепцию владения (ownership) и заимствования (borrowing),
минимизируя вероятность утечек памяти и двойного выделения памяти. Ручное
освобождение памяти осуществляется через стандартные конструкции
(например, деструкторы). Тем не менее, при работе с низкоуровневыми
примитивами возможно прямое взаимодействие с виртуальной памятью.
18. Работа с файловыми картами (file mapping)
Ещё одним способом влияния на организацию памяти является использованиетехнологии file mapping («карты файла»). Она позволяет сопоставлять
содержимое файла виртуальному адресу в памяти, формируя большие страницы
памяти.
Пример на Python:
Этот подход широко используется в СУБД и других приложениях, работающих
с большим объёмом данных.
19. Оптимизация страничной памяти средствами компиляторов и JIT-компиляторов
Компиляторы современных языков программирования (например, LLVM дляC++ или V8 для JavaScript) часто выполняют оптимизации, направленные на
повышение эффективности работы с памятью. Некоторые из них включают:
• Оптимизацию размещения объектов:
Расположение объектов в памяти ближе друг к другу снижает число переходов
между страницами.
• Inline-кэширование:
Используется в JIT-компиляции, ускоряя обращение к объектам за счёт
уменьшения количества ссылок на разные страницы.
Советы и рекомендации
• Используйте библиотеки и API вашего языка программирования, чтобы
выделять большие объёмы памяти (например, numpy в Python или массивы в
JavaScript).
• Старайтесь избегать частых аллокаций небольших объектов, предпочитайте
крупные блоки памяти.
• Настраивайте сборщик мусора и лимиты памяти для оптимального
функционирования вашей среды исполнения.
20.
ЗаданияОтветьте на вопросы:
1) Что такое страничная организация памяти ?
2) Какого размера могут быть страницы относительно друг друга?
3) Что такое виртуальное адресное пространство?
4) Что такое физическое адресное пространство?
5) Что такое таблица страниц?
6) Что такое механизм трансляции адресов?
7) Из каких компонентов состоит адрес виртуального пространства?
8) Что такое сегментация?
9) Что такое сегмент?
21.
Практические заданияМониторинг нагрузки на память в приложении на Python
Цель: Освоить мониторинг потребления памяти Python-программы в процессе
её выполнения и научиться выявлять моменты увеличения нагрузки на память.
Шаги выполнения задания
Этап 1: Установка необходимых инструментов
Для мониторинга памяти потребуется библиотека psutil, которая предоставляет
удобные функции для анализа состояния системы и процессов.
22.
Практические заданияЭтап 2: Определение базовой структуры программы
Создайте скрипт, который периодически выводит информацию о потребляемой
памяти процессом. Запустите небольшой тестовый цикл, создающий нагрузку
на память (например, постоянно увеличивающийся список):
23.
Практические заданияЭтап 3: Улучшение вывода статистики
Сейчас мы видим общее потребление памяти процессом, но полезно добавить
детализацию, например, вывод максимальной нагрузки на память и среднего
показателя потребления за интервал времени.
Дополнительно добавьте вывод максимального расхода памяти и среднюю
скорость роста памяти за каждые N секунд.
Теперь ваш монитор должен выводить статистику:
• Текущую нагрузку на память.
• Максимальную достигнутую нагрузку.
• Среднюю скорость прироста памяти.
24.
Практические заданияЭтап 3:
Изменённый пример скрипта:
25.
Практические заданияЭтап 3:
Изменённый пример скрипта. Продолжение.
26.
Практические заданияЭтап 4: Автоматизация обнаружения аномалий
Часто бывает полезным обнаружить резкий скачок потребления памяти или
превышение порога допустимой нагрузки. Дополните вашу программу
функцией сигнализации, которая отправляет предупреждение, если
потребление памяти превышает определенный порог (например, 1 GB).
По итогу ваш код должен выводить:
• Текущую нагрузку на память.
• Максимальную достигнутую нагрузку.
• Среднюю скорость прироста памяти.
• Уведомлять, когда память превышает указанный лимит.
27.
Практические заданияЭтап 4:
Дополненная версия скрипта:
28.
Практические заданияЭтап 4:
Дополненная версия скрипта. Продолжение.
29.
Практические заданияЭтап 4:
Дополненная версия скрипта. Продолжение.
Информатика