Работа памяти в Windows
Работа памяти в Windows
Работа с памятью в Windows включает в себя множество слоев и механизмов, позволяющих эффективно использовать физическую и виртуальную память, обеспечивать доступ к данным, кэшировать информацию и управлять выделением ресурсов между процессами. Здесь мы рассмотрим, как система распределяет физическую память, какие структуры данных используются для управления памятью, какие типы памяти существуют, как происходит кэширование и какие особенности имеют различные виды выделения памяти.
Физическая память
Что такое физическая память?
Физическая память — это реальные адресуемые блоки памяти, которые доступны процессору напрямую. Это физические компоненты компьютера, такие как оперативная память (RAM), которые обеспечивают хранение данных и команд, необходимых для работы процессора.
Физическая память представляет собой набор битов, расположенных в физических адресах, доступных для чтения и записи. Все данные, которые обрабатываются компьютером, временно размещаются в физической памяти. Система может иметь несколько устройств физической памяти, такие как модули RAM, которые объединяются в один логический объем.
Физическая память организована в виде последовательных блоков, каждая из которых имеет уникальный адрес. Эти адреса могут быть представлены как числа, где каждый бит в адресе указывает на конкретную ячейку памяти. В современных системах адресация осуществляется по 64-битным или 32-битным адресам, что позволяет адресовать огромное количество ячеек памяти.
Физическая память делится на блоки, называемые страницами. Это стандартный размер блока, который используется для управления памятью. В Windows физическая страница обычно имеет размер 4 КБайт (4096 байт). Это значение выбирается как оптимальное для эффективного использования адресного пространства и минимизации потерь при управлении памятью.
Физическая память состоит из:
- Блоков данных — основные ячейки памяти, содержащие информацию;
- Страниц — логические единицы управления памятью;
- Диапазонов — непрерывных участков памяти с определенными характеристиками;
- Заголовков — служебной информации для управления доступом и статусом страниц.
Каждая страница может быть:
- Активной или неактивной;
- Занятой или свободной;
- Используемой процессом или системой;
- Защищённой от записи или выполнения.
Физическая память является основой всех операций с данными в компьютере. Система использует её для хранения программ, данных и информации о состоянии системы.
В операционной системе Windows физическая память используется следующим образом:
- Ядро ОС — использует физическую память для хранения таблиц страниц и других структур;
- Процессы — выделяют память в рамках своих процессов;
- Драйверы — используют память для взаимодействия с оборудованием;
- Системные компоненты — кэшируют данные и управляют ресурсами.
Физическая память в Windows может быть:
- Использована полностью;
- Сжата при необходимости;
- Выгружена на диск;
- Защищена от изменений;
- Управляема системой автоматически.
Физическая страница
Физическая страница — это минимальная единица управления памятью в операционной системе. Это фиксированный размер блоков физической памяти, обычно 4 КБайт. Страница не обязательно соответствует физическому расположению данных в памяти — она лишь представляет собой логическую единицу управления.
Физические страницы могут быть:
- Страницами, доступными для чтения и записи;
- Страницами, только для чтения;
- Защищенными от записи или выполнения.
Каждая физическая страница имеет уникальный номер, который используется системой для отслеживания её использования. Система может переносить данные между физическими страницами в зависимости от необходимости, например, при использовании механизмов кэширования или вытеснения.
Физические страницы имеют следующие особенности:
- Размер — обычно 4 КБайт;
- Назначение — хранение данных и структур управления;
- Управление — через таблицы страниц;
- Свойства — доступность, защита, использование;
- Контроль — через механизмы защиты и управления.
Физические страницы являются основой системы виртуальной памяти. Они обеспечивают связь между адресным пространством процессов и физическими блоками памяти, позволяя эффективно использовать ограниченные ресурсы системы.
Физические диапазоны памяти
Физические диапазоны памяти — это непрерывные блоки физической памяти с определенными адресами. Эти диапазоны могут иметь различные свойства, например:
- Доступны для чтения и записи;
- Только для чтения; мЗащищены от выполнения.
Физические диапазоны могут быть выделены различными компонентами системы:
- Для использования ядром операционной системы;
- Для выделения процессам;
- Для драйверов устройств;
- Для специальных целей, таких как кэширование или сжатие.
Каждый физический диапазон имеет начало и конец, определяемые адресами в памяти. Эти диапазоны могут пересекаться или быть отдельными, что позволяет эффективно управлять доступом к различным частям памяти.
Управление физической памятью
Физическая память в Windows управляема через таблицы страниц, которые обеспечивают связь между виртуальными и физическими адресами. Каждая запись в таблице страниц содержит информацию о том, какие виртуальные страницы соответствуют какой физической странице.
Физическая память может быть выделена:
- Для конкретных процессов;
- Для драйверов устройств;
- Для системных нужд;
- Для кэширования данных.
Система отслеживает использование каждой физической страницы, чтобы оптимизировать доступ и избежать конфликтов. При необходимости память может быть выгружена на диск (в случае сегментации) или сжата (в случае сжатой памяти).
В реальных условиях физическая память используется следующим образом:
- Операционная система использует физическую память для хранения таблиц страниц и других системных структур;
- Приложения выделяют память в рамках своих процессов, что приводит к использованию физических страниц;
- Драйверы устройств используют физическую память для обмена данными с оборудованием;
- Система кэширует данные файлов и других ресурсов, используя физические страницы.
Физическая память также может быть сжата или выгружена при нехватке ресурсов. Это позволяет системе эффективно использовать ограниченные ресурсы и предотвращает переполнение.
Адресация и управление памятью
Механизм виртуальной памяти
Виртуальная память — это механизм, который позволяет операционной системе предоставить каждому процессу собственное адресное пространство, независимо от того, какая физическая память доступна на компьютере. Виртуальная память создает иллюзию, что каждый процесс имеет полный доступ к памяти системы, даже если общего объема физической памяти недостаточно.
В Windows каждому процессу выделяется уникальное виртуальное адресное пространство, которое может быть значительно больше физической памяти. Это позволяет запускать множество приложений одновременно без конфликтов между ними, так как каждый процесс работает с собственными адресами.
Виртуальные и физические адреса
Виртуальный адрес — это адрес, который использует процесс для доступа к памяти. Он не соответствует реальному местоположению данных в физической памяти. Вместо этого виртуальный адрес преобразуется в физический через механизм адресации.
Физический адрес — это реальное место в оперативной памяти, где находятся данные. Это конкретные ячейки памяти, которые могут быть прочитаны или записаны процессором напрямую.
Преобразование адресов
Процесс преобразования виртуального адреса в физический происходит следующим образом:
- Процесс обращается к виртуальному адресу;
- Процессор проверяет таблицу страниц для определения соответствия;
- Если страница не загружена в память, генерируется прерывание страницы (page fault);
- Система загружает нужную страницу из хранилища или вытесняет другую;
- Процессор обновляет таблицу страниц;
- Операция повторяется с новым физическим адресом.
Таблицы страниц
Таблица страниц — это структура данных, которая хранит информацию о сопоставлении виртуальных и физических адресов. Она позволяет операционной системе отслеживать, где находятся данные, которые процессы пытаются использовать.
В Windows используется двухуровневая система таблиц страниц:
- Первая таблица (PML4) — содержит указатели на вторые таблицы;
- Вторая таблица (PDPT) — содержит указатели на третьи таблицы;
- Третья таблица (PDT) — содержит указатели на четвертые таблицы;
- Четвертая таблица (PT) — содержит записи о физических страницах.
Таблицы страниц организованы иерархически, где PML4 верхний уровень, а PT - самый нижний. Каждый уровень содержит указатели на следующий уровень, что позволяет эффективно управлять адресным пространством.
Каждая запись в таблице страниц содержит информацию:
- О том, какая физическая страница соответствует виртуальной;
- Права доступа к странице (чтение, запись, выполнение);
- Состояние страницы (загружена, выгружена, защищена);
- Информацию о кэшировании и других свойствах.
Windows таблицы страниц использует для управления процессами, кэширования данных, защиты памяти, вытеснения страниц и управления ресурсами. Для эффективной работы требуется достаточная память для хранения таблиц, кэш процессора (TLB и другие) для быстрого доступа, поддержка MMU (модуль управления памятью в процессоре) и конечно же операционная система и её поддержка виртуальной памяти.
Page Table Entry (PTE)
Page Table Entry (PTE) — это элемент таблицы страниц, который содержит информацию о конкретной виртуальной странице и её соответствующей физической странице. PTE является основным элементом системы адресации и управления памятью.
Каждый PTE включает следующую информацию:
- Физический адрес — адрес физической страницы, с которой связана виртуальная;
- Права доступа — разрешения на чтение, запись и выполнение;
- Состояние страницы — загружена, выгружена, защищена;
- Информация о кэшировании — используется ли страница в кэше процессора;
- Флаги — различные флаги, указывающие на состояние и свойства страницы.
В Windows существует несколько типов PTE:
- Paged PTE — используется для страниц, которые могут быть выгружены;
- Nonpaged PTE — используется для страниц, которые всегда находятся в памяти;
- System PTE — используется системой для управления памятью.
Системные PTE (System Page Table Entry)
System PTE — это специальные элементы таблицы страниц, используемые ядром операционной системы. Они содержат информацию о физических страницах, которые используются системными компонентами, и обеспечивают надежное управление памятью.
Системные PTE отличаются следующими особенностями:
- Защита от вытеснения — не могут быть выгружены на диск;
- Постоянное присутствие — всегда находятся в физической памяти;
- Специальное назначение — используются для системных структур данных;
- Особые права доступа — имеют специальные разрешения и ограничения.
Управление доступом к памяти
Таблицы страниц обеспечивают контроль доступа к памяти через механизм прав:
- Чтение (Read) — процесс может читать данные из страницы;
- Запись (Write) — процесс может изменять данные в странице;
- Выполнение (Execute) — процесс может выполнять код из страницы;
- Привилегии — контроль доступа на уровне прав пользователя.
Эти права могут быть установлены для каждой страницы отдельно, что позволяет реализовать защиту данных и предотвратить несанкционированный доступ.
Кэширование и производительность
Система использует таблицы страниц для оптимизации кэширования:
- Кэширование PTE — информация о страницах сохраняется в кэше процессора;
- Ускорение доступа — частые обращения к одной и той же странице выполняются быстрее;
- Оптимизация работы — таблицы страниц помогают управлять памятью эффективно.
Взаимодействие с процессором
Процессор использует таблицы страниц для преобразования адресов:
- Получает виртуальный адрес от процесса;
- Использует TLB (Translation Lookaside Buffer) для быстрого поиска соответствия;
- Если нет совпадения в TLB, обращается к таблице страниц;
- Проверяет PTE для получения физического адреса;
- Выполняет операцию с физической памятью.
Пул памяти
Что такое пул памяти?
Пул памяти (Pool) — это механизм выделения памяти, который используется ядром операционной системы Windows для хранения структур данных. Пул представляет собой заранее выделенную область памяти, которая организована как набор блоков фиксированного или переменного размера.
Пул памяти позволяет эффективно управлять ресурсами ядра и драйверов, обеспечивая быстрое выделение и освобождение памяти для различных системных задач. В отличие от обычной динамической памяти, пул памяти имеет специфическую организацию, которая позволяет оптимизировать доступ к данным и уменьшить фрагментацию.
Пулы используются системными компонентами для хранения различных структур данных, таких как структуры управления процессами, таблицы доступа, кэшированные данные, информация о драйверах и системные объекты.
Выгружаемый пул (Paged Pool)
Выгружаемый пул (Paged Pool) — это область памяти, которая может быть выгружена на диск при необходимости. Эта память используется для хранения структур данных, которые не требуют физической памяти, пока они не используются.
Выгружаемый пул может быть освобожден, если система начинает испытывать нехватку памяти. При этом данные из этого пула могут быть временно выгружены на диск или сброшены в кэш, чтобы освободить место для других нужд.
Он используется для хранения временных структур, кэширования информации, управления ресурсами и обработки запросов.
При работе с выгружаемым пулом система может:
- Перемещать страницы на диск при необходимости;
- Использовать системные механизмы для оптимизации использования памяти;
- Автоматически освобождать память при завершении задач.
Невыгружаемый пул (Nonpaged Pool)
Невыгружаемый пул (Nonpaged Pool) — это область памяти, которая всегда находится в физической памяти. Эта память используется для структур данных, которые должны быть доступны даже при прерываниях и в критических секциях.
Такой пул всегда находится в физической памяти, доступен при прерываниях, содержит критические данные, необходимые для работы системы, и не может быть выгружен или перемещен.
Невыгружаемый пул используется для:
- Критических структур данных — данные, которые должны быть всегда доступны;
- Обработки прерываний — структуры данных для обработки системных событий;
- Управления ресурсами ядра — данные о состоянии системы и процессах;
- Системных функций — компоненты, необходимые для работы ядра.
Windows отслеживает объем памяти, используемой в пулах, при нехватке освобождает блоки, оптимизирует равномерное распределение ресурсов и минимизирует влияние на работу системы.
Системные компоненты, использующие пулы
Различные компоненты Windows используют пулы для своих нужд:
Ядро операционной системы
- Управление процессами — структуры данных о процессах и потоках;
- Управление памятью — таблицы страниц и структуры управления памятью;
- Системные вызовы — данные для обработки системных вызовов;
- Сетевые компоненты — структуры данных для работы с сетью.
Драйверы устройств
- Диспетчер устройств — информация о подключенных устройствах;
- Обработка прерываний — структуры данных для обработки событий;
- Кэширование данных — данные, используемые для ускорения работы;
- Управление ресурсами — информация о доступе к аппаратным компонентам.
Отслеживать использование пулов можно с помощью:
- диспетчера задач;
- монитора производительности;
- специализированных утилит для анализа.
Отслеживать рекомендуется, потому что могут быть проблемы, к примеру, нехватка памяти в пуле, фрагментация (неэффективное использование выделенной памяти), повышение нагрузки и конечно сбои системы.
Разработчикам рекомендуется использовать минимально необходимый объём памяти, своевременно её освобождать и проверять производительность.
Структура памяти
Стек и куча
Стек — это область памяти, используемая для хранения локальных переменных и информации о вызовах функций. При каждом вызове функции в стек добавляется новый фрейм, который содержит параметры, локальные переменные и адрес возврата.
Куча — это область памяти, используемая для динамического выделения памяти. Программы могут выделять и освобождать память в куче во время выполнения. В Windows управление кучей реализовано через API, такие как HeapAlloc и HeapFree.
Блоки памяти
В операционной системе Windows память может быть выделена в виде блоков, которые могут быть различными по размеру и типу. Например, память может быть выделена для процесса или драйвера, а также для использования системой.
Рабочий набор
Рабочий набор (Working Set) — это набор страниц физической памяти, которые используются в данный момент активным процессом. Он включает в себя данные, код и структуры, необходимые для выполнения процесса.
Пиковый рабочий набор
Пиковый рабочий набор — это максимальное количество страниц физической памяти, которое использовал процесс за период времени. Он показывает, сколько памяти потребовалось процессу в худшем случае.
Дельта рабочего набора
Дельта рабочего набора — это разница между текущим и предыдущим значением рабочего набора. Эта величина отражает изменение использования памяти процессом.
Частный рабочий набор
Частный рабочий набор — это объем физической памяти, который используется только конкретным процессом. Он не включает общие страницы, используемые другими процессами.
Общий рабочий набор
Общий рабочий набор — это объем физической памяти, который используется как конкретным процессом, так и общими ресурсами других процессов. Он включает частный рабочий набор и общие страницы.
Выделенная и общая память
Выделенная память (Allocated Memory) — это объем памяти, выделенный конкретному процессу или драйверу. Она может быть физически размещена в оперативной памяти или на диске.
Общая память (Shared Memory) — это память, которая может использоваться несколькими процессами одновременно. Такая память часто используется для взаимодействия между приложениями и драйверами.
Кэширование и системный кэш
Системный кэш файлов — это механизм, который позволяет операционной системе хранить данные файлов в физической памяти. Это ускоряет доступ к часто используемым файлам, так как данные уже находятся в памяти.
Windows кэширует все данные, до которых может дотянуться. Это включает:
- Содержимое файлов;
- Структуры данных ядра;
- Данные устройств;
- Системные таблицы.
Сжатая память
Сжатая память (Compressed Memory) — это механизм, который позволяет сжимать данные в оперативной памяти. Это особенно полезно при нехватке физической памяти. Сжатие происходит в фоновом режиме и может быть обратимо при необходимости.
Страницы и драйверы
Страницы памяти — это основные единицы управления физической памятью, используемые в операционной системе. Они могут быть:
- Страницами, доступными для чтения и записи;
- Страницами, только для чтения;
- Страницами, защищенными от записи.
Драйверы устройств
Драйверы устройств — это компоненты операционной системы, которые управляют аппаратным обеспечением. Они могут использовать память различными способами:
- Для хранения структур данных;
- Для кэширования информации;
- Для выделения памяти под свои нужды.
Особенно часто драйверы устройств используют:
- Страницы памяти для обмена данными с оборудованием;
- Кэш для хранения часто используемых данных;
- Системные пулы памяти.
Невидимая память
Невидимая память — это объем физической памяти, который не отображается в диспетчере задач как используемый процессами. Однако он используется системой и драйверами для различных целей.
К невидимой памяти относятся:
- Системный кэш файлов;
- Страницы памяти, используемые в пулах ядра;
- Сжатая память;
- Данные, используемые драйверами устройств.
Особые типы памяти
MMap, Mapped File
MMap (Memory Mapping) — это механизм, позволяющий отображать файл в адресное пространство процесса. Это позволяет использовать файл как память и получать к нему доступ через указатели.
Mapped File — это файл, который был отображен в адресное пространство процесса с помощью MMap. Он может использоваться для быстрого доступа к данным без чтения их с диска.
Shareable, Process Private
Shareable Memory — это память, которая может быть доступна несколькими процессами одновременно.
Process Private Memory — это память, которая используется только одним процессом. Она не делится с другими приложениями.
Сессионная и ядерная память
Session Private
Session Private Memory — это память, выделенная для конкретной сессии пользователя. Она не видна другим пользователям и используется для хранения данных, связанных с сессией.
Kernel Stack
Kernel Stack — это стек, используемый ядром операционной системы. Он содержит информацию о текущих вызовах функций ядра и используется при обработке прерываний.