Существовали 4 принципа архитектуры фон Неймана — «люди жили в раю». А потом случилось грехопадение: эти принципы начали нарушать. Ну и что, что фон Нейман сказал, что так надо — давайте не будем так делать. В итоге: «голову вытянет — хвост увязнет».
Из-за того что память неоднородная, мы получаем одни проблемы. Если доступ к памяти возможен не только через процессор — получаем другие проблемы. Плюсы у этих решений есть, но костыли тоже нужны.
Асимптотики алгоритмов — это идеальность. В реальных боевых условиях процессор может дать процессорное время, а может и не дать. Никто не выделит алгоритму целое ядро. То же самое касается доступа к диску, памяти, сети.
На этом курсе мы будем убирать мифы из головы.
Перетаскивание папки с SSD на флешку с помощью мышки не ощущается чудом. Хотя под капотом — разные файловые системы (в одном случае двухмерные координаты, в другом — трёхмерные).
Закон сохранения энергии работает везде. Если у вас был опыт спортивного программирования (Codeforces и прочее), вы знаете: можно написать программу, идеальную по памяти, или идеальную по времени. Но одновременно идеальную и по тому, и по другому — нельзя. Чем-то всегда приходится жертвовать.
ИИ не заберёт рабочие места. Он сместит точку принятия решения.
О защите дипломов. Студенту задают вопрос: «А что, если упадёт это?» Студент радостно отвечает: «А я это предусмотрел, у меня есть вот это». Ему встречный вопрос: «А что, если это упадёт?» И студент понимает, что так можно задавать вопросы бесконечно. Это философский вопрос, который ведёт в никуда.
Противоречивость требований
Со школы и младших курсов есть мнение, что главное — пройти автотесты, тесты на функциональность. Но есть и нефункциональные требования:
- Если я резервирую — мне нужно синхронизировать.
- Если синхронизирую — теряю производительность.
- И так далее.
Проклятие инженера: если я что-то делаю лучше, что-то другое получается хуже.
Главное противоречие — справедливость и эффективность.
Пример с очередью на кассе: стоят люди с разным количеством товаров. Подходит бедный студент с одной бутылкой воды.
- Для кассира — всё равно, кого обслуживать первым: общее время обслуживания одно и то же.
- Для магазина эффективнее пропустить вперёд того, у кого мало товаров: очередь короче, новые покупатели не уйдут. Можно даже поставить охранника-менеджера, который будет так делать.
- Но что скажут люди в очереди? — «Это несправедливо!»
Bash появился в 1978 году. Было масса попыток его заменить: PHP, Perl, Python. Но bash остался — и, кажется, никуда не денется.
Организация курса
- Лабораторные — 50 баллов
- 6 контрольных — 30 баллов (вопросы в открытом виде)
- Экзамен — 20 баллов
Эволюция Операционных Систем
Операционная система — это базовая (без неё нельзя обойтись) системная (не прикладное ПО — само по себе ценности не имеет, но без неё ничего сделать нельзя) программа, управляющая работой вычислительного узла (без ОС нет доступа к железу) и реализующая универсальный интерфейс между аппаратным обеспечением, программным обеспечением и пользователем.
Архитектура фон Неймана
Если зайти в диспетчер задач, видно сотни процессов. И все эти процессы хотят пользоваться железом…
4 принципа архитектуры фон Неймана:
- Однородность памяти — данные и код хранятся в одной памяти.
- Интерпретация — содержимое ячейки трактуется в зависимости от контекста.
- Адресность — каждая ячейка памяти имеет уникальный адрес.
- Программное управление — программа определяет последовательность выполнения.
Этап 1. Подпрограммы, диспетчер, прерывания
На этом этапе появилось переиспользование кода (конец 40-х, начало 50-х; ещё нет ни C++, ни даже ассемблера — только инструкции, написанные двоичными битами).
Идея: возьмём часть памяти и сразу заложим туда реализации типовых функций (поиск, сортировка и т. п.). Фактически создаём библиотеку подпрограмм.
Программа идёт сверху вниз по инкременту. Но нужно как-то перепрыгивать на ячейку начала подпрограммы. Нужно ещё:
- передать аргумент,
- сохранить место, откуда прыгнули (адрес возврата).
Тогда в память подпрограммы кладётся адрес возврата. Но эти адреса перезаписывать нельзя.
Возникает проблема: если я понял, что реализацию синуса можно эффективнее переписать, мне придётся перемещать и переписывать весь код, потому что байт в байт у меня не выйдет.
Решение — динамическая таблица (диспетчер). У диспетчера есть таблица: левая часть всегда неизменная (ключ — название подпрограммы), правая — адрес начала. Фактически это просто индексация массива.
Кроме того, диспетчеру можно передать стек. Так диспетчер становится универсальным управленцем.
Диспетчер решал проблему линковки, автоматизации загрузки и повторного использования кода.
Контроллеры и прерывания
Появилась идея предзагружать данные в ОЗУ. Но ЦПУ может либо гнать данные, либо их обрабатывать — по архитектуре фон Неймана одновременно нельзя. Решение: создадим процессор поменьше и попроще, который умеет только гонять данные — это контроллер устройства (Storage controller).
Процессор может только давать контроллеру инструкции перегнать данные. Но мы не знаем, закончил ли контроллер перегонку — это ведь физическая штука (магнитная лента, перфокарта…). Нужен механизм оповещения — прерывание. Контроллер сообщает процессору, что закончил.
Прерывание — обращение (сигнал), поступающее от внешнего устройства в центральный процессор, сообщающее о наступлении некоторого события, приостанавливающее исполнение текущего потока команд и передающее управление обработчику этого прерывания.