Определение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Боб Томпсон — специалист по профессиональному обучению компании Metrowerks. С ним можно связаться по адресу thompson@metrowerks.com


Виртуальная память в действии

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