Лекция 1. Введение в операционные системы
1. Понятие операционной системы
Операционная система (ОС) — это комплекс системных программ, который управляет аппаратными ресурсами компьютера и предоставляет прикладным программам и пользователям удобный, унифицированный интерфейс для работы с вычислительной системой.
ОС можно рассматривать с двух точек зрения:
-
ОС как расширенная (виртуальная) машина. Реальное оборудование сложно и неоднородно: регистры контроллеров, протоколы шин, особенности чипсетов. ОС скрывает эту сложность за набором понятных абстракций — файл, процесс, сокет, окно — и предлагает программисту работать именно с ними.
-
ОС как менеджер ресурсов. Процессор, оперативная память, диски, сетевые адаптеры, устройства ввода-вывода — всё это ограниченные ресурсы. ОС распределяет их между конкурирующими программами, обеспечивая справедливость, изоляцию и эффективность.
Ключевые функции ОС:
| Функция | Описание | Пример |
|---|---|---|
| Управление процессами | Создание, планирование, завершение процессов и потоков | fork(), CreateProcess() |
| Управление памятью | Виртуальная память, страницы, выделение/освобождение | Страничная подкачка (swap) |
| Управление файлами | Иерархия каталогов, чтение/запись, контроль доступа | NTFS, ext4, APFS |
| Управление устройствами | Драйверы, буферизация, унифицированный доступ к I/O | Блочные и символьные устройства |
| Безопасность и защита | Аутентификация, разграничение прав, изоляция | ACL, capabilities, sandbox |
| Сетевые функции | Стек протоколов, сокеты, сетевые службы | TCP/IP, DNS-резолвер |
2. Историческое развитие операционных систем
Историю ОС удобно рассматривать как смену доминирующих моделей вычислений, а не просто хронологию продуктов. На каждом этапе менялись задачи, которые решала ОС, и абстракции, которые она предоставляла.
2.1. Ранний период (1940–1950-е): вычисления без ОС
- Машины работали без операционной системы: программа загружалась вручную (перфоленты, переключатели), занимала всю машину, выполнялась и выгружалась.
- Модель: одна машина — одна задача — один оператор.
- К концу 1950-х появляются примитивные мониторы пакетной обработки — прообраз будущих ОС: программа-резидент автоматически загружает и запускает задания из очереди.
2.2. Эра мейнфреймов (1960–1970-е): многозадачность и разделение времени
- Переход к мультипрограммированию: пока одна программа ждёт ввода-вывода, процессор выполняет другую.
- Появление разделения времени (time-sharing): несколько пользователей за терминалами одновременно работают с одной машиной. Каждый получает иллюзию монопольного владения.
- Формируются фундаментальные концепции: процесс, виртуальная память, файловая система, защита памяти, системные вызовы.
- Ключевые системы:
- Multics (1964) — амбициозный проект MIT/Bell Labs/GE, заложивший идеи иерархической файловой системы, колец защиты, динамического связывания.
- UNIX (1969, Bell Labs, Томпсон и Ритчи) — реакция на сложность Multics: простота, элегантность, «всё есть файл». Написана на C, что обеспечило переносимость.
2.3. Персональные компьютеры (1980–1990-е): ОС для каждого
- ОС становится массовым продуктом для индивидуального пользователя.
- MS-DOS (1981) — однозадачная, однопользовательская, командная строка. Простота ценой отсутствия защиты и многозадачности.
- Mac OS (1984) — первая коммерчески успешная ОС с GUI (метафора рабочего стола, мышь, окна).
- Windows 3.x → Windows 95/98 — графическая оболочка поверх DOS, затем полноценная (хоть и нестабильная) многозадачная ОС.
- Windows NT (1993) — принципиально новое ядро (Дэвид Катлер): настоящая многозадачность, защита памяти, поддержка нескольких подсистем (Win32, POSIX, OS/2).
- Linux (1991, Линус Торвальдс) — свободное монолитное ядро, ставшее основой целого семейства дистрибутивов.
2.4. Мобильные, облачные и виртуализованные системы (2000-е — настоящее время)
- Мобильные ОС: Android (ядро Linux + Java/Kotlin-фреймворк), iOS (ядро XNU + Objective-C/Swift-фреймворк). Приоритеты: энергоэффективность, безопасность, управление жизненным циклом приложений.
- Виртуализация и контейнеры: гипервизоры (VMware ESXi, Hyper-V, KVM), контейнеры (Docker, LXC). ОС больше не привязана к физическому оборудованию.
- Облачные вычисления: IaaS (AWS EC2), PaaS (Heroku), FaaS (AWS Lambda). Оркестрация контейнеров: Kubernetes.
- Встроенные и IoT-системы: FreeRTOS, Zephyr, Embedded Linux — ОС для устройств с ограниченными ресурсами.
Хронология:
1950s 1960s 1970s 1980s 1990s 2000s 2010s+ | | | | | | |Пакетная → Multics → UNIX/BSD → MS-DOS → Windows NT → Android → Контейнерыобработка Time- System V Mac OS Linux 1.0 iOS Kubernetes sharing Win 3.x FreeBSD Облако Edge/IoT3. Классификация операционных систем
Классификации ОС задают оси сравнения, позволяющие описывать системы по свойствам, а не по названиям.
3.1. По типу интерфейса
| Тип | Особенности | Примеры |
|---|---|---|
| CLI (командная строка) | Текстовые команды, конвейеры, автоматизация через скрипты | bash, zsh, PowerShell, cmd.exe |
| GUI (графический) | Окна, иконки, меню, мышь/тачскрин | Windows Explorer, macOS Finder, GNOME, KDE |
| Смешанный | CLI и GUI сосуществуют | Все современные настольные ОС |
3.2. По числу пользователей
- Однопользовательские: один активный пользователь (MS-DOS, ранние Windows, iOS формально).
- Многопользовательские: одновременная работа нескольких пользователей с разграничением прав (Linux, Windows Server, macOS).
3.3. По числу задач
- Однозадачные: одна программа в каждый момент (MS-DOS, CP/M).
- Многозадачные: несколько процессов «одновременно». Два подхода:
- Кооперативная многозадачность — процесс сам отдаёт управление (Windows 3.x, classic Mac OS).
- Вытесняющая (preemptive) многозадачность — ОС принудительно прерывает процесс по истечении кванта времени (Linux, Windows NT+, macOS).
3.4. По типу обработки
- Пакетные (batch): задания ставятся в очередь и выполняются без взаимодействия с пользователем. Важна пропускная способность.
- Интерактивные: пользователь ожидает быстрого отклика (< 1 с). Планировщик отдаёт приоритет задачам, связанным с вводом-выводом.
- Реального времени (RTOS): гарантированное время реакции (deadline). Жёсткое реальное время (QNX, VxWorks) — нарушение deadline = авария; мягкое (Android low-latency audio) — нарушение нежелательно, но допустимо.
3.5. По архитектуре ядра
Подробно рассмотрена в разделе 5.
4. Семейства операционных систем
Современные ОС не возникли на пустом месте — они имеют общие корни и развивались ветвящимися путями.
4.1. Генеалогическое дерево UNIX
UNIX (1969, Bell Labs) / | \ BSD (1977) System V Xenix / | | FreeBSD OpenBSD Solaris NetBSD AIX, HP-UX \ Darwin/XNU ──── macOS, iOS
(независимо) Minix (1987) ──── вдохновил ──── Linux (1991) / \ Debian Red Hat Ubuntu Fedora, CentOS Mint RHEL Android (ядро Linux)4.2. Семейство Windows NT
Windows NT 3.1 (1993) | Windows NT 4.0 (1996) | Windows 2000 | Windows XP (2001) | Windows Vista → 7 → 8 → 10 → 11 | Windows Server 2003 → 2008 → 2012 → 2016 → 2019 → 2022Все версии, начиная с XP, основаны на ядре NT — гибридном ядре с поддержкой многозадачности, виртуальной памяти, подсистем среды (Win32, WSL).
4.3. Ключевые различия семейств
| Характеристика | Unix/Linux | Windows NT | macOS (XNU) |
|---|---|---|---|
| Тип ядра | Монолитное (модульное) | Гибридное | Гибридное (Mach + BSD) |
| Лицензия | GPL (Linux), BSD | Проприетарная | Проприетарная (Darwin — open source) |
| Философия | «Всё есть файл», малые утилиты | Интеграция, обратная совместимость | Интеграция HW + SW, UX |
| Shell по умолчанию | bash / zsh | cmd.exe / PowerShell | zsh (ранее bash) |
| Пакетный менеджер | apt, dnf, pacman и др. | winget, MSIX | brew (неофициально), pkg |
| POSIX-совместимость | Да (полная) | Частичная (через WSL) | Да (сертифицирована) |
5. Архитектура ОС: типы ядер
Ядро (kernel) — это центральная, постоянно находящаяся в памяти часть ОС, работающая в привилегированном режиме процессора. Архитектура ядра определяет, какие компоненты работают в привилегированном пространстве, а какие — в пользовательском.
5.1. Монолитное ядро
Все основные подсистемы (планировщик, управление памятью, файловые системы, драйверы, сетевой стек) работают в едином адресном пространстве ядра.
┌──────────────────────────────────────────────────┐│ Пользовательское пространство ││ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ││ │ App1 │ │ App2 │ │ App3 │ │Shell │ ││ └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘ │├─────┼────────┼────────┼────────┼─────────────────┤│ └────────┴────────┴────────┘ ││ Системные вызовы (syscall interface) ││ ┌────────────────────────────────────────────┐ ││ │ М О Н О Л И Т Н О Е Я Д Р О │ ││ │ Планировщик │ Память │ VFS │ Драйверы │ │ ││ │ Сетевой стек │ IPC │ Безопасность │ │ ││ └────────────────────────────────────────────┘ ││ Пространство ядра (ring 0) │└──────────────────────────────────────────────────┘Примеры: Linux, классические UNIX, FreeBSD.
5.2. Микроядро
Ядро содержит только минимум: переключение контекста, межпроцессное взаимодействие (IPC), базовое управление памятью. Всё остальное — серверы в пользовательском пространстве.
┌──────────────────────────────────────────────────┐│ Пользовательское пространство ││ ┌──────┐ ┌───────┐ ┌──────┐ ┌─────────┐ ││ │ App │ │Файл. │ │Драй- │ │Сетевой │ ││ │ │ │сервер │ │вер │ │сервер │ ││ └──┬───┘ └──┬────┘ └──┬───┘ └──┬──────┘ │├─────┼─────────┼──────────┼─────────┼─────────────┤│ ┌──┴─────────┴──────────┴─────────┴──────────┐ ││ │ М И К Р О Я Д Р О │ ││ │ IPC │ Планировщик │ Базовая память │ ││ └────────────────────────────────────────────┘ ││ Пространство ядра (ring 0) │└──────────────────────────────────────────────────┘Примеры: Minix 3, QNX, L4, seL4 (формально верифицированное).
5.3. Гибридное ядро
Компромисс: архитектурно напоминает микроядро, но часть сервисов (драйверы, файловые системы) перенесена в пространство ядра ради производительности.
Примеры: Windows NT (ntoskrnl.exe + Executive + HAL), macOS/XNU (Mach + BSD-слой).
5.4. Сравнительная таблица
| Критерий | Монолитное | Микроядро | Гибридное |
|---|---|---|---|
| Размер ядра | Большой (миллионы строк) | Минимальный (тысячи строк) | Средний |
| Производительность | Высокая (нет переключений) | Ниже (IPC между сервисами) | Высокая |
| Надёжность | Ошибка в драйвере → крах ОС | Сбой сервера не роняет ядро | Компромисс |
| Безопасность | Большая поверхность атаки | Минимальная TCB | Средняя TCB |
| Модульность | Загружаемые модули (LKM) | Все компоненты — отдельные процессы | Частичная |
| Примеры | Linux, FreeBSD | QNX, Minix 3, seL4 | Windows NT, macOS/XNU |
| Верификация | Затруднена | Возможна (seL4) | Затруднена |
6. Ядро: пространство ядра и пространство пользователя
6.1. Два мира
Современные ОС делят всё выполняемое ПО на два уровня:
- Пространство ядра (kernel space) — привилегированный код ОС. Имеет прямой доступ к оборудованию, всей памяти, всем инструкциям процессора.
- Пространство пользователя (user space) — прикладные программы. Ограничены в правах: не могут напрямую обращаться к оборудованию или чужой памяти.
6.2. Системные вызовы (syscalls)
Системные вызовы — единственный легальный способ для программы из user space запросить услугу ядра.
Схема вызова:
Приложение (user space) Ядро (kernel space) │ │ │ write(fd, buf, n) │ │──── syscall (прерывание) ────>│ │ │ проверка прав │ │ копирование данных │ │ запись на диск │<──── возврат результата ──────│ │ │Основные категории системных вызовов:
| Категория | Примеры (POSIX / Linux) | Аналог Windows API |
|---|---|---|
| Процессы | fork(), exec(), wait(), exit() | CreateProcess(), ExitProcess() |
| Файлы | open(), read(), write(), close() | CreateFile(), ReadFile(), WriteFile() |
| Память | mmap(), brk(), munmap() | VirtualAlloc(), VirtualFree() |
| Устройства | ioctl(), read(), write() | DeviceIoControl() |
| Сеть | socket(), bind(), listen(), accept() | WSASocket(), bind(), listen() |
| Информация | getpid(), uname(), time() | GetCurrentProcessId(), GetSystemInfo() |
7. Режимы работы процессора
7.1. User mode и Kernel mode
Процессор аппаратно поддерживает как минимум два режима работы:
- User mode (непривилегированный): запрещён доступ к портам ввода-вывода, привилегированным инструкциям, чужим областям памяти. Попытка выполнить запрещённую инструкцию вызывает исключение (trap).
- Kernel mode (привилегированный): доступны все инструкции процессора, вся память, все устройства.
7.2. Кольца защиты (Protection Rings)
Архитектура x86 определяет 4 кольца (ring 0–3):
┌─────────────────────────────┐ │ Ring 3 (User) │ ← Приложения │ ┌─────────────────────┐ │ │ │ Ring 2 (Службы) │ │ ← Обычно не используется │ │ ┌───────────────┐ │ │ │ │ │ Ring 1 (Др.) │ │ │ ← Обычно не используется │ │ │ ┌─────────┐ │ │ │ │ │ │ │ Ring 0 │ │ │ │ ← Ядро ОС │ │ │ │ (Ядро) │ │ │ │ │ │ │ └─────────┘ │ │ │ │ │ └───────────────┘ │ │ │ └─────────────────────┘ │ └─────────────────────────────┘На практике большинство ОС используют только ring 0 (ядро) и ring 3 (приложения). Кольца 1 и 2 практически не задействованы. Гипервизоры могут использовать ring -1 (VMX root mode на Intel).
7.3. Прерывания и ловушки
Прерывание (interrupt) — асинхронный сигнал от оборудования (таймер, клавиатура, сетевая карта), заставляющий процессор приостановить текущую задачу и передать управление обработчику в ядре.
Ловушка (trap) — синхронное событие, инициированное программой:
- Системный вызов — намеренная ловушка (
int 0x80,syscall,svcна ARM). - Исключение — ошибочная ситуация (деление на ноль, обращение к несуществующей странице памяти).
Переключение между режимами:
User mode Kernel mode │ │ │ ── прерывание / trap ────────> │ Сохранение контекста │ │ Обработка │ <── возврат (iret / sysret) ── │ Восстановление контекста │ │Каждое переключение имеет накладные расходы: сохранение/восстановление регистров, сброс конвейера процессора, обновление TLB.
8. Оболочка (Shell) как интерфейс к ядру
8.1. Что такое оболочка
Оболочка (shell) — это обычная программа (не часть ядра!), предоставляющая пользователю интерфейс для взаимодействия с ОС. Оболочка принимает команды, транслирует их в системные вызовы и отображает результаты.
8.2. Командные оболочки (CLI)
| Оболочка | ОС | Особенности |
|---|---|---|
| bash | Linux, macOS (до Catalina) | Стандарт де-факто в мире Unix; скрипты, конвейеры |
| zsh | macOS (с Catalina), Linux | Совместима с bash, расширенное автодополнение |
| fish | Кроссплатформенная | Автоподсказки, цветная подсветка «из коробки» |
| PowerShell | Windows, Linux, macOS | Объектный конвейер (передаёт не текст, а объекты .NET) |
| cmd.exe | Windows | Устаревшая, ограниченные возможности, обратная совместимость |
Принцип работы CLI-оболочки:
Цикл: чтение → разбор → выполнение → вывод (Read-Eval-Print Loop)
$ ls -la /home # 1. Пользователь вводит команду # 2. Shell разбирает: программа=ls, аргументы=-la /home # 3. Shell вызывает fork() + exec("ls", "-la", "/home") # 4. ls выполняется, выводит результат # 5. Shell ждёт завершения (wait()), печатает приглашение$ # 6. Готов к следующей команде8.3. Графические оболочки (GUI)
| Оболочка | ОС | Описание |
|---|---|---|
| Windows Explorer (explorer.exe) | Windows | Рабочий стол, панель задач, файловый менеджер |
| macOS Finder | macOS | Рабочий стол, Dock, файловый менеджер |
| GNOME | Linux | Минималистичный DE, основан на GTK |
| KDE Plasma | Linux | Богатая настройка, основан на Qt |
| Xfce | Linux | Лёгкий, для старых машин |
Важно: GUI-оболочка — это программа поверх ядра, а не его часть. В Linux можно заменить GNOME на KDE без переустановки ОС. В Windows Explorer можно завершить и перезапустить через диспетчер задач.
9. Загрузка операционной системы
Процесс от нажатия кнопки питания до рабочего стола состоит из нескольких этапов:
9.1. Пошаговый процесс загрузки
Шаг 1: Подача питания │ ▼Шаг 2: POST (Power-On Self-Test) │ Проверка оборудования: CPU, RAM, видео, диски │ ▼Шаг 3: BIOS / UEFI │ Поиск загрузочного устройства │ BIOS: чтение MBR (первые 512 байт диска) │ UEFI: чтение EFI System Partition (ESP), файл .efi │ ▼Шаг 4: Загрузчик (Boot Loader) │ Linux: GRUB — выбор ядра, передача параметров │ Windows: Windows Boot Manager (bootmgr) → winload.efi │ macOS: boot.efi (встроен в прошивку Apple Silicon) │ ▼Шаг 5: Загрузка ядра │ Ядро распаковывается в память │ Инициализация подсистем: память, планировщик, драйверы │ Монтирование корневой файловой системы │ ▼Шаг 6: Первый процесс (init) │ Linux: systemd (PID 1) — запуск служб по зависимостям │ Windows: smss.exe → csrss.exe → wininit.exe → services.exe │ macOS: launchd (PID 1) — аналог systemd │ ▼Шаг 7: Пользовательская среда Запуск оболочки: экран входа → рабочий стол / TTY9.2. BIOS vs UEFI
| Параметр | BIOS | UEFI |
|---|---|---|
| Год появления | 1975 | ~2005 |
| Разрядность | 16-бит (real mode) | 32/64-бит |
| Разметка диска | MBR (до 2 ТБ, 4 раздела) | GPT (до 9.4 ЗБ, 128 разделов) |
| Интерфейс | Текстовый | Графический (мышь) |
| Безопасная загрузка | Нет | Secure Boot (проверка подписей) |
| Скорость загрузки | Медленнее | Быстрее |
10. Основные компоненты ОС: итоговая схема
┌─────────────────────────────────────────────────────────────┐│ Пользователь │├─────────────────────────────────────────────────────────────┤│ Приложения: браузер, редактор, IDE, игры ... │├─────────────────────────────────────────────────────────────┤│ Системные утилиты: ls, ps, top, Task Manager, Activity ││ Monitor, компиляторы, пакетные менеджеры │├─────────────────────────────────────────────────────────────┤│ Оболочка (Shell): bash, zsh, PowerShell / GUI (GNOME, ││ Windows Explorer, Finder) │├─────────────────────────────────────────────────────────────┤│ Системные библиотеки и API: libc (glibc, musl), ││ Win32 API, Cocoa/AppKit, POSIX │├─────────────────────────────────────────────────────────────┤│ ═══════════ Граница user space / kernel space ═══════════ │├─────────────────────────────────────────────────────────────┤│ Интерфейс системных вызовов (syscall interface) │├─────────────────────────────────────────────────────────────┤│ Ядро (Kernel): ││ • Планировщик процессов • Управление памятью ││ • Виртуальная файловая сист. • Сетевой стек ││ • Подсистема безопасности • IPC │├─────────────────────────────────────────────────────────────┤│ Драйверы устройств │├─────────────────────────────────────────────────────────────┤│ Аппаратное обеспечение (Hardware): ││ CPU, RAM, HDD/SSD, GPU, NIC, USB, ... │└─────────────────────────────────────────────────────────────┘Ключевые компоненты:
- Ядро — центральная часть, управляет ресурсами, работает в ring 0.
- Системные библиотеки — обёртки над системными вызовами (glibc в Linux, ntdll.dll в Windows, libSystem в macOS).
- Оболочка — интерфейс пользователя (CLI/GUI).
- Утилиты — инструменты администрирования и разработки.
- Драйверы — модули для взаимодействия с конкретным оборудованием.
11. Вопросы для самопроверки
-
Дайте определение операционной системы. В чём состоят две основные роли ОС (как виртуальная машина и как менеджер ресурсов)?
-
Назовите четыре основных этапа развития ОС. Какую ключевую проблему решала ОС на каждом этапе?
-
Чем вытесняющая многозадачность отличается от кооперативной? Приведите примеры ОС для каждого типа.
-
Нарисуйте таблицу сравнения монолитного ядра, микроядра и гибридного ядра. Укажите по два примера ОС для каждого типа.
-
Что такое системный вызов? Почему прикладная программа не может напрямую обратиться к оборудованию?
-
Объясните разницу между пространством ядра и пространством пользователя. Что произойдёт, если программа в user mode попытается выполнить привилегированную инструкцию?
-
Опишите процесс загрузки компьютера от нажатия кнопки питания до появления рабочего стола. Какую роль играет загрузчик?
-
В чём различие между BIOS и UEFI? Почему современные системы переходят на UEFI?
-
Объясните, почему оболочка (shell) — это обычная программа, а не часть ядра. Можно ли заменить оболочку в Linux? В Windows?
-
Какое место занимает macOS в генеалогическом дереве UNIX? Какие компоненты macOS имеют открытый исходный код?