Введение в архитектуру ОС: история развития, функции ядра и системные вызовы
Введение в архитектуру ОС: история развития, функции ядра и системные вызовы
Добро пожаловать в курс «Основы операционных систем». Представьте, что вы купили самый современный, мощный и дорогой компьютер. У него лучший процессор, гигабайты оперативной памяти и сверхбыстрый диск. Но если на нём не установлена операционная система (ОС), это «железо» — просто груда дорогого металла и пластика. Оно не умеет ничего: ни показать картинку, ни сохранить файл, ни даже отреагировать на нажатие клавиши.
В этой статье мы разберем, как операционная система оживляет компьютер, какой путь она прошла от перфокарт до смартфонов, и что находится у неё «под капотом».
Что такое операционная система?
Операционная система — это комплекс программ, который управляет аппаратным обеспечением компьютера и предоставляет среду для выполнения пользовательских программ. Это посредник между вами (и вашими приложениями) и «железом».
Лучшая аналогия для ОС — это дирижер оркестра.
- Музыканты — это аппаратные ресурсы (процессор, память, диск).
- Ноты — это программы, которые нужно исполнить.
- Дирижер (ОС) — не играет на инструментах сам, но указывает, кому и когда вступать, следит за темпом и предотвращает какофонию, когда все пытаются играть одновременно.
История развития: от вакуумных ламп до облаков
Чтобы понять архитектуру современных систем, нужно взглянуть на то, какие проблемы решали инженеры в прошлом.
Первое поколение (1945–1955): Вакуумные лампы и коммутационные панели
В те времена операционных систем не существовало вовсе. Компьютеры были огромными машинами, занимавшими целые залы. Программисты работали непосредственно с аппаратурой, соединяя провода на коммутационных панелях. Это был «чистый» режим работы с железом. Если программа зависала, нужно было физически перезагружать машину.
Второе поколение (1955–1965): Транзисторы и пакетная обработка
С появлением транзисторов компьютеры стали надежнее. Появилась первая концепция ОС — системы пакетной обработки. Чтобы не терять дорогое машинное время, пока оператор меняет ленты, задания собирались в «пакет» (batch) и скармливались компьютеру одно за другим.
Третье поколение (1965–1980): Интегральные схемы и мультипрограммирование
Это был революционный этап. Появилась идея мультипрограммирования. Процессор работал намного быстрее, чем устройства ввода-вывода (например, считыватели перфокарт). Пока одна программа ждала данные, процессор простаивал.
Мультипрограммирование решило эту проблему: память разбивалась на части, и в ней находилось сразу несколько программ. Когда одна ждала ввода-вывода, ОС переключала процессор на другую.
Для оценки эффективности мультипрограммирования используется следующая формула загрузки процессора:
Где:
- — коэффициент использования процессора (Utilization).
- — доля времени, которую процесс проводит в ожидании ввода-вывода (например, 0.5 или 50%).
- — количество процессов в памяти.
- — единица, представляющая полное время.
Пример: Если процесс тратит 80% времени на ожидание ввода-вывода (), то при одном процессе () процессор занят только 20% времени. Но если запустить 3 таких процесса, загрузка вырастет: , то есть почти 49%.
Четвертое поколение (1980–настоящее время): Персональные компьютеры
Появление LSI (больших интегральных схем) привело к созданию ПК. Операционные системы стали дружелюбными к пользователю (GUI — графический интерфейс), появилась поддержка сетей и распределенных вычислений.
Архитектура ОС: Ядро и режимы работы
Сердцем любой операционной системы является Ядро (Kernel). Это та часть программы, которая загружается в память первой при включении компьютера и остается там до самого выключения.
Защита: Кольца привилегий
Главная задача архитектуры — надежность. Если обычная программа (например, игра) зависнет, она не должна «убить» весь компьютер. Для этого процессоры поддерживают как минимум два режима работы:
- Режим пользователя (User Mode): В этом режиме работают ваши приложения (браузер, Word). У них ограниченные права: они не могут напрямую обращаться к диску или управлять памятью других программ.
- Режим ядра (Kernel Mode): В этом режиме работает ядро ОС. Ему разрешено всё: доступ к любой ячейке памяти, выполнение любой инструкции процессора.
Типы ядер
Существует два основных подхода к построению ядра:
- Монолитное ядро: Вся ОС (файловая система, драйверы, управление памятью) работает как одна большая программа в режиме ядра. Это быстро, но если драйвер видеокарты упадет, упадет вся система. (Примеры: Linux, ранние Windows).
- Микроядро: В режиме ядра работает только самый минимум (передача сообщений, управление процессами). Драйверы и файловые системы вынесены в режим пользователя. Это надежнее, но медленнее из-за постоянных переключений. (Примеры: Minix, QNX).
Основные функции ядра
Чем именно занимается ядро? Можно выделить пять ключевых функций:
- Управление процессами: Создание, остановка и переключение программ. Ядро решает, кому дать процессорное время (планирование).
- Управление памятью: Ядро следит за тем, какая часть памяти занята, а какая свободна. Оно предотвращает ситуации, когда одна программа случайно перезаписывает данные другой.
- Управление файловой системой: Превращение хаоса на магнитном диске или SSD в стройную структуру папок и файлов.
- Управление вводом-выводом: Общение с клавиатурой, мышью, монитором, принтером через драйверы.
- Безопасность и защита: Проверка прав доступа пользователей к файлам и ресурсам.
Системные вызовы (System Calls)
Как программа в режиме пользователя может прочитать файл, если доступ к диску разрешен только в режиме ядра? Она должна «попросить» об этом операционную систему.
Системный вызов — это интерфейс между приложением и ядром. Это специальная команда, которая говорит процессору: «Переключись в режим ядра, выполни эту функцию ОС и верни мне результат».
Представьте ресторан:
- Вы (приложение) сидите за столиком.
- Кухня (ядро/железо) готовит еду.
- Вы не можете просто зайти на кухню и взять стейк (это небезопасно и нарушает правила).
- Вы зовете официанта (системный вызов) и просите его принести заказ.
Примеры системных вызовов (в мире UNIX/Linux):
fork()— создать новый процесс (копию текущего).read()— прочитать данные из файла.write()— записать данные в файл или на экран.open()— открыть файл для работы.
Когда вы в программе на Python пишете `print(