В.Д. Валединский - Краткий конспект курса лекций «Работа на ЭВМ и программирование» (1119512), страница 16
Текст из файла (страница 16)
При увеличении количества кэша растет цена (причем заметнобыстрее, чем его количество) и сильно возрастает тепловая мощность системы в целом,так что если разместить кэш и CPU близко друг к другу, то охладить такую системубудет крайне затруднительно; если же разнести кэш и процессор на значительноерасстояние – возникнут большие проблемы с обменом данными между ними (на короткиерасстояния обмениваться информацией много проще).Лекции по ЭВМ. Конспект. Лектор В.Д. Валединский.Группа 208, 3 семестр, 2002 год53Итак, кэш-памяти мало и ее надо как-то эффективно использовать.
Для этого кэшпамять каким-то образом сопоставляют основной памяти. Если процессору потребуетсяобратиться к данным в памяти, то он вначале проверит – нет ли запрашиваемых данных вкэше – и если есть, то возьмет их из кэша. При этом встает вопрос – каким образомпроверять, какой адрес памяти соответствует элементу кэша. Для этого используетсянесколько основных отображений кэша на основную память1. Прямое отображение.
Вся память делится на страницы размером с кэш (кстраничной организации виртуальной памяти это отношения не имеет). При этом длякаждого элемента кэша записывается номер страницы в памяти, где он лежит, а смещениеэлемента от начала страницы полагается равным смещению от начала кэша.012345678901234567890123456789кэш01234567890123456789ОЗУВ этом примере кэш имеет размер 10 элементов, память – 40 элементов (что заэлементы – см. чуть дальше) и разбита на 4 страницы.
Элементу 0 в кэш-памятисоответствует нулевой элемент нулевой страницы, элементу 1 – первый элемент второйтаблицы (физический адрес получается 2*10+1=21 – смещение страницы от начала памятиплюс смещение элемента от начала страницы), элементу 2 – второй элемент первойстраницы и т.д.Такой способ организации кэша имеет то преимущество, что затраты на хранениеадресов страниц памяти минимальны (по сравнению с хранением полных адресов), апроверка на наличие запрошенного элемента в кэш-памяти очень проста (здесь необходимосделать маленькое лирическое отступление: всюду, где речь заходит о страницах,подразумевается, что размер страницы – степень двойки, а номер страницы получаетсяиз полного адреса простым «проведением границы» в двоичной записи адреса: началоадреса – номер страницы, окончание – смещение от ее начала, в частности, размер кэшаобязан быть степенью двойки, почему у Athlon кэш 384kb – см.
далее) – по запрошенномуадресу выделяем смещение и номер страницы, смотрим в кэш-памяти по тому же смещениюи проверяем – совпадают ли номера страниц запрошенного элемента и лежащего в кэше.Столь же просты стратегии чтения/записи элементов в целом. Если процессору нужнообратиться по адресу памяти x, то он вначале проверяет, не лежит ли уже элемент с такимадресом в кэше. Если лежит – считывает данные из кэша. Если нет – то считывает данные изпамяти и перезаписывает их в кэш (возможно, на место уже лежавших здесь данных). Ксожалению, в такой простоте кроется и главный недостаток такого отображения – а что,если нам надо часто обращаться к элементам памяти, лежащим по одинаковым смещениямот начала страниц памяти? Тогда эти данные будут постоянно заменять друг друга в кэше ивыигрыш от него будет незначительным – все равно большая часть обращений будет коперативной памяти.
Другая ситуация – когда часть кэш-памяти просто не используется изза того, что нет данных, лежащих в памяти по таким смещениям. К счастью, такое вреальной жизни бывает редко – обычно обрабатываемые процессором данные лежатдостаточно «компактно» и в кэш-памяти распределяются равномерно.Все, о чем мы сейчас говорили, касалось только чтения данных. Что делать, когдапроцессору требуется наоборот, записать данные? Здесь возможны 2 стратегии – перваязаключается в том, чтобы сразу обновлять данные в ОЗУ, куда был запрос и, еслизапрошенный адрес лежал в кэше, еще обновлять и кэш. Способ никак не используетпреимуществ кэш-памяти, зато очень прост. Второй вариант – при попытке записи данных впамять, смотреть, есть ли они в кэше.
Если есть – то обновлять только кэш, в память данныепока не сохранять (отложенная запись), если нет – записать данные в кэш, в память, опятьже, ничего не сохранять. При этом для всех элементов кэша нужно вести специальныйЛекции по ЭВМ. Конспект. Лектор В.Д. Валединский.Группа 208, 3 семестр, 2002 год54признак – сохранено ли значение из кэша в памяти, или это значение требуется обновить.При попытке заменить элемент кэша на другой если элемент требуется обновить в памяти,то вначале будет произведена эта операция, и лишь затем элемент будет перезаписан.
Крометого, CPU при таком подходе может обновлять данные в ОЗУ «самостоятельно», в то время,пока к ОЗУ нет обращений выполняемой программы, и память все равно простаивает.Задержки программы при записи в память при отложенной записи окажутся минимальными.Методика отложенной записи может применяться во всех 3х рассматриваемых здесьотображениях.2. Ассоциативное отображениеДругой подход состоит в том, чтобы не делить память на страницы, а для каждогоэлемента кэша хранить полный адрес его в памяти.
Такой способ лишен всех недостатковпрямого отображения – кэш может использоваться на 100%, нет проблем с конфликтамиадресов, но ассоциативный кэш более сложен и дорог по сравнению с прямым (например,поиск адреса в кэше превращается в довольно сложную задачу). В остальном работапроходит так же, как и с прямым отображением – при любом обращении к памятизапрошенные/записанные данные окажутся в кэше. При этом изменяется только стратегиязагрузки данных в кэш – ведь теперь все элементы равноценны и неясно, на место какогоэлемента класть новый элемент. Здесь применяют две стратегии – первая состоит в том,чтобы складывать данные в кэш, «двигаясь по кругу» - вначале по смещению 0, затем – по 1,затем – по 2, и так далее до конца кэша, дойдя до конца – возвращаемся к началу и т.д.Вторая – в том, чтобы класть элемент на случайно выбранное место.
Обе стратегииосновываются на том, что если мы и заместим «нужный» элемент, то только один раз,повторного замещения происходить уже не будет (в среднем, конечно – и здесь будутситуации, когда подряд будут замещаться нужные элементы, хотя и реже, чем в прямомотображении) а элемент скоро будет возвращен в кэш (т.е. в кэше все время будутоказываться наиболее часто используемые элементы в памяти).Несмотря на все сложности, ассоциативный кэш работает быстрее, поэтомусовременные процессоры (например, от AMD, по крайней мере, в статье о K8 (Hammer)упоминалось, что эти процессоры будут использовать полностью ассоциативный кэш)используют полностью ассоциативную кэш-памятьАльтернативный способ – частично ассоциативная память, своеобразный гибрид обоихсхем.
При ней кэш делится на небольшие участки, состоящие из нескольких элементовкэша, память – на страницы размера, равного размеру элемента кэша умноженному на числоучастков в кэше. Для каждого элемента кэша указывается номер страницы, в которой онлежит, а смещение элемента от начала страницы берется таким же, как смещение участка, вкотором он лежит, от начала кэша.
Получается, вроде бы обычное прямое отображение, нокэш может содержать несколько элементов с одинаковым смещением.Лекции по ЭВМ. Конспект. Лектор В.Д. Валединский.Группа 208, 3 семестр, 2002 год55памятькэшстр 2данныестр 0данныесмещение 0стр 1данныесмещение 1стр 0данныестр 3данные012012012012смещение 2И напоследок – что же является элементами кэша. Поскольку на каждый элемент кэшаприходятся «накладные расходы» по запоминанию его адреса, то эти элементы довольновелики, чтобы эти расходы были незначительны по сравнению с объемом кэша. Всовременных процессорах элементами кэша являются т.н.
строки – блоки памяти по 32байта (вспоминаем: любая страница, пусть даже и элемент кэша для удобства работыимеет размер – степень двойки, это позволяет делить адреса просто разделяя первыенесколько бит и последние – в данном случае, 27 первых бит адреса задают адрес строки,5 последних – смещение от начала строки) и при обращении к какому-то адресу вначалевыделяется адрес строки и смещение от начала строки, для адреса строки применяются всеописанные выше операции (поиск элемента в кэше, его загрузка в кэш и т.д.), а затем, когдаэлемент в кэш получен, запрошенные данные выделяются из строки по смещению.3.3. Основные принципы работы операционной системыГлавная задача операционной системы (далее – ОС) – обеспечение взаимодействияпрограммного обеспечения (ПО) с внешними устройствами.
При этом ПО может свободнообратиться к любому из устройств, подключенных к общей шине. Но что делать, еслиодному из устройств требуется что-то сообщить программе? Для этих целей используютмеханизм прерываний.Если какому-то из устройств требуется сообщить о произошедшем в нем событии, тоэто устройство вначале обращается к своему контроллеру по своей шине. Как оно это делает– зависит от самой шины.
Но контроллер уже «стандартизован» - при поступлении на негосигнала от устройства он выставляет у себя специальный флаг готовности, который можетзатем проверить любое устройство, подключенное к общей шине, после чего посылает наспециальное устройство – контроллер прерываний специальный сигнал запроса прерыванияIRQn (Interrupt ReQuest). Контроллер в свою очередь решает, обработать прерываниенемедленно или отложить обработку (если в данный момент обрабатывается прерывание сбольшим приоритетом).
Затем контроллер спрашивает процессор, может ли он обработатьпрерывание. Если процессор обработать прерывание может, то он запрашивает уконтроллера номер вектора прерывания. Вектор прерывания – просто адрес в памятиспециальной программы – обработчика прерывания, задача которого – отреагировать напроизошедшее внешнее событие (например, если поступило прерывание от клавиатуры –прочитать из нее код нажатой клавиши, записать его в системный буфер ОС, откуда егоЛекции по ЭВМ. Конспект.