Что такое виртуальная память компьютера и где она находится
Как изменить Dump File
Перед тем, как менять размер виртуальной памяти, необходимо правильно определить и выбрать тип дампа. Сделать это можно используя штатные инструменты Windows. Для этого выполните следующие действия:
- Правой кнопкой мыши кликните по значку «Мой компьютер» и выберите меню «Свойства» . Найдите пункт «Дополнительные параметры» . Откроются свойства системы.
- Попасть в них можно и другим способом. Откройте диалоговое меню: «Выполнить» и в нем наберите:
- На вкладке «Дополнительно» найдите категорию, которая посвящена загрузке и восстановлению системы. После чего нажмите на кнопку «Параметры» .
- В блоке «Отказ системы» найдите графу запись отладочной информации и выберите подходящий тип дампа. Для Windows 10 по умолчанию используется Автоматический.
Загрузка и восстановление
- По желанию дамп можно отключить. Для этого в выпадающем списке выберите «Нет» . После этого система не будет делать резервные копии.
Нажмите «Ок» , как только внесете все необходимые изменения, чтобы они вступили в силу. Как только тип дампа будет выбран, можно приступать к изменению объема виртуальной памяти.
Параметры pagefile.sys
В «десятке» можно очень быстро перейти в настройки виртуальной памяти:
-
Кликаем по лупе справа от «Пуска». В поле для поиска набираем слово «представление». По мере ввода должна сразу появиться выдача «Настройка представления и производительности системы». Щёлкаем по этому результату.
Вбейте запрос в «Поиске Виндовс»
Перейдите к изменению параметров виртуальной памяти
Задайте определённый размер для вашего файла подкачки
Правильное расположение файла подкачки. На каком диске включить?
Если у вас на компьютере несколько физических дисков, то устанавливать файл подкачки нужно на наиболее быстром диске. Считается, что файл подкачки делить на 2 части:
- Первая часть на системном диске (разделе) (как раз для записи информации отладочной записи при синих экранах смерти)
- Вторая часть на самом быстром диске
При этом система во время работы обращается к наименее загруженному разделу, не трогая первый.
Также рекомендуется, под файл подкачки создавать отдельный раздел, с объёмом памяти равной либо близкой размеру файла подкачки (например 2024мб). Эта хитрость позволяет избавиться от фрагментации данного файла.
Файл подкачки. Терминология.
Файл подкачки (pagefile.sys) — это системный файл на жестком диске (как правило на системном диске) компьютера, который служит как бы дополнением (расширением) к оперативной памяти. Также эту дополнительную память называют виртуальной памятью компьютера.
Виртуальная память — метод управления памятью компьютера для выполнения программ требующих большие объемы оперативной памяти, чем есть реально на компьютере. Недостающую оперативную память такие программы получают из файла подкачки. Другими словами, файл подкачки разгружает оперативную память в периоды её сильной загрузки.
Оперативная память в разы быстрее чем память файла подкачки. Если одновременно запустить несколько приложений в системе, которые потребляют много оперативной памяти, то данные неиспользуемых из них будут выгружены из оперативной памяти в менее быструю виртуальную память. Активные же приложения будут обслуживаться непосредственно оперативной памятью (RAM). Также, если например свернутое приложение развернуть, то данные из виртуальной памяти вновь перейдут в RAM.
Виртуальный адрес
Page Global Directory (далее — PGD) — таблица (здесь и далее — то же самое, что директория) самого высокого уровня, каждая запись в ней — ссылка на Page Middle Directory (PMD), записи которой, в свою очередь, ссылаются на таблицу Page Table Entry (PTE). Записи в PTE ссылаются на реальные физические адреса, а также хранят флаги состояния страницы.
То есть, при трёхуровневой иерархии памяти виртуальный адрес будет выглядеть так:
Значения полей PGD, PMD и PTE — это индексы в соответствующих таблицах (то есть сдвиги от начала этих таблиц), а offset — это смещение адреса от начала страницы.
В зависимости от архитектуры и режима страничной адресации, количество битов, выделяемых для каждого из полей, может отличаться. Кроме того, сама страничная иерархия может иметь число уровней, отличное от трёх: например, на x86 нет PMD.
Для обеспечения переносимости мы задали границы этих полей с помощью констант: MMU_PGD_SHIFT, MMU_PMD_SHIFT, MMU_PTE_SHIFT, которые в приведённой выше схеме равны 24, 18 и 12 соответственно их определение дано в заголовочном файле src/include/hal/mmu.h. В дальнейшем будет рассматриваться именно этот пример.
На основании сдвигов PGD, PMD и PTE вычисляются соответствующие маски адресов.
Эти макросы даны в том же заголовочном файле.
Для работы с виртуальной таблицами виртуальной памяти в некоторой области памяти хранятся указатели на все PGD. При этом каждая задача хранит в себе контекст struct mmu_context, который, по сути, является индексом в этой таблице. Таким образом, к каждой задаче относится одна таблица PGD, которую можно определить с помощью mmu_get_root(ctx).
Как настроить виртуальную память: увеличить или уменьшить размер, отключить её
Ручная настройка файла подкачки поможет оптимизировать работу компьютера. Можно увеличить размер памяти, если ваша «оперативка» не справляется с задачей. Если вам не хватает места на системном диске, вы можете перебросить этот файл на пользовательский диск либо вовсе отключить функцию — файл исчезнет, места станет больше. Выключать файл подкачки стоит только в том случае, если вы уверены, что голой «оперативки» вам хватит на все нужды ПК.
Рекомендации по использованию виртуальной памяти
Если вы не знаете, какой оптимальный объем для свапа выбрать и на что это будет влиять, то далее мы предлагаем ознакомиться вам с небольшими советами, которые помогут увеличить быстродействие ПК.
Итак, рассмотрим ряд советов:
- Если на устройстве используется несколько HDD или SSD, то для свапа указывайте тот диск, который не являетсясистемным. Здесь не должна быть установлена операционная система. В итоге это значительно повысит общую скорость работы.
- Создавать можно несколько файлов подкачки. Если вы используете дамп, то хотя бы один свап должен находиться на системном диске. Для всех остальных случаев делать это не обязательно.
- Если у вас несколько винчестеров с разными физическими параметрами, то выбирать следует тот, который отличается лучшими показателями скорости работы. Узнать это можно из технических характеристик HDD.
- Если жесткий диск разбит на несколько разделов, то для файла подкачки следует выбирать тот, который является основным (первым). К этому участку есть мгновенный доступ, что серьезно влияет на скорость работы.
- Не бойтесь указать слишком большой размер для файла подкачки. Если физический размер HDD позволяет это сделать, то выделите ВП от 4 объемов от существующей RAM. Слишком низкий показатель может привести к появлению ошибок, критическому завершению работы некоторых приложений (с потерей данных).
- Старайтесь ограничивать минимальный объем swap файла. Это позволит избежать его постоянной фрагментации. Если вы используете компьютер для работы с ресурсозатратным ПО или он работает в качестве сервера для хранения баз данных, то размер файла подкачки должен составлять 2-3 полных объема ОЗУ. Во всех остальных случаях он должен быть равен RAM или быть больше в 1,5 раза.
После манипуляций с настройками компьютера и изменением размера ВП лучше перезагрузить компьютер (хотя это не всегда обязательно) и запустить специальную утилиту для дефрагментации. Это поможет переместить его ближе к началу раздела, чтобы система получала к нему моментальный доступ.
Так же подробно про ВП можно посмотреть в видеоролике ниже:
Виртуальная память или файл подкачки
В видео рассматривается оптимальный размер файла подкачки
Сегодня мы ответили на вопрос «Виртуальная память, что это? И для чего она нужна?». Она помогает значительно повысить быстродействие системы и используется для хранения информации при сбоях. По умолчанию объем файла подкачки регулируется Windows полностью в автоматическом режиме.
Если пользователь хочет указать его самостоятельно, то для этого необходимо учесть выбранный тип дампа (либо отключить его). Объем виртуальной памяти зависит от дампа и общего объема RAM.
Понравилась статья? Подпишитесь на канал, чтобы быть в курсе самых интересных материалов
Начинающие пользователи ПК, как правило, понятия не имеют, что такое виртуальная память в системе «Виндовс». В каких целях её используют? Как её включить, поменять размер или вовсе отключить? Как организована виртуальная память в «Виндовс» 10?
Размер страницы
В реальных (то есть не в учебных) системах используются страницы от 512 байт до 64 килобайт. Чаще всего размер страницы определяется архитектурой и является фиксированным для всей системы, например — 4 KiB.
С одной стороны, при меньшем размере страницы память меньше фрагментируется. Ведь наименьшая единица виртуальной памяти, которая может быть выделена процессу — это одна страница, а программам очень редко требуется целое число страниц. А значит, в последней странице, которую запросил процесс, скорее всего останется неиспользуемая память, которая, тем не менее, будет выделена, а значит — использована неэффективно.
С другой стороны, чем меньше размер страницы, тем больше размер страничных таблиц. Более того, при отгрузке на HDD и при чтении страниц с HDD быстрее получится записать несколько больших страниц, чем много маленьких такого же суммарного размера.
Отдельного внимания заслуживают так называемые большие страницы: huge pages и large pages [вики] .
Платформа | Размер обычной страницы | Размер страницы максимально возможного размера |
x86 | 4KB | 4MB |
x86_64 | 4KB | 1GB |
IA-64 | 4KB | 256MB |
PPC | 4KB | 16GB |
SPARC | 8KB | 2GB |
ARMv7 | 4KB | 16MB |
Действительно, при использовании таких страниц накладные расходы памяти повышаются. Тем не менее, прирост производительности программ в некоторых случаях может доходить до 10% [ссылка] , что объясняется меньшим размером страничных директорий и более эффективной работой TLB.
В дальнейшем речь пойдёт о страницах обычного размера.
Что такое виртуальная память?
Виртуальная память (Virtual Memory, ВП) — это метод управления памятью компьютера, использующий для работы файл подкачки (swap file). При недостатке существующего объема ОЗУ, позволяет запускать на ПК более ресурсозатратные программы. В таком случае данные приложения автоматически перемещаются между основной памятью и вторичным хранилищем.
Виртуальная память так же обладает рядом достоинств:
- Работает полностью в автоматическом режиме и не требует от пользователя постоянного управления основным пространством.
- Значительно повышает безопасность использования программного обеспечения (снижает вероятность вылетов, критического завершения работы, потери данных).
- Позволяет запускать и использовать на ПК больше памяти, чем это доступно физически.
За счет ее использования компьютер способен изолировать запущенные процессы друг от друга и рационально распределять RAM.
Виртуальная память может включать важные для пользователя пароли, логины и другую информацию. Эта возможность используется сотрудниками спецслужб и хакерами для получения доступа к остальным компонентам компьютера. Сделать это можно как аппаратно, так и системно.
Размер файла подкачки Windows. Какой правильный?
- оптимальный размер файла подкачки для 512 Mb оперативной памяти, - 5012 Mb ;
- оптимальный размер файла подкачки для 1024 Mb оперативной памяти, - 4012 Mb ;
- оптимальный размер файла подкачки для 2048 Mb оперативной памяти, - 3548 Mb;
- оптимальный размер файла подкачки для 4096 Mb оперативной памяти, - 3024 Mb;
- оптимальный размер файла подкачки для 8 Гб оперативной памяти, - 2016 Mb;
- оптимальный размер файла подкачки для 16 Гб оперативной памяти (и больше), - без файла подкачки .
Конечно, это субъективный взгляд и данные показатели не могут быть абсолютно точными, рекомендуемыми, но на практике именно они давали эффект. Вы можете сами поэкспериментировать и найти лучшее сочетание для вашего компьютера. Тут есть и некоторые примечания.
- Некоторые приложения требуют наличия файла подкачки. Отключение его может привести к ошибкам в работе таких приложений. При отключении виртуальной памяти на системном диске, также станет невозможной запись дампа памяти при BSOD'ах (Синий экран смерти).
- Если вы, как правило, сворачиваете несколько приложений оставляя их запущенными, а сами переключаетесь на другие, то тут вам тоже может понадобиться большой объём файла подкачки, так как данные свернутых приложений записываются именно в него. Хотя, и здесь все зависит от объема RAM.
Dump File и его типы
Swap используется не только для расширения физической памяти, но и для создания аварийных дампов при возникновении «внештатных» аварийных ситуаций.
Как это работает:
- Во время первоначального запуска системы, Windows создает и сохраняет на жестком диске специальную карту секторов, которые занимает на HDD свап.
- Если происходит сбой, то операционная система изучает созданную карту на наличие неисправностей. В идеале она должна быть целостной. Если это так, то данные переписываются на винчестер и в свап по созданной карте секторов.
- При следующем перезапуске компьютера SMSS анализирует ВП и проверяет его на наличие дампов, если он есть, то данные копируются из файла подкачки в специальный dump file. Дополнительно обновляется системный журнал. Поэтому открыв его можно узнать, была ли проведена эта операция.
Таким образом при автоматическом выборе размера свапа, Windows руководствуется настройками для создания аварийного дампа.
Загрузка и восстановление
Дампы можно разделить на 4 типа:
В него записывается все содержимое RAM на момент незапланированного завершения работы. С учетом этой информации файл подкачки должен иметь размер равный физической памяти компьютера +1 МБ (используется для создания записи в системном журнале).
Выбирается системой автоматически только в том случае, если общий объем физической памяти 4 ГБ и менее.
В него записывается только информация и память, выделенная для ядра операционной системы. Он занимает сравнительно меньше места и его объема достаточно, чтобы Windows могла определить причины аварийного завершения работы.
Выбирается по умолчанию, если размер RAM превышает 4 ГБ. При выборе дампа памяти ядра важно следить, чтобы минимальный размер для файла подкачки составлял хотя бы ⅓ от общего объема физической.
Записывает только самую необходимую информацию для выявления причин аварийного сбоя. Здесь находится стоп-код и описание самой ошибки, дополнительно указываются загруженные на устройство драйвера и перечень запущенных процессов.
Доступен только для операционных систем семейства Windows начиная от восьмерки и выше, либо Server 2012. Представляет собой аналог дампа ядра, но с тем отличием, что система может постоянно менять размер файла подкачки, позволяя ей выбирать оптимальный для работы вариант.
Размер свапа будет напрямую зависит от объема RAM и выбранного типа дампа. Дополнительно стоит учитывать и версию операционной системы. Это касается серверных и обычных сборок.
Что такое виртуальная память на Windows 10 и зачем она нужна
Вашей «оперативки» может не хватать на то количество программ, которые открыты сейчас на ПК. Чтобы система не тормозила, подключается виртуальная память. Это файл подкачки определённого размера (устанавливается вручную пользователем либо самой системой) на жёстком диске, в который временно помещается память из «оперативки». Иными словами, часть жёсткого диска используется как «оперативка», если последней оказалось мало.
Обычно в файл подкачки помещаются данные об открытых приложениях, которые в данный момент не используются процессором (окна этих приложений свёрнуты). При необходимости данные перемещаются обратно в «оперативку».
Файл подкачки, кстати, называется pagefile.sys.
Настройка дополнительного файла подкачки swapfile.sys
В «Виндовс» 10 есть ещё один файл подкачки — дополнительный swapfile.sys. Он также находится на системном диске. Он предназначен для хранения информации о приложениях из магазина «Виндовс Стор». Причём в файле хранятся не отдельные разбросанные данные, а вся информация о работе программы целиком. Благодаря этому файлу программы из магазина могут уходить в гибернацию (режим по типу сна), как это делает вся система «Виндовс».
Файл swapfile.sys отвечает за сохранение информации работающих приложений из магазина
Настроить как-либо этот документ нельзя. Вы можете его удалить, но система его вновь создаст, если вы будете пользоваться приложениями из фирменного магазина Windows. Переживать по поводу размеров swapfile.sys не стоит — он весит довольно мало.
Трансляция виртуального адреса в физический
Как уже писалось выше, при обращении к памяти трансляция адресов производится аппаратно, однако, явный доступ к физическим адресам может быть полезен в ряде случаев. Принцип поиска нужного участка памяти, конечно, такой же, как и в MMU.
Для того, чтобы получить из виртуального адреса физический, необходимо пройти по цепочке таблиц PGD, PMD и PTE. Функция vmem_translate() и производит эти шаги.
Сначала проверяется, есть ли в PGD указатель на директорию PMD. Если это так, то вычисляется адрес PMD, а затем аналогичным образом находится PTE. После выделения физического адреса страницы из PTE необходимо добавить смещение, и после этого будет получен искомый физический адрес.
Пояснения к коду функции.
mmu_paddr_t — это физический адрес страницы, назначение mmu_ctx_t уже обсуждалось выше в разделе “Виртуальный адрес”.
С помощью функции vmem_get_idx_from_vaddr() находятся сдвиги в таблицах PGD, PMD и PTE.
Как добавить виртуальную память на Windows
Как правило, среднестатистическому пользователю достаточно того объема ВП, которая выделяется устройством автоматически. Если на ПК мало физической RAM, то увеличить ее объем можно за счет свапа.
Для этого:
- Правой кнопкой мыши кликните по значку «Мой компьютер» и в выпадающем списке выберите графу «Свойства» .
- Откроется окно для работы с параметрами. В левой части экрана найдите надпись «Дополнительный параметры системы» .
Для этого необходимы права администратора. При появлении запроса на ввод пароля, укажите его, после чего продолжите изменение параметров.
- Здесь найдите «Быстродействие» и через меню «Параметры» откройте дополнительные свойства. На отразившейся вкладке выберите «Изменить» напротив «Виртуальная память» .
- Уберите галочку напротив графы «Автоматически выбирать объем файла подкачки» . После этого станут доступны остальные пункты.
- Выберите диск, на котором много свободного места и чьи ресурсы будут использоваться для создания файла подкачки.
- Отметьте пункт «Указать размер» , после чего добавьте значение в пустое поле. При этом число в поле «Максимальный» должно быть в 1,5 раза, чем в поле «Исходный» .
Как только закончите работу, подтвердите действия нажатием кнопки «Ок» . Все изменения автоматически вступят в силу.
В некоторых случаях увеличение Virtual Memory помогает повысить скорость работы ПК, увеличить общее быстродействие.
Работа с Page Table Entry
Для работы с записей в таблице страниц, а так же с самими таблицами, есть ряд функций:
Эти функции возвращают 1, если у соответствующей структуры установлен бит MMU_PAGE_PRESENT
Как настроить файл подкачки и изменить его размер?
Грамотная, правильная настройка файла подкачки поможет значительно ускорить работу компьютера. Этим грех было бы не воспользоваться. Где можно его настроить?
- Для Windows XP:
Пуск > Настройка > Панель управления > Система > Дополнительно > Быстродействие > Параметры > Дополнительно > Изменить - Для Windows 7/8/Vista:
Пуск > Настройка > Панель управления > Система > Дополнительные параметры системы > Быстродействие > Параметры > Дополнительно > Виртуальная память > Изменить
- В самом верху окна снять галочку с пункта Автоматически выбирать объём файла подкачки.
- Выберите раздел (либо физический диск) для которого настраивается файл подкачки.
- Поставьте переключатель в пункт Указать размер , укажите Исходный размер и Максимальный размер (указывается в мегабайтах)
- Обязательно нажмите на кнопку Задать.
Для отключения файла подкачки поставьте переключатель в пункт Без файла подкачки.
Как очистить виртуальную память
Виртуальную память нужно периодически очищать. Можно сразу настроить её очистку вместе с отключением компьютера:
-
Запустите «Панель управления» через меню «Пуск» либо с помощью панели «Выполнить». В последнем случае зажмите «Виндовс» и R. Напишите control и щёлкните по ОК.
Выполните команду control
Перейдите в «Администрирование»
Дважды кликните по ярлыку «Локальная политика безопасности»
Виртуальная память на «Виндовс» может компенсировать нехватку «оперативки», когда система перегружена открытыми окнами. Вы вправе сами указать размер файла подкачки (виртуальной памяти) либо вовсе отключить его, чтобы сэкономить место на системном диске. Желательно сразу настроить очистку виртуальной памяти вместе с отключением «компа».
Мы в 1cloud стараемся рассказывать о различных технологиях — например, контейнерах, SSL или флеш-памяти.
Сегодня мы продолжим тему памяти. Разработчик Роберт Элдер (Robert Elder) в своем блоге опубликовал материал с описанием возможностей виртуальной памяти, которые известны не всем инженерам. Мы представляем вашему вниманию основные мысли этой заметки.
Занявшись обновлением собственного компилятора C и написанием спецификации CPU Элдер понял, что с виртуальной памятью связано очень много вопросов, которые до конца не понятны начинающим разработчикам. По этой причине он решил написать свое интерактивное пособие.
Прежде чем переходить к статье Элдера, можете посмотреть видео, на котором Джейсон Питт (Jason Pitt) рассказывает о том, что такое виртуальная память.
Как это работает
Элдер создал на своем сайте таблицу с физическим и виртуальным представлениями 256-байтного адресного пространства. Ниже представлен скриншот этой таблицы. Интерактивная версия доступна в блоге инженера по этой ссылке.
Обозначения, встречающиеся в интерактивной таблице Элдера:
0x0 | Это указатель на страничную структуру верхнего уровня. На машинах Intel это значение хранится в регистре CR3. С ARM все немного сложнее. |
Первая страничная структура. При двухуровневой организации таблиц часто называется «директорией» страниц. В нашем случае каждая запись в директории занимает 8 бит (1 байт) и содержит информацию о месторасположении таблицы страниц. | |
Вторая страничная структура – это так называемая таблица страниц (page table). Каждая запись содержит информацию о расположении физической страницы. | |
Физическая страница, с которой в настоящий момент ведется работа. | |
Активная запись директории страниц или таблицы страниц. | |
Выбранное расположение в памяти. | |
Память, доступная для чтения (Readable Memory). В данном примере разрешения не анализируются, однако в реальной системе будет осуществляться проверка бита на соответствие требуемому методу доступа. | |
Память, доступная для записи (Writeable Memory). | |
Память, для которой разрешено выполнение (Executable Memory). | |
Недоступная виртуальная память (Inaccessible Virtual Memory). | |
Неинициализированная физическая память (Unitialised Physical Memory). К ней нельзя обратиться через адресное пространство виртуальной памяти – это вызовет страничное нарушение. | |
Недоступная физическая память (Inaccessible Physical Memory). Участки памяти, к которым нельзя получить доступ. |
Отображение адресов «один в один» (Identity Mapping)
Это один из самых простых способов отображения виртуальной памяти: каждый физический адрес отображается на такой же виртуальный адрес. Этот вариант не слишком подходит для работы многофункциональной ОС, но может быть весьма полезен для быстрой разработки некоторых систем (вот пример микроядра, над которым ведет работу Элдер).
Рекурсивное отображение (Recursive Mapping)
Чтобы управлять памятью, нужно знать, где в физической памяти располагаются страничные структуры. Когда блок управления памятью (MMU) начинает работу, вы можете взаимодействовать напрямую только с адресами виртуальной памяти. По этой причине отслеживать физические адреса бывает очень трудно.
Одним из решений этой проблемы могут служить рекурсивные таблицы страниц. Если добавить к страничной структуре верхнего уровня рекурсивную запись, то вы сможете с легкостью сказать, какой виртуальный адрес позволит получить доступ к любому физическому адресу в пределах этой структуры. Вам нужно лишь решить, какой виртуальный адрес сгенерировать, чтобы «попасть» на рекурсивную запись.
Как только вы сгенерируете виртуальные адреса, соответствующие записям в директории страниц (соединенные через рекурсивную запись), записи директории страниц можно будет считать записями таблицы страниц. Если структура записей таблицы страниц соответствует структуре записей директории страниц, то их можно считать равнозначными при трансляции адресов.
В итоге это дает возможность ссылаться на любую страничную структуру через виртуальную память. Недостатком рекурсивного отображения можно считать необходимость выделения дополнительного адресного пространства.
Отображение на одну страницу (Everything Mapped to the Same Page)
Важная особенность виртуальной памяти состоит в том, что она позволяет отображать физические страницы на множество виртуальных адресов в памяти. Это дает возможность отображать страницы, принадлежащие участку разделяемой памяти с атрибутом «только для чтения», на несколько процессов.
Страничные нарушения (Page Faults Everywhere)
Страничные нарушения возникают тогда, когда мы обращаемся к области, для которой не установлен инициализирующий бит. Еще страничное нарушение проявляется в тот момент, когда мы пытаемся провести некое действие, идущее вразрез с правами доступа (хотя в представленном примере разрешения не проверяются, в реальной системе подобное возможно).
Переключение контекста между двумя процессами (Context Switching Between 2 Processes)
Изменяя указатель на страничную структуру верхнего уровня, мы переходим в другую страничную директорию. При этом доступные адреса остаются теми же, но их содержимое меняется. Это объясняет, почему в ОС с виртуальной памятью множество процессов могут использовать один и тот же виртуальный указатель.
Решение проблемы внешней фрагментации (Solving External Fragmentation)
Внешняя фрагментация – это весьма неприятная вещь. Рассмотрим такую ситуацию: у вашего компьютера 4 ГБ памяти, но нет жесткого диска. После нескольких операций распределения памяти система оказалась в ситуации, когда все пространство памяти свободно, кроме одного байта в самой середине. В этом случае, если вам потребуется разместить большой трехгигабайтный блок, вы не сможете этого сделать (несмотря на то, что свободной памяти достаточно).
Из этой ситуации есть два выхода:
- Переместить однобайтовую запись в конец пространства памяти.
- Передать два разделённых блока памяти процессу, чтобы тот самостоятельно решил, что делать.
Второй вариант так же не сработает, потому что процесс ждет, что выделенный ему участок памяти будет непрерывным. Если он перестанет быть таковым, то придется создавать совершенно новый набор инструкций и сохранять информацию о том, как получить корректный адрес второй половины.
Виртуальная память помогает достаточно эффективно разрешить эту проблему. Можно с легкостью переназначить пространство виртуальных адресов, чтобы несвязанные между собой части физической памяти выглядели единым целым. В этом случае не происходит никакого перемещения данных – мы просто обновляем записи таблицы страниц.
Копирование при записи (Copy-On-Write)
Виртуальная память крайне полезна для повышения производительности при выполнении команды fork. Если делать полные копии каждой страницы памяти, которую использует процесс, то это приведет к пустой трате циклов CPU и RAM. Идея копирования при записи состоит в том, что мы просто отображаем образ памяти родительского процесса в адресное пространство дочернего процесса.
После этого ОС запрещает обоим процессам писать в эту память. Действительная копия будет создана только в исключительных ситуациях. На практике выходит так, что после создания процесса-копии большинство страниц никогда не модифицируется, а это только повышает эффективность метода, делая его менее ресурсоемким.
Эксперимент со страницами
Элдер провел эксперимент на своем компьютере с операционной системой Ubuntu 14.04. Он объявил несколько переменных подряд, чтобы посмотреть, будут ли их указатели также располагаться рядом друг с другом.
Вот, что он получил на выходе:
Видно, что указатели следуют не в заданном порядке. Элдер пошел дальше и провел еще один эксперимент, в котором показал, что константы, символы и функции хранятся в той последовательности, в которой их объявил программист. Код и объяснение вы можете найти здесь.
Вызов функции с помощью констант
В следующей программе задаются несколько произвольных констант (которые позже будут заменены) и функция, которая принимает на входе целое число и увеличивает его на 8. В данном примере функция main следует сразу за функцией func1. После запуска программа выводит информацию, необходимую для выполнения функции func1.
На выходе имеем:
Можно просто скопировать эти значения в целочисленные константы, которые будут расположены в памяти одна за другой (пример может не сработать, если ваша система отличается от системы Элдера). Теперь, поскольку они находятся на одной странице, можно обратиться к ним как к исполняемым данным и использовать вместо указателя на функцию указатель на «a».
На выходе по-прежнему имеем число 37.
Заключение
Как вы могли убедиться, возможности виртуальной памяти достаточно богаты. Вот лишь некоторые из возможностей: изоляция процессов, решение проблем внешней сегментации, реализация механизма копирования при записи для оптимизации многих процессов.
Page Fault
Page fault — это исключение, возникающее при обращении к странице, которая не загружена в физическую память — или потому, что она была вытеснена, или потому, что не была выделена.
В операционных системах общего назначения при обработке этого исключения происходит поиск нужной странице на внешнем носителе (жёстком диске, к примеру).
В нашей системе все страницы, к которым процесс имеет доступ, считаются присутствующими в оперативной памяти. Так, например, соответствующие сегменты .text, .data, .bss; куча; и так далее отображаются в таблицы при инициализации процесса. Данные, связанные с потоками (например, стэк), отображаются в таблицы процесса при создании потоков.
Выталкивание страниц во внешнюю память и их чтение в случае page fault не реализовано. С одной стороны, это лишает возможности использовать больше физической памяти, чем имеется на самом деле, а с другой — не является актуальной проблемой для встраиваемых систем. Нет никаких ограничений, делающих невозможной реализацию данного механизма, и при желании читатель может попробовать себя в этом деле :)
Для виртуальных страниц и для физических страниц, которые могут быть использованы при работе с виртуальной памятью, статически резервируется некоторое место в оперативной памяти. Тогда при выделении новых страниц и директорий они будут браться именно из этого места.
Исключением является набор указателей на PGD для каждого процесса (MMU-контексты процессов): этот массив хранится отдельно и используется при создании и разрушении процесса.
Выделение страниц
Итак, выделить физическую страницу можно с помощью vmem_alloc_page
Функция page_alloc() ищет участок памяти из N незанятых страниц и возвращает физический адрес начала этого участка, помечая его как занятый. В приведённом коде virt_page_allocator ссылается на участок памяти, резервированной для выделения физических страниц, а 1 — количество необходимых страниц.
Выделение таблиц
Тип таблицы (PGD, PMD, PTE) не имеет значения при аллокации. Более того, выделение таблиц производится также с помощью функции page_alloc(), только с другим аллокатором (virt_table_allocator).
После добавления страниц в соответствующие таблицы нужно уметь сопоставлять участки памяти с процессами, к которым они относятся. У нас в системе процесс представлен структурой task, содержащей всю необходимую информацию для работы ОС с процессом. Все физически доступные участки адресного пространства процесса записываются в специальный репозиторий: task_mmap. Он представляет из себя список дескрипторов этих участков (регионов), которые могут быть отображены на виртуальную память, если включена соответствующая поддержка.
brk — это самый большой из всех физических адресов репозитория, данное значение необходимо для ряда системных вызовов, которые не будут рассматриваться в данной статье.
ctx — это контекст задачи, использование которого обсуждалось в разделе “Виртуальный адрес”.
struct dlist_head — это указатель на начало двусвязного списка, организация которого аналогична организации Linux Linked List.
За каждый выделенный участок памяти отвечает структура marea
Поля данной структуры имеют говорящие имена: адреса начала и конца данного участка памяти, флаги региона памяти. Поле mmap_link нужно для поддержания двусвязного списка, о котором говорилось выше.
Ранее уже рассказывалось о том, как происходит выделение физических страниц, какие данные о виртуальной памяти относятся к задаче, и теперь всё готово для того, чтобы говорить о непосредственном отображении виртуальных участков памяти на физические.
Отображение виртуальных участков памяти на физическую память подразумевает внесение соответствующих изменений в иерархию страничных директорий.
Подразумевается, что некоторый участок физической памяти уже выделен. Для того, чтобы выделить соответствующие виртуальные страницы и привязать их к физическим, используется функция vmem_map_region()
В качестве параметров передаётся контекст задачи, адрес начала физического участка памяти, а также адрес начала виртуального участка. Переменная flags содержит флаги, которые будут установлены у соответствующих записей в PTE.
Основную работу на себя берёт do_map_region(). Она возвращает 0 при удачном выполнении и код ошибки — в ином случае. Если во время маппирования произошла ошибка, то часть страниц, которые успели выделиться, нужно откатить сделанные изменения с помощью функции vmem_unmap_region(), которая будет рассмотрена позднее.
Рассмотрим функцию do_map_region() подробнее.
Макросы GET_PTE и GET_PMD нужны для лучшей читаемости кода. Они делают следующее: если в таблице памяти нужный нам указатель не ссылается на существующую запись, нужно выделить её, если нет — то просто перейти по указателю к следующей записи.
В самом начале необходимо проверить, выровнены ли под размер страницы размер региона, физический и виртуальный адреса. После этого определяется PGD, соответствующая указанному контексту, и извлекаются сдвиги из виртуального адреса (более подробно это уже обсуждалось выше).
Затем последовательно перебираются виртуальные адреса, и в соответствующих записях PTE к ним привязывается нужный физический адрес. Если в таблицах отсутствуют какие-то записи, то они будут автоматически сгенерированы при вызове вышеупомянутых макросов GET_PTE и GET_PMD.
После того, как участок виртуальной памяти был отображён на физическую, рано или поздно её придётся освободить: либо в случае ошибки, либо в случае завершения работы процесса.
Изменения, которые при этом необходимо внести в структуру страничной иерархии памяти, производятся с помощью функции vmem_unmap_region().
Все параметры функции, кроме последнего, должны быть уже знакомы. free_pages отвечает за то, должны ли быть удалены страничные записи из таблиц.
try_free_pte, try_free_pmd, try_free_pgd — это вспомогательные функции. При удалении очередной страницы может выясниться, что директория, её содержащая, могла стать пустой, а значит, её нужно удалить из памяти.
нужны как раз для случая двухуровневой иерархии памяти.
Конечно, данной статьи не достаточно, чтобы с нуля организовать работу с MMU, но, я надеюсь, она хоть немного поможет погрузиться в OSDev тем, кому он кажется слишком сложным.
Виртуальная память является подкачкой (дополнением) оперативной памяти. Она присутствует практически во всех операционных системах.
При запуске ресурсоемких программ у нас постоянно возникает потребность в виртуальной памяти. По этому сегодня мы рассмотрим подробный обзор «что это такое?» и как мы можем ее изменить в лучшую сторону.
Где находится виртуальная память Windows 10 и как её включить
Виртуальная память в виде файла подкачки находится в корневой папке локального системного диска. По умолчанию эта память включена в «Виндовс». Но даже если она отключена, вы можете её сами включить в настройках системы — об этом в следующем разделе.
Файл pagefile.sys по умолчанию находится прямо на системном диске
Устройство Page Table Entry
В реализации проекта Embox тип mmu_pte_t — это указатель.
Каждая запись PTE должна ссылаться на некоторую физическую страницу, а каждая физическая страница должна быть адресована какой-то записью PTE. Таким образом, в mmu_pte_t незанятыми остаются MMU_PTE_SHIFT бит, которые можно использовать для сохранения состояния страницы. Конкретный адрес бита, отвечающего за тот или иной флаг, как и набор флагов в целом, зависит от архитектуры.
- MMU_PAGE_WRITABLE — Можно ли менять страницу
- MMU_PAGE_SUPERVISOR — Пространство супер-пользователя/пользователя
- MMU_PAGE_CACHEABLE — Нужно ли кэшировать
- MMU_PAGE_PRESENT — Используется ли данная запись директории
Можно установить сразу несколько флагов:
Здесь vmem_page_flags_t — 32-битное значение, и соответствующие флаги берутся из первых MMU_PTE_SHIFT бит.
Программная поддержка
- Выделение физических страниц из некоторого зарезервированного участка памяти
- Внесение соответствующих изменений в таблицы виртуальной памяти
- Сопоставление участков виртуальной памяти с процессами, выделившими их
- Проецирование региона физической памяти на виртуальный адрес
Аппаратная поддержка
Обращение к памяти хорошо описанно в этой хабростатье. Происходит оно следующим образом:
Процессор подаёт на вход MMU виртуальный адрес
Если MMU выключено или если виртуальный адрес попал в нетранслируемую область, то физический адрес просто приравнивается к виртуальному
Если MMU включено и виртуальный адрес попал в транслируемую область, производится трансляция адреса, то есть замена номера виртуальной страницы на номер соответствующей ей физической страницы (смещение внутри страницы одинаковое):
Если запись с нужным номером виртуальной страницы есть в TLB [Translation Lookaside Buffer], то номер физической страницы берётся из нее же
Если нужной записи в TLB нет, то приходится искать ее в таблицах страниц, которые операционная система размещает в нетранслируемой области ОЗУ (чтобы не было промаха TLB при обработке предыдущего промаха). Поиск может быть реализован как аппаратно, так и программно — через обработчик исключения, называемого страничной ошибкой (page fault). Найденная запись добавляется в TLB, после чего команда, вызвавшая промах TLB, выполняется снова.
Таким образом, при обращении программы к тому или иному участку памяти трансляция адресов производится аппаратно. Программная часть работы с MMU — формирование таблиц страниц и работа с ними, распределение участков памяти, установка тех или иных флагов для страниц, а также обработка page fault, ошибки, которая происходит при отсутствии страницы в отображении.
В тексте статьи в основном будет рассматриваться трёхуровневая модель памяти, но это не является принципиальным ограничением: для получения модели с бóльшим количеством уровней можно действовать аналогичным образом, а особенности работы с меньшим количеством уровней (как, например, в архитектуре x86 — там всего два уровня) будут рассмотрены отдельно.
Как изменить объем виртуальной памяти через быстродействие
Запустите системную утилиту «Выполнить» одновременным нажатием клавиш Windows+R или откройте ее через Пуск. После этого:
и нажмите «Ок» .
- Перейдите на вкладку «Дополнительно» и найдите здесь категорию «Быстродействие» .
- Кликните по серой кнопке «Параметры» . Откроется новое окно. Здесь перейдите на вкладку «Дополнительно» .
- В нижней части экрана будет указан объем виртуальной памяти. Нажмите «Изменить» , чтобы ввести другой параметр и увеличить, либо уменьшить размер файла подкачки.
По умолчанию система определяет размер полностью в автоматическом режиме. Это наиболее оптимальная опция для Windows. При изменении объема свапа вручную важно, чтобы новый размер виртуальной памяти был не менее существующего, в противном случае возможны сбои в работе ПК.
После увеличение размера свапа перезагрузка не требуется. Если же он был наоборот уменьшен, то устройство необходимо обязательно перезапустить.
Как узнать объем файла подкачки (swap file)
Файл подкачки хранится на винчестере компьютера. Если для работы устройства используется несколько жестких дисков, то он будет расположен на самом быстром из них. Определить объем ВП можно с использованием стандартных средств Windows или специального софта.
Размер свапа подкачки можно узнать через штатную утилиту «Системный монитор».
Для этого:
- Откройте меню «Пуск» и начните вводить название приложения для мониторинга.
- Появится новое окно. Здесь вы найдете основную информации о свапе, пиковые значения подсчета обмена страниц, процент использования системой и размер.
При определении размера ВП система исходит не из объема ОЗУ, а из задач, которые выполняются на устройстве. Поэтому для определения размера необходимо запустить приложения и компоненты, которые обычно используются компьютером и посмотреть пиковое значение свапинга в течение этого сеанса. Он и будет определять величину файла подкачки.
Узнать объем ВП и другие параметры системы можно используя специальную утилиту Vmmap.exe. Она доступна для бесплатной загрузки на официальном сайте Microsoft и не требует установки. Поставляется в виде исполняемого файла, полностью на английском языке.
Итоги:
Надеюсь приведенные в статье советы помогут вам правильно настроить файл подкачки на вашем компьютере и оптимизирует его работу. Если есть вопросы пишите в комментариях, постараюсь дать на них исчерпывающие ответы.
Если вам понравилась эта статья, то пожалуйста, оцените её и поделитесь ею со своими друзьями на своей странице в социальной сети.
Привет, Хабрахабр!
В предыдущей статье я рассказал про vfork() и пообещал рассказать о реализации вызова fork() как с поддержкой MMU, так и без неё (последняя, само собой, со значительными ограничениями). Но прежде, чем перейти к подробностям, будет логичнее начать с устройства виртуальной памяти.
Конечно, многие слышали про MMU, страничные таблицы и TLB. К сожалению, материалы на эту тему обычно рассматривают аппаратную сторону этого механизма, упоминая механизмы ОС только в общих чертах. Я же хочу разобрать конкретную программную реализацию в проекте Embox. Это лишь один из возможных подходов, и он достаточно лёгок для понимания. Кроме того, это не музейный экспонат, и при желании можно залезть “под капот” ОС и попробовать что-нибудь поменять.
Любая программная система имеет логическую модель памяти. Самая простая из них — совпадающая с физической, когда все программы имеют прямой доступ ко всему адресному пространству.
При таком подходе программы имеют доступ ко всему адресному пространству, не только могут “мешать” друг другу, но и способны привести к сбою работы всей системы — для этого достаточно, например, затереть кусок памяти, в котором располагается код ОС. Кроме того, иногда физической памяти может просто не хватить для того, чтобы все нужные процессы могли работать одновременно. Виртуальная память — один из механизмов, позволяющих решить эти проблемы. В данной статье рассматривается работа с этим механизмом со стороны операционной системы на примере ОС Embox. Все функции и типы данных, упомянутые в статье, вы можете найти в исходном коде нашего проекта.
Будет приведён ряд листингов, и некоторые из них слишком громоздки для размещения в статье в оригинальном виде, поэтому по возможности они будут сокращены и адаптированы. Также в тексте будут возникать отсылки к функциям и структурам, не имеющим прямого отношения к тематике статьи. Для них будет дано краткое описание, а более полную информацию о реализации можно найти на вики проекта.
- Расширение реального адресного пространства. Часть виртуальной памяти может быть вытеснена на жёсткий диск, и это позволяет программам использовать больше оперативной памяти, чем есть на самом деле.
- Создание изолированных адресных пространств для различных процессов, что повышает безопасность системы, а также решает проблему привязанности программы к определённым адресам памяти.
- Задание различных свойств для разных участков участков памяти. Например, может существовать неизменяемый участок памяти, видный нескольким процессам.
Читайте также: