Чему вы научитесь
- Знать историю и эволюцию ОС, от первых ламповых машин до современных систем, включая ключевые вехи: UNIX, MS-DOS, Linux.
- Разбираться в архитектуре ОС: понимать различия между монолитным, микроядерным и гибридным ядрами, а также принципы работы основных компонентов (ядро, системные вызовы, оболочка).
- Программировать на низком уровне в Unix/Linux: уверенно работать с системными вызовами open, read, write, close, fork, exec, wait, stat, lstat, chmod, chown.
- Управлять процессами и потоками: создавать, запускать и ожидать завершения дочерних процессов, управлять их жизненным циклом, предотвращать появление "зомби".
- Организовывать межпроцессное взаимодействие (IPC): использовать каналы (pipes), именованные каналы (FIFO), очереди сообщений, семафоры и разделяемую память для обмена данными между процессами.
- Работать с файловой системой: понимать концепцию "всё есть файл", управлять файлами и каталогами, работать с инодами, жёсткими и символическими ссылками, анализировать метаданные файлов.
- Синхронизировать потоки: применять мьютексы, условные переменные и другие примитивы для защиты критических секций и предотвращения состояний гонки и взаимоблокировок (deadlock).
- Работать с виртуальной памятью: понимать принципы страничной организации памяти, работу MMU и TLB, механизм page fault, а также использовать системные вызовы brk, sbrk, mmap и munmap для управления памятью.
- Использовать буферизованный и небуферизованный ввод-вывод: выбирать подходящий метод в зависимости от задачи, понимать различия между stdio.h и прямым использованием системных вызовов, а также работать с флагами вроде O_DIRECT для прямого доступа к устройствам.
- Анализировать состояние системы: читать и интерпретировать информацию из /proc/pid/maps и других системных файлов для диагностики и отладки.
- Применять полученные знания на практике: реализовывать аналоги утилит (cat, cp, ls), простые шеллы, клиент-серверные приложения и многопоточные программы.
О курсе
Этот курс — ваш проводник в глубину устройства операционных систем, от их исторических корней до современных архитектур и практик. Мы не просто перечислим факты, а проведем вас через ключевые концепции, которые лежат в основе всех современных компьютеров: от вашего смартфона до суперкомпьютера.
Вы поймете, как устроены системы, которые вы используете каждый день. Мы начнем с истории, проследим эволюцию от первых ламповых машин к UNIX, Linux и Windows, чтобы понять, почему ОС стали такими, какие они есть. Затем перейдем к внутреннему устройству: ядру, системным вызовам, файловым системам, управлению процессами и памятью.
Курс построен на практике. Вы не просто будете читать теорию — вы напишете свои собственные аналоги cat, cp и даже простой shell на C. Вы научитесь работать с системными вызовами open, read, write, fork, exec, pipe, mmap и многими другими, чтобы понять, как на самом деле работает ваша система. Мы разберем, что такое процессы, потоки, мьютексы, условные переменные и как с ними работать, чтобы избежать гонок и взаимоблокировок.
Ключевая цель — дать вам системное мышление. Вы выйдете из курса с чётким пониманием того, как программа запускается, как она взаимодействует с ядром, как данные передаются между процессами и почему ваш printf в итоге выводится на экран. Это знание необходимо для любого серьезного разработчика, системного администратора или инженера, стремящегося понимать, а не просто использовать технологии.
Для кого этот курс
Начальные требования
Для успешного прохождения курса рекомендуется иметь базовые знания и навыки в следующих областях:
- Основы программирования. Необходимо понимать базовые концепции, такие как переменные, циклы, условные операторы, функции и структуры данных. Опыт программирования на любом языке (C, Python, Java и др.) будет полезен.
- Работа с командной строкой (терминалом). Умение выполнять базовые команды в оболочке (например,
cd,ls,mkdir,touch,cat,man) и работать с файловой системой — ключевой навык для выполнения лабораторных работ. - Базовые знания Linux/UNIX. Понимание того, что такое операционная система, процесс, файл, каталог, а также знакомство с основными принципами работы Unix-подобных систем (например, "всё есть файл") поможет быстрее погрузиться в материал.
- Навыки работы с текстовыми редакторами. Умение создавать и редактировать файлы с помощью редакторов в терминале (например,
nano,vim) или графических редакторов.
Курс не предполагает глубокого знания C, но большая часть практической части будет выполняться на этом языке. Поэтому наличие хотя бы минимального опыта работы с C (или готовность быстро освоить его) значительно упростит обучение. Для тех, кто хочет использовать более современные языки, будут предоставлены примеры на Rust, Go и Python.
Главное требование — это мотивация и желание разобраться в том, как устроены компьютеры изнутри. Курс построен от простого к сложному, и все необходимые концепции будут объяснены.
Наши преподаватели
Как проходит обучение
Обучение в этом курсе построено на глубоком погружении в материал через сочетание теории и практики. Курс не ограничивается пассивным прослушиванием лекций — он требует активного участия и самостоятельной работы.
Программа курса
Что вы получаете
- Глубокое системное мышление. Вы перестанете просто использовать операционные системы и начнёте понимать, как они устроены изнутри — от ядра до пользовательских приложений. Это фундаментальное знание, необходимое для решения сложных задач.
- Практические навыки программирования на C. Вы научитесь писать код, который напрямую взаимодействует с ядром ОС, используя системные вызовы open, read, write, fork, exec, pipe и другие. Вы реализуете аналоги утилит (cat, cp, ls) и создадите собственный простой shell.
- Мастерство работы с командной строкой. Вы освоите не только базовые команды, но и продвинутые техники: управление файлами и правами доступа, написание скриптов на Bash и Python, анализ системных данных.
- Уверенность в работе с процессами и потоками. Вы поймете разницу между процессом и потоком, научитесь создавать и управлять ими, а также решать ключевые проблемы параллелизма — состояние гонки и взаимоблокировку — с помощью мьютексов, условных переменных и других примитивов синхронизации.
- Навыки анализа и диагностики. Вы научитесь читать и интерпретировать информацию о системе, используя такие инструменты, как /proc/pid/maps, что позволит вам диагностировать проблемы производительности и поведения программ.