Лекция 1

04.02.2026 Обновлено: 04.02.2026

Существовали 4 принципа архитектуры фон Неймана — «люди жили в раю». А потом случилось грехопадение: эти принципы начали нарушать. Ну и что, что фон Нейман сказал, что так надо — давайте не будем так делать. В итоге: «голову вытянет — хвост увязнет».

Из-за того что память неоднородная, мы получаем одни проблемы. Если доступ к памяти возможен не только через процессор — получаем другие проблемы. Плюсы у этих решений есть, но костыли тоже нужны.

Асимптотики алгоритмов — это идеальность. В реальных боевых условиях процессор может дать процессорное время, а может и не дать. Никто не выделит алгоритму целое ядро. То же самое касается доступа к диску, памяти, сети.

На этом курсе мы будем убирать мифы из головы.

Перетаскивание папки с SSD на флешку с помощью мышки не ощущается чудом. Хотя под капотом — разные файловые системы (в одном случае двухмерные координаты, в другом — трёхмерные).

Закон сохранения энергии работает везде. Если у вас был опыт спортивного программирования (Codeforces и прочее), вы знаете: можно написать программу, идеальную по памяти, или идеальную по времени. Но одновременно идеальную и по тому, и по другому — нельзя. Чем-то всегда приходится жертвовать.

ИИ не заберёт рабочие места. Он сместит точку принятия решения.

О защите дипломов. Студенту задают вопрос: «А что, если упадёт это?» Студент радостно отвечает: «А я это предусмотрел, у меня есть вот это». Ему встречный вопрос: «А что, если это упадёт?» И студент понимает, что так можно задавать вопросы бесконечно. Это философский вопрос, который ведёт в никуда.

Противоречивость требований

Со школы и младших курсов есть мнение, что главное — пройти автотесты, тесты на функциональность. Но есть и нефункциональные требования:

  • Если я резервирую — мне нужно синхронизировать.
  • Если синхронизирую — теряю производительность.
  • И так далее.

Проклятие инженера: если я что-то делаю лучше, что-то другое получается хуже.

Главное противоречие — справедливость и эффективность.

Пример с очередью на кассе: стоят люди с разным количеством товаров. Подходит бедный студент с одной бутылкой воды.

  • Для кассира — всё равно, кого обслуживать первым: общее время обслуживания одно и то же.
  • Для магазина эффективнее пропустить вперёд того, у кого мало товаров: очередь короче, новые покупатели не уйдут. Можно даже поставить охранника-менеджера, который будет так делать.
  • Но что скажут люди в очереди? — «Это несправедливо!»

Bash появился в 1978 году. Было масса попыток его заменить: PHP, Perl, Python. Но bash остался — и, кажется, никуда не денется.

Организация курса

  • Лабораторные — 50 баллов
  • 6 контрольных — 30 баллов (вопросы в открытом виде)
  • Экзамен — 20 баллов

Эволюция Операционных Систем

Операционная система — это базовая (без неё нельзя обойтись) системная (не прикладное ПО — само по себе ценности не имеет, но без неё ничего сделать нельзя) программа, управляющая работой вычислительного узла (без ОС нет доступа к железу) и реализующая универсальный интерфейс между аппаратным обеспечением, программным обеспечением и пользователем.

Архитектура фон Неймана

Если зайти в диспетчер задач, видно сотни процессов. И все эти процессы хотят пользоваться железом…

4 принципа архитектуры фон Неймана:

  1. Однородность памяти — данные и код хранятся в одной памяти.
  2. Интерпретация — содержимое ячейки трактуется в зависимости от контекста.
  3. Адресность — каждая ячейка памяти имеет уникальный адрес.
  4. Программное управление — программа определяет последовательность выполнения.

Этап 1. Подпрограммы, диспетчер, прерывания

На этом этапе появилось переиспользование кода (конец 40-х, начало 50-х; ещё нет ни C++, ни даже ассемблера — только инструкции, написанные двоичными битами).

Идея: возьмём часть памяти и сразу заложим туда реализации типовых функций (поиск, сортировка и т. п.). Фактически создаём библиотеку подпрограмм.

Программа идёт сверху вниз по инкременту. Но нужно как-то перепрыгивать на ячейку начала подпрограммы. Нужно ещё:

  • передать аргумент,
  • сохранить место, откуда прыгнули (адрес возврата).

Тогда в память подпрограммы кладётся адрес возврата. Но эти адреса перезаписывать нельзя.

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

Решение — динамическая таблица (диспетчер). У диспетчера есть таблица: левая часть всегда неизменная (ключ — название подпрограммы), правая — адрес начала. Фактически это просто индексация массива.

Кроме того, диспетчеру можно передать стек. Так диспетчер становится универсальным управленцем.

Диспетчер решал проблему линковки, автоматизации загрузки и повторного использования кода.

Контроллеры и прерывания

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

Процессор может только давать контроллеру инструкции перегнать данные. Но мы не знаем, закончил ли контроллер перегонку — это ведь физическая штука (магнитная лента, перфокарта…). Нужен механизм оповещения — прерывание. Контроллер сообщает процессору, что закончил.

Прерывание — обращение (сигнал), поступающее от внешнего устройства в центральный процессор, сообщающее о наступлении некоторого события, приостанавливающее исполнение текущего потока команд и передающее управление обработчику этого прерывания.