Скачиваний:
98
Добавлен:
03.06.2014
Размер:
5.64 Mб
Скачать

Виртуальнаяпамять 453

уплотнения состоит в том, что на этот процесс тратится некоторое количество времени. Совершать уплотнение после появления каждой дырки невыгодно.

Сегмент 4

Сегмент 4

 

у/

 

(7К)

(7К)

Сегмент5

Сегмент5

 

 

 

(4К)

(4К)

 

Сегмент3

Сегмент 3

Сегмент 3

 

Сегмент5

(8К)

(8К)

(8К)

Сегмент 6

(4К)

 

 

 

 

 

 

(4К)

 

 

 

 

 

 

 

 

Сегмент 6

Сегмент2

Сегмент2

Сегмент2

Сегмент2

(4К)

(5К)

(5К)

(5К)

(5К)

Сегмент2

 

 

 

 

 

'(ЗК)

(3K)

 

(5К)

Сегмент1

 

 

 

 

(8К)

Сегмент 7

Сегмент 7

Сегмент 7

Сегмент 7

 

(5К)

(5К)

(5К)

(5К)

СегментО

СегментО

СегментО

СегментО

СегментО

(4К)

(4К)

(4К)

(4К)

(4К)

Рис. 6.8. Динамика внешней фрагментации (а, б, в, г); удаление внешнейсегментациипутемуплотнения(д)

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

Другой популярный алгоритм по кругу просматривает список «дырок» и выбирает первую «дырку», которая по размеру подходит для данного сегмента. Естественно, это занимает меньше времени, чем проверка всего списка, чтобы найти оптимальную «дырку». Удивительно, но последний алгоритм гораздолучше, чем алгоритм оптимальной подгонки, с точки зрения общей производительности, поскольку оптимальная подгонкапорождаеточеньмногомаленькихнеиспользованныхдырок [74].

Оба алгоритма сокращают средний размер «дырки». Всякий раз, когда сегмент помещается в «дырку», которая больше, чем этот сегмент, что бывает практически всегда (точные попадания очень редки), «дырка» делится на две части. Одну часть занимает сегмент, а вторая часть — это новая «дырка». Новая «дырка» всегда меньше, чем старая. Без воссоздания больших «дырок» из маленьких оба алгоритма в конечном итоге будут наполнять память маленькими неиспользованными «дырками».

Опишем один из таких процессов. Всякий раз, когда сегмент удаляется из памяти, а одна или обе соседние области этого сегмента — «дырки», а не сегменты, смежные неиспользованные пространства можно слить в одну большую «дырку». Если из рис. 6.8, г удалить сегмент 5, то две соседние «дырки» и 4 К, которые использовались данным сегментом, будут слиты в одну «дырку» в 11 К.

4 5 4 Глава 6. Уровень операционной системы

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

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

MULTICS (Multiplexed Information and Computing Service — служба общей информации и вычислений) — это древняя операционная система, которая совмещала сегментацию с разбиением на страницы. Она была разработана Массачусетским технологическим институтом совместно с компаниями Bell Labs и General Electric [28, 106]. Адреса в MULTICS состоят из двух частей: номера сегмента и адреса внутри сегмента. Для каждого процесса существовал сегмент дескриптора, который содержал дескриптор для каждого сегмента. Когда аппаратное обеспечение получало виртуальный адрес, номер сегмента использовался в качестве индекса в сегмент дескриптора для нахождения дескриптора нужного сегмента (рис. 6.9). Дескриптор указывал на таблицу страниц, что позволяло разбивать на страницы каждый сегмент обычным способом. Для повышения производительности недавно используемые комбинации сегмента и страницы помещались в ассоциативную память из 16 элементов. Операционная система MULTICS уже давно не применяется, но виртуальная память всех процессоров Intel, начиная с 386-го, очень похожа на эту систему.

18-битный номер сегмента

10-битное смещение

внутри страницы

 

Адрес системы MULTICS, состоящий из двух частей

Рис. 6.9. Превращение адресасистемы MULTICS, состоящего издвухчастей, в адрес основной памяти

Виртуальная память

455

Виртуальная память в процессоре Pentium II

Pentium II имеет сложную систему виртуальной памяти, которая поддерживает вызов страниц по требованию, чистую сегментацию и сегментацию с разбиением на страницы. Виртуальная память состоит из двух таблиц: LDT (Local Descriptor Table — локальная таблица дескрипторов) и GDT (Global Descriptor Table глобальная таблица дескрипторов). Каждая программа имеет свою собственную локальную таблицу дескрипторов, а единственная глобальная таблица дескрипторов разделяется всеми программами компьютера. Локальная таблица дескрипторов LDT описывает локальные сегменты каждой программы (ее код, данные, стек и т. д.), а глобальная таблица дескрипторов GDT описывает системные сегменты, в том числе саму операционную систему.

Как мы уже говорили в главе 5, чтобы получить доступ к сегменту, Pentium II сначала загружает селектор для сегмента в один из сегментных регистров. Во время выполнения программы регистр CS содержит селектор для сегмента кода, DS содержит селектор для сегмента данных и т. д. Каждый селектор представляет собой 16-битное число (рис. 6.10).

Один из битов селектора показывает, является сегмент локальным или глобальным (то есть в какой из двух таблиц он находится: в локальной таблице дескрипторов или в глобальной таблице дескрипторов). Еще 13 битов определяют номер элемента в локальной или глобальной таблице дескрипторов, поэтому объем каждой из этих таблиц ограничен до 8 К (213) сегментных дескрипторов. Оставшиеся два бита связаны с защитой. Мы опишем их позже.

Биты

13

12

 

ИНДЕКС

 

 

0=GDT

Уровень привилегий (0-3)

 

1=LDT

 

 

 

Рис. 6.10. Селектор в машине Pentium II

Дескриптор 0 недействителен и вызывает ловушку. Его можно загрузить в регистр сегмента, чтобы показать, что регистр сегмента в данный момент недоступен, но если попытаться использовать дескриптор 0, он вызовет ловушку.

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

Формат селектора был выбран таким образом, чтобы упростить нахождение дескриптора. Сначала на основе бита 2 в селекторе выбирается локальная таблица дескрипторов LDT или глобальная таблица дескрипторов GDT. Затем селектор копируется во временный регистр контроллера управления памятью, а три младших бита принимают значение 0, в результате 13-битное число селектора умножается на 8. Наконец, к этому прибавляется адрес из локальной таблицы дескрипто-

4 5 6 Глава 6. Уровень операционной системы

ров или из глобальной таблицы дескрипторов (который хранится во внутренних регистрах контроллера управления памятью), и в результате получается указатель на дескриптор. Например, селектор 72 обращается к элементу 9 в глобальной таблице дескрипторов, который находится в ячейке с адресом GDT+72.

• 32бита

 

Относительный

 

—•- адрес

BASE 0-15

LIMIT

 

BASE 24-31 G D О LIMIT 16-19 P DPL

TYPE

BASE 16-23

0: содержимое поля"

Типсегмента изащита

LIMIT в байтах

Уровеньпривилегий(0-3)

1:содержимоеполя

 

 

LIMIT в страницах

0: Сегмент отсутствует в памяти

0:16-битный

1: Сегмент присутствует в памяти

 

 

сегмент

 

 

1: 32-битный сегмент

Рис. 6 . 1 1 . Дескриптор сегмента кода в процессоре Pentium II. Сегментыданныхпрактически ничем не различаются

Давайте проследим, каким образом пара (селектор, смещение) превращается

вфизический адрес. Как только аппаратное обеспечение определяет, какой именно регистр сегмента используется, оно может найти полный дескриптор, соответствующий данному селектору во внутренних регистрах. Если такого сегмента не существует (селектор 0) или в данный момент он не находится в памяти (Р=0), вызывается системное прерывание (ловушка). В первом случае — это ошибка программирования; второй случай требует, чтобы операционная система вызвала нужный сегмент.

Затем аппаратное обеспечение проверяет, не выходит ли смещение за пределы сегмента. Если выходит, то снова происходит ловушка. По логике вещей в дескрипторе должно быть 32-битное поле для определения размера сегмента, но там

вналичии имеется всего 20 битов, поэтому в данном случае используется совершенно другая схема. Если поле G (Granularity — степень детализации) равно 0, то поле LIMIT дает точный размер сегмента (до 1 Мбайт). Если поле G равно 1, то поле LIMITуказывает размер сегмента в страницах, а не в байтах. Размер страницы в компьютере Pentium II никогда не бывает меньше 4 Кбайт, поэтому 20 битов достаточно для сегментов до 232 байтов.

Если сегмент находится в памяти, а смещение не выходит за границу сегмента, Pentium II прибавляет 32-битное поле BASE в дескрипторе к смещению, в результате чего получается линейный адрес (рис. 6.12). Поле BASE разбивается на три части и разносится по дескриптору, чтобы обеспечить совместимость с процессором 80286, в котором размер BASE составляет всего 24 бита. Поэтому каждый сегмент может начинаться с произвольного места в 32-битном адресном пространстве.

Виртуальнаяпамять 457

Селектор

Смещение

Дескриптор

Базовый адрес

Максимальное

значение Другие поля

32-битныйлинейныйадрес

Рис. 6.12. Преобразование пары (селектор, смещение) в линейный адрес

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

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

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

На рис. 6.13, а мы видим линейный адрес, разбитый на три поля: DIR, PAGE и OFF. Поле DIR используется в качестве индекса в директории страниц для нахождения указателя на нужную таблицу страниц. Поле PAGE используется в качестве индекса в таблице страниц для нахождения физического адреса страничного кадра. Наконец, поле OFF прибавляется к адресу страничного кадра, и получается физический адрес нужного байта или слова.

Размер каждого элемента таблицы страниц — 32 бита, 20 из которых содержат номер страничного кадра. Оставшиеся биты включают бит доступа и бит изменения, которые устанавливаются аппаратным обеспечением для помощи операционной системе, биты защиты и некоторые другие биты.

В каждой таблице страниц содержатся элементы для 1024 страничных кадров по 4 К каждый, поэтому одна таблица страниц работает с 4 Мбайт памяти. Сегмент короче 4 Мбайт будет иметь директорию страниц с одним элементом (указателем на его единственную таблицу страниц). Таким образом, непроизводительные издержки для коротких сегментов составляют всего две страницы, а не миллион страниц, как было бы в одноуровневой таблице страниц.

4 5 8 Глава 6. Уровень операционной системы

 

 

Линейный адрес

 

Биты

10

10

12

 

DIR

PAGE

OFF

Директория страниц

Таблица страниц

Страничный кадр

Г

I

£

1

i

t

 

 

 

Выбранное слово

 

PAGE

 

 

DIR

T

 

Рис. 6.13. Отображение линейного адреса на физический адрес

Чтобы избежать повторных обращений к памяти, устройство управления памятью Pentium II содержит специальную аппаратную поддержку для поиска недавно использовавшихся комбинаций DIR-PAGE и отображения их на физический адрес соответствующего страничного кадра. Шаги, показанные на рис. 6.13, выполняются только в том случае, если текущая комбинация не использовалась недавно.

При применении разбиения на страницы значение поля BASE в дескрипторе вполне может быть равно 0. Единственное, для чего нужно поле BASE, — это мотивировать небольшое смещение и использовать элемент в середине директории страниц, а не в начале. Поле BASE включено в дескриптор только для осуществления чистой сегментации (без разбиения на страницы), а также для обратной совместимости со старым процессором 80286, в котором не было разбиения на страницы.

Отметим, что если конкретное приложение не нуждается в сегментации и довольствуется единым 32-битным адресным пространством со страничной организацией, этого легко достичь. Все сегментные регистры могут быть заполнены одним и тем же селектором, дескриптор которого содержит поле BASE, равное 0, и поле LIMIT, установленное на максимальное значение. Смещение команды будет тогда линейным адресом с единственным адресным пространством — по сути, традиционное разбиение на страницы.

В завершение стоит сказать несколько слов о защите, поскольку это имеет непосредственное отношение к виртуальной памяти. Pentium II поддерживает 4 уровня защиты, где уровень 0 — самый привилегированный, а уровень 3 — наименее привилегированный. Они показаны на рис. 6.14. В каждый момент работающая программа находится на определенном уровне, указывающемся 2-битным полем

в PSW (Program Status Word — слово состояния программы) — регистре аппарат-

ного обеспечения, который содержит коды условия и другие биты состояния. Более того, каждый сегмент в системе также принадлежит к определенному уровню.

Виртуальная память

459

Возможные

пользователи разных уровней

"Уровень

Рис. 6.14. Уровни защиты процессора Pentium II

Пока программа использует сегменты только своего собственного уровня, все идет нормально. Доступ к данным более высокого уровня разрешается. Доступ к данным более низкого уровня запрещен1: в этом случае происходит системное прерывание (ловушка). Допустим вызов процедур как более высокого, так и более низкого уровня, но при этом нужно вести строгий контроль. Для вызова процедуры из другого уровня команда CALL должна содержать селектор вместо адреса. Этот селектор обозначает дескриптор, который выдает адрес нужной процедуры. Таким образом, невозможно совершить переход в середину произвольного сегмента на другом уровне. Могут использоваться только официальные точки входа.

Рассмотрим рис. 6.14. На уровне 0 мы видим ядро операционной системы, которая контролирует процесс ввода-вывода, работу памяти и т. п. На уровне 1 находится обработчик системных вызовов. Пользовательские программы могут вызывать процедуры из этого уровня, но только строго определенные процедуры. Уровень 2 содержит библиотечные процедуры, которые могут разделяться несколькими работающими программами. Пользовательские программы могут вызывать эти процедуры, но не могут изменять их. На уровне 3 работают пользовательские программы, которые имеют самую низкую степень защиты. Система защиты Pentium II, как и схема управления памятью, в целом основана на идеях системы MULTICS.

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

1Эти словаследует понимать следующим образом: авторназывает более высоким уровнемте сегменты данных, у которых значение уровня привилегий больше, хотя на самом деле все обстоит иначе. Самымвысокимуровнемпривилегийсчитаютсясегменты, имеющиеуровень привилегий, равныйО, асамый низкий уровень привилегий имеют сегменты созначениемэтого уровня,равным 3. — Примеч.научн.ред.

4 6 0

Глава 6. Уровень операционной системы

Виртуальная память UltraSPARC II

UltraSPARC II — это 64-разрядная машина, которая поддерживает виртуальную память со страничной организацией и с 64-битными виртуальными адресами. Тем не менее по разным причинам программы не могут использовать полное 64-бит- ное виртуальное адресное пространство. Поддерживается только 64 бита, поэтому программы не могут превышать 1,8х1013 байтов. Допустимая виртуальная память делится на 2 зоны по 243 байтов каждая, одна из которых находится в верхней части виртуального адресного пространства, а другая — в нижней. Между ними находится «дырка», содержащая адреса, которые не используются. Попытка использовать их вызовет ошибку из-за отсутствия страницы.

Максимальная физическая память компьютера UltraSPARC II составляет 241 байтов (2200 Гбайт). Поддерживается 4 размера страниц: 8 Кбайт, 64 Кбайт, 512 Кбайт и 4 Мбайт. Отображения этих четырех размеров показаны на рис. 6.15.

Биты

51

13

48

16

45

19

42

22

 

 

 

 

 

Ч

 

Ч

 

ьнои

7i

ние

Q.

 

 

1

О

i

 

 

аниц

CD

 

 

 

2

 

ш

 

CJ

 

 

 

I

 

I

ничный

S

щение

 

 

CD Q.

Q.я 2

оо

о.g*

ние

о *4

CD

CD ^

CD

2

S g-

О

I

 

I

ный

3

ние

 

 

CD

X

о.

=1

CD

 

CD

а.СО

2

О

 

О

 

 

Q.

ИОНK512

эи н

ниць

 

О

CD

 

 

 

 

ВИ1 стра

5

 

О

 

 

I J

И1 Я

CN

CD

 

т Ю

X

X

О.

CD

CD

 

а.

2

6

 

О

 

 

Q.

ИОН

 

 

 

zs

О

 

S

 

1CDX

 

ВИ|

&

 

 

ние CD

О

Биты

28

13

25

16

22

19

19

22

Рис. 6.15. Отображения виртуальных адресов в физические в машине UltraSPARC II

Из-за огромного виртуального адресного пространства обычная таблица страниц (как в Pentium II) не будет практичной. В UltraSPARC II применяется совершенно другой подход. Устройство управления памятью содержит таблицу, так называемый TLB (Translation Lookaside Buffer — буфер быстрого преобразования адреса). Эта таблица отображает номера виртуальных страниц в номера физических страничных кадров. Для страниц размером в 8 К существует 231 номеров виртуальных страниц, то есть более двух миллиардов. Естественно, не все они могут быть отображены.

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

Виртуальная память

461

вызывает его контекст, виртуальный адрес в этом контексте передается в контроллер управления памятью, то он с помощью специальной схемы сравнивает номер виртуальной страницы со всеми элементами буфера быстрого преобразования адреса TLB для данного контекста одновременно. Если обнаруживается совпадение, номер страничного кадра в этом элементе буфера соединяется со смещением, взятым из виртуального адреса, чтобы получить 41-битный физический адрес и обработать некоторые флаги (например, биты защиты). Буфер быстрого преобразования адресаТЬВ изображен на рис. 6.16, а.

 

TLB (контроллер

 

TLB (контроллер

 

 

управления памятью +

 

 

управления памятью)

программное обеспечение ]

 

 

и

го

го

 

 

о i

 

ш е

со, Б

ё

¥иi

Транслирующаятаблица

 

I s

 

 

(операционная система)

1

 

ш

 

 

 

 

 

 

Формат

 

 

 

 

полностью

 

 

 

 

определяется

 

Элемент 0 совместно

 

операционной

 

используется всеми

Элемент 1 совместно

системой

виртуальными страницами,

I

 

заканчивающимися

используется всеми

виртуальными страницами,

на 0...0000

заканчивающимися

 

 

на 0...0001

Рис.6.16.Структурыданных, использующиесядлятрансляции виртуальногоадреса на UltraSPARC II: буфер быстрого преобразования адреса TLB (а); буфер хранения преобразований (б);транслирующаятаблица(в)

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

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

4 6 2 Глава 6. Уровень операционной системы

(TSB — translationstorage buffer). Этатаблицапостроенакак кэш-памятьпрямого отбражения виртуальных страниц. Каждый 16-байтный элемент данной таблицы указывает на одну виртуальную страницу и содержит бит достоверности, номер контекста,тегвиртуального адреса, номер физической страницы и несколько флаговых битов. Если размер кэш-памяти составляет, скажем, 8192 элемента, тогда все виртуальные страницы, у которых младшие 13 битов отображаются в 0000000000000, будут претендовать на элемент 0 в данной таблице. Точно так же все виртуальные страницы, у которых младшие биты отображаются в 0000000000001, претендуют на элемент 1 в этой таблице, как показано на рис. 6.16, б. Размер таблицы определяется программным обеспечением и передается в контроллер управления памятью через специальные регистры, доступные только для операционной системы.

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

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

Сравним схемы разбиения настраницы в Pentium II и UltraSPARC И. Pentium II поддерживает чистую сегментацию, чистое разбиение на страницы и сегментацию в сочетании с разбиением на страницы. UltraSPARC II поддерживает только разбиение на страницы. Pentium II использует аппаратное обеспечение для перезагрузки элемента буфера TLB в случае промаха TLB. UltraSPARC II в случае такого промаха просто передает управление операционной системе.

Причинаэтого различия состоит в том, что Pentium II использует 32-битные сегменты, а такие маленькие сегменты (только 1 млн страниц) могут обрабатываться только с помощью страничных таблиц. Теоретически у Pentium II могли бы возникнуть проблемы, если бы программа использовала тысячи сегментов, но так как ни одна из версий Windows или UNIX не поддерживает более одного сегмента на процесс, никаких проблем не возникает. UltraSPARC II — 64-битная машина. Она может содержать до 2 млрд страниц, поэтому таблицы страниц не работают. В будущем все машины будут иметь 64-битные виртуальные адресные пространства, и схема UltraSPARC II станет нормой. Сравнение Pentium II, UltraSPARC II и четырех других схем виртуальной памяти можно найти в книге [66].