
…
Нормальная компания живёт от кодовой базы. Твой накопленный код это твоё богатство. Время уникальных решений прошло. Уже не засесть в гараже и не написать что-то уникальное. Всё когда-то уже было написано
Тут речь про архитектора Гауди и его постройки в Барселоне. Он строил дома без чётких границ. Все грани на внешней стороне были скруглёнными. Он строил собор Саграда Фамилия и не успел его достроить. Это здание никто не может достроить.
То же самое получается и в айти. Если мы не будем использовать архитектурные патернны, то может решение и будет крутым и ценным, но она не будет способным развиваться
Карл Росси. Аничков дворец устойчив к износу, окна не запотевают, летом прохладно, зимой тепло. Реставрация не сильно нужна. Он гениальный человек, который держал все аспекты в голове когда проектировал. Но таких людей просто единицы.
Нужно провести вентиляцию, водопровод, электрику. Будет не очень удачным решением, когда стык труб будет ад главным распредилительным щитком. Ну и много всего остального нужно продумать. При этом ни один специалист не может быть специалистом по сантехнике, по водопроводу и электрике.
Берём Бурдж Халифу. Как с высоты 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 версии. Будут находиться ошибки и уязвимости. Ведь будут новые атаки, которые найдут эти ошибки. Будут новые требования у пользователей. На живой работающей машины поменять что-то и сохранить целостность и работоспособность очень тяжело
Ставим сервер и думаем что он будет под веба. Но прошло время и понимаете что этот сервер веб не потянет. Будет сервер просто доменным сервером. Меняется профиль нагрузки и мы должны суметь отключить какие-то модули и включить другие. И это всё как-то должно собраться в реальном времени