Подсистема памяти на современном процессоре ограничена доступом к памяти по степени детализации и выравниванию ее размера слова; это имеет место по ряду причин.
скорость
Современные процессоры имеют несколько уровней кэш-памяти, через которую должны извлекаться данные; поддержка однобайтовых считываний сделает пропускную способность подсистемы памяти тесно связанной с пропускной способностью исполнительного блока (иначе, связанной с процессором); все это напоминает то, как режим 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 младших бита всегда равны 0 (например, 32-разрядные машины), тогда она может получить доступ в 4 раза больше памяти (2 сохраненных бита могут представлять 4 различных состояния), или столько же памяти с 2 битами для чего-то вроде флагов. Удаление двух младших битов из адреса даст вам 4-байтовое выравнивание; также называется шагом 4 байта. Каждый раз, когда адрес увеличивается, он эффективно увеличивает бит 2, а не бит 0, т. Е. Последние 2 бита всегда будут оставаться 00
.
Это может даже повлиять на физический дизайн системы. Если для шины адреса требуется на 2 бита меньше, на процессоре может быть на 2 контакта меньше, а на плате - 2 трассы.
валентность
Процессор может атомарно работать с выровненным словом памяти, что означает, что никакая другая инструкция не может прервать эту операцию. Это имеет решающее значение для правильной работы многих структур данных без блокировки и других парадигм параллелизма .
Вывод
Система памяти процессора немного сложнее и сложнее, чем описано здесь; может помочь обсуждение того, как процессор x86 фактически обращается к памяти (многие процессоры работают аналогично).
Есть много других преимуществ соблюдения выравнивания памяти, которые вы можете прочитать в этой статье IBM .
Основное назначение компьютера - преобразование данных. Современные архитектуры и технологии памяти были оптимизированы на протяжении десятилетий, чтобы упростить получение большего объема данных, вход, выход и между более быстрыми исполнительными блоками - с высокой надежностью.
Бонус: кеши
Другое выравнивание по производительности, о котором я упоминал ранее, это выравнивание по строкам кэша, которые (например, на некоторых процессорах) имеют 64B.
Для получения дополнительной информации о том, как можно повысить производительность за счет использования кэшей, см. « Галерея эффектов кэша процессора» ; из этого вопроса о размерах строки кэша
Понимание строк кэша может быть важно для определенных типов программных оптимизаций. Например, выравнивание данных может определять, касается ли операция одной или двух строк кэша. Как мы видели в приведенном выше примере, это может легко означать, что в случае неправильного выравнивания операция будет в два раза медленнее.