3

У меня есть простой вопрос. Сегодня чипы памяти DDR имеют ширину 64 бита, а шина данных ЦП также имеет ширину 64 бита. Но память все еще организована в один байт. Итак, я хочу спросить: когда процессор выбирает какой-либо адрес памяти, он должен быть одним байтом, верно? Поскольку самая низкая часть памяти, к которой вы можете получить доступ, составляет 1 байт. Но если вы получаете 1 байт на 1 адрес, почему шина памяти имеет 8 байт?

5 ответов5

2

Быстрее передавать большие объемы данных 8 байтов за раз вместо 1. Кроме того, в любом случае нет никакого способа адресовать отдельные байты вне кэша ЦП, поскольку последние несколько битов адреса больше не имеют физических соединений (потому что они не нужны).

2

Мы называем нашу компьютерную архитектуру byte-addressable есть память рассматривается как байты. Это помогает нам извлекать 8-битные данные за раз. Но это не всегда норма, и используются другие значения ширины.

Фактически, даже если вы используете компьютер с байтовым адресом на базе Intel, к используемой памяти обычно обращаются с другой шириной (64 бита, как в вашем примере).

Это помогает в адресации большего объема данных с меньшим адресным пространством.

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


Если вы видели карту памяти DDR-RAM, вы могли бы вспомнить несколько чипов на зеленой печатной плате. Они чередуются для параллельного доступа. Это делает ваш доступ к оперативной памяти быстрее.

Перед модулем оперативной памяти находится контроллер памяти. Это предназначено для доступа к данным с более широкой битовой шириной (32, 64, 128 бит - в зависимости от конструкции).

Когда вы обращаетесь к байту из этого пространства памяти, контроллер памяти фактически получает полное "слово памяти"; здесь слово фактически является шириной этого доступа из контроллера памяти.

Это означает, что если его ширина 128 бит, вы всегда выбираете 16 байтов из адресов, кратных 16.

Итак, что теперь происходит, когда вам нужен байт по адресу 18 (= 16+2)?
Ну, вы получаете 16 байтов с адреса 16 и выбрасываете 15 из них!

Что еще интереснее, что происходит, когда вы хотите записать байт по адресу 19?
Вы берете 16 байтов с адреса 16, меняете 3-й (19-й адрес) байт, а затем записываете обратно все эти 16 байт (весело, да?).

Все это довольно много усилий. Контроллер памяти предназначен для управления этим, и параллельно выполняет несколько запросов.

Мы даже не говорим о «двухканальном» :-)


Вот ссылка из Википедии на организацию DDR SDRAM

PC3200 - это DDR SDRAM, предназначенная для работы на частоте 200 МГц с использованием чипов DDR-400
с пропускной способностью 3200 МБ / с. Как память дважды прокачана,
это означает, что эффективная тактовая частота памяти PC3200 составляет 400 МГц.

Модули PC3200 не ECC объемом 1 ГБ обычно изготавливаются с шестнадцатью чипами по 512 Мбит,
8 на каждую сторону (512 Мбит × 16 чипов) / (8 бит (на байт)) = 1024 МБ.
Отдельные микросхемы, составляющие модуль памяти объемом 1 ГБ, обычно
организован с 64 Мбит и шириной данных 8 бит для каждого чипа,
обычно выражается как 64M × 8.

Память, изготовленная таким образом, имеет низкую плотность ОЗУ и обычно будет
совместим с любой материнской платой с указанием памяти PC3200 DDR-400.

Со страницы контроллера памяти

Ширина шины - это количество параллельных линий, доступных для связи с ячейкой памяти.
Ширина шины контроллеров памяти варьируется от 8-битной в более ранних системах до 512-битной в более сложных системах и видеокартах (обычно реализуются в виде четырех 64-битных одновременных контроллеров памяти, работающих параллельно, хотя некоторые предназначены для работы в "групповом режиме" «где два 64-битных контроллера памяти могут использоваться для доступа к 128-битному устройству памяти).

1

Я говорю без особого опыта, но грубо ...

Процессоры извлекают одно слово за раз (то есть 64-разрядный процессор извлекает 8 байтов за раз). Однако при извлечении одного байта они эффективно отбрасывают остальные 7 байтов. Схема адресации памяти все еще обычно рассматривается как байты, но если вы извлекаете данные как можно быстрее, вы используете выровненные по словам адреса, то есть адреса, которые делятся на длину слова в байтах. В 64-битной системе вы будете использовать адреса 0, 8, 16, 24 и т.д.

Если вы извлекаете слово из адреса, не выровненного по словам, скажем, 5, процессор должен будет выполнить две выборки: одну для байтов 5, 6, 7 и вторую 8, 9, 10, 11, 12, поэтому потребуется в два раза длиннее

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

Вне ЦП ОЗУ никогда не сможет увидеть младшие биты адреса, ОЗУ организовано в виде слов, это модель ЦП / Программиста, которая создает иллюзию байтовой адресации.

0

В вашем примере, записывая один байт, с точки зрения слова памяти слово изменилось. Мы с вами оба знаем, что только несколько битов отличаются друг от друга, но, тем не менее, память нужно обновлять. Так что это слово записывается обратно в память - все 64 бита. Это было бы верно, независимо от того, каков минимальный адресуемый объем памяти. Когда ширина памяти составляла 8 бит, все 8 бит были бы записаны, хотя, возможно, изменился только 1 бит.

0

Из того, что я помню из моих дней ассемблера и низкоуровневой аппаратной работы, память фактически доступна в страницах. На самом деле вы никогда не получаете доступ к одному байту или даже к ширине шины ОЗУ, а скорее в блоках (я не могу дать вам точное число, особенно если оно варьируется), но цифры 4 КБ звучат очень знакомо [возможно, я думать о сегментах, хотя это 64 КБ]).

Дело в том, что адресация одного байта ужасно неэффективна, тем более что следующий адрес памяти, к которому нужно получить доступ, скорее всего, будет рядом с ним. Таким образом, когда вы обращаетесь к байту, система кэширует блок оперативной памяти (как вы думаете, для чего предназначены различные кэши ЦП?) Любые изменения, которые вы делаете, выполняются в этой кэшированной памяти, так что если вы запишете ее обратно, она сможет быстро и красиво записать блок. Байт доступен сам по себе, но из кэшированного блока; то есть процессор не извлекает ни одного байта, но возвращает только один.

Учитывая, что современные системы намного больше, я полагаю, что им нужно было бы кешировать еще больше, чтобы оптимизировать вещи (следовательно, увеличить кеш процессоров).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .