Последната
актуализация
на този
раздел е от 2021 година.
6.4.5
Виртуален
или
физически
адрес?
От
казаното до
момента
става ясно,
че компютърните
системи
използуват
два типа адреси:
виртуален и
физически. В
зависимост
от това и два
различни
типа кеш-памети.
Операционните
системи,
които
предоставят
напреднали
възможности
за
многозадачен
режим (като Unix и
OS/2), създават
илюзията, че
всяка
програма се
изпълнява на
отделна
машина. Това
позволява
всяка
програма да
прави достъп
и да
разпределя
паметта независимо
от всички
останали, без
да се тревожи,
че ще стъпи в
адресното
пространство
на друга
програма. На
практика
обаче всеки
байт (всяка
клетка) от
физическата
(оперативна)
памет
притежава
единствен
адрес.
Операционната
система и
апаратурата
на процесора създават
съвместно
тази илюзия,
като дефинират
два
типа адреси - виртуален
и физически - и
управляват
преобразуването
на единия в другия.
Програмите
използуват
виртуални адреси,
докато
контролерът
на
системната памет
генерира
физически
адреси. Вече
бяха изяснени
методите за
това
преобразуване.
Намирането
на
физическото
място на
търсената
информация
изисква
време. За да
се минимизира
загубата в
бързодействие,
в структурата
на
процесорите
се включва адресен
кеш-буфер,
наричан
буфер за
преобразуване
(TLB-буфер,
Translation Lookaside Buffer). Вече
беше
изяснено, че
несполуките
при обръщение
към този
буфер водят
до генериране
на
прекъсване,
като
обновяването
на информацията
представлява
привилегирована
операция.
Докато
несполучливите
обръщения
към паметта
"струват"
по-малко и от
десетина
машинни
цикъла, несполучливите
обръщения
към TLB-буфера
са твърде
"скъпи" –
каналните
линии трябва
да се
изпразнят,
съдържанието
на
регистрите трябва
да се
съхрани,
подпрограмата
за търсене
трябва да се
изпълни и
след това
съдържанието
на
регистрите
трябва да се
възстанови.
Всичко това
може да
изисква
стотици машинни
цикли. Поради
тази причина TLB-буферът
обикновено
притежава
много по-голяма
степен на
асоциативност,
отколкото другите
типове
кеш-памети.
За
търсене и
съхраняване
на данни в
кеш-паметта
могат да се
използуват
както
физически,така
и виртуални
адреси. Структурата
на
кеш-паметта
рядко се
променя, но и
изборът,
който
конструктора
ще направи,
оказва
въздействие
върху
другите аспекти
на общата
архитектура
на системата
и върху
продуктивността
на
приложенията.
Използуването
на кеш-памет
с виртуално
адресиране
има няколко
предимства.
Кеш-контролерът
не трябва да
изчаква
завършването
на
преобразуването
на адреса,
преди да може
да започне
търсенето на
адреса в
кеш-паметта.
Това
означава, че
този
кеш-механизъм
може да доставя
данните
по-бързо.
Тъй
като се
използуват
виртуални
адреси в програмата,
то идентични
стартирания
на програмата
ще доведат до
идентични
образци на
използуване
на
кеш-паметта.
Това
не е така при
кеш-памети с
физическо
управление,
където
операционната
система може
да
разпредели
различни физически
страници за
програмата
при различните
й
стартирания.
В резултат,
теговете на
адресите от
едно
стартиране
ще се различават
от тези на
друго
(следващо)
стартиране,
дори ако се
извършва
същото
изчисление.
Това означава,
че някои
стартирания
биха могли да
генерират
повече
конфликти в
рамките, съхраняващи
се в кеша,
отколкото
други. Работните
характеристики
могат
значително
да варират,
особено
когато се
използува
кеш-памет с
еднократна
асоциация
(кеш с
директно съответствие).
Въпреки,
че при
използуване
на кеш-памети
с физическо
адресиране
се получават
разлики в
работните
характеристики,
те имат две важни
предимства.
Първо, ако
външната
кеш-памет е
проектирана
за централен процесор
с вградено
ММU
(устройство
за управление
на паметта),
адресът
който се
подава от
процесора, е
вече
преобразуван
и единственият
избор е
кеш-памет с
физическо
адресиране.
Второ,
тъй като
всички
адреси са
адреси предимно
за едно
единствено
физическо
адресно
пространство
(а не за всяко
приложение
по едно
виртуално
адресно
пространство),
данните
могат да се
оставят в
кеш-паметта,
когато
операционната
система
предава
управлението
от една
програма на
друга.
С
виртуално
адресируема
кеш-памет
данните трябва
да се подават
всеки път
(става дума
за съдържанието
на TLB-буфера),
когато се
налага предаване
на
управлението
или промяна
на състоянието
на процесора.
В противен
случай приложение
А например,
може да
прочете
съдържанието
на адрес 000..00 от приложение
Б, вместо
собственият
си нулев
адрес. Поради
тази причина
кеш-паметите
с физическо
адресиране
често водят
до по-добра
производителност
в
многосвързани,
многозадачни
среди, в
които
превключването
на контекста
е доста често
събитие.
Виртуално
адресируемите
кеш-памети
могат да
бъдат
модифицирани
така, че да
запазват
"етикет на
процеса",
заедно с
адресния
етикет в
кеш-паметта.
Но това означава,
че
операционната
система
трябва да
разпредели
етикети на
процеси за
приложенията
и пак се
нуждае от
изпразване
на кеш-паметта,
когато
работещите
приложения
са повече,
отколкото
наличните
етикети на процеси.
Една
несполука
при
обръщение
към кеш-паметта
струва много
машинни
цикли и тъй
като бързодействието
на основната
памет не се увеличава
толкова
бързо,
колкото при
процесорите,
тази цена
може само да
се увеличава.
В резултат на
това се
налага да се
проектират
процесори с
допълнителна
апаратура, която
да
минимизира
цената на
кеш-несполуките.
В
най-простата
процесорна
архитектура,
когато
кеш-паметта
сигнализира
за несполука,
процесорът
изчаква
процедурата
на заместване
на данните,
преди да
продължи
работата си.
Тази
организация
изисква
сравнително
проста схема
за
реализация,
но довежда до
значителен
престой на
процесора.
По-сложните
процесори
изпълняват
последващите
команди,
които не
зависят от
съдържанието
на кеш-паметта,
докато
последната
се зареди.
Тази
организация
е значително
по-сложна, тъй
като
процесорът
може да
привърши
изпълнението
на командите
в безпорядък.
Ако се
получи още
едно
несполучливо
обръщение
преди първото
да е
отработено,
процесорът
спира, осигурявайки
по този начин
съществуването
най-много на
едно
очакващо
обработка
несполучливо
обръщение.
По
принцип, едно
или две
такива
висящи несполучливи
обръщения
могат да
бъдат позволени,
преди
процесорът
да спре.
Съвременните
скъпи
процесори
обикновено
позволяват
едно или две
очакващи
обработка
зареждания.
В
най-простата
кеш
организация
при несполучливо
обръщение се
зарежда цял
блок. След това
необходимата
стойност се
подава на процесора,
като по този
начин е сигурно,
че няма да се
получи
следващо
несполучливо
обръщение
към същия
блок, докато
тече
процедурата
на
заместване.
Това може да
удвои
времето
което отнема
несполучлив
достъп до
кеш-паметта.
Един
по-сложен
подход изисква
зареждането
на блока да
започне от исканата
дума и едва
след това да
се направи преход
за да се
изберат и
прехвърлят
думите от
началото до
края на
блока.
Исканата
дума се
подава на
процесора
щом
пристигне от
основната
памет, а
останалите
думи на блока
се предават,
докато
процесорът е
зает с обработката
(виж пункт 6.3.2).
Когато
съответните
данни не се
намират в кеш-паметта
или не могат
да бъдат
прочетени наведнъж
от паметта
може да се
стигне до затруднения
в
бързодействието
на кеш-паметта.
Например,
нека
процесорът
изпълнява програмен
цикъл, който
започва с две
команди за
зареждане, които
прочитат
елементи от
два масива.
Всеки път при
изпълнение
на цикъла се
зарежда следващият
елемент от
масива. Ако
се предположи,
че размерът
на кеш-блока
е 16 байта и елементите
на масива са
от формат 4
байта, то
всяка
операция за
зареждане ще
причинява
несполучливо
обръщение,
веднъж на
всеки 4
завъртания
по цикъла.
Ако се случи
и двата
масива да
започват от
границата на
кеш-блока (т.е.
от адрес
кратен на 16),
тогава ще се
получават по
две
несполучливи
обръщения в
една и съща
итерация,
последвани
от три безпроблемни
итерации и
т.н.
Когато
първото
зареждане не
успее в
кеш-паметта,
обработката
продължава,
докато второто
зареждане не
успее. В този
момент обработката
се спира,
докато не се
удовлетвори първото
зареждане.
Това
ще причини
намаляване
на
производителността
в две
определени
насоки, които
съответствуват
на двете
различни
подобрения в
организацията
на
кеш-паметта и
централния
процесор,
описани
по-горе.
Първият
източник на
загуба в
работните характеристики
се дължи на
факта, че
командите,
които пристигат
след второто
зареждане, не
могат да се
изпълнят,
докато не
завърши
първото зареждане.
Тези
команди биха
могли да се
изпълнят по време
на
обработването
на
несполучливото
обръщение за
второто
зареждане.
Вторият
източник на
загуба се
дължи на
факта, че
първото
зареждане
трябва да
изчаква не само
да бъде
извлечена
първата
стойност, но също
и останалата
част от
кеш-блока,
съдържаща
първата
стойност,
която трябва
да се прочете
от основната
памет. Ако
несполучливите
обръщения се
случваха в
различни
итерации,
това
допълнително
закъснение
никога
нямаше да се
получи.
Този
проблем,
който може да
се нарече задръстване
на
кеш-паметта,
може да се
разреши чрез
поставяне на
фиктивна
(празна)
променлива
между
масивите, така
че те да
бъдат
принудени да
се
разположат от
различни
начални
точки в
кеш-блоковете.
Следва да се
обърне
внимание на
това, че задръстването
на кеша не се
влияе от
степента на
неговата
асоциативност.
Означава
ли това, че
схемното
поддържане на
зареждания,
чакащи
обработка, е
лоша идея? Не.
В повечето
случаи е
малко
вероятно
задръстването
да бъде
значително.
Дори когато
е, работните характеристики
не са по-лоши,
отколкото, ако
съвременните
хардуерни
приспособления
бъдат
пропуснати,
освен ако те
затрудняват
процесора
толкова
много, че да
се увеличи времето
за един
цикъл. Това
наистина ще
означава, че
е въведен
допълнителен
източник на
промяна и
работните
характеристики
на програмата
ще са трудно
предсказуеми.
Съществуват
много
параметри в
структурата
и организацията
на
управлението
на
кеш-паметта и
всеки от тях
се намесва по
различен
начин в
работата й.
Това са: обем
на
кеш-рамката,
дължина на
кеш-блока,
степен на
асоциативност,
физическо
или
виртуално
адресиране и
степен на
асинхронност
(т.е. брой на
чакащите
обработка
несполучливи
обръщения).
Обикновено
потребителят
има слаб
контрол върху
тези
параметри.
Ето защо те
трябва да се
знаят и
отчитат,
когато се
избира или
оценява една
машина.
Резултатите
от тестовете
за
бързодействие
при
определен
процесор и кеш
конфигурация
могат да се
променят
съществено,
когато
същият
процесор се
комбинира с
друга кеш
конфигурация.
Разглеждайки
само
кеш-паметта
при еднакви
останали
елементи,
по-високата
степен на асоциативност
е за
предпочитане.
Кеш-паметите
с директно
съответствие
(с еднократна
асоциация) са
особено податливи
на
конфликтни
проблеми.
Кеш-памети с
виртуално
адресиране
поддържат
сравнително
по-постоянни
работни
характеристики,
а кеш-памети
с физическо
адресиране са
за
предпочитане
в среди,
където
превключването
на контекста
е по-често
събитие.
Способността
на
програмиста
да усеща кеш-паметта,
може да му
помогне да
избягва капаните,
водещи към
намалено
бързодействие
на
програмите.
Ако
проектирате
или настройвате
приложение,
работещо
интензивно с
централния
процесор,
стремете се
да подобрите
местоположението
на данните и
да избегнете
достъпа до поредица
от адреси в
паметта,
които са
разположени
със стъпка
кратна на
големи
степени на
двойката.
Следващият
раздел е:
6.4.6
Канални
режими за
работа на
основната
памет