• скачать файл

Регистры буферной памяти. Кэш

с. 1


Лекция 2



Лекция №2

На прошлой лекции мы начали обсуждать проблему ВС, рассмотрели ее структуру, которая представляет собой пирамиду, две ступени которой ( управление логическими (виртуальными) устройствами и управление физическими устройствами) - это то, что мы называем операционной системой. Мы также кратко рассмотрели структуру ЭВМ и основные свойства оперативной памяти и ЦП. Перед нами возникла проблема несоответствия скорости работы ЦП и времени доступа к ОЗУ. Мы поговорили об одном из решений этой проблемы, а именно об организации регистровой памяти, которая позволяет сглаживать это несоответствие в скоростях. Нами была также затронута тема прерываний и их обработки.



Здесь надо отметить одно важное свойство: прерывания могут быть инициированы как схемами контроля процессора (деление на ноль), так и внешним устройством (при нажатии клавиши на клавиатуре происходит прерывание, по которому процессор считывает из некоторого регистра код нажатой клавиши). Прерывания позволяют частично разрешить такую большую проблему, как проблему несоответствия скоростей работы внешних запоминающих устройств (ВЗУ) и ОЗУ. Если бы все обмены с ВЗУ происходили в синхронном режиме, то производительность ЭВМ была бы очень низкой. Но аппарат прерываний позволяет сгладить несоответствие в скоростях доступа к ВЗУ и ОЗУ благодаря работе в асинхронном режиме, т.е. можно дать заказ на обмен и забыть о нем до прерывания по завершению обмена. Это позволяет в целом значительно увеличить производительность ЭВМ. Сделаем еще одно замечание по теме обработки прерываний. Возникает вопрос, что произойдет если два внешних прерывания пресекутся. На этот случай существует режим работы CPU, обеспечивающий функционирование программы без реакции на внешние прерывания. (Этот режим включается и выключается автоматически, когда информация из буферных регистров перенеслась в таблицы ОС.)

Регистры буферной памяти. КЭШ (Cache).

Вернемся к нашей глобальной проблеме, проблеме несоответствия скорости доступа к RAM и скорости работы CPU. На прошлой лекции мы обсудили тот факт, что при умело организованном алгоритме работы с регистрами общего назначения можно минимизировать число обменов с ОЗУ, а следовательно увеличить эффективность программы. Но этот способ решения данной проблемы имеет большой недостаток. Эффективность работы системы в целом сильно зависит от качества программы (и следовательно от уровня программиста). Мы приходим к необходимости искать аппаратное решение данной проблемы. В современных ЭВМ имеются средства аппаратной минимизации обращения в RAM. Процессоры содержат быстродействующую регистровую память призванную буферизировать обращение к оперативной памяти, которая называется КЭШ-памятью (cache).

Рассмотрим алгоритм чтения из ОЗУ при использовании cache:


  1. Происходит ассоциативный поиск в специальном буферном регистре строки, в которой находится исполнительный адрес, совпадающий с исполнительным адресом необходимого нам операнда. (Мы - это CPU, а конкретнее АЛУ). Если такая строчка имеется, то соответствующее этому адресу значение, считается значением операнда и передается в процессор для дальнейшей обработки. (При этом никакого обращения в ОЗУ не происходит!).

  2. Если такой строчки нет, то происходит обмен с оперативной памятью, затем в таблице ищется свободная строчка и копия полученного значения помещается в буферный регистр и помечается исполнительным адресом этого значения в оперативной памяти. Содержимое операнда поступает в ЦП для обработки. Появляется вопрос, может возникнуть такая ситуация, что все строчки уже заняты и необходимо кого-то “вытеснить” из таблицы, кого “убирать”? Существуют различные дифференцированные критерии решения этой проблемы. Наиболее распространенный и простой критерий - вытеснять из таблицы самую “старую” строчку. А признаком старения может быть, например, количество обращений к буферу, при котором нет обращения к этой строчке. В каждом таком случае значение в третьем столбце нашей таблицы увеличивается на единицу.

Регистровый буфер

Исполнительный адрес

Содержимое

Значение признака “старения”









...


...

...

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

Алгоритм записи в ОЗУ симметричен. Когда в программе встречается команда записи в память, аппаратура выполняет следующие действия. Проверяется наличие в буфере строки с заданным исполнительным адресом. При ее наличии в поле “Содержимое” записывается новое значение и аппаратно корректируется значение признака “старения” данной строки. Если же такой строчки нет, то запускается описанный выше процесс выталкивания, и затем информация размещается в освободившейся строке.

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

Следующим достаточно мощным механизмом решения поставленной выше проблемы является использование расслоения памяти.


Механизм расслоения памяти.

Мы говорили о том, что адресация в оперативной памяти сквозная (0..n-1). При механизме расслоения памяти используется следующая схема организации оперативной памяти. Оперативная память представляется в виде объединения k запоминающих устройств, каждое из которых имеет свой канал взаимодействия с CPU. В адресном пространстве ОЗУ все пары соседних адресов находятся в разных устройствах (блоках) ОЗУ:



Оперативная память

1-й блок 2-й блок ... k-й блок



0

1

...

k-1

k

k+1

...

2k-1

...

...

...

...



За счет этого достигается возможность распараллеливания работы процессора с RAM при выполнении программы. Если нам надо обработать структурные данные, массивы мы можем считывать их буфера параллельно, т. е. за одно обращение можно прочесть до k машинных слов и разместить их в буфере. Схема работы буфера была рассмотрена нами выше. Итоговая скорость чтения может быть увеличена в k раз.
Отойдем теперь от рассмотрения hardware и затронем проблему мультипрограммирования.
Мультипрограммирование.

Обсудим систему, которая появилась в самом начале развития вычислительной техники. Это однопрограммная система. Рассмотрим диаграмму выполнения процесса в однопрограммной системе. Оси абсцисс будет соответствовать течение времени, а ось ординат - статус работы программы: ордината точки равна 0, значит программа не работает (простаивает), в это время происходит обмен, например, с жестким диском; если ордината равна 1, то в данный момент времени t программа работает (в том смысле, что CPU производит вычисления):



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

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



По оси абсцисс отложим время, а на оси ординат отметим выполняемые задачи. Пусть процессор начал работу над задачей №1. В какой-то момент времени ему потребовались данные, находящиеся на ВЗУ. Процессор формирует заказ на обмен, но пока происходит обмен система в целом не будет простаивать - начнет свое выполнение задача №2. Как только ей понадобится считать информацию с ВЗУ запустится задача №3 и т. д. В зависимости от типа и класса решаемых задач такой подход позволить сэкономить от 1 до 99% всего времени.

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



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

  2. Все программы при мультипрограммировании должны находится в ОЗУ. И будет “плохо” если одна программа “залезет” (например, при записи) в область памяти, занимаемую другой программы. Вторая проблема - механизм защиты (оперативной) памяти.

  3. Третью проблему можно проиллюстрировать примером. Все программы в рамках мультипрограммной системы подали команду на принтер напечатать строку. Ничего хорошего из этого не выйдет. Не хорошо обычным программам предоставлять возможность работы с конкретными физическими устройствами. Это означает, что во множестве машинных команд должно быть выделено подмножество общедоступных команд и группа команд, доступных только ОС. Мы пришли к необходимости наличия поддержки привилегированного режима работы. А при попытке выполнения недоступной команды должно происходить прерывание. Вернемся к принтеру. Как быть с ним? В разных ОС есть разные способы взаимодействия программ и ОС. Проблему с принтером можно решить, например, так. Есть буфера (программные), которые располагаются в RAM или во внешних устройствах. В них аккумулируем заказы, поступающие от программ на печать. А принтер по очереди печатает заказы, находящиеся в этом буфере.


Организация работы оперативной памяти.

С этого момента мы говорим о мультипрограммных ВС. Итак, рассмотрим структуру ОЗУ. В некоторой ее части находится ОС. Эта часть является локализованной. Оставшуюся часть могут использовать программы пользователя или же те программы, которые подгружает ОС.





Обсудим тот случай, когда программы жестко привязаны к конкретным физическим адресам оперативной памяти. Пусть одна задача использует диапазон адресов A1..A2, другой задаче необходимо адресное пространство B1..B2, где A1<=B1<=A2. В этом случае, если одна из задач начнет писать в область памяти B1..A2, это повлечет за собой порчу данных другой программы. Т. е. в этом случае имеются участки памяти, которые являются пересечением областей данных двух разных задач. Эта проблема называется проблемой нехватки адресного пространства (заметьте, не объема!).

Рассмотрим другой случай. Пусть в ОЗУ загружены задачи №1, №2 и №3. Но эти задачи находятся в памяти, не следуя строго одна за другой - между ними есть свободные участки памяти - фрагменты. У нас есть еще и 4-ая задача, готовая к загрузке в ОЗУ, но объема каждого фрагмента не достаточно для того, чтобы загрузить эту задачу в память, несмотря на то, что суммарный объем фрагментов быть может даже превышает объем памяти, необходимой для загрузки 4-й задачи. Происходит деградация схемы работы программ. Перед нами появляется еще одна проблема - проблема фрагментации.



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