- •Глава 1 Обзор компьютерных систем
- •1.1. Основные элементы
- •1.2. Регистры процессора
- •Управляющие регистры и регистры состояния
- •1.3. Исполнение команд
- •Выборка и исполнение команды
- •Функции ввода-вывода
- •Множественные прерывания
- •Многозадачность
- •1.5. Иерархия запоминающих устройств
- •1.6. Кэш
- •Обоснование
- •Принципы работы кэша
- •Внутреннее устройство кэша
- •1.7. Технологии ввода-вывода
- •Программируемый ввод-вывод
- •Ввод-вывод с использованием прерываний
- •Прямой доступ к памяти
- •1.8. Рекомендуемая литература
- •1.9. Задачи
- •Приложение а. Характеристики производительности двухуровневой памяти
- •Функционирование двухуровневой памяти
- •Производительность
- •Приложение б. Управление процедурами
- •Реализация стека
- •Вызов процедуры и возврат из нее
- •Реентерабельные процедуры
Приложение а. Характеристики производительности двухуровневой памяти
В данной главе упоминался кэш, который выступает в роли промежуточного буфера между процессором и основной памятью, что обеспечивает двухуровневую структуру памяти. Производительность работы памяти с такой архитектурой выше, чем у одноуровневой памяти. Это повышение производительности достигается за счет свойства, известного как локализация, которое и рассматривается в данном приложении.
Механизм кэширования основной памяти является составной частью компьютерной архитектуры. Он встроен в аппаратное обеспечение и обычно невидим операционной системе. В силу этого кэширование не рассматривается в данной книге. Однако есть еще два примера использования двухуровневой памяти, в которых также используется локализация и которые, по крайней мере, частично, управляются операционной системой; виртуальная память и дисковый кэш (см. табл. 1.2). Эти темы являются предметом рассмотрения глав 8, "Виртуальная память", и 11, "Управление вводом-выводом и дисковое планирование", соответственно. Данное приложение поможет читателю познакомиться с некоторыми характеристиками производительности двухуровневой памяти, которые являются общими для всех трех подходов.
Таблица 1.2. Характеристики двухуровневой памяти
Кэш основной памяти
|
Виртуальная память (страничная организация)
|
Дисковый кэш
| |
Типичное соотношение времени доступа
|
5:1
|
1000:1
|
1000:1
|
Система управления памятью
|
Специальное встроенное аппаратное обеспечение |
Сочетание аппаратного и программного обеспечения
|
Системное программное обеспечение
|
Типичный размер блока
|
От 4 до 128 байт
|
От 64 до 4096 байт
|
От 64 до 4096 байт
|
Доступ процессора Ко второму уровню |
Прямой доступ
|
Косвенный доступ
|
Косвенный доступ
|
Локализация
Основой для повышения производительности двухуровневой памяти является принцип локализации, о котором шла речь в разделе 1.5. Основной постулат состоит в том, что последовательные обращения к памяти имеют тенденцию собираться в группы (кластеры). По истечении длительного периода времени один кластер сменяется другим, но на протяжении сравнительно небольших промежутков времени процессор преимущественно работает с адресами, входящими в один и тот же кластер памяти.
Принцип локализации подтверждается на практике. Рассмотрим следующую цепочку рассуждений.
1. Команды программы выполняются последовательно, за исключением тех случаев, когда встречаются команды ветвления или вызова (процедуры. функции и т.д.). Поэтому в большинстве случаев команды из памяти извлекаются последовательно, одна за другой в порядке их размещения.
2. Длинная, не нарушаемая прерываниями последовательность вызовов процедур, за которой идут соответствующие команды возврата, встречается довольно редко. Другими словами, глубина вложенного вызова процедур остается небольшой. Поэтому в течение короткого промежутка времени обращения, скорее всего, происходят к командам, которые находятся в небольшом числе процедур.
3. Большинство итерационных конструкций состоят из сравнительно небольшого числа многократно повторяющихся команд. Во время выполнения этих итераций вычисления сосредоточены на небольшом локализованном участке программы.
4. Во многих программах значительная часть вычислений приходится на операции с такими структурами данных, как массивы и последовательности записей. В большинстве случаев данные, к которым происходит обращение, расположены близко друг к другу.
Приведенные рассуждения подтверждаются многими исследованиями. Для проверки утверждения 1 проводился разносторонний анализ поведения программ, составленных на языках высокого уровня. Результаты измерений частоты появления различных команд при выполнении программы, проведенные разными исследователями, представлены в табл. 1.3. Одно из самых ранних исследований поведения языка программирования проводилось Кнутом [KNUT71], рассматривавшим различные программы на языке FORTRAN, написанные студентами при выполнении практических заданий. Таненбаум [TANE78] опубликовал результаты измерений, проведенные более чем на 300 процедурах, которые использовались при разработке операционных систем и были написаны на языке, поддерживающем структурное программирование. Паттерсон и Секвин [РАТТ82] провели анализ ряда измерений, выполненных над компиляторами, текстовыми редакторами, системами автоматизированного проектирования, программами сортировки данных и сравнения содержимого файлов (языки программирования С и Pascal). Хак [HUCK83] проанализировал четыре программы, являющиеся типичными примерами программ для проведения научных вычислений. Среди них были, в частности, программы для выполнения быстрого Фурье-преобразования и для решения системы дифференциальных уравнений. Полученные результаты хорошо согласуются с утверждением, что ветвления и команды вызовов представляют собой лишь небольшую часть всех команд, выполняющихся во время работы программы. Таким образом, проведенные исследования подтверждают справедливость приведенного выше утверждения 1.
Таблица 1.3. Относительная динамическая частота различных операций, встречающихся в программах, составленных на языках высокого уровня
Исследование Язык
|
[HUCK83] Pascal
|
(KNUT71] FORTRAN
|
[РАTT82] Pascal
|
С |
[TANE78] SAL
|
Изучаемый материал
|
Научное ПО
|
Студенческие работы
|
Системное ПО
|
Системное ПО
|
Системное ПО
|
Присвоение
|
74
|
67
|
45
|
38
|
42
|
Цикл
|
4
|
3
|
5
|
а
|
4
|
Вызов
|
1
|
3
|
15
|
12
|
12
|
IF
|
20
|
11
|
29
|
43
|
36
|
GOTO
|
2
|
9
|
-
|
3
|
-
|
Другие
|
-
|
7
|
6
|
1
|
6
|
Что касается утверждения 2, то его справедливость подтверждается Исследованиями, результаты которых изложены в [РАТТ85]. Это проиллюстрировано на рис. 1.20, где показано поведение программы в разрезе используемых в ней вызовов процедур и возврата из них. Каждый вызов представлен отрезком линии, идущим на одно деление вниз, а каждый возврат — отрезком, идущим на одно деление вверх. Весь график заключен в коридор шириной 5 делений. Этот коридор является подвижным, но сдвигается лишь в результате 6 последовательных команд вызова или возврата. Из графика видно, что программа во время своей работы может оставаться в стационарном коридоре на протяжении достаточно длительного периода времени. Изучение программ, написанных на С или Pascal, показало, что при расширении коридора до 8 делений он сдвигается меньше, чем при 1% вызовов или возвратов [TAMI83].
Принцип локализации обращений подтверждается и более поздними исследованиями. Например, на рис. 1.21 показаны результаты исследований, при которых измерялась частота доступа к Web-страницам отдельно взятого узла.
В литературе различают пространственную и временную локализации. Пространственная локализация означает преимущественное обращение к некоторому количеству сгруппированных ячеек памяти. Это свойство отражает тенденцию процессора исполнять команды последовательно. Пространственная локализация свидетельствует также о склонности программы обращаться к данным, которые находятся в последовательных ячейках, как, например, при обработке данных, собранных в таблицу. Временная локализация отражает тенденцию процессора обращаться к ячейкам памяти, к которым недавно уже производился доступ. Например, при выполнении цикла итераций процессор многократно повторяет исполнение одного и того же набора команд.