Как работают компьютеры: объяснение с самого низа
Начиная с нажатия клавиши
Вы нажимаете клавишу ‘A’ на клавиатуре.
Менее чем через 1 миллисекунду символ появляется на экране.
Кажется простым? В реальности за эту 1 миллисекунду электрический сигнал проходит как минимум через 6 уровней абстракции, десятки аппаратных компонентов и пересекает несколько шин, чтобы завершить это “простое” взаимодействие.
Сущность компьютеров — не вычисления, а абстракция.
Каждый уровень скрывает сложность нижележащего и предоставляет лишь чистый интерфейс вышележащему. Именно благодаря этим абстракциям программисты могут писать код на языках высокого уровня, не заботясь о том, как электроны текут через транзисторы.
Сегодня мы проследим полный путь сигнала от нажатия клавиши, увидев, как компьютеры, уровень за уровнем абстракции, превращают физическое действие в символ на экране.
Первый уровень: от физического сигнала до скан-кода

То, что вы нажимаете, — не буква, а переключатель.
Под каждой клавишей клавиатуры находится механический переключатель. Когда вы нажимаете клавишу ‘A’, переключатель замыкается, и ток начинает течь. Это самая нижняя физическая реальность — только вкл и выкл, никакой ‘A’.
Задача контроллера клавиатуры — перевести этот физический сигнал в числа, которые компьютер может понять.
Как он это делает?
Матричное сканирование
Более 100 клавиш на клавиатуре. Если бы каждая имела свой собственный провод, подключённый к компьютеру, кабель клавиатуры был бы толще вашего пальца. Поэтому клавиатура использует умную конструкцию: матричное сканирование.
Представьте шахматную доску с пересекающимися линиями строк и столбцов. Каждая клавиша находится на пересечении. Контроллер быстро подаёт напряжение на каждую строку и определяет, есть ли ток на каждом столбце. Если столбец 5 обнаруживает ток, когда строка 3 под напряжением, это означает, что клавиша на строке 3, столбце 5 нажата.
Отсюда и берётся скан-код — число, представляющее позицию клавиши.
Нажатие ‘A’ может выдать скан-код 0x1E. Отпускание ‘A’ выдаёт 0x9E (с дополнительным старшим битом, указывающим “отпускание”).
Первый уровень завершён: физическое действие → цифровое кодирование.
Но это ещё не всё. Скан-код всё ещё находится во внутреннем буфере клавиатуры, ожидая отправки.
Второй уровень: от устройства ввода-вывода к памяти

Скан-код должен попасть в процессор, но процессор не может просто сидеть и ждать ввода с клавиатуры.
Процессор работает со скоростью миллиардов операций в секунду; ввод с клавиатуры поступает со скоростью десятков операций в секунду. Если бы процессор проверял “есть ли ввод с клавиатуры?” перед каждой инструкцией, 99,9999% его времени тратилось бы впустую.
Каково решение? Механизм прерываний.
Прерывания: аппаратная версия “позвоните мне, когда будете готовы”
Философия прерываний отражает повседневную жизнь: вы не звоните курьеру каждые 5 минут с вопросом “моя посылка прибыла?” Вместо этого курьер звонит вам, когда приезжает.
После того как контроллер клавиатуры генерирует скан-код, он отправляет процессору сигнал запроса прерывания (IRQ).
Этот сигнал проходит через контроллер прерываний (8259A или его современный аналог) и получает номер прерывания. Клавиатура обычно является IRQ1, номер прерывания 0x21.
После выполнения каждой инструкции процессор проверяет наличие сигналов прерывания. Если такой сигнал есть, он приостанавливает текущую работу и обрабатывает прерывание.
Таблица векторов прерываний
Откуда процессор знает, как обрабатывать прерывание клавиатуры?
В памяти существует таблица векторов прерываний (Interrupt Vector Table), которая хранит адрес программы-обработчика для каждого номера прерывания. Это как телефонная книга: номер прерывания 0x21 соответствует адресу обработчика клавиатуры.
Когда процессор получает прерывание клавиатуры:
- Помещает текущий счётчик команд (PC), регистр состояния и т.д. в стек
- Ищет в таблице по номеру прерывания адрес обработчика
- Переходит к обработчику и выполняет его
Обработчик клавиатуры читает скан-код через порт ввода-вывода (обычно 0x60) и затем сохраняет его в буфер клавиатуры в памяти.
Второй уровень завершён: событие ввода-вывода → данные в памяти.
Теперь скан-код благополучно лежит в памяти. Но это всё ещё скан-код, а не символ ‘A’.
Третий уровень: от скан-кода к символу

Скан-код 0x1E представляет “позицию клавиши A на клавиатуре”, а не символ ‘A’.
Почему? Потому что одна и та же клавиша может обозначать разные символы на клавиатурах в разных странах. Американцы нажимают её и получают ‘A’; французы нажимают и получают ‘Q’ (раскладка их клавиатуры отличается).
Операционная система отвечает за преобразование скан-кодов в символы.
Подсистема ввода
Современные операционные системы имеют подсистему ввода (Input Subsystem), которая занимается:
- Чтением скан-кодов из буфера ядра
- Преобразованием их в символы согласно текущей раскладке клавиатуры
- Обработкой клавиш-модификаторов (Shift+A = заглавная ‘A’, Ctrl+C = команда копирования)
- Доставкой символа в активное окно
Это преобразование включает таблицу соответствия раскладки клавиатуры. Реестр Windows содержит HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts, где хранятся соответствия для различных языков.
После преобразования символ ‘A’ помещается в очередь сообщений, ожидая, пока приложение его прочитает.
Третий уровень завершён: аппаратно-зависимое кодирование → унифицированное кодирование символов.
Четвёртый уровень: от символа к пикселю

Приложение получает символ ‘A’ и должно отобразить его на экране.
Но то, что вы видите, — не символ, а пиксели.
Монитор понимает только пиксели — какого цвета каждая точка. Символ ‘A’ — это узор, состоящий из набора пикселей, хранящийся в файле шрифта.
Рендеринг шрифтов
Когда вы вводите ‘A’, приложение:
- Находит файл шрифта (например, Microsoft YaHei, SimSun)
- Получает описание глифа для ‘A’ (векторные кривые или растровое изображение)
- Масштабирует глиф в соответствии с размером шрифта
- Растеризует: преобразует векторные кривые в сетку пикселей
- Применяет сглаживание (anti-aliasing) для более гладких краёв
Эти пиксельные данные записываются в видеопамять (VRAM) — память на графической карте.
Из VRAM на экран
Контроллер дисплея на графической карте считывает данные из VRAM 60 раз в секунду (60 Гц), преобразует их в видеосигнал и отправляет на монитор.
Монитор получает сигнал, управляет цветом каждого пикселя, и вы видите символ ‘A’.
Четвёртый уровень завершён: кодировка символа → матрица пикселей.
Пятый уровень: как процессор выполняет эти инструкции

Все вышеупомянутые операции — сканирование, прерывания, преобразование, рендеринг — в конечном счёте должны быть выполнены процессором.
Как процессор выполняет инструкции?
Цикл инструкции: выборка-декодирование-исполнение
Выполнение инструкции состоит из трёх этапов:
-
Выборка (Fetch)
- Счётчик команд (PC) хранит адрес следующей инструкции
- Адрес отправляется в память, инструкция извлекается
- Инструкция сохраняется в регистре инструкций (IR)
-
Декодирование (Decode)
- Блок управления анализирует код операции инструкции
- Определяет, какую операцию выполнить (сложение? загрузка? переход?)
- Определяет, где находятся операнды
-
Исполнение (Execute)
- Арифметико-логическое устройство (АЛУ) выполняет вычисление
- Или обращается к памяти для чтения/записи данных
- Обновляет счётчик команд
Затем повторяется.
Пример
Предположим, процессору нужно выполнить ADD R1, R2, R3 (сложить значения в R2 и R3, сохранить в R1):
- Выборка: чтение машинного кода этой инструкции из памяти
- Декодирование: распознавание инструкции сложения, операнды в R2 и R3
- Исполнение: АЛУ отправляет значения R2 и R3 в сумматор, записывает результат в R1
Каждая инструкция выполняется за наносекунды.
Пятый уровень завершён: язык высокого уровня → машинные инструкции → электрические сигналы.
Цена абстракции
Абстракция не бесплатна.
Каждый уровень абстракции имеет свою стоимость производительности:
- Сканирование клавиатуры: несколько микросекунд
- Обработка прерывания: десятки микросекунд
- Преобразование ОС: сотни микросекунд
- Рендеринг шрифтов: несколько миллисекунд
- Запись в VRAM: несколько микросекунд
Всё вместе это составляет “задержку ввода” (input lag), которую вы ощущаете, обычно от 10 до 50 миллисекунд.
Для обычного человека эта задержка незначительна. Но для киберспортсменов это разница между жизнью и смертью. Вот почему они используют механические клавиатуры (более быстрое срабатывание), мониторы с высокой частотой обновления (144 Гц и выше) и проводные соединения (беспроводные добавляют дополнительную задержку).
Резюме
Сущность компьютеров — абстракция: инкапсулировать сложность, предоставляя только простой интерфейс.
Путь сигнала от нажатия клавиши:
Физический переключатель → скан-код → прерывание → буфер памяти → кодировка символа → очередь сообщений → рендеринг шрифта → VRAM → пиксель
Каждый уровень делает только одно: получает упрощённый вывод от нижележащего уровня, обрабатывает его и предоставляет упрощённый интерфейс вышележащему уровню.
Именно эта уровневая абстракция позволяет людям управлять невероятно сложными компьютерными системами.
Программистам не нужно знать, как работает сканирование клавиатуры — им нужно только прочитать возвращаемое значение getchar().
Программистам не нужно знать, как графическая карта выполняет рендеринг — им нужно только вызвать функцию DrawText().
Сила абстракции — в том, чтобы сделать сложность управляемой.
