Страница , страница памяти или виртуальная страница — это непрерывный блок виртуальной памяти фиксированной длины , описываемый одной записью в таблице страниц . Это наименьшая единица данных для управления памятью в операционной системе, использующей виртуальную память. Аналогично, кадр страницы — это наименьший непрерывный блок физической памяти фиксированной длины , в который страницы памяти отображаются операционной системой. [1] [2] [3]
Передача страниц между основной памятью и вспомогательным хранилищем, таким как жесткий диск , называется подкачкой или свопингом. [4]
Память компьютера разделена на страницы, чтобы информацию можно было найти быстрее.
Концепция названа по аналогии со страницами печатной книги. Если читатель хотел найти, например, 5000-е слово в книге, он мог бы считать с первого слова. Это заняло бы много времени. Было бы намного быстрее, если бы у читателя был список того, сколько слов находится на каждой странице. Из этого списка он мог бы определить, на какой странице появляется 5000-е слово, и сколько слов нужно посчитать на этой странице. Этот список слов на странице книги аналогичен таблице страниц в файловой системе компьютера . [5]
Размер страницы обычно определяется архитектурой процессора. Традиционно страницы в системе имели одинаковый размер, например 4096 байт . Однако конструкции процессоров часто допускают два или более, иногда одновременных, размера страницы из-за их преимуществ. Есть несколько моментов, которые могут повлиять на выбор наилучшего размера страницы. [6]
Система с меньшим размером страницы использует больше страниц, требуя таблицу страниц , которая занимает больше места. Например, если виртуальное адресное пространство 2 32 отображается на страницы размером 4 КиБ (2 12 байт), количество виртуальных страниц составляет 2 20 = (2 32 / 2 12 ). Однако, если размер страницы увеличивается до 32 КиБ (2 15 байт), требуется только 2 17 страниц. Многоуровневый алгоритм страничного обмена может снизить стоимость памяти для выделения большой таблицы страниц для каждого процесса путем дальнейшего разделения таблицы страниц на более мелкие таблицы, эффективно разбивая таблицу страниц.
Поскольку каждый доступ к памяти должен быть сопоставлен с виртуальным адресом на физический, чтение таблицы страниц каждый раз может быть довольно затратным. Поэтому часто используется очень быстрый тип кэша, буфер трансляции (TLB). TLB имеет ограниченный размер, и когда он не может удовлетворить заданный запрос ( промах TLB ), таблицы страниц должны быть просмотрены вручную (либо аппаратно, либо программно, в зависимости от архитектуры) для правильного сопоставления. Большие размеры страниц означают, что кэш TLB того же размера может отслеживать большие объемы памяти, что позволяет избежать дорогостоящих промахов TLB.
Редко когда процессы требуют использования точного количества страниц. В результате последняя страница, скорее всего, будет заполнена лишь частично, что приведет к потере некоторого объема памяти. Большие размеры страниц приводят к большому объему потерянной памяти, поскольку больше потенциально неиспользуемых участков памяти загружается в основную память. Меньшие размеры страниц обеспечивают более точное соответствие фактическому объему памяти, требуемому при выделении.
В качестве примера предположим, что размер страницы составляет 1024 Б. Если процесс выделяет 1025 Б, необходимо использовать две страницы, в результате чего останется 1023 Б неиспользованного пространства (где одна страница полностью занимает 1024 Б, а другая — только 1 Б).
При передаче с вращающегося диска большая часть задержки вызвана временем поиска, временем, необходимым для правильного расположения головок чтения/записи над пластинами диска. Из-за этого большие последовательные передачи более эффективны, чем несколько меньших передач. Передача того же объема данных с диска в память часто требует меньше времени с большими страницами, чем с меньшими.
Большинство операционных систем позволяют программам определять размер страницы во время выполнения . Это позволяет программам использовать память более эффективно, выравнивая выделения по этому размеру и уменьшая общую внутреннюю фрагментацию страниц.
Системы на базе Unix и POSIX могут использовать системную функцию sysconf()
, [7] [8] [9] [10] [11], как показано в следующем примере, написанном на языке программирования C.
#include <stdio.h> #include <unistd.h> /* sysconf(3) */ int main ( void ) { printf ( "Размер страницы для этой системы составляет %ld байт. \n " , sysconf ( _SC_PAGESIZE )); /* _SC_PAGE_SIZE тоже подходит. */ вернуть 0 ; }
getconf
Во многих системах Unix можно использовать утилиту командной строки . [12] [13] [14]
Например, getconf PAGESIZE
вернет размер страницы в байтах.
Операционные системы на базе Win32 , такие как семейства Windows 9x и Windows NT , могут использовать системную функцию GetSystemInfo()
[15] [16] из kernel32.dll
.
#include <stdio.h> #include <windows.h> int main ( void ) { SYSTEM_INFO si ; GetSystemInfo ( & si ); printf ( "Размер страницы для этой системы составляет %u байт. \n " , si . dwPageSize ); вернуть 0 ; }
Некоторые архитектуры набора инструкций могут поддерживать несколько размеров страниц, включая страницы, значительно превышающие стандартный размер страницы. Доступные размеры страниц зависят от архитектуры набора инструкций, типа процессора и режима работы (адресации). Операционная система выбирает один или несколько размеров из поддерживаемых архитектурой. Обратите внимание, что не все процессоры реализуют все определенные большие размеры страниц. Эта поддержка больших страниц (известных как «огромные страницы» в Linux , «суперстраницы» в FreeBSD и «большие страницы» в терминологии Microsoft Windows и IBM AIX ) позволяет «взять лучшее из обоих миров», снижая нагрузку на кэш TLB (иногда увеличивая скорость на целых 15%) для больших выделений, при этом сохраняя использование памяти на разумном уровне для небольших выделений.
Начиная с Pentium Pro и AMD Athlon , процессоры x86 поддерживают страницы размером 4 МиБ (называемые Page Size Extension ) (страницы размером 2 МиБ при использовании PAE ) в дополнение к своим стандартным страницам размером 4 КиБ; более новые процессоры x86-64 , такие как новые процессоры AMD64 от AMD и Westmere [27] от Intel и более поздние процессоры Xeon , могут использовать страницы размером 1 ГиБ в длинном режиме . IA-64 поддерживает до восьми различных размеров страниц, от 4 КиБ до 256 МиБ, и некоторые другие архитектуры имеют схожие функции. [ указать ]
Более крупные страницы, несмотря на то, что они доступны в процессорах, используемых в большинстве современных персональных компьютеров , не используются повсеместно, за исключением крупномасштабных приложений, приложений, которые обычно находятся на больших серверах и в вычислительных кластерах , а также в самой операционной системе. Обычно их использование требует повышенных привилегий, сотрудничества со стороны приложения, выделяющего большую память (обычно устанавливая флаг, чтобы запросить у операционной системы огромные страницы), или ручной настройки администратора; операционные системы обычно, иногда по замыслу, не могут выгружать их на диск.
Однако SGI IRIX имеет универсальную поддержку для нескольких размеров страниц. Каждый отдельный процесс может предоставлять подсказки, и операционная система автоматически будет использовать наибольший возможный размер страницы для заданной области адресного пространства. [28] Более поздняя работа предложила прозрачную поддержку операционной системы для использования смеси размеров страниц для немодифицированных приложений посредством упреждающих резервирований, оппортунистических повышений, спекулятивных понижений и управления фрагментацией. [29]
Linux поддерживает огромные страницы на нескольких архитектурах, начиная с серии 2.6 через hugetlbfs
файловую систему [30] и без нее, hugetlbfs
начиная с 2.6.38. [31] Windows Server 2003 (SP1 и новее), Windows Vista и Windows Server 2008 поддерживают огромные страницы под названием больших страниц. [32] Windows 2000 и Windows XP поддерживают большие страницы внутренне, но не предоставляют их приложениям. [33] Резервирование больших страниц в Windows требует соответствующего права, которое системный администратор должен предоставить пользователю, поскольку большие страницы не могут быть выгружены в Windows. Начиная с версии 9, Solaris поддерживает большие страницы на SPARC и x86. [34] [35]
FreeBSD 7.2-RELEASE имеет суперстраницы. [36] Обратите внимание, что до недавнего времени в Linux приложениям требовалось вносить изменения для использования больших страниц. В ядре 2.6.38 появилась поддержка прозрачного использования больших страниц. [31] В ядрах Linux, поддерживающих прозрачные огромные страницы, а также в FreeBSD и Solaris , приложения используют преимущества огромных страниц автоматически, без необходимости внесения изменений. [36]
[…] ПЗУ далее делится на страницы, каждая из которых содержит 256 байтов. Таким образом, ячейки с 0 по 255 составляют страницу 0 ПЗУ, ячейки с 256 по 511 составляют страницу 1 и так далее. […] Программируемое оперативное запоминающее устройство (ОЗУ) организовано точно так же, как ПЗУ. […]