Операции ввода-вывода
Операции ввода-вывода (англ. Input/Output, I/O) — это совокупность процессов передачи данных между центральным процессором (ЦП) или оперативной памятью компьютера и внешними устройствами (периферией), а также между различными компонентами вычислительной системы. Являются фундаментальным механизмом взаимодействия программного обеспечения с аппаратным обеспечением, обеспечивая загрузку данных, сохранение результатов и обмен информацией с пользователем или другими системами. Без операций ввода-вывода компьютер не может функционировать как полезное устройство, так как все программы существуют в оперативной памяти лишь временно и не могут воспринимать внешние сигналы.
Классификация операций ввода-вывода
Операции ввода-вывода классифицируются по нескольким признакам: способу взаимодействия с устройством, синхронности выполнения, инициатору и типу передаваемых данных.
По способу взаимодействия с устройством
В основе классификации лежит метод, с помощью которого процессор управляет передачей данных.
- Программно-управляемый ввод-вывод (PIO). Процессор непосредственно выполняет инструкции по чтению или записи данных в порт устройства. Процессор ожидает готовности устройства (опрос статуса), затем передаёт каждый байт или слово данных. Высокая нагрузка на ЦП; применялся в ранних персональных компьютерах для управления приводами гибких дисков.
- Ввод-вывод по прерываниям (Interrupt-driven I/O). Устройство инициирует операцию: после готовности данных оно отправляет сигнал прерывания процессору. Процессор приостанавливает текущую программу, выполняет обработчик прерывания, передаёт данные и возобновляет прерванную задачу. Позволяет процессору заниматься другими вычислениями во время ожидания данных, не тратя такты на активный опрос.
- Прямой доступ к памяти (DMA). Устройство-контроллер DMA (специализированное аппаратное обеспечение) осуществляет передачу данных между устройством и оперативной памятью без участия процессора. Процессор лишь настраивает DMA-контроллер (адрес начала блока, размер, направление) и запускает передачу. По завершении DMA генерирует прерывание. Значительно снижает нагрузку на процессор при больших объёмах данных (например, при работе с жёсткими дисками, сетевыми картами, видеозахватом).
По синхронности
- Синхронный (блокирующий). Вызывающий процесс (поток) приостанавливается до тех пор, пока операция ввода-вывода не будет полностью завершена. Простейший и наиболее часто используемый в простых программах способ. Во время ожидания процессор может переключиться на другой поток.
- Асинхронный (неблокирующий). Вызов операции возвращает управление сразу, не дожидаясь завершения. Программа может продолжать выполнение других задач, а позднее получить уведомление (через коллбэк, сигнал или опрос) о завершении операции и результате. Используется в высоконагруженных серверных приложениях, графических интерфейсах, где недопустимо зависание.
По инициатору
- Пользовательский ввод-вывод. Инициируется прикладной программой, работающей в пространстве пользователя. Обычно требует обращения к системным вызовам, которые переключают процессор в привилегированный режим.
- Системный ввод-вывод. Выполняется ядром операционной системы. Включает операции по обслуживанию файловых систем, управлению памятью, обработке прерываний. Ядро выступает посредником между устройством и пользовательской программой.
Архитектура подсистемы ввода-вывода
Подсистема ввода-вывода в вычислительных системах организована иерархически: от аппаратного обеспечения на самом низком уровне до драйверов и системных вызовов на более высоких.
Уровни абстракции
- Аппаратное обеспечение. Физические контроллеры устройств (например, контроллер SATA для жёстких дисков, контроллер USB, контроллер PCIe для сетевых карт). Они содержат регистры, через которые осуществляется настройка и передача данных.
- Драйвер устройства. Программный модуль, работающий в ядре операционной системы. Драйвер предоставляет единый интерфейс для взаимодействия с контроллером, скрывая особенности конкретной модели.
- Интерфейс ядра. Системные вызовы (например,
read(),write(),open()в Unix-подобных системах) обрабатываются ядром, которое перенаправляет запрос соответствующему драйверу. - Библиотеки времени выполнения. Си-функции
fread,fwrite, std::fstream в C++ — надстройки над системными вызовами, добавляющие буферизацию и форматирование для повышения производительности и удобства. - Прикладные программы. Используют операции ввода-вывода для своих нужд: редактирование документа, открытие веб-страницы, управление 3D-принтером.
Адресация и отображение
В зависимости от архитектуры процессора специальные регистры устройств могут располагаться:
- В отдельных адресных пространствах (in/out). Архитектура x86 использует инструкции
INиOUTдля доступа к 64-килобайтному пространству портов ввода-вывода. - В едином адресном пространстве с памятью (Memory-Mapped I/O, MMIO). Регистры устройства отображаются на адреса оперативной памяти. Для доступа к ним используются стандартные инструкции чтения/записи памяти (например,
MOV). Этот подход применяется в архитектурах ARM, PowerPC, а также в современных процессорах x86-64 для многих устройств (графика, шины PCIe).
Программное обеспечение ввода-вывода
Буферизация
Буферизация — это временное хранение данных в оперативной памяти для согласования скорости передачи данных между процессором и медленным устройством. Различают:
- Одиночный буфер. Данные копируются из устройства в системный буфер, затем в пользовательское пространство. Процессор во время копирования занят.
- Двойная буферизация (double buffering). Используются два буфера: пока один буфер заполняется из устройства, процессор обрабатывает данные из другого. Уменьшает время ожидания.
- Кольцевой буфер (circular buffer). Непрерывная область памяти, использующаяся для организации очереди данных. Эффективен для поточного ввода-вывода (аудио, видео).
Кэширование
Кэширование позволяет уменьшить количество обращений к медленным устройствам (например, жёстким дискам). Часто используемые данные сохраняются в быстрой оперативной памяти или в специальном кэше контроллера. При повторном чтении данные извлекаются из кэша, что существенно ускоряет работу. Операционные системы используют кэш для файловых данных и метаданных.
Обработка прерываний
Современные системы обрабатывают прерывания от устройств приоритетно. Каждому устройству или классу устройств может быть назначен уровень прерывания (IRQ). При возникновении прерывания процессор сохраняет контекст выполнения, определяет источник прерывания, вызывает соответствующий обработчик (interrupt handler), который выполняет минимально необходимые действия (например, копирование данных в буфер). Затем процессор переключается обратно на прерванную задачу. Обработка прерываний должна быть как можно короче, чтобы не блокировать другие прерывания.
Производительность операций ввода-вывода
Производительность оценивается несколькими метриками:
- Пропускная способность (throughput). Объём данных, переданных за единицу времени (например, Мбайт/с).
- Время отклика (latency). Время между инициированием операции и моментом, когда результат становится доступен. Лагентность ввода-вывода может варьироваться от единиц микросекунд (обращение к оперативной памяти) до миллисекунд (механические жёсткие диски) и даже секунд (сетевые соединения, медленные USB-устройства).
- Операции в секунду (IOPS). Количество операций чтения/записи в секунду. Особенно важна для баз данных и файловых серверов.
Факторы, влияющие на производительность
- Тип устройства. Твёрдотельные накопители (SSD) значительно быстрее механических жёстких дисков (HDD) по времени доступа и IOPS.
- Размер блока. Передача данных большими блоками (4 Кбайт, 64 Кбайт) эффективнее, чем побайтовая, благодаря меньшим накладным расходам на обработку каждого запроса.
- Метод передачи. DMA практически не загружает процессор, тогда как PIO полностью занимает его на время передачи.
- Планирование запросов. Операционная система может объединять (merge) соседние запросы, переназначать их порядок для оптимизации перемещения головки HDD (алгоритмы лифта) или минимизации латентности на SSD.
- Наличие очередей. Многопоточные приложения могут создавать несколько параллельных запросов. Современные устройства (в частности, NVMe SSD) поддерживают несколько очередей команд, что позволяет эффективно утилизировать параллелизм.
Применение в современных системах
Операции ввода-вывода являются неотъемлемой частью работы любых цифровых устройств. Основные области:
- Файловые системы. Все изменения файлов на накопителях — результат операций записи и чтения блоков данных.
- Сетевые коммуникации. Отправка и приём пакетов через Ethernet, Wi-Fi, Bluetooth — сетевой ввод-вывод.
- Графические подсистемы. Вывод изображения на монитор (через GPU) — высокоскоростной ввод-вывод с использованием DMA.
- Управление внешними устройствами (IoT, робототехника). Считывание показаний с датчиков (температура, давление) и подача управляющих сигналов на двигатели, реле.
- Виртуализация. Гипервизоры эмулируют устройства ввода-вывода для гостевых операционных систем, что требует сложной симуляции PMIO и MMIO.
Интересные факты
- В ранних персональных компьютерах (например, IBM PC/XT) операции ввода-вывода выполнялись преимущественно через программный доступ к портам. Это требовало, чтобы программы (например, драйверы клавиатуры) были написаны на ассемблере и учитывали особенности аппаратуры.
- Технология Direct Memory Access (DMA) была разработана в 1950-х годах для мейнфреймов IBM и стала стандартом для массовых компьютеров только в 1980-х с появлением контроллеров Intel 8237.
- В современных процессорах нагрузка на операции ввода-вывода может быть столь велика, что для их оптимизации применяются аппаратные ускорители (например, Intel QuickAssist или SmartNICs с собственными процессорами).
Источники
- Таненбаум Э., Остин Т. «Архитектура компьютера» (6-е издание)
- Таненбаум Э., Бос Х. «Современные операционные системы» (4-е издание)
- Stallings W. «Operating Systems: Internals and Design Principles» (9th edition)
- Документация Intel 64 and IA-32 Architectures Software Developer’s Manual, т. 1-3
- ISO/IEC 9899:2018 (стандарт языка Си), раздел 7.21 (Ввод-вывод файлов)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →