Виртуальная память процесса windows

Аннотация: Виртуальная память. Реализация виртуальной памяти в Windows. Структура виртуального адресного пространства. Выделение памяти процессам. Дескрипторы виртуальных адресов. Трансляция адресов. Ошибки страниц. Пределы памяти.

Виртуальная память

Всем процессам в операционной системе Windows предоставляется важнейший ресурсвиртуальная память (virtual memory). Все данные, с которыми процессы непосредственно работают, хранятся именно в виртуальной памяти.

Название «виртуальная» произошло из-за того что процессу неизвестно реальное (физическое) расположение памяти – она может находиться как в оперативной памяти (ОЗУ), так и на диске. Операционная система предоставляет процессу виртуальное адресное пространство (ВАП, virtual address space) определенного размера и процесс может работать с ячейками памяти по любым виртуальным адресам этого пространства, не «задумываясь» о том, где реально хранятся данные.

Размер виртуальной памяти теоретически ограничивается разрядностью операционной системы. На практике в конкретной реализации операционной системы устанавливаются ограничения ниже теоретического предела. Например, для 32-разрядных систем (x86), которые используют для адресации 32 разрядные регистры и переменные, теоретический максимум составляет 4 ГБ (232 байт = 4 294 967 296 байт = 4 ГБ). Однако для процессов доступна только половина этой памяти – 2 ГБ, другая половина отдается системным компонентам. В 64 разрядных системах (x64) теоретический предел равен 16 экзабайт (264 байт = 16 777 216 ТБ = 16 ЭБ). При этом процессам выделяется 8 ТБ, ещё столько же отдается системе, остальное адресное пространство в нынешних версиях Windows не используется.

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

Реализация виртуальной памяти в Windows

Схема реализации виртуальной памяти в 32-разрядной операционной системе Windows представлена на рис.11.1. Как уже отмечалось, процессу предоставляется виртуальное адресное пространство размером 4 ГБ, из которых 2 ГБ, расположенных по младшим адресам (0000 0000 – 7FFF FFFF), процесс может использовать по своему усмотрению (пользовательское ВАП), а оставшиеся два гигабайта (8000 0000 – FFFF FFFF) выделяются под системные структуры данных и компоненты (системное ВАП)1Специальный ключ /3GB в файле boot.ini увеличивает пользовательское ВАП до 3 ГБ, соответственно, уменьшая системное ВАП до 1 ГБ. Начиная с Windows Vista вместо файла boot.ini используется утилита BCDEDIT. Чтобы увеличить пользовательское ВАП, нужно выполнить следующую команду: bcdedit /Set IncreaseUserVa 3072. При этом, чтобы приложение могло использовать увеличенное ВАП, оно должно компилироваться с ключом /LARGEADDRESSAWARE.. Отметим, что каждый процесс имеет свое собственное пользовательское ВАП, а системное ВАП для всех процессов одно и то же.

Реализация виртуальной памяти в 32-разрядных Windows

Рис.
11.1.
Реализация виртуальной памяти в 32-разрядных Windows

Виртуальная память делится на блоки одинакового размера – виртуальные страницы. В Windows страницы бывают большие (x86 – 4 МБ, x64 – 2 МБ) и малые (4 КБ). Физическая память (ОЗУ) также делится на страницы точно такого же размера, как и виртуальная память. Общее количество малых виртуальных страниц процесса в 32 разрядных системах равно 1 048 576 (4 ГБ / 4 КБ = 1 048 576).

Обычно процессы задействуют не весь объем виртуальной памяти, а только небольшую его часть. Соответственно, не имеет смысла (и, часто, возможности) выделять страницу в физической памяти для каждой виртуальной страницы всех процессов. Вместо этого в ОЗУ (говорят, «резидентно») находится ограниченное количество страниц, которые непосредственно необходимы процессу. Такое подмножество виртуальных страниц процесса, расположенных в физической памяти, называется рабочим набором процесса (working set).

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

Каким образом процесс узнает, где в данный момент находится требуемая страница? Для этого служат специальные структуры данных – таблицы страниц (page table).

Структура виртуального адресного пространства

Рассмотрим, из каких элементов состоит виртуальное адресное пространство процесса в 32 разрядных Windows (рис.11.2).

В пользовательском ВАП располагаются исполняемый образ процесса, динамически подключаемые библиотеки (DLL, dynamic-link library), куча процесса и стеки потоков.

При запуске программы создается процесс (см. лекцию 6 «Процессы и потоки»), при этом в память загружаются код и данные программы (исполняемый образ, executable image), а также необходимые программе динамически подключаемые библиотеки (DLL). Формируется куча (heap) – область, в которой процесс может выделять память динамическим структурам данных (т. е. структурам, размер которых заранее неизвестен, а определяется в ходе выполнения программы). По умолчанию размер кучи составляет 1 МБ, но при компиляции приложения или в ходе выполнения процесса может быть изменен. Кроме того, каждому потоку предоставляется стек (stack) для хранения локальных переменных и параметров функций, также по умолчанию размером 1 МБ.

Структура виртуального адресного пространства

Рис.
11.2.
Структура виртуального адресного пространства

В системном ВАП расположены:

  • образы ядра (ntoskrnl.exe), исполнительной системы, HAL (hal.dll), драйверов устройств, требуемых при загрузке системы;
  • таблицы страниц процесса;
  • системный кэш;
  • пул подкачиваемой памяти (paged pool) – системная куча подкачиваемой памяти;
  • пул подкачиваемой памяти (nonpaged pool) – системная куча неподкачиваемой памяти;
  • другие элементы (см. [5]).

Переменные, в которых хранятся границы разделов в системном ВАП, приведены в [5, стр. 442]. Вычисляются эти переменные в функции MmInitSystem (файл base\ntos\mm\mminit.c, строка 373), отвечающей за инициализацию подсистемы памяти. В файле base\ntos\mm\i386\mi386.h приведена структура ВАП и определены константы, связанные с управлением памятью (например, стартовый адрес системного кэша MM_SYSTEM_CACHE_START, строка 199).

Выделение памяти процессам

Существует несколько способов выделения виртуальной памяти процессам при помощи Windows API2См. обзор в MSDN «Comparing Memory Allocation Methods» (http://msdn.microsoft.com/en-us/library/windows/desktop/aa366533(v=vs.85).aspx).. Рассмотрим два основных способа – с помощью функции VirtualAlloc и с использованием кучи.

1. WinAPI функция VirtualAlloc позволяет резервировать и передавать виртуальную память процессу. При резервировании запрошенный диапазон виртуального адресного пространства закрепляется за процессом (при условии наличия достаточного количества свободных страниц в пользовательском ВАП), соответствующие виртуальные страницы становятся зарезервированными (reserved), но доступа к этой памяти у процесса нет – при попытке чтения или записи возникнет исключение. Чтобы получить доступ, процесс должен передать память зарезервированным страницам, которые в этом случае становятся переданными (commit).

Отметим, что резервируются участки виртуальной памяти по адресам, кратным значению константы гранулярности выделения памяти MM_ALLOCATION_GRANULARITY (файл base\ntos\inc\mm.h, строка 54). Это значение равно 64 КБ. Кроме того, размер резервируемой области должен быть кратен размеру страницы (4 КБ).

WinAPI функция VirtualAlloc для выделения памяти использует функцию ядра NtAllocateVirtualMemory (файл base\ntos\mm\allocvm.c, строка 173).

2. Для более гибкого распределения памяти существует куча процесса, которая управляется диспетчером кучи (heap manager). Кучу используют WinAPI функция HeapAlloc, а также оператор языка C malloc и оператор C++ new. Диспетчер кучи предоставляет возможность процессу выделять память с гранулярностью 8 байтов (в 32-разрядных системах), а для обслуживания этих запросов использует те же функции ядра, что и VirtualAlloc.

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

Для хранения информации о зарезервированных страницах памяти используются дескрипторы виртуальных адресов (Virtual Address Descriptors, VAD). Каждый дескриптор содержит данные об одной зарезервированной области памяти и описывается структурой MMVAD (файл base\ntos\mm\mi.h, строка 3976).

Границы области определяются двумя полями – StartingVpn (начальный VPN) и EndingVpn (конечный VPN). VPN (Virtual Page Number) – это номер виртуальной страницы; страницы просто нумеруются, начиная с нулевой. Если размер страницы 4 КБ (212 байт), то VPN получается из виртуального адреса начала страницы отбрасыванием младших 12 бит (или 3 шестнадцатеричных цифр). Например, если виртуальная страница начинается с адреса 0x340000, то VPN такой страницы равен 0x340.

Дескрипторы виртуальных адресов для каждого процесса организованы в сбалансированное двоичное АВЛ дерево3АВЛ дерево – структура данных для организации эффективного поиска; двоичное дерево, сбалансированное по высоте. Названо в честь разработчиков – советских ученых Г. М. Адельсон Вельского и Е. М. Ландиса. (AVL tree). Для этого в структуре MMVAD имеются поля указатели на левого и правого потомков: LeftChild и RightChild.

Для хранения информации о состоянии области памяти, за которую отвечает дескриптор, в структуре MMVAD содержится поле флагов VadFlags.

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

Основные концепции виртуальной памяти

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

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

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

Такой подход обеспечивает 3 ключевых преимущества:

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

Каждый процесс имеет собственное виртуальное адресное пространство. Оно разделено на фиксированные блоки данных — страницы. Их размер 4 КБ или 8 КБ в зависимости от архитектуры системы. Физическая память также разделена на блоки того же размера — фреймы.

Как работает виртуальная память в операционных системах 1

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

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

Механизм работы виртуальной памяти

Как работает виртуальная память в операционных системах 2

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

  1. Разделение памяти. Как виртуальное адресное пространство, так и физическая память разделены на страницы и фреймы соответственно.
  2. Таблица страниц. Для каждого процесса создается таблица страниц, которая содержит информацию о соответствии между виртуальными страницами и физическими фреймами.
  3. Преобразование адресов. Когда процесс обращается к виртуальному адресу, ОС использует таблицу страниц для определения соответствующего физического адреса.
  4. Обработка страничных ошибок. Если запрашиваемая страница отсутствует в физической памяти, возникает страничная ошибка (page fault). ОС загружает требуемую страницу с диска в память.
  5. Обновление таблицы страниц. После загрузки страницы таблица обновляется, чтобы отразить новое местоположение данных.

Для оптимизации процесса преобразования адресов используется аппаратное устройство — Translation Lookaside Buffer. TLB представляет собой кэш, который хранит недавно использованные преобразования виртуальных адресов в физические, что значительно ускоряет доступ к памяти.

Алгоритмы управления виртуальной памятью

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

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

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

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

Чтобы сократить количество страничных ошибок, используются следующие техники:

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

Роль ОС в управлении виртуальной памятью

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

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

Реализация виртуальной памяти различается в разных ОС.

  • Windows использует файл подкачки (pagefile.sys), размер которого может динамически изменяться. Windows также поддерживает механизм приоритетного ввода/вывода для страниц виртуальной памяти. 
  • Linux использует выделенный раздел диска (swap partition) или файл подкачки (swap file) для виртуальной памяти. Linux предоставляет гибкие настройки для управления swap-пространством и позволяет использовать несколько swap-устройств с разными приоритетами.
  • MacOS использует механизм компрессии, который сжимает неиспользуемые страницы в памяти перед их выгрузкой на диск. Это уменьшает количество операций ввода/вывода.

Операционная система также отвечает за очистку и освобождение хранилища:

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

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

Плюсы:

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

Минусы:

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

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

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

Советы по оптимизации виртуальной памяти

Файл подкачки — основной компонент виртуальной памяти в Windows. Он расположен в корневой директории жесткого диска. Системный файл pagefile.sys выступает резервным хранилищем данных. Оно активируется при недостатке оперативной памяти для предотвращения сбоев в работе приложений.

В Windows 8-11 есть взаимосвязанные системные файлы: pagefile.sys и swapfile.sys. Первый отвечает за общее управление виртуальной памятью, второй обслуживает приложения из Microsoft Store. При полном отключении файла подкачки оба компонента удаляются из файловой системы.

Доступ к настройкам файла подкачки возможен через системные интерфейсы. Можно воспользоваться встроенным поиском Windows, утилитой «Выполнить» или стандартным меню «Пуск».

Как работает виртуальная память в операционных системах 3

Чтобы перейти к настройкам файла подкачки Windows, нужно нажать комбинацию Win + R и ввести команду sysdm.cpi

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

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

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

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

Настройка виртуальной памяти в Linux

Настройка пространства подкачки в Linux осуществляется двумя основными методами: через выделенный раздел диска и создание файла подкачки.

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

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

Технология подготовки раздела подкачки включает несколько последовательных шагов:

  1. Форматирование раздела с помощью утилиты mkswap.
  2. Редактирование системного файла /etc/fstab для автоматического монтирования при загрузке.
  3. Активация пространства подкачки командой swapon.

Альтернативный подход — файлы подкачки

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

  • Использование виртуальных машин.
  • Работа со встраиваемыми системами.

Создание файла подкачки реализуется через несколько подходов:

  • Метод с использованием утилиты fallocate:

sudo fallocate -l 2G /path/to/swapfile

  • Метод с применением команды dd:

dd if=/dev/zero of=swapfile bs=1024k count=2048

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

Настройка поведения подкачки осуществляется через параметр ядра «swappiness». Шкала значений варьируется от 0 до 100:

  • 0 — полное торможение использования swap;
  • 60 — штатное поведение большинства дистрибутивов;
  • 100 — максимальное применение виртуальной памяти.

Временное изменение параметров производится командой:

sudo sysctl vm.swappiness=20

Постоянная конфигурация реализуется правкой файла /etc/sysctl.conf путем внесения записи вида:

sudo vm.swappiness=20

Что запомнить?

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

Виртуальная память

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

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

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

Физическая память и страничный файл

Виртуальная память Windows состоит из физической оперативной памяти (RAM) и страничного файла на диске. Если физическая память заполняется, то часть данных может быть перемещена в страничный файл, освобождая место для новых данных. Этот процесс называется “подкачкой” (paging).

Страницы памяти

Виртуальная память разбивается на небольшие блоки, называемые страницами памяти. Размер страницы обычно составляет 4 КБ. Windows использует систему управления таблицами страниц (Page Table) для отображения виртуальных адресов на физические адреса или на адреса в страничном файле.

Отображение виртуальной памяти

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

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

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

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

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

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

Управление памятью в Windows может быть выполнено с использованием различных функций и API операционной системы. Давайте рассмотрим несколько примеров кода на языке C/C++ для выделения и освобождения памяти в Windows.

Выделение памяти с использованием malloc и free (C/C++)

#include <stdio.h>
#include <stdlib.h>

int main() {
    // Выделение памяти под массив целых чисел
    int *arr = (int*)malloc(5 * sizeof(int));

    if (arr == NULL) {
        printf("Не удалось выделить память\n");
        return 1;
    }

    // Использование выделенной памяти
    for (int i = 0; i < 5; i++) {
        arr[i] = i * 10;
    }

    // Освобождение памяти после использования
    free(arr);

    return 0;
}

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

Выделение памяти с использованием функции VirtualAlloc (WinAPI)

#include <Windows.h>
#include <stdio.h>

int main() {
    // Выделение 1 мегабайта (1048576 байт) виртуальной памяти
    LPVOID mem = VirtualAlloc(NULL, 1048576, MEM_COMMIT, PAGE_READWRITE);

    if (mem == NULL) {
        printf("Не удалось выделить виртуальную память\n");
        return 1;
    }

    // Использование выделенной виртуальной памяти

    // Освобождение виртуальной памяти
    VirtualFree(mem, 0, MEM_RELEASE);

    return 0;
}

Здесь мы используем функцию VirtualAlloc из библиотеки WinAPI для выделения виртуальной памяти. После использования памяти мы освобождаем ее с помощью функции VirtualFree.

Выделение и освобождение памяти с использованием C++ операторов new и delete

#include <iostream>
#include <windows.h>

int main() {
    SetConsoleOutputCP(1251);
    // Выделение памяти под одно целое число
    int *num = new int;

    // Использование выделенной памяти
    *num = 42;
    std::cout << "Значение: " << *num << std::endl;

    // Освобождение памяти
    delete num;

    return 0;
}

Стек и куча

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

Стек (Stack)

  • Характеристики:
    • Ограниченный по размеру.
    • Доступ к данным выполняется в порядке “первым вошел, последним вышел” (LIFO — Last-In, First-Out).
    • Часто фиксированный размер стека определяется на этапе компиляции.
  • Использование:
    • Хранит локальные переменные функций и адреса возврата после вызова функций.
    • Используется для управления вызовами функций (стек вызовов).
  • Жизненный цикл данных:
    • Данные, хранящиеся в стеке, автоматически удаляются при завершении функции, в которой они определены.
    • Ограниченное время жизни.
  • Примеры языков:
    • Стек используется в C, C++, Java (для вызовов методов), Python (для вызовов функций).

Куча (Heap)

  • Характеристики:
    • Динамически расширяемая область памяти.
    • Доступ к данным происходит в произвольном порядке.
    • Размер кучи ограничен объемом доступной физической и виртуальной памяти.
  • Использование:
    • Хранит данные, которые могут иметь долгий или неопределенный срок жизни, такие как объекты, созданные динамически.
  • Жизненный цикл данных:
    • Данные, хранящиеся в куче, существуют до тех пор, пока на них есть указатели, и могут быть освобождены вручную (например, с помощью free в C/C++ или сборщика мусора в других языках).
  • Примеры языков:
    • Куча используется в C, C++, C#, Java (для объектов, созданных с помощью new), Python (с использованием модуля gc для сборки мусора).

Сравнение стека и кучи

  • Стек обычно быстрее доступен для чтения и записи, чем куча.

  • Куча предоставляет более гибкое управление памятью, но требует явного освобождения ресурсов.

  • Стек обеспечивает управление временем жизни данных автоматически, в то время как в куче это делается вручную.

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

  • Оба механизма имеют свои применения и зависят от конкретных требований программы.

Функции для работы со стеком

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

GetCurrentThreadStackLimits (Windows 8.1 и более поздние версии)

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

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

void GetStackLimits() {
    ULONG_PTR lowLimit, highLimit;
    GetCurrentThreadStackLimits(&lowLimit, &highLimit);
    printf("Low Limit: 0x%llx\n", lowLimit);
    printf("High Limit: 0x%llx\n", highLimit);
}

RtlCaptureContext (Windows XP и более поздние версии)

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

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

CONTEXT context;
RtlCaptureContext(&context);
// Теперь у вас есть информация о контексте выполнения текущего потока

VirtualQuery (Windows XP и более поздние версии)

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

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

MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(&someAddress, &mbi, sizeof(mbi));
// Теперь вы можете получить информацию о найденной памяти, включая стек

SetThreadStackGuarantee (Windows 8 и более поздние версии)

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

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

DWORD stackSize = 0x10000; // 64 КБ
SetThreadStackGuarantee(&stackSize);

StackWalk64 (DbgHelp API)

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

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

STACKFRAME64 stackFrame;
// Настройка параметров и выполнение обхода стека

Функции для работы с кучей

WinAPI предоставляет ряд функций для работы с кучей (памятью, выделяемой в куче). Основные функции включают в себя HeapCreate, HeapAlloc, HeapFree, HeapReAlloc и HeapDestroy. Давайте рассмотрим эти функции более подробно:

HeapCreate

  • Создает новую кучу.

  • Синтаксис: HANDLE HeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize);

  • Пример:

    HANDLE hHeap = HeapCreate(0, 0, 0);

HeapAlloc

  • Выделяет блок памяти из кучи.

  • Синтаксис: LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);

  • Пример:

    int* pData = (int*)HeapAlloc(hHeap, 0, sizeof(int) * 10);

HeapFree

  • Освобождает блок памяти, выделенный ранее с помощью HeapAlloc.

  • Синтаксис: BOOL HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);

  • Пример:

    HeapFree(hHeap, 0, pData);

HeapReAlloc

  • Изменяет размер выделенного блока памяти в куче.

  • Синтаксис: LPVOID HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dwBytes);

  • Пример:

    pData = (int*)HeapReAlloc(hHeap, 0, pData, sizeof(int) * 20);

HeapDestroy

  • Уничтожает кучу и освобождает все связанные с ней ресурсы.

  • Синтаксис: BOOL HeapDestroy(HANDLE hHeap);

  • Пример:

HeapSize

  • Возвращает размер выделенного блока памяти в куче.

  • Синтаксис: SIZE_T HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem);

  • Пример:

    SIZE_T size = HeapSize(hHeap, 0, pData);

HeapValidate

  • Проверяет целостность кучи и выделенных блоков.

  • Синтаксис: BOOL HeapValidate(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem);

  • Пример:

    if (HeapValidate(hHeap, 0, pData)) {
        printf("Куча валидна.\n");
    } else {
        printf("Куча повреждена.\n");
    }

Пример 1: Создание кучи и выделение памяти

#include <Windows.h>
#include <stdio.h>

int main() {
    SetConsoleOutputCP(1251);
    // Создание кучи
    HANDLE hHeap = HeapCreate(0, 0, 0);

    if (hHeap == NULL) {
        printf("Не удалось создать кучу\n");
        return 1;
    }

    // Выделение памяти из кучи
    int *data = (int*)HeapAlloc(hHeap, 0, sizeof(int) * 5);

    if (data == NULL) {
        printf("Не удалось выделить память из кучи\n");
        HeapDestroy(hHeap);
        return 1;
    }

    // Использование выделенной памяти
    for (int i = 0; i < 5; i++) {
        data[i] = i * 10;
    }

    // Освобождение памяти
    HeapFree(hHeap, 0, data);

    // Уничтожение кучи
    HeapDestroy(hHeap);

    return 0;
}

В этом примере мы создаем кучу с помощью HeapCreate, выделяем память из кучи с помощью HeapAlloc, используем эту память и освобождаем ее с помощью HeapFree, а затем уничтожаем кучу с помощью HeapDestroy.

Пример 2: Выделение строки в куче

#include <Windows.h>
#include <stdio.h>

int main() {
    SetConsoleOutputCP(1251);
    // Создание кучи
    HANDLE hHeap = HeapCreate(0, 0, 0);

    if (hHeap == NULL) {
        printf("Не удалось создать кучу\n");
        return 1;
    }

    // Выделение строки в куче
    char *str = (char*)HeapAlloc(hHeap, 0, 256);

    if (str == NULL) {
        printf("Не удалось выделить память для строки\n");
        HeapDestroy(hHeap);
        return 1;
    }

    // Копирование строки в выделенную память
    strcpy_s(str, 256, "Пример строки в куче");

    // Использование строки

    // Освобождение памяти
    HeapFree(hHeap, 0, str);

    // Уничтожение кучи
    HeapDestroy(hHeap);

    return 0;
}

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

Отображение файлов на адресное пространство

File mapping (сопоставление файла) в WinAPI — это механизм, который позволяет отображать содержимое файла в виртуальную память процесса. Это может быть полезно для обмена данными между процессами, создания разделяемой памяти или для улучшения производительности при доступе к большим файлам. Давайте рассмотрим основы использования file mapping в WinAPI:

Создание файла для сопоставления

Сначала необходимо создать или открыть файл, который вы хотите сопоставить. Это можно сделать с помощью функций, таких как CreateFile или OpenFile. Например:

HANDLE hFile = CreateFile(
    L"C:\\example.txt",           // Имя файла
    GENERIC_READ | GENERIC_WRITE, // Режим доступа
    0,                            // Атрибуты файла
    NULL,                         // Дескриптор безопасности
    OPEN_ALWAYS,                  // Действие при открытии (создать, если не существует)
    FILE_ATTRIBUTE_NORMAL,        // Атрибуты файла
    NULL                          // Шаблон для атрибутов
);

Создание отображения файла в памяти

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

HANDLE hMapFile = CreateFileMapping(
    hFile,                   // Дескриптор файла
    NULL,                    // Атрибуты безопасности (можно использовать NULL)
    PAGE_READWRITE,          // Режим доступа к файлу в отображении
    0,                       // Размер отображения файла (0 - весь файл)
    0,                       // Высший значащий байт размера файла
    NULL                     // Имя отображения файла (можно использовать NULL)
);

Отображение файла в виртуальную память

Завершите процесс сопоставления файла, отображая его в виртуальную память с помощью функции MapViewOfFile:

LPVOID pData = MapViewOfFile(
    hMapFile,              // Дескриптор отображения файла
    FILE_MAP_ALL_ACCESS,   // Режим доступа к отображению
    0,                     // Смещение в файле
    0,                     // Начальный байт отображения
    0                      // Размер отображения (0 - весь файл)
);

Использование данных

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

Освобождение ресурсов

После завершения работы с данными не забудьте освободить ресурсы:

UnmapViewOfFile(pData);  // Освобождение отображения файла
CloseHandle(hFile);      // Закрытие дескриптора файла
CloseHandle(hMapFile);   // Закрытие дескриптора отображения файла

Наверх

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

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

Определение

Файл подкачки – это специальный системный файл на жестком диске компьютера. Он выступает в качестве дополнения (расширения) к оперативной памяти. Размещается обычно на системном диске. Называется виртуальной памятью устройства.

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

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

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

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

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

Где находится и как называется

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

В старых версиях Windows рассматриваемый документ подкачки имел название pagefile.sys. В Windows 10 их стало больше – добавился еще и swapfile.sys. Эти два элемента работают вместе. Храниться они будут в корне системного диска (по умолчанию – диск C). Чтобы увидеть файлы подкачки, необходимо активировать опцию «Отображение скрытых системных файлов и папок».

Чтобы сделать это, нужно:

  1. Перейти на устройстве на диск C.
  2. На «Панели управления» кликнуть по вкладке «Вид».
  3. Поставить отметку около пункта «Скрытые элементы».

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

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

Как открыть настройки

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

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

Поисковик Windows

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

  1. Открыть поисковую строчку Windows.
  2. Ввести запрос «Настройка представления и производительности системы». Необходимая пользователю ссылка должна быть продемонстрирована еще до того, как пользователь закончит печать.
  3. Перейти в появившемся окне во вкладку «Дополнительно».
  4. В пункте «Виртуальная память» кликнуть по «Изменить».

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

Служба «Выполнить»

Файл подкачки и его настройки могут быть открыты через службу «Выполнить» в Windows. Для этого потребуется:

  1. Нажать Win + R.
  2. Ввести в появившейся строке команду «sysdm.cpl» (без кавычек).
  3. Кликнуть по кнопке Enter.
  4. Перейти в раздел «Дополнительно».
  5. В пункте «Быстродействие» выбрать «Параметры».
  6. Перейти на вкладку «Дополнительно».
  7. В разделе «Виртуальная память» выбрать команду «Изменить».

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

Меню «Пуск»

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

Для реализации рассматриваемой задачи предстоит:

  1. Кликнуть по меню «Пуск» правой кнопкой мыши.
  2. Выбрать пункт «Система».
  3. В правой части появившегося окна щелкнуть по «Дополнительные параметры системы».
  4. Перейти в «Быстродействие», а затем – в «Параметры».
  5. Открыть вкладку «Дополнительно».
  6. В разделе «Виртуальная память» выбрать операцию «Изменить».

Теперь можно рассмотреть особенности настройки файлов подкачки в Windows. Они помогут как новичкам, так и более опытным ПК-пользователям наладить работу устройства.

Какой размер виртуальной памяти устанавливать

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

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

Некоторые полагают, что, чем больший объем имеет файл подкачки, тем лучше работает операционная система. Это не совсем верное утверждение. Слишком большой размер рассматриваемого элемента приведет к тому, что система начнет игнорировать оперативную память. Вместо увеличения производительности оборудования пользователь столкнется с ее «торможением». Если размер, который имеет файл подкачки, слишком маленький, это будет равноценно ее отключению. Многие системные утилиты перестанут корректно работать.

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

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

  • 1 Гб оперативной памяти – 2 ГБ документ подкачки;
  • 2 Гб оперативной памяти – 1512 Мб документ подкачки;
  • 4 Гб оперативной памяти – 1 Гб файл подкачки.

Если на устройстве 2 Гб оперативной памяти, рекомендуется использовать автоматический режим определения пространства для документа подкачки.

Второй вариант определения объема рассматриваемого файла отталкивается от оптимальных значений. Для его применения предстоит:

  1. Открыть все приложения, которые необходимы на постоянной основе для работы на устройстве.
  2. Нажать Ctrl + Alt + Del.
  3. Перейти в раздел «Производительность».
  4. Посмотреть на пункт «Используемая оперативная память».
  5. Умножить соответствующий показатель в 2 раза и отнять значение размера установленной оперативной памяти на оборудовании.
  6. Полученный параметр – это и есть значение, которое нужно установить в настройках изучаемого файла.

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

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

Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus! 

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • В чем преимущество linux перед windows
  • Windows 10 долго печатает принтер
  • Набор системных значков ms windows виды расположения значков на рабочем столе
  • Iis windows server что это
  • Kb4536952 что за обновление windows 7