Страничный обмен
Подкачка, или свопинг
(от англ, swapping — обмен) — это процесс
выгрузки редко используемых областей виртуального адресного пространства
программы на диск или другое устройство массовой памяти. Такая массовая
память всегда намного дешевле оперативной, хотя и намного медленнее.
Во многих учебниках по ОС приводятся таблицы, аналогичные табл. 5.2.
Таблица 5.2. Сравнительные характеристики и стоимость различных
типов памяти
Тип памяти |
Время доступа |
Цена 1 Мбайта (цены 1995 г.) |
Способ использования |
Статическая память |
15 нc |
$200 |
Регистры, кэш-память |
Динамическая память |
70 нc |
$30 (4 Мбайт SIMM) |
Основная память |
Жесткие магнитные диски |
1-10 мс |
$3 (1.2Gb HIDE) |
Файловые системы, устройства свопинга |
Магнитные ленты |
Секунды |
$0.025 (8mm Exabyte) |
Устройства резервного копирования |
При разработке системы всегда есть желание сделать память как можно более
быстрой. С другой стороны, потребности в памяти очень велики и постоянно
растут.
Примечание
Существует эмпирическое наблюдение, что любой объем дисковой памяти будет
полностью занят за две недели.
Очевидно, что система с десятками гигабайтов статического ОЗУ будет
иметь стоимость, скажем так, совершенно не характерную для персонапь-ных
систем, не говоря уже о габаритах, потребляемой мощности и прочем. К счастью,
далеко не все, что хранится в памяти системы, используется одновременно.
В каждый заданный момент исполняется только часть установленного в системе
программного обеспечения, и работающие программы используют только часть
данных.
Эмпирическое правило "80—20", часто наблюдаемое в коммерческих
системах обработки транзакций, гласит, что 80% операций совершаются над
20% файла [Heising 1963]. В ряде работ, посвященных построению оптимизирующих
компиляторов, ссылаются на правило "90-10" (90% времени исполняется
10% кода) — впрочем, есть серьезные основания сомневаться в том, что в
данном случае соотношение именно таково [Кнут 2000, т. 3].
В действительности, удивительно большое количество функций распределения
реальных дискретных величин (начиная от количества транзакций на строку
таблицы и заканчивая распределением богатства людей или капитализации
акционерных обществ) подчиняются закону Парето
[Pareto 1897]:
Р = ck-1,
где
— число в диапазоне от 0 до 1, k — значение
величины (в нашем случае — количество обращений к данной записи), р
— количество записей, к которым происходит k
обращений, с — нормализующий коэффициент (правило
"80—20" соответствует ==log80/log20
= 0,1386) или его частному случаю, распределению
Зипфа [Zipf 1949]:
р = c/ k.
Детальное обсуждение этого явления, к сожалению, не доходящее до глубинных
его причин, приводится в [Кнут 200, т. 3]. Как один из результатов обсуждения
предлагается концепция "самоорганизующегося файла" — для ускорения
поиска в несортированном массиве предлагается передвигать записи ближе
к началу массива. Если обращения к массиву распределены в соответствии
с законом Зипфа, наиболее востребованные записи концентрируются в начале
массива и поиск ускоряется в c/ ln N раз, где N — размер массива, а с
— константа, зависящая от используемой стратегии перемещения элементов.
При произвольном доступе к данным (например, по указателям или по ключам
хэш-таблицы) перемещение к началу массива не имеет столь благотворного
эффекта — если только вся память имеет одну и ту же скорость доступа.
Но мы видели, что разные типы запоминающих устройств резко различаются
по этому параметру.
Это различие приводит нас к идее многослойной или многоуровневой
памяти, когда в быстрой памяти хранятся часто используемые код
или данные, а редко используемые постепенно мигрируют на более медленные
устройства. В случае дисковой памяти такая миграция осуществляется вручную:
администратор системы сбрасывает на ленты редко используемые данные и
заполняет освободившееся место чем-то нужным. Для больших и сильно загруженных
систем существуют специальные программы, которые определяют, что является
малоценным, а что — нет. Управление миграцией из ОЗУ на диск иногда осуществляется
пользователем, но часто это оказывается слишком утомительно. В случае
миграции между кэш-памятью и ОЗУ Делать что-то вручную просто физически
невозможно.
|