Словесная адресация
Эта статья нуждается в дополнительных цитатах для проверки . ( сентябрь 2022 г. ) |
В компьютерной архитектуре адресация слов означает, что адреса памяти на компьютере однозначно идентифицируют слова памяти. Обычно он используется в отличие от байтовой адресации , где адреса однозначно идентифицируют байты . Почти все современные компьютерные архитектуры используют байтовую адресацию, а словесная адресация представляет в основном лишь исторический интерес. Компьютер, использующий словесную адресацию, иногда называют текстовой машиной .
Основы
[ редактировать ]Рассмотрим компьютер, который выдает 524 288 (2 19 ) бит памяти. Если эта память организована в плоском адресном пространстве с байтовой адресацией с использованием 8-битных байтов, то имеется 65 536 (2 16 ) действительные адреса от 0 до 65 535, каждый из которых обозначает 8 независимых бит памяти. Если вместо этого оно организовано в плоском адресном пространстве с пословной адресацией с использованием 32-битных слов, то имеется 16 384 (2 14 ) действительные адреса от 0 до 16 383, каждый из которых обозначает независимые 32 бита.
В более общем смысле, минимальная адресуемая единица (MAU) — это свойство конкретной абстракции памяти. Различные абстракции внутри компьютера могут использовать разные MAU, даже если они представляют одну и ту же базовую память. Например, компьютер может использовать 32-битные адреса с байтовой адресацией в своем наборе команд ЦП , но система когерентности кэша может работать с памятью только с точностью до 64-байтовых строк кэша , позволяя идентифицировать любую конкретную строку кэша только с помощью 26-битный адрес и уменьшение нагрузки на кэш.
Трансляция адресов, выполняемая виртуальной памятью, часто влияет на структуру и ширину адресного пространства, но не меняет MAU.
Компромиссы различных минимальных адресуемых единиц
[ редактировать ]Размер минимальной адресуемой единицы памяти может иметь сложные компромиссы. Использование большего MAU позволяет покрыть тот же объем памяти меньшим адресом, что может существенно снизить требования программы к памяти. Однако использование меньшего MAU упрощает эффективную работу с небольшими элементами данных.
Предположим, программа желает сохранить один из 12 традиционных знаков западной астрологии . Один знак может храниться в 4 битах. Если знак хранится в собственном MAU, то 4 бита будут потрачены впустую при байтовой адресации (эффективность 50%), а 28 бит будут потрачены впустую при 32-битной словной адресации (эффективность 12,5%). Если знак «упакован» в MAU вместе с другими данными, его чтение и запись могут оказаться относительно более дорогими. Например, чтобы записать новый знак в MAU, в который были упакованы другие данные, компьютер должен прочитать текущее значение MAU, перезаписать только соответствующие биты, а затем сохранить новое значение обратно. Это будет особенно дорого, если программе необходимо разрешить другим потокам одновременно изменять другие данные в MAU.
Более распространенный пример — текстовая строка . Распространенные форматы строк, такие как UTF-8 и ASCII, хранят строки как последовательность 8-битных кодовых точек. При байтовой адресации каждая кодовая точка может быть помещена в свой собственный независимо адресуемый MAU без каких-либо дополнительных затрат. При 32-битной словной адресации размещение каждой кодовой точки в отдельном MAU приведет к увеличению использования памяти на 300 %, что неприемлемо для программ, работающих с большими объемами текста. Упаковка соседних кодовых точек в одно слово позволяет избежать этих затрат. Однако многие алгоритмы работы с текстом предпочитают иметь возможность независимо обращаться к точкам кода; чтобы сделать это с упакованными кодовыми точками, алгоритм должен использовать «широкий» адрес, который также хранит смещение символа внутри слова. Если этот широкий адрес необходимо сохранить в другом месте памяти программы, для него может потребоваться больше памяти, чем для обычного адреса.
Чтобы оценить это влияние на всю программу, рассмотрим веб-браузер, отображающий большую и сложную страницу. Часть памяти браузера будет использоваться для хранения простых данных, таких как изображения и текст; браузер, скорее всего, предпочтет хранить эти данные максимально эффективно, и они будут занимать примерно одинаковый объем памяти независимо от размера MAU. Другая память будет представлять модель браузера различных объектов на странице, и эти объекты будут включать в себя множество ссылок: друг на друга, на изображения и текстовые данные и так далее. Объем памяти, необходимый для хранения этих объектов, будет во многом зависеть от ширины адреса компьютера.
Предположим, что если бы все адреса в программе были 32-битными, эта веб-страница занимала бы около 10 Гигабайт памяти.
- Если веб-браузер работает на компьютере с 32-битными адресами и байтовой адресацией памяти, адресное пространство будет занимать 4 Гигабайта памяти, что недостаточно. Браузер либо не сможет отобразить эту страницу, либо ему потребуется возможность произвольно переместить часть данных в более медленное хранилище, что существенно снизит его производительность.
- Если веб-браузер работает на компьютере с 64-битными адресами и памятью с байтовой адресацией, ему потребуется значительно больше памяти для хранения больших адресов. Точные накладные расходы будут зависеть от того, какая часть из 10 гигабайт — это простые данные, а какая — объектноподобная и насыщенная ссылками, но цифра в 40 % не является неправдоподобной, поскольку в общей сложности требуется 14 гигабайт. Это, конечно, вполне соответствует возможностям 64-битного адресного пространства. Однако браузер, как правило, демонстрирует худшую локальность и хуже использует кэш-память компьютера внутри компьютера, при условии равенства ресурсов с альтернативами.
- Если веб-браузер работает на компьютере с 32-битными адресами и 32-битной адресной памятью, ему, скорее всего, потребуется дополнительная память из-за неоптимальной упаковки и необходимости использования нескольких широких адресов. Это влияние, вероятно, будет относительно небольшим, поскольку браузер будет использовать упаковку и неширокие адреса для большинства важных целей, и браузер будет комфортно вписываться в максимальный адресный диапазон в 16 гигабайт. Однако могут возникнуть значительные накладные расходы во время выполнения из-за широкого использования упакованных данных для изображений и текста. Что еще более важно, 16 гигабайт — это относительно низкий предел, и если веб-страница значительно увеличится, этот компьютер исчерпает свое адресное пространство и начнет испытывать некоторые из тех же трудностей, что и компьютер с байтовой адресацией.
- Если веб-браузер работает на компьютере с 64-битными адресами и 32-битной адресной памятью, он будет страдать от обоих вышеперечисленных издержек во время выполнения: ему потребуется значительно больше памяти для размещения больших 64-битных адресов, что нанесет ущерб локальности, а также требует дополнительных затрат времени выполнения при работе с обширной упаковкой текстовых и графических данных. Словарная адресация означает, что программа теоретически может адресовать до 64 эксабайт памяти вместо всего лишь 16 эксабайт, но поскольку программе далеко не требуется столько памяти (а на практике ни один реальный компьютер не способен ее предоставить), это не дает никакой пользы. .
Таким образом, адресация по словам позволяет компьютеру адресовать значительно больший объем памяти без увеличения ширины адреса и соответствующего значительного увеличения использования памяти. Однако это полезно только в относительно узком диапазоне размеров рабочего набора и может привести к существенным накладным расходам во время выполнения в зависимости от приложения. Программы, которые относительно мало работают с байтовыми данными, такими как изображения, текст, файлы и сетевой трафик, могут получить наибольшую выгоду.
Доступ к подсловам и широкие адреса
[ редактировать ]Программа, работающая на компьютере, использующая словесную адресацию, по-прежнему может работать с меньшими единицами памяти, эмулируя доступ к меньшей единице. Для загрузки требуется загрузить заключающее слово и затем извлечь нужные биты. Для хранилища это требует загрузки закрывающего слова, перемещения нового значения на место, перезаписи нужных битов и последующего сохранения закрывающего слова.
Предположим, что четыре последовательные кодовые точки из строки UTF-8 необходимо упаковать в 32-битное слово. Первая кодовая точка может занимать биты 0–7, вторая 8–15, третья 16–23 и четвертая 24–31. (Если бы память имела побайтовую адресацию, порядок байтов был бы прямым порядком байтов.)
Чтобы четко объяснить код, необходимый для доступа к подсловам, не привязывая пример слишком тесно к какой-либо конкретной архитектуре с адресацией по словам, в следующих примерах используется MIPS ассемблер . На самом деле MIPS представляет собой архитектуру с байтовой адресацией и прямой поддержкой загрузки и хранения 8-битных и 16-битных значений, но в примере будет притворяться, что она обеспечивает только 32-битную загрузку и сохранение, а это смещение в пределах 32-битного слова. должны храниться отдельно от адреса. MIPS был выбран потому, что это простой язык ассемблера без каких-либо специальных средств, которые могли бы сделать эти операции более удобными.
Предположим, что программа желает прочитать третью кодовую точку в регистр. r1
от слова по адресу в реестре r2
. При отсутствии какой-либо другой поддержки со стороны набора команд программа должна загрузить полное слово, сдвинуть вправо на 16, чтобы отбросить первые две кодовые точки, а затем замаскировать четвертую кодовую точку:
ldw $r1, 0($r2) # Load the full word srl $r1, $r1, 16 # Shift right by 16 andi $r1, $r1, 0xFF # Mask off other code points
Если смещение не известно статически, а вместо этого в регистре хранится битовое смещение r3
, требуется немного более сложный подход:
ldw $r1, 0($r2) # Load the full word srlv $r1, $r1, $r3 # Shift right by the bit offset andi $r1, $r1, 0xFF # Mask off other code points
Вместо этого предположим, что программа желает присвоить кодовую точку в регистре. r1
до третьей кодовой точки в слове по адресу в r2
. При отсутствии какой-либо другой поддержки со стороны набора команд программа должна загрузить полное слово, замаскировать старое значение этой кодовой точки, переместить новое значение на место, объединить значения и сохранить полное слово обратно:
sll $r1, $r1, 16 # Shift the new value left by 16 lhi $r5, 0x00FF # Construct a constant mask to select the third byte nor $r5, $r5, $zero # Flip the mask so that it clears the third byte ldw $r4, 0($r2) # Load the full word and $r4, $r5, $r4 # Clear the third byte from the word or $r4, $r4, $r1 # Merge the new value into the word stw $r4, 0($r2) # Store the result as the full word
Опять же, если смещение вместо этого сохраняется в r3
, требуется более сложный подход:
sllv $r1, $r1, $r3 # Shift the new value left by the bit offset llo $r5, 0x00FF # Construct a constant mask to select a byte sllv $r5, $r5, $r3 # Shift the mask left by the bit offset nor $r5, $r5, $zero # Flip the mask so that it clears the selected byte ldw $r4, 0($r2) # Load the full word and $r4, $r5, $r4 # Clear the selected byte from the word or $r4, $r4, $r1 # Merge the new value into the word stw $r4, 0($r2) # Store the result as the full word
Эта последовательность кода предполагает, что другой поток не может одновременно изменять другие байты в слове. Если одновременное изменение возможно, то одна из модификаций может быть потеряна. Чтобы решить эту проблему, последние несколько инструкций необходимо превратить в атомарный цикл сравнения-обмена, чтобы одновременная модификация просто заставляла его повторять операцию с новым значением. Никаких барьеров памяти в этом случае не требуется.
Пара адреса слова и смещения внутри слова называется широким адресом (также известным как толстый адрес или толстый указатель ). (Это не следует путать с другими видами использования широких адресов для хранения других видов дополнительных данных, таких как границы массива.) Сохраняемое смещение может быть либо битовым, либо байтовым смещением. Приведенные выше кодовые последовательности выигрывают от того, что смещение выражено в битах, поскольку они используют его в качестве счетчика сдвига; архитектура с прямой поддержкой выбора байтов может предпочесть просто хранить смещение байтов.
В этих кодовых последовательностях дополнительное смещение должно храниться рядом с базовым адресом, что фактически удваивает общие требования к хранению адреса. Это не всегда верно для текстовых машин, в первую очередь потому, что сами адреса часто не упакованы другими данными, чтобы сделать доступ более эффективным. Например, Cray X1 использует 64-битные слова, но адреса имеют длину только 32 бита; когда адрес сохраняется в памяти, он сохраняется в отдельном слове, поэтому смещение байта может быть помещено в старшие 32 бита слова. Неэффективность использования широких адресов в этой системе заключается всего лишь в дополнительной логике для манипулирования этим смещением, а также извлечения и вставки байтов в слова; это не влияет на использование памяти.
Связанные понятия
[ редактировать ]Минимальная адресуемая единица компьютера не обязательно совпадает с минимальным размером доступа к памяти набора команд компьютера. Например, компьютер может использовать байтовую адресацию, не предоставляя никаких инструкций для прямого чтения или записи одного байта. Ожидается, что программы будут эмулировать эти операции в программном обеспечении с помощью битовых манипуляций, как это делают приведенные выше примеры последовательностей кода. Это относительно распространено в 64-битных компьютерных архитектурах, разработанных как преемники 32-битных суперкомпьютеров или миникомпьютеров, таких как DEC Alpha и Cray X1 .
Стандарт C гласит, что указатель должен иметь обычное представление адреса. C также позволяет формировать указатель на любой объект, кроме битового поля; сюда входит каждый отдельный элемент массива байтов. Компиляторы C для компьютеров, использующих словесную адресацию, часто используют разные представления указателей на разные типы в зависимости от их размера. Указатель на тип, достаточно большой для заполнения слова, будет простым адресом, а указатель типа char*
или void*
будет широкий указатель: пара адреса слова и смещения байта внутри этого слова. Таким образом, преобразование между типами указателей не обязательно является тривиальной операцией и может привести к потере информации, если выполнено неправильно.
Потому что размер C struct
не всегда известно при принятии решения о представлении указателя на это struct
, невозможно надежно применить приведенное выше правило. Компиляторам может потребоваться выровнять начало struct
чтобы он мог использовать более эффективное представление указателя.
Примеры
[ редактировать ]- ERA 1103 использует словесную адресацию с 36-битными словами. Только адреса 0–1023 относятся к оперативной памяти; другие либо не сопоставлены, либо относятся к памяти барабана.
- PDP -10 использует словесную адресацию с 36-битными словами и 18-битными адресами.
- Большинство суперкомпьютеров Cray 1980-х и 1990-х годов используют словесную адресацию с помощью 64-битных слов. Cray -1 и Cray X-MP используют 24-битные адреса, тогда как большинство других используют 32-битные адреса.
- Cray X1 использует байтовую адресацию с 64-битными адресами. Он не поддерживает напрямую доступ к памяти размером менее 64 бит, и такой доступ должен эмулироваться программно. Компилятор C для X1 был первым компилятором Cray, поддерживающим эмуляцию 16-битного доступа. [1]
- DEC Alpha использует байтовую адресацию с 64-битными адресами. Ранние процессоры Alpha не обеспечивают никакой прямой поддержки 8-битного и 16-битного доступа к памяти, и программам требуется, например, загружать байт, загружая содержащееся в нем 64-битное слово, а затем отдельно извлекая байт. Поскольку Alpha использует байтовую адресацию, это смещение по-прежнему представлено в младших битах адреса (а не отдельно в виде широкого адреса), и Alpha удобно обеспечивает загрузку и сохранение невыровненных инструкций (
ldq_u
иstq_u
), которые игнорируют эти биты и просто загружают и сохраняют содержащее их выровненное слово. [2] Более поздние расширения архитектуры байтовых слов (BWX) добавили 8-битные и 16-битные загрузки и сохранения, начиная с Alpha 21164a. [3] Опять же, это расширение было возможно без серьезных несовместимостей программного обеспечения, поскольку Alpha всегда использовала байтовую адресацию.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Терри Грейзк, Cray Inc. Проблемы компилятора Cray X1 (и как мы их решили)
- ^ «Альфа AXP, часть 8: Доступ к памяти, хранение байтов, слов и невыровненных данных» . 16 августа 2017 г.
- ^ «Альфа: история в фактах и комментариях — Альфа 21164 (EV5, EV56) и 21164PC (PCA56, PCA57)» .