- •6 Запоминающие устройства компьютера Запоминающие устройства компьютера
- •Кэш процесора. Структура кеш
- •Обоснование
- •Принципы работы кэша
- •Внутреннее устройство кеша
- •Операции ввода вывода
- •Программируемый ввод-вывод
- •Ввод-вывод с использованием прерываний
- •Реализация стека
- •Вызов процедуры и возврат из нее
Операции ввода вывода
Возможны три метода выполнения операций ввода-вывода:
программируемый ввод-вывод;
ввод-вывод с использованием прерываний;
прямой доступ к памяти (direct memory access — DMA)
Программируемый ввод-вывод
Когда процессору при выполнении программы встречается команда, связанная с вводом-выводом, он выполняет ее, передавая соответствующие команды контроллеру ввода-вывода. При программируемом вводе-выводе это устройство выполняет требуемое действие, а затем устанавливает соответствующие биты в регистрах состояния ввода-вывода. Контроллер ввода-вывода больше не посылает процессору никаких сигналов, в том числе и сигналов прерываний. Таким образом, ответственность за периодическую поверку состояния модуля ввода-вывода несет процессор; он должен производить проверку до тех пор, пока операция ввода-вывода не завершится.
При использовании такого метода процессор отвечает за извлечение из основной памяти данных, предназначенных для вывода, и размещение в ней данных, поступивших с устройств ввода. Программное обеспечение для ввода-вывода разрабатывается таким образом, что процессор непосредственно управляет операциями ввода-вывода, включая опознание состояния устройства, пересылку команд чтения-записи и передачу данных. Таким образом, в набор используемых команд входят команды ввода-вывода, принадлежащие следующим категориям:
Управление. Команды этой категории используются для того, чтобы привести внешнее устройство в действие и сообщить ему, что нужно делать. Например, блоку с магнитной лентой можно отдать команду перемотки или перемещения вперед на одну запись.
Состояние. Используется для проверки состояния контроллера ввода-вывода и соответствующих периферийных устройств.
Передача. Используется для чтения и/или записи данных в регистры процессора и внешние устройства и из регистров процессора и внешних устройств.
Ввод-вывод с использованием прерываний
Проблема программируемого ввода-вывода состоит в том, что процессор должен долго ждать, пока контроллер ввода-вывода будет готов читать или принимать новые данные. Во время ожидания процессор должен постоянно производить опрос, чтобы узнать состояние модуля ввода-вывода. В результате значительно падает производительность всей системы.
При альтернативном подходе процессор может передать контроллеру команду ввода-вывода, а затем перейти к выполнению другой полезной работы. Затем, когда контроллер ввода-вывода снова будет готов обмениваться данными с процессором, он прервет процессор и потребует, чтобы его обслужили. Процессор передает ему новые данные, а затем возобновляет прерванную работу.
Рассмотрим для начала, как все это выглядит с точки зрения контроллера ввода-вывода. Сначала он получает от процессора команду READ и переходит к считыванию данных из связанного с ним периферийного устройства. Как только эти данные поступят в регистры контроллера, он посылает процессору по шине управления сигнал прерывания и ожидает, когда процессор запросит эти данные. При поступлении запроса контроллер передает данные по информационной шине и переходит в состояние готовности для новых операций ввода-вывода.
С точки зрения процессора передача входных данных выглядит следующим образом. Процессор генерирует команду READ, а затем сохраняет содержимое программного счетчика и других регистров, соответствующих выполняемой программе, и переходит к выполнению других операций (например, он в одно и то же время может выполнять несколько различных программ). В конце каждого цикла команды процессор проверяет наличие прерываний (см. рис. 1.7). При поступлении прерывания от контроллера ввода-вывода процессор сохраняет информацию о выполняющейся в данный момент задаче и выполняет программу, обрабатывающую прерывания. При этом он считывает слова из контроллера ввода-вывода и заносит их в память. Затем он восстанавливает контекст программы, от которой поступила команда ввода-вывода и продолжает работу
Ввод-вывод с прерываниями намного эффективнее, чем программируемый ввод-вывод, так как при нем исключается ненужное ожидание. Однако этот процесс все еще потребляет много процессорного времени, потому что каждое слово, которое передается из памяти в модуль ввода-вывода или в обратном направлении, должно пройти через процессор.
Почти в каждой компьютерной системе есть несколько контроллеров ввода-вывода, поэтому нужны механизмы, позволяющие процессору определить, какое из устройств вызвало прерывание, а если прерывание одно, то решить, какое из них будет обрабатываться в первую очередь. В некоторых системах имеется несколько шин прерываний, так что каждый контроллер ввода-вывода посылает сигнал по своей шине, причем у каждой шины — свой приоритет. Есть и другой вариант, когда прерывающая шина всего одна, но тогда используются дополнительные шины, по которым передаются адреса устройств. В этом случае каждому устройству также присваиваются разные приоритеты.
Прямой доступ к памяти
Хотя ввод-вывод, управляемый прерываниями, более эффективен, чем простой программируемый ввод-вывод, он все еще занимает много процессорного времени для передачи данных между памятью и контроллером ввода-вывода (при этом через процессор должны пройти все пересылаемые данные). Таким образом, обе описанные формы ввода-вывода обладают двумя недостатками.
Скорость передачи данных при вводе-выводе ограничена скоростью, с которой процессор может проверять и обслуживать устройство.
Процессор занят организацией передачи данных; при вводе-выводе для каждой передачи данных должна быть выполнена определенная последовательность команд.
Для перемещения больших объемов данных может использоваться более эффективный метод — прямой доступ к памяти (direct memory access — DMA).
Функции DMA выполняются отдельным контроллером системной шины или могут быть встроены в контроллер ввода-вывода.
В любом случае метод работает следующим образом. Когда процессору нужно прочитать или записать блок данных, он генерирует команду для модуля DMA, посылая ему следующую информацию:
указание, требуется ли выполнить чтение или запись;
адрес устройства ввода-вывода;
начальный адрес блока памяти, использующегося для чтения или записи;
количество слов, которые должны быть прочитаны или записаны.
Передав полномочия по выполнению этих операций контроллеру DMA, процессор продолжает работу. Контроллер DMA слово за словом передает весь блок данных в память или из нее, не задействуя при этом процессор. После окончания передачи контроллер DMA посылает процессору сигнал прерывания. Таким образом, процессор участвует только в начале и в конце передачи.
Для передачи данных в память и из нее контроллеру DMA нужен контроль над шиной. Если в это время процессору также нужна шина, может возникнуть конфликтная ситуация, и процессор должен ждать окончания работы модуля DMA. Заметим, что в этом случае нельзя говорить о прерывании, так как процессор не сохраняет информацию о состоянии задачи и не переходит к выполнению других операций. Вместо этого он вынужден сделать паузу на время выполнения одного цикла шины.
В результате это приведет к тому, что во время передачи данных с использованием прямого доступа к памяти замедляется выполнение процессором тех команд, для которых ему требуется шина.
Тем не менее при передаче большого количества информации прямой доступ к памяти намного более эффективен, чем программируемый ввод-вывод или ввод-вывод, управляемый прерываниями.
