Что такое процесс и чем он отличается от программы? Как операционная система одновременно запускает множество программ, создаёт новые процессы, переключается между ними и отслеживает их завершение?
В этой лекции разбираем процессы — одну из ключевых абстракций операционных систем. Рассмотрим как общие принципы, так и практические механизмы Linux и Windows.
Отдельное внимание уделяется тому, как эти механизмы выглядят с точки зрения системного программиста: что происходит после fork(), зачем нужен exec(), как родитель узнаёт результат работы дочернего процесса и каким образом ОС сохраняет состояние процесса при переключении контекста.
Это первая лекция серии, в которой мы с нуля разрабатываем векторный графический редактор и используем его как полигон для объектно-ориентированного проектирования.
Начинаем с простой модели рисунка и превращаем её в настоящее интерактивное GUI-приложение. Для графики используем SFML 3, но основная тема лекции — не SFML, а архитектурные решения, которые возникают по мере роста требований.
Мы не начинаем с готовой архитектуры вроде MVC и не пытаемся заранее применить известные паттерны. Вместо этого последовательно добавляем новые возможности, смотрим, какие проблемы возникают в коде, и только после этого выделяем новые ответственности и даём найденным решениям имена.
Главный вопрос серии — не «какой паттерн сюда применить?», а «какое изменение требований стало дорогим, почему оно стало дорогим и где провести новую архитектурную границу?»
Как операционная система видит программы, память и файлы — и как приложения взаимодействуют с ядром?
В этой лекции разбираем основные абстракции операционных систем: процессы, адресные пространства и файлы. Посмотрим не только на теорию, но и на то, как эти механизмы проявляются в реальной Linux-системе: какие процессы запущены, кому они принадлежат, сколько памяти используют и как связаны друг с другом.
На практических примерах познакомимся с командами ps, top, htop, free, vmstat, pwd, ls, cd и другими. Разберём пользователей, UID/GID и права доступа, устройство файловой системы UNIX, специальные файлы, монтирование, каналы pipe, перенаправление ввода-вывода и роль командной оболочки Shell.
Отдельная часть лекции посвящена тому, как программа на C или C++ взаимодействует с операционной системой. Разберём, что такое системный вызов, почему прикладная программа работает в User Mode, как библиотечная функция вроде read() передаёт управление ядру и как результат возвращается обратно в программу.
Также сравним подходы POSIX/UNIX и Windows API: почему похожие задачи решаются через разные интерфейсы и почему публичный Win32 API отделён от внутренних системных вызовов Windows.
После лекции должна сложиться общая картина: программы не управляют железом напрямую — операционная система предоставляет им удобные и безопасные абстракции и выполняет привилегированные операции от их имени.
Лекция будет полезна студентам, начинающим изучать операционные системы, системное программирование, Linux и разработку на C/C++.
Вторая лекция курса "Объектно-ориентированное проектирование"
Почему небольшое изменение требований иногда заставляет менять половину программы? И как спроектировать систему так, чтобы изменения оставались локальными?
В этой лекции по объектно-ориентированному проектированию разбираем Cohesion, Coupling и принципы SOLID не как набор правил для заучивания, а как инструменты анализа дизайна. На примере графического редактора смотрим, как зависимости распространяют изменения по системе и почему хороший дизайн стремится удержать связанные элементы вместе, а связи между модулями сделать минимально необходимыми.
В лекции:
- Cohesion и Coupling — что стоит объединять внутри модуля и что должно пересекать его границу;
- SRP — ответственность как причина изменения, а не количество методов;
- OCP — какие оси изменений имеет смысл сделать дешёвыми;
- LSP — поведенческие контракты, предусловия, постусловия, инварианты и исключения;
- ISP — почему интерфейс стоит проектировать с точки зрения его клиента;
- DIP — почему политика системы не должна зависеть от технических деталей и что именно означает «инверсия» зависимостей;
- связь принципов SOLID друг с другом;
- KISS и YAGNI как противовес избыточной гибкости;
- цена абстракций и границы применения SOLID.
Главная мысль лекции:
Хороший дизайн не делает все изменения дешёвыми. Он делает дешёвыми важные изменения.
Архитектура не может защитить программу от изменений требований. Но она определяет, насколько далеко эти изменения распространятся и сколько мы заплатим за них в будущем. Поэтому проектирование можно рассматривать как осознанное распределение стоимости будущих изменений.