|
Чтобы не потекли мозги.
Тонкости разгона памяти
Дмитрий Румянцев
themechanics@mail.ru

Не всякому такое счастье. Да, не всякому такое счастье выпадает в жизни -
щелкать как орехи тексты, нафаршированные подобными, например, фразами: "Можно
найти как и очень быстрые DDR400-модули, работающие с таймингами 2-2-2-5 (CAS
Latency - RAS# to CAS# Delay - RAS# Precharge - Active to Precharge Delay), так
и модули с гораздо худшими характеристиками. Большое число представленных на
рынке модулей DDR400 требует использования CL 2,5, однако и это не самый плохой
вариант". Среднестатистический владелец компьютера, натыкаясь на нечто подобное,
думает: "Да-а, наверное, требование использовать CL 2,5 - это не самый плохой
вариант. Однако что, черт возьми, вся эта тарабарщина обозначает?" Дабы со всеми
этими тонкостями разобраться, понадобится не одна большая статья; та, которую вы
сейчас читаете, - первая в цикле о тонкостях разгона памяти.
Конечно, асы оверклокинга вряд ли найдут в статьях что-то новое для себя, так
что совершенно спокойно могут обратить свое дорогостоящее внимание на что-нибудь
более познавательное. Кстати, когда я был очень маленьким, то после просмотра в
первый раз фильма "Небесный тихоход" у меня сложилось впечатление, что ас - это
марка какого-нибудь мощного истребителя или штурмовика. И лишь значительно
позднее я выяснил, что асы - это боги древних скандинавов, а выражение "он в
своем деле - ас" следует понимать как "он в своем деле подобен богам". Так что
тому, кто в хлопотном деле оверклокинга подобен богам, читать эти статьи нет
никакого резона. Те же, кто пока еще богам в этом деле не подобен, возможно,
найдут пару достойных своего внимания фактов.
Чтобы окончательно выяснить, читать или не читать, предлагаю простенький
тестовый вопрос: что такое SDRAM? Если вы считаете, что это SRAM, скрещенная с
DRAM, то вам, вне всякого сомнения, имеет смысл почитать эту статью. Если вы так
не считаете, то вот вам вопросик посложнее: данные на магнитном носителе
записываются всего один раз и не требуют регенерации в силу свойств
ферромагнетиков, за счет чего в модулях SRAM обходятся без регенерации данных,
тогда как в DRAM без этого ну никак? Ну как? Если есть затруднения с ответом,
давайте разбираться вместе. Начнем, как и положено, с самых азов. SRAM и
DRAM С очень давних пор я привык к мысли, что основу современных
компьютеров составляют триггеры (как-то так удачно вдолбили в институте мне эту
мысль в голову). И лишь сравнительно недавно я выяснил, что триггеры в
современных PC-подобных монстрах применяются очень ограниченно. "Как же так? -
может воскликнуть иной читатель. - Но ведь без триггеров невозможно обойтись при
строительстве оперативной памяти!" Именно этот вопрос я задал себе и, дабы
развеять туман в голове, вынул из гнезда системной платы один модуль памяти,
выпаял одну из микросхем и, продольно разделив ее пополам, стал изучать под
микроскопом. И что же? Никаких триггеров я не обнаружил. Вот облом - только
"микруху" зря испортил!
Ну ладно, пошутил (ничего не могу с собой поделать, иной раз меня так и
распирает - выдать в эфир какую-нибудь плоскую шутку). Разумеется, если бы мне
пришла в голову такая странная мысль - изучать под микроскопом чип памяти, то
ничего бы я такого особенного не увидел, ибо размер элементов очень уж невелик.
Слышали, наверное, фразу "0,15-микронная технология" (или еще какую-нибудь в
этом роде)? Означает она, что размер каждого элемента на кристалле при такой
технологии 0,15 микрон. Один микрон - это одна миллионная метра (10-6). Стало
быть, размер какого-нибудь транзистора на кристалле составляет 0,15 x 10-6
метра. Да его только в электронный микроскоп и разглядишь, а у меня дома не то
что электронного микроскопа, даже обыкновенной лупы нет.
Словом, несмотря на то, что дух естествоиспытателя требовал непосредственных
экспериментов, пришлось поискать авторитетной информации. Для начала я заглянул
в первоисточники - на веб-сайт Intel. Не скрою, на этот раз сайт меня несколько
разочаровал. Нет, вообще-то, все красиво, есть целый раздел, где детально, с
красочными картинками рассказывается о технологическом процессе производства
процессоров, есть страницы о работе транзисторов (непонятно, правда, зачем такие
разделы на портале для разработчиков и дилеров).

Оперативная память, собранная на триггерах, называется статической памятью с
произвольным доступом, или попросту SRAM (Static RAM). Но вот слова
"триггер" я нигде не встретил. Даже странно. Во всех пассажах, где речь, по
идее, должна идти о триггерах, говорится о каких-то туманных группах
транзисторов.
"Ну ладно, нет, так нет", - сказал я себе и принялся листать толстенные
книжки. И, что характерно, нигде ничего нет. Такое ощущение, что по поводу этого
вопроса то ли всем давно и так все известно и только я один прошел мимо кассы,
то ли всем фиолетово. А меня заело, и обратился я к трудам старины Таненбаума:
уж если Таненбаум не поможет, то и никто не поможет! Старина Таненбаум не подвел
- молодчина! И вот что выяснилось. Основу аппаратного обеспечения компьютера,
на которой строятся все цифровые электронные устройства, составляют так
называемые вентили. Самый простейший вентиль - инвертор, который состоит всего
из одного транзистора. Его называют также вентилем НЕ за то, что если подать на
его вход сигнал, соответствующий 1, то на выходе будет 0 (логическое отрицание).
Есть еще вентиль НЕ-И и вентиль НЕ-ИЛИ; каждый собирается из двух транзисторов.
Вентиль НЕ-И работает следующим образом: если на оба его входа подается высокое
напряжение (соответствует 1), то на выходе будет низкое напряжение (0); если на
один из входов подается 1, а на второй 0, то на выходе будет 1. Вентиль НЕ-ИЛИ
работает сходным образом, только на его выходе высокое напряжение (1) будет
только тогда, когда на оба входа подано низкое напряжение (0). Если к выходу
вентиля НЕ-И и вентиля НЕ-ИЛИ подсоединить вентиль НЕ, то в результате будут
получены, соответственно, вентиль И и вентиль ИЛИ. А имея вентили НЕ, И и ИЛИ,
можно создавать какие угодно аппаратные схемы для реализации булевой алгебры
(так, собственно, и поступают в узлах, наиболее критичных ко времени выполнения,
- например, в АЛУ процессора). Теоретически считается, что сигнал на выходе
вентиля изменяется сразу же, как только меняется сигнал на входе, но реально,
конечно же, происходит определенная задержка, которая называется задержкой
вентиля, - время прохождения сигнала через вентиль, которое равняется от 1 до 10
нс.

Память на конденсаторах получила весьма красивое название - динамическая
память - DRAM (Dynamic RAM). Все вентили вытравляются (причем при
многократном травлении) на пластинах кремния. Входы и выходы вентилей
подсоединяются к специальным металлическим выводам, которые расположены по обе
стороны от пластины кремния, а все вместе запаковывается в специальный кожух.
Полученная таким образом микросхема официально именуется двурядным корпусом -
Dual Inline Package, или попросту DIP. Для того чтобы изготовить простейший
триггер, необходимо по крайней мере два вентиля НЕ-ИЛИ, а более сложные
Т-триггеры (или настоящие триггеры) могут состоять из четырех и более вентилей.
Таким образом, получается, что для одного триггера требуется от четырех
транзисторов и более. Реально чаще всего используются триггеры, состоящие из
шести транзисторов. Достоинство построения памяти на триггерах заключается в
том, что достаточно на триггер послать высокий или низкий сигнал (0 или 1),
чтобы переключить его состояние, и в этом новом состоянии триггер будет
находиться бесконечно долго (до того момента, пока в цепи есть ток, разумеется).
То есть триггер хранит разряд неизменно, статично. Поэтому оперативная память,
собранная на триггерах, называется статической памятью с произвольным доступом,
или просто статической памятью - SRAM (Static RAM). Другое достоинство этой
памяти - скорость. Поскольку триггеры собраны на вентилях, а время задержки
вентиля очень мало, то и переключение состояния триггера происходит очень
быстро.
Но за все нужно платить. В данном случае эту фразу следует понимать буквально.
Во-первых, шесть транзисторов обходятся в шесть раз дороже, чем один транзистор
(математика, однако!), даже если они вытравляются по миллиону штук на одной
кремниевой подложке. Кроме того, шесть транзисторов занимают и места на этой
самой подложке больше, причем даже не в шесть раз, поскольку между
транзисторами, которые образуют триггер, должны быть вытравлены линии связи. Эти
соображения заставили изобретателей изобрести (а что еще оставалось делать
изобретателям?) более экономичную память, как по стоимости, так и по
компактности.
В более экономичной памяти для хранения разряда (бита) используют схему,
состоящую из одного конденсатора и одного транзистора (в некоторых вариациях
конденсаторов два). Такой вид памяти решает, во-первых, проблему дороговизны
(понятное дело, один кондер и один транзистор всяко разно дешевле шести
транзисторов), а во-вторых, компактности (на том месте, где в SRAM размещается
один триггер, то есть один бит, запросто можно уместить штук восемь кондеров и
транзисторов) и, стало быть, снова дешевизны, ибо кремний для подложки денег
стоит. Однако есть и свои минусы. Во-первых, память на основе конденсаторов
работает медленнее, поскольку если в SRAM изменение напряжения на входе триггера
сразу же (ну или почти сразу же) приводит к изменению его состояния, то для
того, чтобы установить в единицу бит на основе конденсатора, этот конденсатор
нужно зарядить, а для того, чтобы бит установить в 0, соответственно, разрядить.
А зарядка или разрядка конденсатора - гораздо более длительная операция, чем
переключение триггера (раз этак в 10 и более), даже если конденсатор имеет очень
и очень небольшие размеры. А как мы увидим далее, имеются и еще кое-какие
обстоятельства, замедляющие память этого типа.
Есть и второй существенный минус - конденсаторы склонны к "стеканию" заряда,
проще говоря, со временем конденсаторы разряжаются. Причем разряжаются они тем
быстрее, чем меньше их емкость (что вполне логично, ну сами подумайте, откуда
быстрее вытечет вода: из дырявой бочки или дырявой кружки?). Помню, в одном из
давних периодов моей биографии приходилось мне иметь дело с большими блоками от
хитрых радиолокационных устройств. В этих блоках, наряду с разными мирными
деталями типа диодов и транзисторов (размером с наручные часы), были и
конденсаторы размером чуть меньше кассеты VHS. Так вот, даже после отключения
блока и спустя несколько дней можно было получить неслабый удар током от этих
конденсаторов - так долго они разряжались, в связи с чем приходилось перед
работой их принудительно разряжать, замыкая контакты отверткой и вызывая сноп
искр.
Конденсаторы в микросхемах нет надобности разряжать отверткой, они и так
"стекут", причем очень быстро - всего за какие-нибудь 15 микросекунд. В связи с
этим грустным обстоятельством, дабы не потерять содержимое битов, эти
конденсаторы необходимо каждые 15 мкс регенерировать, чтобы восстанавливать
заряд. Регенерация, как ни странно, выполняется путем считывания заряда
(считывание заряда с конденсатора выполняется через транзистор). Контроллер
памяти каждые 15 мкс приостанавливает все операции с памятью для регенерации ее
содержимого. Эта операция - регенерация - сами понимаете, работу с памятью также
не ускоряет.
Память на конденсаторах получила красивое название - динамическая память -
DRAM (Dynamic RAM) за то, что разряды в ней хранятся не статически, а "стекают"
динамически во времени. Таким образом, DRAM значительно дешевле SRAM, ее
плотность значительно выше, что позволяет на том же пространстве кремниевой
подложки размещать больше битов, но при этом ее быстродействие очень низкое.
SRAM, наоборот, является очень быстрой памятью, но зато и очень дорогой. В связи
с чем обычную оперативную память строят на модулях DRAM, а SRAM используется при
создании кэшей всех уровней. Декодирование адресов памяти Чтобы
понять, каким образом можно разогнать память, сперва нужно понять, как
центральный процессор выполняет операции обмена данными с памятью (чтение /
запись). Для этого, собственно, процессор имеет три шины: шину чтения / записи,
адресную шину и шину данных (на самом деле шин у процессора гораздо больше, но в
операциях с памятью принимают участие именно эти три). В зависимости от того,
читает или записывает данные, процессор посылает сигнал чтения или записи (1 или
0) по шине чтения / записи, посылает адрес нужной ячейки по адресной шине и
принимает или передает байты по шине данных. Что же происходит дальше, каким
образом контроллер памяти определяет нужную процессору ячейку памяти? Для
простоты забудем пока, что имеются кэши первого, второго, а в последних
процессорах еще и третьего уровня. И вообще, рассмотрим упрощенную схему (а то у
нас у самих точно мозги потекут). Что бы вы стали делать, если бы вам нужно
было разработать механизм произвольного доступа к ячейкам памяти? Задачка вовсе
не из тривиальных. Скажем, первый Pentium имел 32-разрядную шину адреса, иначе
говоря, для передачи адреса нужной ячейки памяти использовались 32 линии, а уже
начиная с Pentium II, ширина адресной шины увеличилась до 36 линий (у Intel
Itanium их целых 44!). Опять же, для простоты будем считать, что нет никакого
механизма дексрипторов, а те биты, которые процессор передает по шине адреса, -
это реальный адрес произвольной ячейки памяти. Наименьшей адресуемой ячейкой
памяти в PC-клонах является байт. Вот и представьте: как с помощью небольшого
количества адресных линий указать, какая из тех сотен миллионов ячеек, из
которых состоит оперативная память современного компьютера, понадобилась
центральному процессору? В современных модулях памяти каждая отдельная
микросхема DIP состоит из массива ячеек, которые ни на какие группы (байты) не
разделяются. Байты получаются за счет "сборки" соответствующих битов в восьми
отдельных DIP. Если вы пересчитаете количество DIP, смонтированных на одном
банке (модуле) памяти вашей машины, то обнаружите, что их девять. Все правильно
- восемь для битов, из которых состоят байты, и один - это так называемый бит
четности, используемый для проверки корректности содержимого ячейки (в некоторых
современных DIMM смонтировано сразу 16 микросхем; в данном случае речь идет о
сдвоенной структуре хранения байтов без контроля четности, но с этим мы еще
разберемся). Таким образом, оказывается, что контроллер памяти на основании
сигналов, посланных процессором по адресной шине (адрес), должен точно
идентифицировать не всю ячейку памяти, а только один бит в одном из чипов, а в
остальных восьми микросхемах нужно будет выбрать (или установить) те же самые
биты. При этом контроллер памяти должен учитывать, что в машине может быть
установлен не один, а несколько банков памяти. Контроллер об этом не забывает,
ибо количество банков памяти система определяет автоматически при каждой
перезагрузке. Получается, что биты адреса разбиваются на две части - номер банка
памяти и собственно адрес ячейки (или попросту идентификатор бита в микросхеме).
Каким же образом указывается нужный бит? Чтобы лучше понять этот механизм,
совершим небольшой исторический экскурс.
В допотопных компьютерах древних времен оперативная память была организована
не на транзисторах, а на магнитных сердечниках. Это устройство представляло
собой металлическую сетку. В точках, где вертикальные и горизонтальные провода
пересекались друг с другом, они скреплялись небольшими колечками из
ферромагнетика, образуя матрицу ферромагнитных колечек. Каждое такое колечко
было отдельным битом, и, чтобы установить его значение, нужно было подать
небольшое напряжение на ту "строку" и "столбец", на пересечении которых и
находилось ферромагнитное колечко. Если подавался положительный заряд, то
считалось, что данный бит устанавливается в единицу, отрицательный - в ноль.
Современная память устроена схожим образом. Вернемся в наше время. Если взять
техническое описание выводов 168-контактных или 184-контактных модулей DIMM, то
обнаружится, что из этой кучи контактов под адрес выделено всего 14 выводов (с
учетом того, что с самого начала несколько линий DIMM разработчиками было
зарезервировано, количество адресных выводов может достигать 17, но даже при
таком "расширении" это практически в два раза уже, чем ширина адресной шины
процессора)! Как же так, ведь процессор посылает 32- или 36-битный адрес?
Во-первых, несколько линий, как уже было сказано, используется под номер банка
памяти. Если на системной плате имеются 168-контактные разъемы DIMM, то
процессор на номер банка памяти выделяет два бита, если 184-контактные - три. А
остальные? Остальные передаются двумя группами. Все ячейки в рамках одного
чипа располагаются в виде матрицы, в которой количество строк и столбцов равно
друг другу (речь идет о квадратной матрице). Все выводы в чипе DIP делятся на
четыре группы: выводы данных; управляющие выводы; выводы питания и адресные
выводы. Поскольку стандартный чип запоминает только один бит, то вывод данных,
собственно, только один; выводов питания два (один для положительного
напряжения, второй - земля). Управляющие выводы мы рассмотрим чуть ниже.
Поскольку в одном чипе следует получить значение (или изменить) только одной
ячейки, то для ее идентификации нужно указать номер строки и номер столбца, на
пересечении которых эта ячейка располагается.
Для работы с чипами DRAM используется схема адресации с мультиплексором,
когда реальный адрес разбит на две адресные группы - линии адреса строки и линии
адреса столбца. При обращении центрального процессора к какой-то ячейке тот
адрес, который он посылает по адресной шине, состоит из трех частей: номер банка
памяти, адрес строки и адрес столбца нужного бита. Для того чтобы оповестить чип
о том, какая именно группа сейчас поступила на его адресные выводы, в микросхеме
предусмотрены еще два дополнительных вывода - строб (сигнал синхронизации)
адреса строки (Row Address Strobe - RAS) и строб адреса столбца (Column Address
Strobe - CAS). Таким образом, логика системной платы (без которой ничто не
смогло бы правильно работать) оказывает поддержку центральному процессору при
его обращении к оперативной памяти тем, что вычленяет из посланного им адреса
номер банка памяти (и дальнейшая работа происходит именно с указанным банком
памяти), а также последовательно помещает на адресные выводы всех чипов банка
памяти сначала группу адреса строки и посылает сигнал по линии RAS, а затем
группу адреса столбца и посылает сигнал по линии CAS. После этого все чипы,
смонтированные в одном банке памяти, точно находят нужные биты. Схемы
синхронизации Напоследок кратко разберем, что обозначают загадочные
четверки цифр, именуемые таймингами. Как мы уже знаем, выборка данных
осуществляется так: сначала вычисляется строка, затем столбец, и уже после этого
пересылаются данные. Начальная установка строки и столбца занимает время,
которое называется временем задержки, кроме того, требуется некоторое время,
чтобы данные передать. Это время называется временем цикла передачи или просто
временем цикла. Общий цикл выглядит следующим образом: 1) на адресные выводы
помещается группа адреса строки; 2) по линии RAS посылается сигнал; 3) на
адресные выводы помещается группа адреса столбца; 4) по линии CAS посылается
сигнал; 5) на выводе чтения / записи 0 или 1 уведомляет о том, что нужно либо с
линии данных получить значение и установить его в только что выявленную ячейку,
либо значение этой ячейки передать на линию данных. Причем одновременно так
работают все микросхемы в рамках одного банка памяти. Поскольку процессор
считывает (записывает) не один, а сразу несколько смежных байт, то после того,
как установлен номер строки и столбца в матрице для первого байта, следующий
байт может быть прочитан в пределах строки, то есть для его чтения достаточно
изменить только номер столбца (естественно, что это будет следующий столбец в
рамках строки матрицы). Этот режим, который был назван пакетным, стал
применяться уже начиная с процессора Intel 80486. Поскольку у процессора 80486
была 32-битная шина данных, то за один раз он мог "проглатывать" (или
"выплевывать") порции данных по четыре байта. Поэтому доступ в пакетном режиме
ограничивался четырьмя операциями, схема синхронизации которых выглядела
следующим образом: F-S-S-S, где F - время выполнения первой операции доступа
(продолжительность цикла плюс время ожидания), а S - число циклов, необходимых
для следующих операций доступа. Однако в современных модулях памяти применяется
другая схема тайминга. О ней, а также о различных видах чипов памяти и более
эффективных схемах синхронизации мы и поговорим в следующей статье. Время
апгрейдить машину? Недавно я призадумался над одним вопросом, который
раньше меня совершенно не интересовал: что заставляет людей апгрейдить свой
компьютер? Кажется, ответ очевиден: появление нового, более требовательного к
машинным ресурсам программного обеспечения, плюс усиленное чтение разного рода
тестов новых устройств. Однако насколько такой подход оправдан? В самом деле -
что за радость тратить свои кровные, наращивая память или приобретая графический
адаптер последней модели, если реально наличие нового железа можно будет
определить только с помощью специальных тестов или по более реалистичному виду
перистых облаков в какой-нибудь 3D-игре? В конечном итоге лично для себя этот
вопрос я разрешил следующим образом. Поскольку компьютер - это электронное
устройство, предназначенное для сбора, хранения, обработки и отображения
информации, то, видимо, апгрейд машины имеет смысл выполнять тогда, когда
выполнение любой из этих операций (а то и всех сразу) на старой конфигурации
начинает причинять существенное неудобство, а разгонка существующих узлов не
приводит к реальному результату. И начинать нужно, видимо, с попытки выжать из
текущей конфигурации максимум возможного. Технические подробности В
модулях DIMM наличие микросхем определяется методом последовательного поиска. В
модуле DIMM предусмотрена небольшая микросхема флэш-памяти, или EEPROM. В этой
микросхеме в специальном формате содержится описание банка памяти DIMM.
Последовательно поступающие из микросхемы данные считываются через специальные
контакты и позволяют системной плате автоматически выбирать конфигурацию,
соответствующую установленному модулю DIMM. В технической документации часто
можно увидеть обозначение линий с расположенным рядом знаком #. Этот знак
указывает, что данная линия управляется низким напряжением, то есть выполнение
указанной функции линия обеспечивает, когда на нее подано напряжение, близкое к
нулю (любое напряжение, меньшее 0,4 В), и бездействует, когда напряжение на ней
существенно выше нулевого (от 1,6 до 5 В). Таким образом, обозначение RAS#
указывает на то, что чип выберет адрес строки тогда, когда на этой линии
окажется напряжение, близкое к нулю. UP
|