Предварительная выборка входной очереди
извлечение кодов операций программы инструкций из памяти Заблаговременное называется предварительной выборкой и осуществляется с использованием входной очереди предварительной выборки (PIQ). Предварительно загруженные инструкции сохраняются в очереди . Заблаговременное получение кодов операций, до того, как они понадобятся для выполнения, повышает общую эффективность процессора, повышая его скорость. Процессору больше не нужно ждать операций доступа к памяти для завершения последующего кода операции инструкции. Эта архитектура широко использовалась в микропроцессоре Intel 8086 .
Введение
[ редактировать ]Конвейерная обработка была выдвинута на передний план проектирования вычислительной архитектуры в 1960-х годах из-за необходимости более быстрых и эффективных вычислений. Конвейерная обработка является более широкой концепцией, и большинство современных процессоров загружают инструкции за несколько тактов перед их выполнением. Это достигается за счет предварительной загрузки машинного кода из памяти в очередь ввода предварительной выборки .
Такое поведение [ нужны разъяснения ] применимо только к компьютерам фон Неймана (то есть не к компьютерам с гарвардской архитектурой ), которые могут выполнять самомодифицирующийся код и имеют своего рода конвейерную обработку инструкций . Почти все современные высокопроизводительные компьютеры отвечают этим трем требованиям. [1]
Обычно поведение предварительной выборки PIQ невидимо для модели программирования ЦП. Однако в некоторых обстоятельствах поведение PIQ заметно и программист должен его учитывать.
Когда процессор x86 меняет режим с реального режима на защищенный и наоборот, PIQ необходимо сбросить, иначе ЦП продолжит транслировать машинный код , как если бы он был записан в последнем режиме. Если PIQ не сброшен, процессор может неправильно транслировать свои коды и сгенерировать исключение недопустимой инструкции .
При выполнении самомодифицирующегося кода изменение кода процессора непосредственно перед текущим местом выполнения может не изменить то, как процессор интерпретирует код, поскольку он уже загружен в его PIQ. Он просто выполняет свою старую копию, уже загруженную в PIQ, вместо новой и измененной версии кода в своей оперативной памяти и/или кэше .
Такое поведение PIQ можно использовать для определения того, выполняется ли код внутри эмулятора или непосредственно на оборудовании реального ЦП. [ нужна ссылка ] Большинство эмуляторов, вероятно, никогда не будут имитировать такое поведение. Если размер PIQ равен нулю (изменения в коде всегда немедленно влияют на состояние процессора), можно сделать вывод, что либо код выполняется в эмуляторе, либо процессор делает PIQ недействительным при записи по адресам, загруженным в PIQ. .
Оценка производительности на основе теории массового обслуживания
[ редактировать ]( А. К. Эрланг 1878-1929) первым предложил использовать очередь как решение проблемы перегрузок телефонного трафика. Предлагаются различные модели массового обслуживания для приблизительного моделирования систем массового обслуживания в реальном времени, чтобы их можно было математически проанализировать для различных характеристик производительности.
Модели массового обслуживания можно представить с помощью обозначений Кендалла :
- А1/А2/А3/А4
где:
- A1 — распределение времени между двумя прибытиями
- A2 — распределение времени обслуживания.
- A3 — общее количество серверов
- А4 — емкость системы
- Модель M/M/1 (одна очередь, один сервер/ марковская модель ). В этой модели элементы очереди обслуживаются в порядке очереди. Учитывая средние скорости прибытия и обслуживания, фактические скорости варьируются вокруг этих средних значений случайным образом и, следовательно, должны определяться с использованием кумулятивной функции распределения вероятностей . [2]
- Модель M/M/r . Эта модель является обобщением базовой модели M/M/1, в которой несколько серверов работают параллельно. Модель такого типа также позволяет моделировать сценарии с нетерпеливыми пользователями, которые немедленно покидают очередь, если не получают обслуживания. Это также можно смоделировать с помощью процесса Бернулли, имеющего только два состояния: успех и неудачу. Лучшим примером этой модели являются наши обычные проводные телефонные системы. [3]
- Модель M/G/1 (модель Такача с конечным входом): эта модель используется для анализа сложных случаев. Здесь распределение времени обслуживания больше не является марковским процессом . В этой модели рассматривается случай, когда один ремонтник ремонтирует более одной вышедшей из строя машины. В этом случае время обслуживания для любого пользователя увеличится. [4]
Обычно в таких приложениях, как очередь ввода с предварительной выборкой, широко используется модель M/M/1 из-за ограниченного использования функций очереди. В этой модели в соответствии с микропроцессорами пользователь берет на себя роль исполнительного устройства, а сервер — устройства интерфейса шины.
Очередь инструкций
[ редактировать ]Процессор выполняет программу, извлекая инструкции из памяти и выполняя их. Обычно скорость выполнения процессора намного превышает скорость доступа к памяти. Очередь инструкций используется для предварительной выборки следующих инструкций в отдельном буфере, пока процессор выполняет текущую инструкцию.
При четырехэтапном конвейере скорость выполнения инструкций может быть в четыре раза выше, чем при последовательном выполнении. [5]
Процессор обычно имеет два отдельных блока для получения инструкций и выполнения инструкций. [6] [7]
Реализация конвейерной архитектуры возможна только в том случае, если блок интерфейса шины и исполнительный блок независимы. Пока исполнительный блок декодирует или выполняет команду, которая не требует использования шин данных и адреса , блок интерфейса шины извлекает коды операций инструкций из памяти.
Этот процесс намного быстрее, чем отправка адреса, чтение кода операции, а затем его декодирование и выполнение. Выборка следующей инструкции во время декодирования или выполнения текущей инструкции называется конвейерной обработкой. [8]
Процессор 8086 имеет шестибайтовый конвейер команд предварительной выборки, а процессор 8088 — четырехбайтовый. Пока исполнительный модуль выполняет текущую инструкцию, модуль интерфейса шины заранее считывает до шести (или четырех) байтов кодов операций из памяти. Длины очередей были выбраны на основе симуляционных исследований. [9]
Исключение возникает, когда исполнительный блок встречает инструкцию ветвления , т.е. либо инструкцию перехода, либо инструкцию вызова. В этом случае необходимо сбросить всю очередь и извлечь содержимое, на которое указывает указатель инструкции, из памяти.
Недостатки
[ редактировать ]Процессоры, реализующие алгоритм предварительной выборки очереди команд, достаточно технически продвинуты. таких Сложность конструкции ЦП процессоров намного выше, чем у обычных процессоров. В первую очередь это связано с необходимостью создания двух отдельных подразделений, BIU и EU , работающих отдельно.
По мере увеличения сложности этих чипов стоимость также увеличивается. Эти процессоры относительно дороже, чем их аналоги без входной очереди предварительной выборки.
Однако эти недостатки в значительной степени компенсируются улучшением времени выполнения процессора. После введения очереди команд предварительной выборки в процессоре 8086 все последующие процессоры включили эту функцию.
пример кода x86
[ редактировать ]code_starts_here:
mov bx, ahead
mov word ptr cs:[bx], 9090h
ahead:
jmp near to_the_end
; Some other code
to_the_end:
Эта самомодифицирующаяся программа перезапишет jmp to_the_end двумя NOP (которые закодированы как 0x9090 ). Переход jmp рядом с to_the_end собирается в два байта машинного кода, поэтому два NOP просто перезапишут этот переход и ничего больше. (То есть переход заменяется кодом ничего не делать.)
Потому что машинный код перехода уже считан в PIQ и, вероятно, тоже уже выполнен процессором ( суперскалярные процессоры выполняют несколько инструкций одновременно, но «делают вид», что этого не делают из-за необходимости обратной совместимости ), изменение кода не приведет к изменению потока выполнения.
Пример программы для определения размера
[ редактировать ]Это пример NASM — синтаксиса самомодифицирующего x86 — алгоритма языка ассемблера , который определяет размер PIQ:
code_starts_here:
xor bx, bx ; zero register bx
xor ax, ax ; zero register ax
mov dx, cs
mov [code_segment], dx ; "calculate" codeseg in the far jump below (edx here too)
around:
cmp ax, 1 ; check if ax has been altered
je found_size
; 0x90 = opcode "nop" (NO oPeration)
mov byte [nop_field+bx], 0x90
inc bx
db 0xEA ; 0xEA = opcode "far jump"
dw flush_queue ; should be followed by offset (rm = "dw", pm = "dd")
code_segment:
dw 0 ; and then the code segment (calculated above)
flush_queue:
; 0x40 = opcode "inc ax" (INCrease ax)
mov byte [nop_field+bx], 0x40
nop_field:
times 256 nop
jmp around
found_size:
;
; register bx now contains the size of the PIQ
; this code is for [[real mode]] and [[16-bit protected mode]], but it could easily be changed into
; running for [[32-bit protected mode]] as well. just change the "dw" for
; the offset to "dd". you need also change dx to edx at the top as
; well. (dw and dx = 16 bit addressing, dd and edx = 32 bit addressing)
;
По сути, этот код меняет поток выполнения и грубо определяет размер PIQ. «На каком расстоянии мне нужно изменить код передо мной, чтобы он подействовал на меня?» Если он находится слишком близко (он уже есть в PIQ), обновление не будет иметь никакого эффекта. Если это достаточно далеко, изменение кода повлияет на программу, и тогда программа найдет размер PIQ процессора. Если этот код выполняется в многозадачной ОС, переключение контекста может привести к неправильному значению.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Информационный центр АРМ» . Статьи технической поддержки ARM .
- ^ Хейс, Джон (1998). Компьютерная архитектура и организация (второе изд.). МакГроу-Хилл.
- ^ Феллер, Уильям (1968). Введение в теорию вероятностей и ее приложения (второе изд.). Джон Уайли и сыновья.
- ^ Папулис, Афанасий; С.Унникришна Пиллаи (2008). Вероятность, случайные величины и случайные процессы (Четвертое изд.). МакГроу-Хилл. стр. 784–800.
- ^ Заки, Сафват; В. Карл Хамахер; Звонко Г. Вранешич (1996). Компьютерная организация (Четвертое изд.). МакГроу-Хилл. стр. 310–329 . ISBN 0-07-114309-2 .
- ^ «Блок-схема процессора 8086» .
- ^ Холл, Дуглас (2006). Микропроцессоры и интерфейсы . Тата МакГроу-Хилл. п. 2.12. ISBN 0-07-060167-4 .
- ^ Холл, Дуглас (2006). Микропроцессоры и интерфейсы . Нью-Дели: Тата МакГроу-Хилл. стр. 2.13–2.14. ISBN 0-07-060167-4 .
- ^ Маккевитт, Джеймс; Бэйлисс, Джон (март 1979 г.). «Новые варианты от больших фишек». IEEE-спектр . 16 (3): 28–34. дои : 10.1109/MSPEC.1979.6367944 . S2CID 25154920 .