Подсистема ввода-вывода в ОС
Ввод-вывод - диск, сеть и устройства
Процессор считает миллиарды операций в секунду, а диск отвечает за миллисекунды, сеть — за RTT в миллисекундах и выше. ОС существует во многом затем, чтобы скрыть эту медлительность: не блокировать всю машину на ожидании диска, переиспользовать каналы, ставить запросы в очередь.
Без понимания I/O непонятны:
- почему
read()«висит»; - зачем буферизация и кэш страниц;
- как SSD и NVMe менили планировщики;
- связь прерываний с планированием CPU.
См. также: ядро — устройства, определение ОС, периферия в «Как работает компьютер».
Цель подсистемы I/O
| Задача | Как решается |
|---|---|
| Единый интерфейс | read/write/ioctl, сокеты, mmap |
| Защита | Приложение не пишет в порты диска напрямую |
| Мультиплексирование | Много процессов — один контроллер |
| Эффективность | DMA, очереди, асинхронный I/O |
| Обработка ошибок | Повтор, таймаут, сообщение приложению |
Слои — от приложения до устройства
┌─────────────────────────────────────┐
│ Приложение (cat, PostgreSQL, браузер) │
└─────────────────┬───────────────────┘
│ syscall: read, write, poll, io_uring
┌─────────────────▼───────────────────┐
│ Ядро: VFS (файлы), socket layer, │
│ block layer (диски), char devices │
└─────────────────┬───────────────────┘
│ вызовы драйвера
┌─────────────────▼───────────────────┐
│ Драйвер устройства (модуль ядра) │
└─────────────────┬───────────────────┘
│ MMIO, порты, DMA-дескрипторы
┌─────────────────▼───────────────────┐
│ Контроллер (AHCI, NVMe, NIC, USB) │
└─────────────────┬───────────────────┘
│
Физическое устройство
Драйвер — переводчик: «запиши блок LBA 42» → команды конкретному чипу. В Unix устройство часто видно как файл /dev/sda, /dev/tty, /dev/null — идея «всё есть файл» из 3.md.
Типы устройств
Символьные (character devices)
Поток байтов без фиксированных блоков: клавиатура, терминал, /dev/random, иногда принтер.
- Доступ последовательный;
- часто буфер в ядре невелик;
readможет блокироваться до нажатия клавиши.
Блочные (block devices)
Данные адресуются блоками фиксированного размера (512 B, 4 KiB): HDD, SSD, разделы.
- Ядро может кэшировать блоки в page cache;
- файловая система строится поверх блочного слоя;
- см. файловую систему Windows.
Сетевые
Логически сокет — другой API (send/recv), но та же идея: syscall → стек ядра → драйвер NIC.
Программный, прерыванийный I/O и DMA
Programmed I/O (PIO)
CPU сам крутит цикл: «есть данные?» → прочитать байт → повторить. Просто, но дорого для больших объёмов — процессор занят.
I/O через прерывания
Устройство сигнализирует контроллеру прерываний (IRQ): «пакет готов», «сектор записан». CPU прерывает текущий процесс, ядро вызывает обработчик прерывания (ISR) — короткий, быстрый; тяжёлую работу откладывает в bottom half / workqueue / поток ядра.
Связь с процессами: пока ваш процесс ждёт диск, он в состоянии Waiting; планировщик отдаёт CPU другим — см. 5114.
DMA (Direct Memory Access)
Контроллер DMA переносит данные между устройством и RAM без участия CPU в каждом байте. CPU настраивает дескриптор (адрес, длина), уходит заниматься другим; по завершении — прерывание.
Современные NVMe и сетевые карты активно используют DMA — иначе гигабитная сеть съела бы весь CPU.
Буферизация и кэш
Буфер в ядре
Двойная буферизация, кольцевые очереди — сглаживают разницу скоростей «производитель / потребитель».
Page cache (кэш страниц)
Чтение файла часто не идёт на диск: данные уже в RAM как страницы кэша. Запись может попасть в dirty pages и сброситься на диск позже (fsync, sync).
Это связывает I/O с виртуальной памятью и замещением страниц.
Spooling (спулинг)
Очередь заданий на медленное устройство (принтер): приложение «отдало» файл в spool, освободило себя; демон печати работает с принтером по одному. Разрушает условие deadlock «прямой захват принтера» — см. 5119.
Синхронный и асинхронный I/O
| Режим | Поведение | Пример |
|---|---|---|
| Синхронный | read() блокирует поток до данных | Простой код |
| Неблокирующий | O_NONBLOCK, poll/select/epoll | Серверы, event loop |
| Асинхронный (AIO) | io_uring (Linux), IOCP (Windows) | Высокая нагрузка на диск/сеть |
Важно: «асинхронный» не значит «магически быстрее» — значит поток не ждёт в syscall; завершение приходит callback’ом или повторным read.
Планировщик ввода-вывода (диск)
Когда много процессов бьют в один диск, порядок запросов влияет на latency и throughput.
| Алгоритм | Идея |
|---|---|
| FCFS | По очереди |
| SSTF | Сначала ближайший сектор (головка диска) — starvation |
| SCAN / C-SCAN | «Лифт» по цилиндрам |
| CFQ (старый Linux) | Справедливость между процессами |
| mq-deadline, bfq, none | Современные SSD/NVMe — другая физика |
На SSD выигрывает случайный доступ; планировщик чаще упрощён (none на NVMe), упор на очередь глубины контроллера.
В справочнике Linux: /sys/block/<dev>/queue/scheduler — см. 51.md.
ioctl и управление устройством
Не всё укладывается в read/write. ioctl — расширенные команды: eject CD, настройка сетевого интерфейса, громкость, режим терминала.
Терминал: stty, raw/cooked mode — классический пример символьного устройства.
Ошибки и надёжность
- EIO, ENOSPC, ETIMEDOUT — errno в POSIX.
- Повтор при временных сбоях (сеть).
- Журналирование ФС — целостность после обрыва питания — 411.
- RAID, резервирование — уровень ниже ОС, но видно как одно устройство.
Пример — что происходит при cat file.txt
- Shell вызывает
read()→ syscall в ядро. - VFS находит inode, page cache.
- Если страницы нет — page fault, чтение с диска через block layer.
- Драйвер ставит DMA-запрос; процесс блокируется (Waiting).
- Диск закончил → IRQ → драйвер будит процесс → данные в user buffer.
- Повтор до EOF;
write()на stdout — тот же путь к терминалу/пайпу.
Связь с другими темами
- Процесс ждёт I/O → не держит CPU → планирование.
- Дисковый swap → подкачка.
- Драйвер в kernel mode → сбой опасен в монолитном ядре → 3.md.
- Блокировки на файлах → 5119.
Что запомнить
- I/O — слои и абстракции, не «магия драйвера».
- Прерывания + DMA освобождают CPU.
- Кэш делает повторное чтение файла быстрым.
- Планировщик диска всё ещё важен под смешанной нагрузкой; на NVMe — иная эра.
- Для серверов — epoll / io_uring / IOCP, не только синхронный
read.
Чек-лист · Память · Замещение страниц
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Программное обеспечение, управляющее аппаратными ресурсами компьютера. Основные функции и задачи ОС. Функциональные и нефункциональные требования к операционным системам, критерии выбора архитектуры ядра и способы реализации подсистем. Классификация операционных систем - ключевые семейства ОС, их отличия, типовые области применения и архитектурные особенности. Основы UNIX-систем - ключевые принципы многозадачности, иерархии файлов и управления процессами в классической Unix-модели. Ядро операционной системы - различия монолитной и микроядерной архитектуры, их компромиссы по производительности и надежности. Обзор Windows — версии, компоненты ядра NT, файловая система NTFS, структура каталогов и отличия от Unix-подобных систем. Полный инструментарий по Windows 11, возможности и функции. Устройство файловой системы Windows - иерархия хранения данных, служебные структуры и поведение файловой среды в ОС. Работа памяти в Windows - физические и виртуальные уровни, страницы памяти и механизмы управления ресурсами процессов. Локализация и символы в Windows - особенности кодировок, терминалов и корректной обработки текста в системных инструментах. Сравнение Windows и Linux - различия подходов к интерфейсу, администрированию и повседневным рабочим сценариям. Linux - структура файловой системы, ключевые каталоги и базовые принципы организации среды в Unix-подобной ОС.Операционные системы
Требования к ОС и подходы к реализации
Классификация операционных систем
Основы UNIX-систем
Ядро операционной системы
Windows
Справочник по Windows 11
Устройство файловой системы Windows
Работа памяти в Windows
Поддержка локализации и символов в Windows
Сравнение Windows и Linux
Linux