4. От Гауди до Бурдж-Халифы: зачем софту архитектура и почему ОС — это город

среда, февр. 25, 2026 | 9 минут чтения

4. От Гауди до Бурдж-Халифы: зачем софту архитектура и почему ОС — это город

Нормальная компания живёт от кодовой базы. Твой накопленный код это твоё богатство. Время уникальных решений прошло. Уже не засесть в гараже и не написать что-то уникальное. Всё когда-то уже было написано

Тут речь про архитектора Гауди и его постройки в Барселоне. Он строил дома без чётких границ. Все грани на внешней стороне были скруглёнными. Он строил собор Саграда Фамилия и не успел его достроить. Это здание никто не может достроить.

То же самое получается и в айти. Если мы не будем использовать архитектурные патернны, то может решение и будет крутым и ценным, но она не будет способным развиваться

Карл Росси. Аничков дворец устойчив к износу, окна не запотевают, летом прохладно, зимой тепло. Реставрация не сильно нужна. Он гениальный человек, который держал все аспекты в голове когда проектировал. Но таких людей просто единицы.

Нужно провести вентиляцию, водопровод, электрику. Будет не очень удачным решением, когда стык труб будет ад главным распредилительным щитком. Ну и много всего остального нужно продумать. При этом ни один специалист не может быть специалистом по сантехнике, по водопроводу и электрике.

Берём Бурдж Халифу. Как с высоты 540 смыть канализацию? Как сделать так, чтобы на высоте 540 метров с крана была вода? Если взять обычное решение, то там должно быть такое давление, что труба будет с огроменным диаметром. Там много необычных и крутых уникальныйх решений

Такое же возникает и в программирование

Архитектура

  • Функциональная
    • С позиции пользователя
    • Что именно пользователь хочет видеть, где, как и почему. Ему безразличны патерны и другие сложности разработки.
  • Информационная
    • Есть информационные потоки, это множество информационных объектов, процесс.
    • Какие информационные объекты выделяем для выполнения функциональности. Как удаляем, добавляем, соединяем.
  • Системная
    • С позиции инженерии. Midleware слои. Слой паравиртуализации, а над ним контейнеризации. Разделяем функционал с точки зрения безопасности, стабильности, надёжности. Разделяем между ними отвественность. Программные интерфейсы, пользовательские, аппаратные. Как данные попадают, куда уходят.
  • Программная
    • Код должен быть как-то организован. Паттерны, их реализация с помощью фреймворка.
    • Как реализован ваш программный код, чтобы его можно было масштабировать, разрабатывать и реализовывать. %%Разработчики ОС не любят ООП%%
  • Архитектура данных
    • Информационные объекты должны быть в виде каких-то структур данных и быть связаны между собой.

Что-ж. Начнём более глубокое изучение сверху - вниз.

Цель существования ОС (Но тут плохой перевод, goal - цель как конкретика, aim - цель глобально. Мы как раз говорим об Aim)

  • Производительность
  • Надежность
  • Безопасность Всё это обеспечить для Software, Hardware, Data, Interfaces

Вспомним БД: делаем надёжность ACID и т.п - падаёт производительность. Добавляем безопасность - падает надёжность и производительность. А тут у нас 4 объекта: Software, Hardware, Data, Interfaces. И всё это должно быть производительным, надёжным и безопасным…

Потерять сгоревшую железку фигня. Просто вложение каких-то средств. Есть блестящая Еврейская мудрость, которой с нами поделился Матяин: “Если проблему можно решить деньгами, то это не проблема, а затрата.”

Но если мы потеряли данные - то это может быть фатально. В ЛосАндежелесе, в аэропорту Хитлоу почти на трое суток выбыл из нормальной функциональности. И когда посчитали, то это были 6 значные потери фунтов стерлингов. Начали в этом разбираться. Тот кто потерял миллионы фунтов стерлингов, то как бы потерявшие деньги хотели разобраться или хотяб ы посмотреть в глаза.

Накатили обновление ПО, это как бы нормально, но там была ошибка. Какой-то фрагмент не был покрыт автотестами и так вот вышло что фрагмент никто не тестировал и в нём была ошибка. Админ который всё это обслуживал у него была некоректно настроена бэкап система. Бэкапы затирали друг друга.

Обновление привело к сбоям. Решили быстро откатиться к старому. Откатились, но бэкап был поломан и они поломали еще сильнее… Код откатили, но данные не восстановить

А там данные были всего… Настройки линий багажей, регистрации. Никто не работал десятки лет без этой системы. Никто не в курсе какие номера на гейтах. Круто если номера гейта написаны краской, но если там экранчик, кто помнит что там обычно высвечивалось?

Функциональная архитектура

В ней мы выделим 4 мета функции и начнём в них выделять более мелкие функции.

1. Управление исполнением и разработкой пользовательского ПО

- API
- Управление исполнением
- Обнаружение и исправление ошибок
- Организация ввода/вывода (I/O)
- Хранилище данных
- Мониторинг ресурсов

API: Не зря Томас Кёрнинган и Томас Ричи не зря 6 лет страдали и создавали основы UNIX. Интеграция компилятора и ядра У них не было API. Написали fopen() и открылся дескриптор. И вы не задумываетесь почему файл открылся. Вы могли даже не знать что там за файловая система, в каких структурах лежало, проверялись ли права доступа. Вы абстрогированы от всего это

fopen() дёрнула библиотеку системы, библиотека системы дёрнула api ядра, ядро там дальше своё чего-то делало…

Управление исполнением: Я нажал на ярлычок и у меня волшебным образом запустился браузер. Код как-то попал в память, отрисовалось окошко, процесс получился в системе и приобрёл какие-то приоритеты, встал в очереди. Очереди оптимизированы чтобы появился новый участник очереди. И там много-много всего… И мы за этим ничем не наблюдаем, как ребенок, который не знает и не задумывается как еда попадает в холодильник.

Обнаружение и исправление ошибок: Написали код, в результате чего-то возникает ошибка деление на 0. Ранее запустив подобное у нас был бы чёрный экран, нет сигналов клавиатуры. Не понятно может там ошибка, а может вечный цикл… И чтобы закрыть это, нужно просто выдернуть компьютер из розетки

В 2х тысячах строчек кода чтобы найти ошибку нужно было написать сотни строк отладочного вывода, чтобы локализовать ошибку

Сейчас же IDE тебе скажет на какой строчке у тебя ошибка.

О том как это реализовано разберём позже. Но это тоже очень сложная логика… Когда программа падает на деление на 0, чтобы вывести инфу нужно было её сформировать в видеопамяти, а потом вывести. Но как это всё сделать, если процессор стоит? Существует исключительное состояние процесса.

I/O: Разная скорость шины, разные протоколы. Мы воткнули принтер и он почему-то начал печатать. Воткнули флешку и она почему-то загрузилась. Но на деле это стэк драйверов. Ввод/вывод должен быть буфферизуем, потому что он асинхронен. Сейчас много задач, а через пару секунд будет мало. У нас будет неравномерная нагрузка. В одно время он свободен, а в другое задыхается от нагрузки. Поэтому был создан буфер %%Фильтр Калмана? Штука, которая позволяет сглаживать неравномерности процесса во времени. Узнаем об этом на курсе математики или статистики%%.

У нас все железяки физические устройства и на них действуют законы физики. Проезжающий трамвай по заледеневшим проводам может вызвать искру. Эта искра за собой несёт электро магнитный импульс, из-за которого может возникнуть ошибка в каком-то битике во время передачи данных. И это нужно проверять…

Хранилище данных Как-то эффективно ходить и вытаскивать данные. С учётом контроля доступа, требований безопасности. Файловые системы и т.п.

Мониторинг ресурсов Я запускаю приложение и понимаю что оно работает медленно. CompilationError легко пофиксить. Очев как бы, пойди глянь RuntimeError как бы тоже можно пофиксить

Но а если программа работает, ошибок нет, но всё лежит и медленно работает? Прям как my itmo. Процессор загружен на 100, но памяти много и сетевых запросов толком нет. Тогда почему он забит? Активность есть, но результатов она не приносит: Spin lock. Опрашивает одну и тоже переменну top, htop. Всякие сетевые мониторы. Инструменты ОС, которые показывают какие процессы используются. Используешь Grafana и сопоставляешь несколько графиков по времени. Кажется будто проблема из-за процессора, но видишь что оно связано с дисковой нагрузкой. Опа, а тут ошибка spin lock допустим… Казалось что беда с процессором, но беда с дисковым пространством…

2. Оптимизация использования ресурсов (Или просто оптимизация ресурсов)

  • Решение многокритериальных задач

С самого начала перед ОС ставилась задача оптимально использовать аппаратные ресурсы. Я заплатил большие деньги за сервер, за узел. Вопрос не в цене железки. 2-5 тысяч за блейд сервера не дорого. Дороже электричество. Вы купили электронагревательный прибор. Вы привели 2 киловатта и вам его еще отвести нужно. КПД компьютера ничтожно. В основном вся энергия уходит в тепло. КПД 0.5% 99.5% уходит просто в тепло. Сейчас лучшие умы стараются хотя бы немного увеличить это кпд.

Понятно что если ЦОД в Гренландии, то всё хорошо. Но что если это Дубай какой-то? Нормальная температура внутри ЦОД должна быть примерно 18 градусов. Нагреть ЦОД очень легко, а вот охладить тяжело… И даже охладить всё может стоить дороже чем просто цод

Человек который заплатил бабки за блейд хочет чтобы всё всегда работало на 100%

Решение многокритеальных задач Есть критерий чтобы процессор был всё время занят. Чтобы память всё время занята. Но у нас выходит то, что наши критерии противоречат друг другу. Как это решить?

1 подход: суперкритерий. Вводим весовые коэффиценты. $$\hat k = \alpha k_1 + \beta k_2 + \gamma k_3, ; \alpha + \beta + \gamma = 1$$ Есть такое понятие - TCO. Цена владения и мы можем выразить нашу $\hat k$ в деньгах допустим. Этим занимается отдельная наука эконометрика.

Если бы эта функция была гладкой и непрерывной, везде дифференцируемой, то это было бы классной математической задачкой. Но у нас функция зачастую будет некрасивой и неподоходящей для просто математики. Решаются численными методами алгосами.

Boieng летает под Windows LC (?). Каждый самолёт индивидуальный. Инструкция для модели самолёта маленькая. Но помимо этого к конкретному самолёту прилагается огромная инструкция. Её составляет лётчик-испытатель, который поднимает борт и дальше начинает смотреть как ведёт себя самолёт. Имитируются отказы. Разбираются какие там допуски.

Угол открытия закрылков зависит от десятков параметров. И его нужно высчитывать в реальном времени за 1 секунду. Это всё высчитывает винда. А что если винда в момент когда высчитывается угол начнёт соединение с интернетом или решит что-то оптимзиировать или дефрагментировать память, так как она чёт забитой выглядит… Ни о каком расчёте за 1 секунду речь не идёт…

2 подход: Цикл Дёминга Коэффициенты высчитаны под кокнкретное время P - Plan. Спланировали на какое-то ближайшее время. Но мы не можем вечно планировать D - Do. Период выполнения плана C - Check. Выяснилось что план и факт совпали. Но если что-то внешнее поменялось, то состояние разойдется A - Act. Устранение расхождения. Процесс не дополучил памяти или процессорного времени. Давайте поднимем ему приоритет

3. Поддержка эксплуатации

  • Диагностика
  • Восстановление

ОС очень сложна и как любая система работающая в открытом мире она будет ломаться. Написать что-то совершенное невероятно дорого. Если ошибка произойдет с шансом 0.01%, то пофиг, нецелесообразно с экономии особо чего-то делать.

4. Поддержка развития операционной системы

  • обновление
  • изменения конфигурации

Обновление - цикл создания ОС около 4х лет от каркаса до релиза. Огромный объект кодовой базы. Время эксплуатации по 20 лет. До сих пор есть компы работающие на Windows XP, FreeBSD 5-6 версии. Будут находиться ошибки и уязвимости. Ведь будут новые атаки, которые найдут эти ошибки. Будут новые требования у пользователей. На живой работающей машины поменять что-то и сохранить целостность и работоспособность очень тяжело

Ставим сервер и думаем что он будет под веба. Но прошло время и понимаете что этот сервер веб не потянет. Будет сервер просто доменным сервером. Меняется профиль нагрузки и мы должны суметь отключить какие-то модули и включить другие. И это всё как-то должно собраться в реальном времени