Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
konspekt_20-38.doc
Скачиваний:
111
Добавлен:
11.05.2015
Размер:
2.38 Mб
Скачать

27.Автоинкрементная и автодекрементная адресация.

Основная (оперативная) память ЭВМ обычно является адресной. Это значит, что каждой хранимой в ОП единице информации (байту, слову) ставится в соответствие специальное число - адрес, определяющий место ее хранения в памяти.

Следует различать понятия адресный код в команде Ак и исполнительный адрес Аи. Адресный код - это информация об адресе операнда, содержащаяся в команде. Исполнительный адрес - это номер ячейки памяти, к которой производится фактическое обращение. В современных ЭВМ, адресный код, как правило, не совпадает с исполнительным адресом.

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

Регистровая косвенная адресация требует предварительной загрузки регистра из ОП косвенным адресом, что связано с потерей времени (при косвенной адресации адресный код команды указывает адрес ячейки памяти, в которой находится адрес операнда или команды, таким образом, косвенная адресация может быть иначе определена как «адресация адреса»).

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

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

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

Постдекрементная ( postdecrement) - автодекрементная адресация, при которой вычитание производится после выборки операнда.

Предекрементная ( predecrement) - автодекрементная адресация, при которой вычитание производится до выборки операнда.

У Intel только 1, нет направления, в процессорах этого типа есть ФЛАГ НАПРАВЛЕНИЯ.

Флаг направления (Direct Flag) в регистре состояния определяет направление обработки строк. Если он равен 1, то адрес уменьшается, а если он сброшен в 0, то адрес увеличивается. Флаг направления позволяет одному набору строковых команд обслуживать оба направления в зависимости от установки флага. В некоторых случаях желательно пересылать строку с увеличением адресов, но иногда лучше использовать уменьшение адреса. Сама величина инкремента или декремента адреса определяется размером операнда. Например, для символьных строк, в которых размер операндов равен 1 байту, команды обработки строк изменяют адрес на 1 после каждой операции. Если обрабатывается массив целых чисел, в котором каждый операнд занимает 4 байта, то строковые команды изменяют адрес на 4.

28. Стек - структура данных, в которой доступ к элементам организован по принципу «последним пришёл — первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.

Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху). Удаление элемента, называемое также выталкиванием (pop), тоже возможно только из вершины стека, при этом второй сверху элемент становится верхним.

Стек — это область оперативной памяти, специально выделяемая для временного хранения данных программы.

Для стека в структуре программы предусмотрен отдельный сегмент (если программист забыл описать сегмент стека, компоновщик tlink выдаст предупреждающее сообщение).

Для стека можно отвести любую область памяти, но ее размер зависит от режима работы микропроцессора и ограничивается 64 Кбайт (или 4 Гбайт в защищенном режиме), а начальный адрес должен быть выровнен на границу параграфа (т.е. д.б. кратным 16).

!!! Даже если сама программа не использует стек, сегмент стека в программе все равно надо описывать. Так как стек программы использует ОС при обработке прерываний, возникающих во время выполнения программы.

Рекомендуемый размер стека (с запасом) - 128 байтов.

В каждый момент времени доступен только один стек, адрес сегмента которого содержится в регистре ss. Этот стек называется текущим.

Особенности организации стека:

1.    запись и чтение данных в стеке осуществляется в соответствии с принципом LIFO (Last In First Out — “последним пришел, первым ушел”);

2.    по мере записи данных  стек растет в сторону младших адресов. Эта особенность заложена в алгоритм команд работы со стеком; Др. словами, стек заполняется снизу вверх: первый элемент записывается в самый конец стека (в ячейку с наибольшим адресом), а следующий элемент записывается «над» ним. 

3.    при чтении из стека первым всегда удаляется верхний элемент, поэтому низ стека фиксирован, а вершина стека все время сдвигается. Текущее положение этой вершины наз. вершиной стека. Адрес вершины стека храниться в регистре SP (stack pointer, указатель стека). Т.е. в регистре SP хранится смещение той ячейки, в которой находится элемент, записанный в стек последним. Смещение относительно начала сегмента стека. Итак, абсолютный адрес вершины стека задается парой сегментов SS:SP. Команды работы со стеком неявно изменяют этот регистр так, чтобы он указывал всегда на последний записанный в стек элемент. Если стек пуст, то значение esp равно адресу последнего байта сегмента, выделенного под стек.

Замечание: Регистр ss автоматически используется процессором для выполнения всех команд, работающих со стеком. Это означает, что при использовании регистров esp/sp и ebp/bp для адресации памяти ассемблер автоматически считает, что содержащиеся в нем значения представляют собой смещения относительно сегментного регистра ss и поэтому  префикс SS можно не указывать.

4. Элементы стека могут иметь любой размер (байт, слово и т.д.). Но команды записи и чтения, предназначенные для стека, работают только со словами, т.е. информация, помещаемая в стек и извлекаемая из него, имеет длину 2 байта.

Для работы со стеком предназначены три регистра:

•ss — сегментный регистр стека;

•sp/esp — регистр указателя стека;

•bp/ebp — регистр указателя базы кадра стека.

Команды работы со стеком.

Запись слова в стек

push операнд               — запись значения операнд в вершину стека.

 Чтение слова из стека

pop операнд            — запись значения из вершины стека по месту, указанному операндом.

!!! Операндом не может быть регистр CS

!!! Команды PUSH и POP не осуществляют проверку на выход за пределы стека.

Например, если стек пуст, а мы считываем слово из стека, будет считано слово за сегментом стека.

Использование стека

      для временного сохранения значений регистров

            например,     push cx

                                    . . . ; например во вложенных циклах           

                                    pop cx

      для сохранения текущих состояний флагов и последующего их восстановления

            pushf

            popf

      для определения или изменения состояния любого флага

      для пересылки данных

            например, X:=Y                   push Y

                                                            pop X

      при работе с процедурами;

      при определении локальных переменных.

29. Иерархия памяти. Кэш памяти.

Две возможные стратегии для ускорения быстродействия– уменьшение времени отклика или упреждающий запрос нужной памяти.

Использование регистров и оперативной памяти.

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

Следующая часть памяти – это обычная оперативная память. С ростом производительности процессоров стало ясно, что самым узким местом производительности является доступ к оперативной памяти. Для того, чтобы добраться до оперативной памяти, нужны сотня, а то и две сотни тактов процессора. То есть, запросив какую-то ячейку памяти в оперативной памяти, мы будем ждать двести тактов, а процессор будет простаивать.

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

Кэширование

Кэш-память служит для уменьшения времени доступа к данным.

Для этого блоки оперативной памяти отображаются в более быструю кэш-память.

Если адрес памяти находится в кэше – происходит "попадание" и скорость получения данных значительно увеличивается.

В противном случае – "промах" (cash miss)

В этом случае блок оперативной памяти считывается в кэш-память за один или несколько циклов шины, называемых заполнением строки кэш-памяти.

Можно выделить следующие виды кэш-памяти:

  • полностью ассоциативная кэш-память (каждый блок может отображаться в любое место кэша)

  • память с прямым отображением (каждый блок может отображаться в одно место)

  • гибридные варианты (секторная память, память с множественно-ассоциативным доступом)

Множественно-ассоциативный доступ – по младшим разрядам определяется строка кэша, куда может отображаться данная память, но в этой строке может находиться только несколько слов основной памяти, выбор из которых проводится на ассоциативной основе.

Качество использования кэша – ключевое условие быстродействия.

Дополнительная информация: в современных IA32 системах размер кэш-линии 64 байта.

Уменьшение времени доступа было достигнуто введением кэш-памяти. Кэш-память – это память, находящаяся между оперативной памятью и микропроцессором. Она реализована на ядре, то есть доступ к ней гораздо быстрее чем к обычной памяти, но она намного дороже, поэтому приразработке микроархитектуры нужно найти точный баланс между ценой и производительностью. Если вы посмотрите на описания предлагаемых в продаже процессоров, вы увидите, что всегда в описании пишется, сколько кэша памяти того или иного уровня на данном процессоре есть. Эта цифра серьезно влияет на цену данного изделия. Кэш-память устроена так, что обычная память отображается на кэш-память, отображение идет блоками. Вы, запрашивая в оперативной памяти какой-то адрес, делаете проверку, отображен ли этот адрес в кэш-памяти. Если этот адрес уже есть в кэш-памяти, то вы экономите время на обращение к памяти. Вы считываете эту информацию из быстрой памяти, и у вас время отклика существенно уменьшается, если же этого адреса в кэш-памяти нет, то мы должны обратиться к обычной памяти, чтобы этот необходимый нам адрес вместе с каким-то блоком, в котором он находится, отобразился в эту кэш-память.

Существуют разные реализации кэш-памяти. Бывает полностью ассоциативная кэш-память, когда каждый блок может отображаться в любое место кэша. Существует память с прямым отображением, когда каждый блок может отображаться в одно место, также существуют различные гибридные варианты – например кэш с множественно-ассоциативным доступом. В чем разница? Разница во времени и сложности проверки на наличие нужного адреса в кэш-памяти. Предположим, что нам нужен определенный адрес. В случае с ассоциативной памятью нам нужно проверить весь кэш – убедиться, что этого адреса в кэше нет. В случае с прямым отображением нам нужно проверить только одну ячейку. В случае с гибридными вариантами, например, когда используется кэш с множественно-ассоциативным доступом, нам нужно проверить, к примеру, четыре или восемь ячеек. То есть, задача определить есть ли адрес в кэша – тоже важна. Качество использования кэша – важное условие быстродействия. Если нам удастся написать программу так, чтобы как можно чаще те данные, с которыми мы собирались работать, находились в кэше, то такая программа будет работать гораздо быстрее.

Характерные времена отклика при обращении к кэш памяти для Nehalem i7:

  • L1 - latency 4

  • L2 - latency 11

  • L3 - latency 38

Время отклика для оперативной памяти > 100

Упреждающий механизм доступа к памяти реализован при помощи механизма упреждающей выборки (hardware prefetching).

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

Для примера возьмем наш последний процессор Nehalem: i7.

Здесь мы имеем не просто кэш, а некий иерархический кэш. Долгое время он был двухуровневый, в современной системе Nehalem он трехуровневый – совсем немного очень быстрого кэша, чуть побольше кэша второго уровня и достаточно большое количество кэша третьего уровня. При этом, эта система построена так, что если какой-то адрес находится в кэше первого уровня, он автоматически находится во втором и в третьем уровнях. Это и есть иерархическая система. Для кэша первого уровня задержка – 4 такта, для второго – 11, третьего – 38 и время отклика оперативной памяти – больше 100 тактов процессора.

Принцип локальности. Качество упреждающей выборки.

Локальность ссылки (locality of reference) – повторное использование переменных или взаимосвязанных данных. Различают временную локальность (temporal locality) – когда речь идет об одних и тех же данных и пространственную локальность (spatial locality) – использование различных данных, имеющих относительно близкие области хранения.

Механизм кэширования использует принцип временной локальности. (Стремится сохранять в кэше наиболее часто используемые данные).

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

Кэш aliasing – из-за неудачного расположения в памяти различных объектов, участвующих в вычислении, происходит вытеснению из кэш памяти одних адресов другими.

Второй вариант улучшения быстродействия и работы с памятью, про который мы упомянули – это подкладывать в кэш заранее необходимые адреса – упреждающий механизм доступа к памяти (Hardware Prefetching). Этот механизм выявляет закономерности, с которыми вы обращаетесь к памяти, и заранее закачивает в кэш адреса, которые могут вам понадобиться. Если вы обрабатываете несколько массивов, движетесь по ним последовательно или с каким-то постоянным шагом, то, скорее всего, этот механизм начнет эти адреса заранее подгружать. Есть специальный набор инструкций, позволяющий загрузить в кэш память, расположенную по определенному адресу. (Software Prefetching)

Кэш имеет внутренние алгоритмы работы. Введем несколько понятий.

Локальность ссылки – переиспользование переменных или взаимосвязанных данных. Различают временную локальность – переиспользование определенных данных и ресурсов и пространственную локальность - использование данных, имеющих относительно близкие области хранения.

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

Механизм упреждающей выборки использует принцип пространственной локальности, то есть подгружает соседние элементы.

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

Иерархическая структура памяти является традиционным решением проблемы

хранения большого количества данных Она изображена на рис. 2.15. На самом

верху находятся регистры процессора. Доступ к регистрам осуществляется быст-

рее всего. Дальше идет кэш-память, объем которой сейчас составляет от 32 Кбайт

до нескольких мегабайт. Затем следует основная пам'ять. Далее идут магнитные

диски и, наконец, накопители на магнитной ленте и оптические диски, которые

используются для хранения архивной информации.

Рис. 2.15. Пятиуровневая организация памяти

По мере продвижения по структуре сверху вниз возрастают три параметра. Во-

первых, увеличивается время доступа. Доступ к регистрам занимает несколько

наносекунд, доступ к кэш-памяти — немного больше, доступ к основной памяти —

несколько десятков наносекунд. Дальше идет большой разрыв: доступ к дискам

занимает по крайней мере 10 мке, а время доступа к магнитным лентам и оптичес-

ким дискам вообще может измеряться в секундах (поскольку эти накопители ин-

формации еще нужно взять и поместить в соответствующее устройство).

Во-вторых, увеличивается объем памяти. Регистры могут содержать в лучшем

случае 128 байтов, кэш-память — несколько мегабайтов, основная память — десятки

тысяч мегабайтов, магнитные диски — от нескольких гигабайтов до нескольких

десятков гигабайтов. Магнитные ленты и оптические диски хранятся автономно

от компьютера, поэтому их объем ограничивается только финансовыми возмож-

ностями владельца.

В-третьих, увеличивается количество битов, которое вы получаете за 1 доллар.

Стоимость объема основной памяти измеряется в долларах за мегабайт1, объем

магнитных дисков — в пенни за мегабайт, а объем магнитной ленты — в долларах

за гигабайт или еще дешевле.

Регистры, кэш-память и основную память мы уже рассмотрели. В следующих

разделах мы расскажем о магнитных дисках, а затем приступим к изучению оп-

тических дисков. Накопители на магнитных лентах мы рассматривать не будем,

поскольку они очень редко используются; к тому же о них практически нечего

сказать.

КЭШ памяти.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]