Архитектура современных ЭВМ.

Структура курса

  • 7 лекций
  • 7 лабораторных работ (ассемблер).
  • Зачет: сданы все лабы.

Компьютерная система

  • Программное обеспечение + аппаратная часть
  • Программы + компьютер
  • [Приложения + операционная система] + компьютер
  • Язык программирования + операционная система + архитектура компьютера

Сборка приложений (на примере C программы)

Ядро ОС

  • ОС компьютера, такая как macOS, Windows или Linux — это коллекция программного обеспечения, выполняющая всю основную работу.
  • "Основная работа" — это общее понятие, и, в зависимости от ОС, может включать такие вещи, как приложения, шрифты, иконки, которые поставляются с компьютером по умолчанию.
  • Каждая ОС имеет ядро.
  • Когда вы включаете компьютер, указатель инструкции запускает какую-то программу.
  • Этой программой является ядро.
  • Ядро имеет почти полный доступ к памяти, периферийным устройствам и другим ресурсам и отвечает за запуск ПО, установленного на компьютере (пользовательских программ).
  • Linux — это всего лишь ядро, которому для полноценной работы требуется множество пользовательских программ, таких как оболочки (shells) и серверы отображения (display servers). Ядро macOS называется XNU, а современное ядро Windows — NT Kernel.

Основные функции ядра

  • Управление процессами (Process Management): создание, планирование и завершение процессов и потоков (threads).
  • Мультизадачность: распределение времени процессора между несколькими процессами.
  • Управление памятью (Memory Management): выделение и освобождение оперативной памяти для процессов.
  • Виртуальная память: организация подкачки (swapping) данных на диск, когда RAM недостаточно.

Основные функции ядра

  • Управление устройствами (Device Management / I/O): обеспечение доступа к периферийным устройствам через драйверы устройств.
  • Драйвер — это переводчик между ядром и конкретным устройством.
  • Управление файловой системой (File System Management): организация хранения, чтения и записи данных на дисках.
  • Обеспечение прав доступа к файлам и каталогам.

Системные вызовы (System Calls) — Интерфейс ядра

  • System Call — это запрос от программы в User Mode к ядру на выполнение привилегированной операции.
  • Это единственный легальный способ для приложения получить доступ к ресурсам.
  • Примеры: open() (открыть файл), fork() (создать процесс), send() (отправить данные по сети).

Типы ядер: Монолитное vs Микроядро

  • Монолитное ядро (Monolithic Kernel): все основные функции выполняются в одном адресном пространстве.
  • Примеры: Linux, UNIX. Плюсы: Высокая производительность. Минусы: Меньшая стабильность.
  • Микроядро (Microkernel): в режиме ядра работает только минимальный набор функций.
  • Примеры: macOS (XNU). Плюсы: Высокая стабильность и безопасность. Минусы: Большие накладные расходы.

Гибридные ядра и примеры

  • Большинство современных ядер являются гибридными (Hybrid Kernel).
  • Сочетают идеи монолитного ядра и микроядра для баланса производительности и стабильности.
  • Windows NT Kernel: монолитное по design, но с элементами микроядра.
  • macOS XNU: основано на микроядре Mach, но включает части монолитного ядра BSD.

Дистрибутивы Linux: Ядро + Пользовательское пространство

  • Linux — это действительно только ядро.
  • Полноценная ОС = Ядро Linux + Набор программ из проекта GNU + Другие компоненты.
  • Такая сборка называется дистрибутив (distribution).
  • Примеры дистрибутивов: Ubuntu, Fedora, Debian, Android.

Что такое монолитное ядро?

  • Монолитное ядро — это архитектура ядра ОС, в которой все компоненты работают в одном адресном пространстве
  • Все службы ядра (управление памятью, файловая система, драйверы устройств) выполняются в режиме ядра
  • Компоненты тесно связаны между собой и имеют прямой доступ к данным друг друга
  • Взаимодействие между компонентами происходит посредством вызовов функций
  • Примеры ОС с монолитным ядром: Linux, Unix, FreeBSD, MS-DOS

Архитектурные особенности монолитного ядра

  • Единое адресное пространство для всего кода ядра
  • Отсутствие границ между компонентами ядра
  • Высокоинтегрированные компоненты с минимальными накладными расходами на взаимодействие
  • Возможность оптимизации взаимодействия между компонентами
  • Простота разработки и отладки благодаря единой кодовой базе
  • Использование модулей для динамической загрузки компонентов

Преимущества

  • Высокая производительность
  • Низкие задержки
  • Простота разработки
  • Эффективное использование ресурсов

Недостатки

  • Низкая отказоустойчивость
  • Сложность сопровождения
  • Проблемы с безопасностью
  • Сложность обновления компонентов

Принципы работы монолитного ядра

  • Все системные вызовы обрабатываются в одном адресном пространстве
  • Отсутствие механизмов изоляции между компонентами ядра
  • Прямой доступ ко всем структурам данных ядра из любой его части
  • Использование единой системы разрешений и привилегий
  • Возможность оптимизации межкомпонентного взаимодейщения за счет отсутствия границ
  • Единая система обработки ошибок и исключений

Процесс обработки системного вызова в монолитном ядре:

  1. Приложение выполняет системный вызов
  2. Процессор переключается в режим ядра
  3. Вызов передается соответствующему обработчику в ядре
  4. Обработчик может напрямую обращаться к любым структурам ядра
  5. Результат возвращается приложению
  6. Процессор возвращается в пользовательский режим

Сравнение с другими архитектурами ядер

Характеристика Монолитное ядро Микроядро Гибридное ядро
Производительность Высокая Низкая Средняя/Высокая
Стабильность Низкая Высокая Средняя/Высокая
Безопасность Низкая Высокая Средняя
Сложность разработки Низкая Высокая Средняя
Гибкость Низкая Высокая Средняя
Примеры ОС Linux, UNIX Minix, QNX Windows NT, macOS

Когда выбирать монолитное ядро?

  • Критически важна производительность
  • Аппаратные ресурсы ограничены
  • Система работает на одном типе оборудования
  • Требуется низкая задержка response time

Когда избегать монолитного ядра?

  • Требуется высокая надежность системы
  • Важна безопасность и изоляция компонентов
  • Система должна работать на разнородном оборудовании
  • Планируются частые обновления компонентов

Эволюция и современное состояние монолитных ядер

  • Современные монолитные ядра поддерживают модульную архитектуру
  • Динамическая загрузка и выгрузка модулей ядра
  • Использование механизмов изоляции для повышения безопасности
  • Поддержка симметричной многопроцессорности (SMP)
  • Оптимизации для уменьшения времени удержания спинлоков
  • Преемптимость ядра для уменьшения задержек

Современные тенденции развития монолитных ядер:

  • Внедрение элементов микроядерной архитектуры
  • Улучшение механизмов изоляции и безопасности
  • Поддержка горячей замены компонентов ядра
  • Оптимизация для энергоэффективных систем
  • Улучшение инструментов отладки и профилирования
  • Поддержка контейнеризации и виртуализации

Известные представители монолитных ядер:

  • Linux — наиболее популярное монолитное ядро с поддержкой модулей
  • FreeBSD Kernel — монолитное ядро с расширенными сетевыми возможностями
  • OpenSolaris Kernel — монолитное ядро с уникальными особенностями
  • XIV — экспериментальное монолитное ядро с улучшенной архитектурой

Что такое микроядро?

  • Микроядро — это минимальная реализация функций ядра ОС
  • В режиме ядра выполняются только самые базовые функции: управление процессами, памятью и межпроцессным взаимодействием
  • Все остальные компоненты (драйверы, файловые системы, сетевые стеки) работают в пользовательском пространстве
  • Компоненты взаимодействуют через механизм межпроцессного взаимодействия (IPC)
  • Примеры ОС с микроядром: QNX, Minix, L4, Fuchsia

Принципы проектирования микроядер

  • Минимизация кода, выполняемого в привилегированном режиме
  • Вынос максимального количества функциональности в пользовательское пространство
  • Четкое определение и реализация механизмов IPC
  • Изоляция компонентов для повышения надежности и безопасности
  • Модульность и возможность замены компонентов без изменения ядра
  • Единообразные интерфейсы взаимодействия между компонентами

Преимущества

  • Высокая надежность и отказоустойчивость
  • Улучшенная безопасность
  • Гибкость и модульность
  • Упрощение разработки и отладки
  • Поддержка распределенных систем

Недостатки

  • Низкая производительность из-за IPC
  • Сложность проектирования
  • Большой объем передаваемых данных между компонентами
  • Высокие накладные расходы

Межпроцессное взаимодействие (IPC) в микроядре

  • IPC — основной механизм взаимодействия между компонентами
  • Сообщения передаются через ядро, которое обеспечивает их доставку
  • Типы IPC: сообщения, разделяемая память, удаленный вызов процедур (RPC)
  • Ядро обеспечивает безопасность и контроль доступа при передаче сообщений
  • Оптимизации IPC: копирование данных между адресными пространствами, кэширование

Процесс обработки запроса в микроядре:

  1. Приложение отправляет запрос серверу через IPC
  2. Запрос передается ядру, которое перенаправляет его целевому серверу
  3. Сервер обрабатывает запрос и формирует ответ
  4. Ответ возвращается через ядро обратно приложению
  5. Ядро обеспечивает изоляцию и безопасность на всех этапах

Пример:

При чтении файла: приложение -> IPC -> файловый сервер -> IPC -> драйвер файловой системы -> IPC -> драйвер диска -> аппаратура

Сравнение с монолитной архитектурой

Характеристика Микроядро Монолитное ядро
Размер кода в ядре Минимальный (10-100k строк) Большой (миллионы строк)
Производительность Ниже (из-за IPC) Выше (прямые вызовы)
Надежность Высокая (изоляция сбоев) Низкая (сбой = падение системы)
Безопасность Высокая (меньше кода в ядре) Ниже (вся функциональность в ядре)
Гибкость Высокая (модульность) Ниже (сложнее изменять)
Примеры ОС QNX, Minix, Fuchsia Linux, FreeBSD, Windows

Когда выбирать микроядро?

  • Критически важна надежность
  • Требуется высокая безопасность
  • Система должна работать в реальном времени
  • Нужна возможность горячей замены компонентов

Когда избегать микроядра?

  • Критически важна производительность
  • Ограниченные аппаратные ресурсы
  • Нет требований к надежности и безопасности
  • Простота разработки в приоритете

Применение микроядер в современных системах

  • Встроенные системы реального времени (автомобили, промышленность)
  • Критически важные системы (авионика, медицинское оборудование)
  • Безопасные операционные системы
  • Распределенные и кластерные системы
  • Исследовательские и академические проекты

Известные реализации микроядер:

  • QNX - коммерческая ОС реального времени, используемая в automotive, медицине
  • Minix - образовательная ОС, послужившая основой для разработки Linux
  • L4 - семейство высокопроизводительных микроядер
  • Fuchsia - разрабатываемая Google ОС для различных устройств
  • Redox - ОС на Rust, написанная с нуля с микроядерной архитектурой

Пример использования: автомобильные системы

В современных автомобилях QNX используется для информационно-развлекательных систем, цифровых приборных панелей и систем помощи водителю. Микроядерная архитектура обеспечивает изоляцию между компонентами - сбой в медиасистеме не влияет на критически важные функции управления автомобилем.

Абстракции операционной системы

  • Абстракция 1: процессы
    • приложения: приложение
    • операционная система: процесс
    • аппаратная часть: компьютер
  • Абстракция 2: виртуальная память
    • приложения: адресное пространство.
    • операционная система: виртуальная память
    • аппаратная часть: физические планки памяти

Абстракции операционной системы

  • Абстракция 3: файловая система
    • приложения: файлы, директории
    • операционная система: файловая система
    • аппаратная часть: диск
  • Абстракция 4: связь
    • приложения: сокеты
    • операционная система: TCP/IP протокол
    • аппаратная часть: сетевой интерфейс

Что такое компьютер?

Классическая модель вычислений фон Нейман.

Классическая модель вычислений фон Неймана

  • Память компьютера состоит из ячеек, каждой из которых присвоен номер — адрес. Любая из ячеек доступна компьютеру в любой момент времени, и он может обратиться к её содержимому по адресу.
  • Память компьютера используется как для хранения данных, так и для хранения программы. Команды и числа кодируются в двоичной системе счисления. Над командами можно производить те же операции, что и над числами.

Принцип хранимой программы

  • Программа и данные хранятся вместе в одной памяти, что позволяет компьютеру модифицировать программу в процессе выполнения
  • Этот принцип устраняет необходимость физической перекоммутации машины для выполнения разных задач
  • Программа становится данными, которые можно обрабатывать другими программами

Последовательное выполнение команд

  • Компьютер выполняет команды строго последовательно — от первой к последней
  • Порядок выполнения может изменяться командами перехода (условными и безусловными)
  • Счетчик команд (Program Counter) хранит адрес следующей выполняемой команды

Архитектура из пяти компонентов

  • Арифметико-логическое устройство (АЛУ) — выполняет арифметические и логические операции
  • Устройство управления — координирует работу всех компонентов
  • Память — хранит данные и программы
  • Устройства ввода — для получения данных извне
  • Устройства вывода — для передачи результатов

Адресуемость памяти

  • Все ячейки памяти имеют уникальные адреса
  • Обращение к памяти происходит по принципу произвольного доступа (RAM)
  • Время доступа к любой ячейке памяти одинаково
  • Адресное пространство определяет максимальный объем доступной памяти

Двоичное кодирование

  • Все данные и команды представляются в двоичной системе счисления
  • Единообразие представления позволяет обрабатывать команды как данные
  • Двоичная система упрощает аппаратную реализацию электронных схем

Централизованное управление

  • Устройство управления является центральным координатором
  • Цикл "выборка-декодирование-выполнение" является фундаментальным процессом
  • Синхронизация работы всех компонентов через тактовый генератор

Принцип однородности памяти

  • Отсутствует принципиальное различие между различными типами памяти
  • Программы могут быть перемещены в любую область памяти
  • Динамическое распределение памяти между программами и данными

Машинно-ориентированное программирование

  • Программы пишутся с учетом конкретной архитектуры
  • Набор команд процессора определяет возможности программирования
  • Трансляторы преобразуют высокоуровневые языки в машинные команды

Гарвардская архитектура

  • Разделение памяти для команд и данных на физическом уровне
  • Раздельные шины для передачи команд и данных
  • Позволяет одновременно обращаться к памяти команд и памяти данных
  • Повышает производительность за счет параллельного доступа
  • Широко используется в микроконтроллерах и DSP-процессорах

Гарвардская архитектура: Основной принцип

  • Физическое разделение памяти на два независимых модуля: память команд (instruction memory) и память данных (data memory)
  • Раздельные системные шины: отдельная шина адреса и шина данных для каждой памяти
  • Исключает конфликты при обращении к памяти, так как процессор может одновременно читать команду и читать/записывать данные
  • Позволяет оптимизировать каждый тип памяти под конкретную задачу (например, память команд — только для чтения, память данных — для чтения и записи)
  • Название архитектуры происходит от Harvard Mark I — компьютера, построенного в Гарварде в 1944 году

Сравнение с архитектурой фон Неймана

  • Фон Нейман: Единая память для команд и данных → "Бутылочное горлышко" при одновременном доступе
  • Гарвардская: Раздельная память → Параллельный доступ и повышенная пропускная способность
  • Фон Нейман: Упрощенная организация памяти и управления
  • Гарвардская: Усложненная hardware-реализация из-за дублирования шин и каналов доступа
  • Гибридные подходы: Современные процессоры часто используют модифицированную гарвардскую архитектуру (кэш-память L1 разделена, а общая память — единая)

Преимущества Гарвардской архитектуры

  • Высокая производительность: Возможность параллельной выборки команды и данных сокращает время выполнения инструкций
  • Повышенная предсказуемость: Отсутствие конфликтов доступа к памяти упрощает расчет времени выполнения для систем реального времени (Real-Time Systems)
  • Улучшенная безопасность: Разделение памяти затрудняет выполнение вредоносного кода, который пытается манипулировать данными как кодом
  • Оптимизация под задачи: Возможность использовать разные технологии памяти (например, Flash для команд и RAM для данных) с разной шириной шины

Области применения и примеры

  • Цифровые сигнальные процессоры (DSP): Обработка аудио-, видео- и радиосигналов, где требуется высокая пропускная способность памяти (Texas Instruments, Analog Devices)
  • Микроконтроллеры (MCU): Широко используется в микроконтроллерах для встраиваемых систем (например, семейства AVR от Microchip (ранее Atmel), ARM Cortex-M с модифицированной гарвардской архитектурой)
  • Кэш-память в современных CPU: Уровень кэша L1 внутри процессоров обычно организован по гарвардскому принципу: отдельный кэш для инструкций (I-cache) и отдельный для данных (D-cache)
  • Специализированные ускорители: Обработка изображений, нейросетевые акселераторы

Современные вариации и модификации

  • Модифицированная Гарвардская архитектура: Память физически разделена, но процессор может работать с ней как с единым адресным пространством с помощью специальных инструкций
  • Гарвардская архитектура с общей кэш-памятью: Раздельные кэши L1 для команд и данных, но общий кэш L2 и общая оперативная память
  • Векторные процессоры: Сочетание гарвардских принципов с возможностью параллельной обработки массивов данных
  • Система на кристалле (SoC): Интеграция нескольких процессоров с разной архитектурой на одном чипе для разных задач

Архитектура с явным параллелизмом (VLIW)

  • Very Long Instruction Word — сверхдлинное командное слово
  • Одна инструкция содержит несколько операций для параллельного выполнения
  • Задача планирования выполнения ложится на компилятор
  • Упрощение аппаратной части процессора
  • Использование в медиапроцессорах и специализированных ускорителях

Dataflow архитектура

  • Выполнение операций по готовности данных, а не по порядку команд
  • Отсутствие счетчика команд и глобальной памяти
  • Операции активируются при наличии всех необходимых входных данных
  • Естественный параллелизм на уровне данных
  • Экспериментальные архитектуры для специализированных вычислений

Нейроморфные вычисления

  • Архитектура, имитирующая структуру и принципы работы человеческого мозга
  • Массивы простых процессорных элементов (нейронов) и связей между ними (синапсов)
  • Высокий параллелизм и энергоэффективность
  • Специализация на задачах машинного обучения и распознавания образов
  • Процессоры Intel Loihi и IBM TrueNorth как примеры реализации

Квантовые вычисления

  • Использование квантовых битов (кубитов) вместо классических битов
  • Принципы суперпозиции и квантовой запутанности
  • Потенциальное экспоненциальное ускорение для алгоритмов
  • Коренное отличие от классических архитектур фон Неймана
  • Перспективы в криптографии, оптимизации и моделировании молекул

Классический компьютер сегодня

ЦП

  • ЦП — это место, в котором происходят все вычисления.
  • Первым массовым ЦП был Intel 4004, спроектированный в конце 60-х итальянским физиком и инженером Федерико Фарджином.
  • Это была 4-битная архитектура, а не 64-битная, которая используется сегодня.
  • 4-битная архитектура была гораздо менее сложной, чем современные процессоры, но многое осталось почти неизменным.
  • "Инструкции", выполняемые ЦП — всего лишь двоичные (binary) данные: байт или два для представления запускаемой инструкции (код операции — opcode), за которыми следуют данные, необходимые для выполнения инструкции.
  • То, что мы называем машинным кодом (machine code) — всего лишь серия этих бинарных инструкций в виде строки.
  • Assemble — это полезный синтаксис, облегчающий чтение и запись сырых (raw) битов людьми.
  • Он всегда компилируется в двоичные данные, понятные ЦП.

ЦП

Оперативная память

  • Оперативная память или оперативное запоминающее устройство (Random Access Memory, RAM) — это основное хранилище компьютера
  • большое многоцелевое пространство, где хранятся все данные, используемые программами, запущенными на компьютере.
  • Это включает код самих программ, а также код ядра (kernel) операционной системы.
  • ЦП всегда читает машинный код прямо из ОП.
  • Код, не загруженный в ОП, не может быть выполнен.

ОП

  • ЦП хранит указатель инструкции (instruction pointer), который указывает на место в ОП, где находится следующая инструкция.
  • После выполнения всех инструкций, ЦП возвращает указатель в начало, и процесс повторяется.
  • Это называется циклом выборки-исполнения (fetch-execute cycle).

ОП

  • После выполнения инструкции указатель передвигается за нее в ОП и таким образом указывает на следующую инструкцию.
  • Указатель инструкции двигается вперед, и машинный код выполняется в порядке его хранения в памяти.
  • Некоторые инструкции могут заставить указатель переместиться (перепрыгнуть — jump) в другое место (выполнить другую инструкцию вместо текущей или выполнить одну из инструкций в зависимости от определенного условия).
  • Это делает возможным повторное и условное выполнение кода.

Регистры

  • Указатель инструкции хранится в регистре (registry).
  • Регистры — это маленькие хранилища, которые являются очень производительными для чтения и записи ЦП.
  • Каждая архитектура ЦП имеет фиксированный набор регистров, используемых для всего: от хранения временных значений в процессе вычислений до настройки процессора.
  • Некоторые регистры доступны из машинного кода напрямую, например, ebx
  • Другие регистры предназначены только для внутреннего использования ЦП, но часто могут обновляться или читаться с помощью специальных инструкций.
  • Одним из примеров такого регистра является указатель инструкции, который не может читаться напрямую, но может обновляться, например, для выполнения другой инструкции вместо текущей.

Организация памяти

Режимы

  • Режим (mode) (иногда именуемый уровнем привилегий (privilege level) или кольцом (ring)), в котором находится процессор, управляет тем, что разрешено делать.
  • В современных архитектурах имеется, как минимум, два варианта: режим ядра/администратора (kernel/supervisor mode) и режим пользователя (user mode).
  • Несмотря на то, что архитектура может поддерживать более двух режимов, как правило, используются только режимы ядра и пользователя.
  • В режиме ядра разрешено все: ЦП может выполнять любую поддерживаемую инструкцию и обращаться к любой памяти.
  • В режиме пользователя разрешен только определенный набор инструкций, ввод/вывод (input/output, I/O) и доступ к памяти ограничены, многие настройки ЦП заблокированы.
  • Как правило, ядро и драйверы запускаются в режиме ядра, а приложения — в режиме пользователя.
  • Процессоры запускаются в режиме ядра.
  • Перед выполнением программы ядро инициализирует переключение в пользовательский режим.

Чтение hello с клавиатуры

Загрузка программы в память

Отображение hello

Многопроцессорность

Инженерная работа

  • Спецификация: описание того, что должна делать?
  • Синтез: поиск решения, нахождение наилучшего решения.
  • Реализация: описание как должно быть это построено?
  • Анализ: проверка того, что получилось с тем что должно было получиться.