Страница , страница памяти или виртуальная страница — это непрерывный блок виртуальной памяти фиксированной длины , описываемый одной записью в таблице страниц . Это наименьшая единица данных для управления памятью в операционной системе, использующей виртуальную память. Аналогично, страничный фрейм — это наименьший непрерывный блок физической памяти фиксированной длины , в который операционная система отображает страницы памяти. [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 МБ (так называемые расширения размера страницы ) (страницы размером 2 МБ при использовании PAE ) в дополнение к своим стандартным страницам размером 4 КиБ; новые процессоры x86-64 , такие как новые процессоры AMD64 от AMD и процессоры Intel Westmere [27] и более поздние версии 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] Начиная с версии 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 и так далее.
[…] Программная оперативная память (ОЗУ) организована точно так же, как ПЗУ.
[…]