Зарегистрируйтесь, чтобы продолжить обучение

RAM и ROM Основы ЭВМ

Скорость и стабильность системы во многом определяет память. Процессор ждёт данные дольше всего, когда они лежат далеко, и почти не ждёт, когда они рядом. Кэш работает за наносекунды, RAM — за десятки наносекунд, SSD — за сотни микросекунд, сеть — за десятки микросекунд, а промах по RAM со свопом — это уже секунды. Поэтому объём и качество оперативки — базовый ресурс.

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

Решением стала синхронная DRAM (SDRAM, Synchronous Dynamic Random Access Memory). В отличие от старой асинхронной DRAM, она работает синхронно с тактовым сигналом контроллера памяти. Это значит, что обращения к ячейкам подстраиваются под ритм контроллера, команды и данные идут по расписанию, и задержки можно упорядочить и частично скрыть за счёт очередей.

Следующим шагом стала DDR — Double Data Rate SDRAM. В ней придумали передавать данные не один раз за тактовый цикл, а дважды — и на фронте (подъёме), и на спаде (спуске) сигнала. За счёт этого пропускная способность удвоилась без роста тактовой частоты. Именно поэтому DDR-память кажется «в два раза быстрее», хотя сама базовая частота не изменилась.

Отсюда и привычные обозначения вроде DDR4-3200. Эта цифра означает 3200 миллионов передач данных в секунду на каждой линии. При 64-битной (8-байтовой) шине один канал даёт около 25,6 ГБ/с. DDR5-5600 поднимает планку ещё выше — примерно до 44,8 ГБ/с.

Важно понимать, что «3200» или «5600» — это эффективная скорость. Контроллер реально работает в два раза медленнее, и именно от его частоты считают задержки в наносекундах. Поэтому оценивать память только по цифрам на наклейке неправильно: нужно учитывать и пропускную способность, и реальные задержки доступа.

Оперативная память устроена как большая таблица: строки и столбцы с ячейками, где лежат биты. Чтобы прочитать данные, контроллер делает несколько шагов. Сначала открывает строку, потом выбирает столбец, затем получает данные и в конце закрывает строку. На каждом шаге есть своя задержка. Эти задержки и называются таймингами.

Главный параметр — CAS Latency (CL). Он показывает, сколько тактов нужно подождать с момента команды «открой столбец» до появления первого бита на шине. Другие важные задержки: tRCD — время между выбором строки и выбором столбца, tRP — время на закрытие строки перед открытием новой, tRAS — минимальное время, сколько строка должна оставаться открытой. Когда на модуле написано «16-18-18-36», это значит: CL=16, tRCD=18, tRP=18, tRAS=36. Все значения даны в тактах, а длительность такта зависит от частоты контроллера, поэтому на разных поколениях одинаковые цифры означают разную задержку в наносекундах.

В практическом смысле тайминги определяют скорость получения первого байта и время переключения между строками. При случайной нагрузке задержки становятся критичными, при последовательных обращениях важнее общая пропускная способность.

В маркировках модулей легко ошибиться. Надпись «DDR4-3200» не означает, что контроллер работает на 3200 мегагерцах. Это маркетинговая «эффективная скорость передачи». Реальный такт в два раза ниже — 1600 МГц. Задержки считают именно от него. Поэтому DDR4-3200 CL16 даёт около 10 нс, а DDR5-5600 CL36 — примерно 13 нс. На бумаге «CL36» выглядит хуже «CL16», но на деле разница невелика, а более высокая пропускная способность DDR5 перекрывает проигрыш в латентности.

Эволюция DDR шла через архитектурные изменения. DDR3 работала на скоростях до 1866–2133 MT/s и имела предвыборку ×8. DDR4 сохранила предвыборку ×8, но подняла планку до 3200 MT/s и снизила напряжение до 1,2 В. DDR5 увеличила предвыборку до ×16 и разделила модуль на два независимых 32-битных субканала, что повысило параллелизм и лучше загрузило шину. Её напряжение ещё ниже — 1,1 В, при этом регулятор перенесён прямо на модуль (PMIC), что уменьшает нагрузку на плату, но удорожает память.

Каждое поколение несёт новые ограничения по совместимости. DDR3 и DDR4 физически несовместимы из-за разного ключа в слоте. DDR5 добавила свои требования: новые профили таймингов, обязательный контроллер нового поколения и более строгие параметры сигналов.

Когда появился стандарт DDR (Double Data Rate SDRAM), производители начали указывать не реальную тактовую частоту контроллера, а эффективную скорость передачи данных. Поскольку данные передаются дважды за такт (на подъёме и на спаде сигнала), то число операций как бы удваивается.

Например, если контроллер работает на 1600 МГц, то реально он делает 1,6 миллиарда тактов в секунду. Но с передачей дважды за такт это превращается в 3200 миллионов передач данных в секунду. Именно эту величину и пишут на модулях памяти — 3200 MT/s (MegaTransfers per second). Отсюда привычное обозначение «DDR4-3200».

У памяти всегда есть шина фиксированной ширины: у одного канала DDR это 64 бита = 8 байт. Значит, DDR4-3200 передаёт 3,2 миллиарда × 8 байт ≈ 25,6 ГБ/с на один канал.

У следующего поколения — DDR5-5600 — контроллер работает на 2800 МГц, но эффективная скорость удвоена до 5600 MT/s. При той же 64-битной шине это уже около 44,8 ГБ/с на канал.

Производительность памяти зависит не только от частоты. Когда ставят два модуля и включают двухканальный режим, ширина шины удваивается. На серверных платах с четырьмя каналами это масштабируется ещё сильнее: при правильной установке модулей пропускная способность растёт почти линейно.

Канал памяти — это как отдельная дорога между процессором и оперативкой. Один канал у DDR — это 64 бита шириной (8 байт). Когда в плате стоит только одна планка, работает один канал. Когда ставят вторую в правильный слот — включается второй канал, и процессор получает в два раза более широкую «дорогу». На серверных процессорах таких дорог может быть четыре, восемь и даже двенадцать. Чем больше каналов занято модулями — тем выше суммарная пропускная способность.

Дополнительный фактор — ранговость. Модуль может быть одноранговым или двухранговым, то есть содержать одну или две логические «стороны» с набором чипов. Когда есть два ранга на канал, контроллер может переключаться между ними и прятать задержки, что повышает среднюю загрузку шины. Но такая организация усложняет топологию и может ограничивать максимальные частоты.

Ранг (rank) — это «слой» чипов на модуле памяти. Модуль может быть одноранговым (x1R) или двухранговым (x2R). Двухранговый — это как будто два модуля памяти, упакованные в одну планку: там два независимых набора чипов, которые делят одну и ту же шину. Контроллер видит каждый ранг отдельно и может переключаться между ними. Это позволяет прятать задержки: пока один ранг обслуживает команду, другой готовится. За счёт этого нагрузка на шину распределяется ровнее, и общая производительность выше. Но есть минус: чем больше рангов и плотнее планка, тем тяжелее электрическая топология, и максимальная стабильная частота работы ниже.

Форм-фактор и буферизация отвечают за совместимость. В настольных ПК используются UDIMM без буферов, в ноутбуках — укороченные SO-DIMM, в серверах — RDIMM с регистром адреса/команд и LRDIMM, где буферизуются ещё и линии данных. Буферизация позволяет ставить больше чипов на модуль и набирать огромные объёмы оперативки без проблем с сигналами. Но смешивать разные типы нельзя: UDIMM не заработает в серверной плате, а RDIMM и LRDIMM не могут стоять вместе. Контроллер на старте читает SPD-чип на модуле и договаривается о таймингах и напряжениях. В десктопах можно включить профили XMP/EXPO для ускорения памяти, но серверные платы такие профили почти всегда игнорируют и работают строго по стандарту JEDEC.

Надёжность в серверах обеспечивает ECC. Типичная схема SECDED добавляет восемь проверочных бит к каждому слову в 64 бита. Это позволяет исправлять одиночные ошибки и хотя бы сигнализировать о двойных. Контроллер памяти ведёт статистику исправлений, а фоновый scrubbing регулярно перечитывает строки, чтобы не допустить накопления ошибок. Более продвинутые технологии вроде Chipkill и lockstep распределяют данные по чипам и каналам так, что система переживает отказ целого кристалла DRAM. В DDR5 появился on-die ECC, но он работает только внутри самого чипа и не заменяет полноценный системный ECC.

Совместимость модулей часто становится источником скрытых проблем. Модули разной плотности, с разной организацией чипов (x4 против x8), с разным числом рангов и даже просто с разными таймингами могут формально запуститься вместе, но работать будут не на максимуме. Контроллер памяти в таких случаях снижает частоту, поднимает задержки или, что хуже всего, оставляет редкие ошибки, проявляющиеся только под нагрузкой. Сценарий, когда один быстрый комплект смешивают с более медленным, почти всегда заканчивается тем, что вся система работает на худших параметрах. В серверах требования строже: контроллер ждёт одинакового заполнения каналов и слотов по «цветам», иначе многоканальный режим отключается.

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

Представим, у нас есть материнка с двумя каналами и набор разных планок: 4, 8 и 16 ГБ.

Если поставить только одну планку, например 16 ГБ, то вся память будет работать в одноканале. Объём хороший, но скорость ниже вдвое по сравнению с двухканалом. Это часто становится узким местом: процессор простаивает, ожидая данные.

Если поставить две одинаковые планки, например 8+8 или 16+16, то контроллер включит двухканальный режим. Каналы будут работать параллельно, и суммарная пропускная способность удвоится. Это идеальная ситуация, именно так обычно и рекомендуют собирать память.

Если взять разные модули, например 16 и 8, то контроллер разделит память. Первые 8 ГБ из каждой планки пойдут в двухканал, а «лишние» 8 ГБ от большей планки будут работать в одноканале. Такой режим называется flex mode. В итоге получится, что часть памяти быстрая, а часть медленнее, но система сама старается сначала использовать быстрый участок.

Если добавить третью планку, например 16+16+8, то две шестнадцатки образуют полный двухканал на 32 ГБ, а оставшиеся 8 ГБ встанут в одноканал. Общий объём будет 40 ГБ, но часть из него с меньшей скоростью.

Проблема в том, что при смешивании разных модулей контроллер вынужден подстраиваться под худший вариант. Если одна планка медленнее или с другими таймингами, то вся система может уйти на более низкие частоты. В худшем случае это проявляется как редкие ошибки под нагрузкой.

В серверах ситуация другая. Контроллеры в процессорах Xeon и EPYC работают сразу с несколькими каналами памяти — четыре, шесть, восемь и больше. Чтобы многоканальный режим включился, все каналы должны быть заполнены одинаковыми модулями. Требуется одинаковый объём, одинаковый тип (RDIMM или LRDIMM), одинаковая организация чипов и ранговость. Если поставить разные модули, система может не пройти инициализацию, сбросить память в одноканал или снизить частоты и тайминги.

Поэтому в серверных инструкциях всегда указывают точную схему установки: какие слоты занимать и какими модулями. Только при симметричном заполнении контроллер задействует все каналы на полной скорости.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff