Перейти к содержимому

Лекция 1. Введение в операционные системы


1. Понятие операционной системы

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

ОС можно рассматривать с двух точек зрения:

  1. ОС как расширенная (виртуальная) машина. Реальное оборудование сложно и неоднородно: регистры контроллеров, протоколы шин, особенности чипсетов. ОС скрывает эту сложность за набором понятных абстракций — файл, процесс, сокет, окно — и предлагает программисту работать именно с ними.

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

Ключевые функции ОС:

ФункцияОписаниеПример
Управление процессамиСоздание, планирование, завершение процессов и потоков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/IoT

3. Классификация операционных систем

Классификации ОС задают оси сравнения, позволяющие описывать системы по свойствам, а не по названиям.

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/LinuxWindows NTmacOS (XNU)
Тип ядраМонолитное (модульное)ГибридноеГибридное (Mach + BSD)
ЛицензияGPL (Linux), BSDПроприетарнаяПроприетарная (Darwin — open source)
Философия«Всё есть файл», малые утилитыИнтеграция, обратная совместимостьИнтеграция HW + SW, UX
Shell по умолчаниюbash / zshcmd.exe / PowerShellzsh (ранее bash)
Пакетный менеджерapt, dnf, pacman и др.winget, MSIXbrew (неофициально), 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, FreeBSDQNX, Minix 3, seL4Windows 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)

ОболочкаОСОсобенности
bashLinux, macOS (до Catalina)Стандарт де-факто в мире Unix; скрипты, конвейеры
zshmacOS (с Catalina), LinuxСовместима с bash, расширенное автодополнение
fishКроссплатформеннаяАвтоподсказки, цветная подсветка «из коробки»
PowerShellWindows, Linux, macOSОбъектный конвейер (передаёт не текст, а объекты .NET)
cmd.exeWindowsУстаревшая, ограниченные возможности, обратная совместимость

Принцип работы 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 FindermacOSРабочий стол, Dock, файловый менеджер
GNOMELinuxМинималистичный DE, основан на GTK
KDE PlasmaLinuxБогатая настройка, основан на Qt
XfceLinuxЛёгкий, для старых машин

Важно: 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: Пользовательская среда
Запуск оболочки: экран входа → рабочий стол / TTY

9.2. BIOS vs UEFI

ПараметрBIOSUEFI
Год появления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, ... │
└─────────────────────────────────────────────────────────────┘

Ключевые компоненты:

  1. Ядро — центральная часть, управляет ресурсами, работает в ring 0.
  2. Системные библиотеки — обёртки над системными вызовами (glibc в Linux, ntdll.dll в Windows, libSystem в macOS).
  3. Оболочка — интерфейс пользователя (CLI/GUI).
  4. Утилиты — инструменты администрирования и разработки.
  5. Драйверы — модули для взаимодействия с конкретным оборудованием.

11. Вопросы для самопроверки

  1. Дайте определение операционной системы. В чём состоят две основные роли ОС (как виртуальная машина и как менеджер ресурсов)?

  2. Назовите четыре основных этапа развития ОС. Какую ключевую проблему решала ОС на каждом этапе?

  3. Чем вытесняющая многозадачность отличается от кооперативной? Приведите примеры ОС для каждого типа.

  4. Нарисуйте таблицу сравнения монолитного ядра, микроядра и гибридного ядра. Укажите по два примера ОС для каждого типа.

  5. Что такое системный вызов? Почему прикладная программа не может напрямую обратиться к оборудованию?

  6. Объясните разницу между пространством ядра и пространством пользователя. Что произойдёт, если программа в user mode попытается выполнить привилегированную инструкцию?

  7. Опишите процесс загрузки компьютера от нажатия кнопки питания до появления рабочего стола. Какую роль играет загрузчик?

  8. В чём различие между BIOS и UEFI? Почему современные системы переходят на UEFI?

  9. Объясните, почему оболочка (shell) — это обычная программа, а не часть ядра. Можно ли заменить оболочку в Linux? В Windows?

  10. Какое место занимает macOS в генеалогическом дереве UNIX? Какие компоненты macOS имеют открытый исходный код?