Подсистема памяти на современном процессоре ограничена доступом к памяти по степени детализации и выравниванию ее размера слова; это имеет место по ряду причин.
Скорость
Современные процессоры имеют несколько уровней кэш-памяти, через которую должны извлекаться данные; поддержка однобайтовых считываний сделает пропускную способность подсистемы памяти тесно связанной с пропускной способностью исполнительного блока (иначе, связанной с процессором); все это напоминает о том, как режим PIO был превзойден DMA по многим из тех же причин в жестких дисках.
ЦП всегда читает по своему размеру слова (4 байта на 32-разрядном процессоре), поэтому, когда вы осуществляете доступ с невыровненным адресом - на процессоре, который его поддерживает - процессор будет читать несколько слов. Процессор будет читать каждое слово памяти, которое заполняет ваш запрошенный адрес. Это приводит к увеличению в 2 раза количества транзакций памяти, необходимых для доступа к запрашиваемым данным.
Из-за этого очень легко прочитать два байта медленнее, чем четыре. Например, скажем, у вас есть структура в памяти, которая выглядит следующим образом:
struct mystruct {
char c; // one byte
int i; // four bytes
short s; // two bytes
}
На 32-разрядном процессоре он, скорее всего, будет выровнен, как показано здесь:
Процессор может читать каждый из этих элементов за одну транзакцию.
Скажем, у вас есть упакованная версия структуры, возможно, из сети, в которой она была упакована для эффективности передачи; это может выглядеть примерно так:
Чтение первого байта будет таким же.
Когда вы попросите процессор выдать вам 16 бит из 0x0005, ему придется прочитать слово из 0x0004 и сдвинуть влево 1 байт, чтобы поместить его в 16-битный регистр; некоторая дополнительная работа, но большинство может справиться с этим за один цикл.
Когда вы запрашиваете 32 бита от 0x0001, вы получаете 2-кратное усиление. Процессор будет считывать из 0x0000 в регистр результатов и сдвигать влево 1 байт, затем снова считывать из 0x0004 во временный регистр, сдвигать вправо на 3 байта, а затем OR
с регистром результата.
Диапазон
Для любого данного адресного пространства, если архитектура может предполагать, что 2 LSB всегда равны 0 (например, 32-разрядные машины), тогда она может получить доступ в 4 раза больше памяти (2 сохраненных бита могут представлять 4 различных состояния), или тот же объем памяти с 2 битами для чего-то вроде флагов. Удаление 2 младших битов из адреса даст вам 4-байтовое выравнивание; также называется шагом из 4 байтов. Каждый раз, когда адрес увеличивается, он эффективно увеличивает бит 2, а не бит 0, то есть последние 2 бита всегда будут оставаться равными 00
.
Это может даже повлиять на физический дизайн системы. Если для шины адреса требуется на 2 бита меньше, на ЦП может быть на 2 контакта меньше, а на плате - 2 трассы.
Атомарность
ЦП может атомарно работать с выровненным словом памяти, что означает, что никакая другая инструкция не может прервать эту операцию. Это очень важно для правильной работы многих структур данных без блокировки и других параллелизмов парадигм.
Заключение
Система памяти процессора немного сложнее и сложнее, чем описано здесь; может помочь обсуждение того, как процессор x86 фактически обращается к памяти (многие процессоры работают аналогично).
Существует гораздо больше преимуществ для выравнивания памяти, которые вы можете прочитать в этой статье IBM .
Основное назначение компьютера - преобразование данных. Современные архитектуры и технологии памяти были оптимизированы на протяжении десятилетий, чтобы упростить получение большего объема данных, вход, выход и между более быстрыми исполнительными блоками - с высокой степенью надежности.
Бонус: кэши
Другое выравнивание по производительности, на которое я ссылался ранее, это выравнивание по строкам кэша, которые (например, на некоторых процессорах) имеют размер 64B.
Для получения дополнительной информации о том, как можно повысить производительность за счет использования кэшей, см. Галерея эффектов кэша процессора ; из этого вопрос о размерах строки кэша
Понимание строк кэша может быть важно для некоторых типов программных оптимизаций. Например, выравнивание данных может определять, касается ли операция одной или двух строк кэша. Как мы видели в приведенном выше примере, это может легко означать, что в случае со смещением операция будет выполняться в два раза медленнее.