К. Касперски - Техника оптимизации программ, Эффективное использование памяти (1127752), страница 50
Текст из файла (страница 50)
номер строки и номер столбца), а сигнал %Е должен быть сброшен (переведен в высокое состояние, соответствующее операции чтения ячейки). Уровень сигнала ОЕ (Ощрш ЕпаЫе — разрешение выхода) нс играет никакой роли, т. к. на выходе пока ничего не содержится, точнее выходные линии находятся в так назсяваемом высоко импедансном состоянии (Н1й)з (пзрес)апсе). СпУстЯ некотоРое вРемЯ (глав„„, А„к ), опРеделЯемое быстРодействием управляющей логики и быстротечностью перехолных процессов в инверторах, на линиях выхода появляются долгожданные данные, которые вплоть до окончания рабочего цикла (гп,,к~,.) могут быть непосрелственно считаны. Обычно время лоступа к ячейке статической памяти не превышает ! — 2 нс, а зачастую бывает и меньше того! Цикл записи Цикл записи происхолит в обратном порядке.
Сначала мы выставляем на шину адрес записываемой ячейки (см. рис. 3.8) и одновременно с этим устанавливаем сигнал %Е (переводим в низкое состояние). Затем, дождавшись, когда наш адрес деколируется, усилится и поступит на соответствующие битовые линии, устанавливаем сигнал СЯ, "приказывая" микросхеме подать сигнал высокого уровня на требуемую линию толч. Ключ, удерживающий триггер, откроется и в зависимости от состоянии Ыг-линии, триггер переключится в то или иное состояние.
Типы статической памяти Существует как минимум три типа статической памяти: асинхронная (только что рассмотренная выше), синхроссгсая и конвейерная. Все они практически ничем не отличаются от соответствующих им типов динамической памяти (слс. розд. Устройство и принципы срункцссонировпнсся оперативной палсяспи' глссвы г), поэтому во избежание никому не нужного повторения далее приведено лишь краткое их описание. Асинхронная статическая память Асинхронная статическая память работает независимо от контроллера и потому контроллер не может быть уверен, что окончание цикла обмена совпа- Глава 3 252 дет с началом очередного тактового импульса.
В результате, цикл обмена удлиняется по крайней мере на один такт, снижая тем самым эффективную производительность. "Благодаря" последнему обстоятельству в настояшее время асинхронная память практически нигде не применяется (последними компьютерами, на которых она еше использовалась в качестве каша второго уровня, стали машины, построенные на базе процессора !пге1 80386). Синхронная статическая память Синхронная статическая память выполняет все операции одновременно с тактовыми сигналами, в результате чего время доступа к ячейке укладывается в один-единственный такт.
Именно на синхронной статической памяти реализуется кэш первого уровня современных процессоров. Конвейерная статическая память Конвейерная статическая память представляет собой синхронную статическую память, оснащенную специальными "ключами", удерживаюшими линии данных, что позволяет читать (записывать) содержимое одной ячейки параллельно с передачей адреса другой.
Также конвейерная память может обрабатывать несколько смежных ячеек за один рабочий цикл. Достаточно передать лишь адрес первой ячейки пакета, а адреса остальных микросхема вычислит самостоятельно, — только успевай подавать (забирать) записываемые (считываемые) данные! За счет большей аппаратной сложности конвейерной памяти время доступа к первой ячейке пакета увеличивается на один такт, однако это практически не снижает производительности, т. к. все последующие ячейки пакета обрабатываются без задержек.
Конвейерная статическая память используется в частности в каше второго уровня микропроцессоров Репг(цпз-!1, и ее формула (см. разд. "Формула памяти" главы 2) выглядит так; 2-1-1-1. Кэш — принципы функционирования Краткое описание архитектуры кэш-подсистемы, включенное в настоящую книгу, не претендует на исчерпываюшее изложение материала и ориентировано в первую очередь на неподготовленных программистов, помогая им разобраться с устройством кэш-памяти хотя бы в обших чертах.
Тем не менее, определенную ценность этот раздел представляет и для профессионалов, позволяя им освежить свои знания и, возможно, даже восполнить некоторые пробелы и/или "осветить темные" места документации. Несмотря на то что приведенного здесь материла для грамотной работы с кэш-памятью более чем достаточно, автор настоятельно рекомендует не Кэш пренебрегать и чтением технической документации по процессорам, распространяемой их производителями, поскольку там содержится множество интереснейших сведений, не включенных в данную книгу по тем или иным соображениям (ну хотя бы уже потому, что нельзя объять необъятное и это все-таки руководство по оптимизации, а не энциклопедия компьютерного "железа").
Истоки Итак, динамическая оперативная память относительно дешева, но по сегодняшним меркам недостаточно производительна. Статическая оперативная память на всех, достигнутых ныне частотах, имеет скорость доступа в один такт, но стоит чрезвычайно дорого и потому не может использоваться в качестве основной оперативной памяти ПК. Так может, хотя бы часть памяти реализовать на БРАМ? Знаете, а это мысль! Ведь что по сути представляет собой оперативная память? Правильно — временное хранилище данных, загруженных с внешней, так называемой, дисковой памяти. Диски слишком медленны и интенсивная работа с ними крайне непроизводительна.
Поэтому, разместив многократно используемые данные в оперативной памяти, мы резко сокращаем время доступа к ним, а значит — и время их обработки. На первый взгляд, выигрыш в производительности достигается в тех, и только в тех случаях, когда загруженные данные используются многократно. А вот и нет! Допустим, нам потребовалось перекодировать содержимое некоторого файла. Поскольку к каждому байту обращение происходит лишь однократно, какой смысл загружать его в оперативную память? Тем не менее, смысл все-таки есть — дисковод в силу своих конструктивных особенностей просто "не хочет" считывать один-единственный байт и как минимум требует обработать весь сектор целиком.
А раз так, то прочитанный сектор надо где-то хранить. К тому же, обмен данными можно значительно ускорить, т. е. обрабатывать не один, а сразу несколько секторов за раз. В этом случае дисководу не придется тратить время на позиционирование головки при обращении к каждому сектору. Наконец, хранение данных в оперативной памяти позволяет отложить их немедленную запись до тех времен, пока это не будет "удобно" дисководу. Таким образом, вовсе не обязательно всю оперативную память реализовывать на дирогостоящнх микросхемах ЯРАМ Даже небольшое (в процентном соотношении) количество статической памяти при грамотном с ней обращении значительно увеличивает производительность системы. Итак, с памятью мы разобрались.
Теперь поговорим о способах ее адресации. Если бы этот кусочек "быстрой" памяти адресовался бы непосредственно, т. е. был бы доступен программисту как и все остальные ресурсы Глава 3 254 компьютера, то проектирование программ ощутимо усложнилось бы и, что егце хуже, привело к полной потере переносимости, поскольку такая тактика привязывает программиста к особенностям реализации конкретной аппаратной архитектуры. Поэтому конструкторы решили сделать "быструю" память невидимой и прозрачной для программиста.
Так родился кэш. Цели и задачи кэш-памяти Кза (называемый также сверхолеративной памятью) представляет собой высокоскоростное запоминающее устройство небольшой емкости для временного хранения данных, значительно более быстродействующее, чем основная память, но, в отличие от оперативной памяти, неадресуемое и непосредственно "невидимое" для программиста. В задачи кэша входит: О обеспечение быстрого доступа к интенсивно используемым данным; О согласование интерфейсов процессора и контроллера памяти; О упреждающая загрузка данных; О отложенная запись данных.
Обеспечение быстрого доступа к интенсивно используемым данным Архитектурно кэш-память расположена между процессором и основной оперативной памятью (рис. 3.9) и охватывает все адресное пространство (реже ее часть). ш-память Рис. ЗЛН Расположение кеша в иерархии оперативной памяти Перехватывая запросы к основной памяти, кэш-контроллер "смотрит": есть ли действительиал ("валиднан" от англ. яабд) копия затребованных данных в кэше. Если такая копия там действительно присугствует, т. е. произошло так называемое кэш-попадание (сасне йй), то данные наскоро извлекаются из сверхоперативной памяти. В противном случае говорят о промахе — (сасйе тцз), и тогда запрос данных переадресуется к основной оперативной памяти.
Для достижения наивысшей производительности кэш-промахи должны происходить как можно реже (а в идеале — не происходить вообще). Учитывая, что емкость сверхоперативной памяти намного меньше емкости основной оперативной памяти, добиться этого не так-то просто! Поэтому в служебные обязанности кэш-контроллера в первую очередь входит накопление в сверхоперативной памяти действительно нужных данных и своевременное удаление оттуда всякого "мусора", т. е. данных, которые более не понадобятся.
Поскольку кэш-контроллер не имеет абсолютно никакого представления о назначении обрабатываемых данных„то эта задача требует "не хилого" искусственного интеллекта, Но, увы, кзш-контроллеры персональных процессоров интеллектом не обременены и слепо действуют по одному из нескольких шаблонов, называемых стратегитии кэширования. Стратегия помещения данных в кэш-память представляет собой алгоритм, определяюшии: стоит ли помешать копию запрошенных данных в сверхоперативную память или нет? Процессоры класса!п[е( Репгшщ (и совместимые с ними процессоры АМЕ!), не мудрствуя лукаво, помешают в кзш все данные, к которым хотя бы однократно происходит обращение. Поскольку мы не можем сохранить в каше содержимое всей оперативной памяти и рано или поздно кэш заполняется "по самую макушку" (а с такой стратегией он заполняется скорее рано, чем поздно), настанет время, когда для помещения новой порции данных нам придется в спешном порядке выкинуть из каша что-нибудь ненужное, чтобы освобождать для них место.
(Помните, как говорил кот Матроскин: "Чтобы продать что-нибудь ненужное, надо сначала кутсть что-нибудь ненужное".) Поиском вот таких наименее нужных данных и занимается стратегия заме- шенин. Можно принимать решение, основываясь на количестве обращений к кажлой порции данных (частотный анализ), можно — основываясь на времени последнего обращения, выбрав ту, к которой дольше всего не обращались (алгоритм ЬК() — Ьеам Кесепг!у ()ьег)), можно — основываясь на времени загрузки из основной памяти, вытеснив ту, которая была загружена раньше всех (алгоритм Р1РΠ— Р!гтп 1прп! Р!гм Ошрш), а можно просто подкинуть монетку (гапдоии е-алгоритм) — на кого судьба ляжет, — ту и вытеснять (кстати, именно такая стратегия замещения использовалась в процессорах АМО К5).