Содержание
- Что такое операционная система и как она работает
- Введение
- Зачем нужна операционная система?
- Функции ОС
- Основные абстракции ОС
- Как ОС загружается в компьютер
- Что делает ядро ОС
- Прерывания
- Как приложения взаимодействуют с ОС
- Как оборудование взаимодействует с ОС
- Что это значит?
- Сервисы ОС
- Основные
- Дополнительные
- Очновные абстракции
- Процесс
- Поток
- Файл
- Реализация многозадачности
- Переключение контекста
- Критические секции и блокировки
- Адреса и управление памятью
- Итог
- Основные механизмы
- Абстракции
Введение
Операционные системы окружают нас повсюду – это основное программное обеспечение персональных компьютеров, серверов, мобильных устройств, сетевых устройств (роутеры, коммутаторы) и даже современных автомобилей (борт-компьютер), телевизоров и прочего. Перечислять можно очень долго, ведь они требуются практически в каждой компьютерной системе.
Любой компьютер представляет собой связанную совокупность: процессора, памяти и устройств ввода-вывода.
Сама по себе, аппаратура умеет делать только очень простые, базовые операции - по типу: сложить два числа, перейти к адресу, записать по адресу и тд.
Например, процессор умеет выполнять только четыре базовых типа инструкции:
- Чтение инструкций/данных из памяти (read)
- Выполнение интрукции (execute)
- Запись результата в память (write)
- Прерывание (interrupt)
Получается, что непосредственное создание и управление сложными процессами (приложениями) на аппаратуре становится крайне неэффективным и неудобным. То есть, например, создать и запустить на исполнение программу-браузер исключительно с помощью данных инструкций становится крайне сложной задачей. Особенно при условии, что помимо этого процесса (браузера) существуют и другие процессы, которые также пользуются ресурсами вычислительной машины.
Возникает вопрос — Как заставить всё это слаженно и эффективно работать, сделав пользование компьютером удобным как для обычного человека, так и для прикладного программиста?
Зачем нужна Операционная Система?
Операционная система - программная система, которая управляет ресурсами компьютера, а следовательно осуществляет доступ к этим ресурсам, управляет процессами, вводит и реализует различные абстракции, выполняет другие системные функции.
Существует три ключевых элемента операционной системы:
- Абстракции (процессы, потоки, файлы, сокеты, адресное пространство).
- Функции (создание, управление, открытие, запись, распределение).
- Конкретные реализации
- Архитектуры: монолитные, модульные, гибридные;
- Алгоритмы: LRU, EDF;
Фунции ОС
- Управление ресурсами и процессами, а также совместное использование вычислительных ресурсов группой приложений (многозадачность) — центральная функция ОС, которая является базой для разных системных архитектур
- Scheduler — планировщик. Механизм управляющий процессами и реализующий многозадачность.
- Memory manager — менеджер памяти. Механизм выделяющий память и управляющий ею.
- Абстракция оборудования для удобства и переносимости
- то есть реализация единого интерфейса для разного, но схожего по функциям оборудования.
- Изоляция ошибок приложений друг от друга (и от ядра ОС)
- Переносимость данных между приложениями (процессами)
- Inter Process Communication (IPC) — Механизм межпроцессного взаимодействия
- файлы и файловая система
Основные абстракции ОС
- Процессы и потоки - программы, что находятся в оперативной памяти и обрабатываются процессором. Другими словами - исполнение программы.
- Файлы и файловые системы - некоторая структура данных и связи между этими структурами, универсальный системный интерфейс.
- Адресное пространство и память - распределение и управление памятью.
- Сокеты, протоколы, устройства - интерфейсы взаимодействия.
Положение ОС в многоуровневой иерархии организации компьютера
Современный компьютер можно представить в виде иерархии уровней (от двух и более), где на каждом уровне выделяются свои абстракции и набор возможных функций.
Операционная система является одним из таких уровней и представляет собой интерфейс («прослойку») между пользователем ресурсов компьютера и самими ресурсами, управляющий взаимодействиями как между пользователь-ресурс, так и пользователь-пользователь, устройство-устройство.
В целом, общей схемой это можно отобразить так:
Как операционная система загружается в компьютер?
Процесс загрузки операционной системы и вообще компьютера имеет несколько этапов, основные из которых:
- Запуск компьютера – на процессор подаётся напряжение, и его элекрические компоненты начинают работу.
- Процессор начинает исполнять инструкции с фиксированного, аппаратно зашитого в него адреса.
- По этому адресу находится специальная программа POST – Power On Self Test. Которая проверяет работоспособность основных компонентов вычислительной системы.
- Далее, управление передаётся BIOS’y — Basic Input Output System (Базовая система ввода-вывода), которая инициализирует основные устройства ввода-вывода: загрузочные устройства (раличные хранители информации: HDD, SSD, Flash и так далее), клавиатура, монитор и прочее.
- BIOS обращается к загрузочному устройству и читает первый блок данных, на котором должен находиться загрузчик. Загружает его в память и передаёт ему управление.
- Загрузчик загружает в память и инициализирует основные компоненты операционной системы, и передаёт ей управление.
- Операционная система запускает таймер, который будет возвращать управление операционной системе каждый, заранее установленный разработчиками ОС, квантвремени. Это делается для реализация Scheduler’a - планировщика, чтобы ОС могла управлять и контролировать процессы.
- Операционная система создаёт первый процесс-пользователя и дальше от него начинают множится другие процессы.
Что делает ядро ОС?
Ядро ОС – центральная часть операционной системы. По сути, это и есть ОС.
- Обрабывает запросы приложений
- системные вызовы (программные прерывания)
- Обрабывает запросы оборудования
- прерывания
- Обрабатывает исключительные ситуации
- Разного рода ошибки
- Обеспечивает диспетчеризацию процессов (scheduling)
- реализация многопользовательского режима доступа к ресурсам
- время работы процессора делится на фрагменты и они распределяются по процессам
Прерывания
Прерывание – сигнал остановки последовательного выполнения программы, для обработки запроса или реакции на событие.
Чтобы получить код обработки прерывания, в памяти расположена специальная таблица обработчиков прерываний, в которой для каждого типа прерывания содержится указатель на тот участок памяти, где расположен соответствующий код обработки данного прерывания.
Инициализация данной таблицы первично осуществялется BIOS’ом в соответствии с архитектурой процессора. После её инициализирует операционная система для дополнения этой таблицы какими-либо своими прерываниями.
Виды и примеры прерываний:
- Аппаратные прерывания – с помощью специального контроллера прерываний.
- Нажатие на кнопку
- Заполнение памяти сетевой карты
- И тд.
- Программные прерывания (системные вызовы) – вызывается самой программой для вызова того или иного прерывания.
- Открытие/закрытие файла
- Прерывания таймера – для реализации планировщика ОС
- Исключение
- Разного рода ошибки
Как приложения взаимодействуют с ОС?
Взаимодействие процессов с ОС осуществляется с помощью системных вызовов.
Например, чтобы выполнить обычное действие, с точки зрения прикладного программиста, – вывод строки в консоль, необходимо загрузить исполнимый код в оперативную память и передать его процессору. С помощью системных вызовов, запускающий процесс (уже запущенный процесс, из которого вызывается новый процесс — одни процессы порождают другие) обращается к соответствующим сервисам ОС и передаёт им управление для выполнения этих функций.
То есть с помощью системных вызововвыполняются те рутинные действия, которые раньше осуществлялись вручную, — загрузка кода программы в память, передача его на исполнение процессору и прочее.
Схема организации ОС расширяется добавлением интерфейса для взаимодействия приложений с ядром ОС — механизмом системных вызовов:
Как оборудование взаимодействует с ОС?
Оборудование взаимодействует с ОС с помощью аппаратных прерываний. И одна из функций ОС — абстрагирование оборудования.
Что это значит?
У каждого оборудования есть свой фиксированный интерфейс. Например, операции с флешкой, жестким диском, сетевой платой и многими другими будут похожи по своему типу - «записать/считать данные». Но у каждого устройства для этого, тем не менее, будет свой особенный и отличный от других интерфейс. То есть эти однотипные действия нужно будет выполнять для разных устройств по разному.
ОС должка выполнять одни и те же операции над разными типами устройств. И чтобы она выполняла их однообразно — нужно чтобы был общий интерфейс. Реализацией этого общего интерфейса занимаются специальные программы - драйверы устройств. То есть, ОС обращается к драйверам устройств используя однотипные команды «отправить команду/считать/записать», а драйвера уже превращает эти команды в то, что понимает конкретное устройство.
Схема организации ОС расширяется добавлением интерфейса взаимодействия ОС и оборудования - специальные программы «драйвера»:
Сервисы ОС
Функции ОС заключены в её сервисах (модулях). Реализация организации которых зависит от архитектуры ядра. Рассмотрим на примере монолитного ядра:
Основные
- Управление процессами (Process scheduler - планировщик)
- Запуск (помещение на процессор, выделение процессорного времени)
- Приостановка (заморозка)
- Завершение
- Изменение приоритета
- Межпроцессное взаимодействие (IPC - Inter Process Communication)
- Общая память для нескольких процессов (shared memory)
- Способы обмена данными через те или иные механизмы (file, pipe, signals)
- Сетевое взаимодействие
- Механизмы предотвращения коллизий и синхронизации (семафоры, мьютексы)
- Управление памятью (Memory manager)
- Динамическое выделение памяти (Memory allocation)
- Создание иллюзии уникальности адресного пространства для каждого процесса
- Механизм виртуальной памяти
Дополнительные
- Файловая система (File system)
- Файлы и их содержимое
- Каталоги и директории
- Доступ к оборудованию и управление им
- Прерывания
- Драйвера
- Модель безопасности
- Пользователи («юзеры») и их группы
- Права доступа
- Разное
- Интерфейс ввода-вывода (I/O Interface)
- Сетевой интерфейс (Network Interface)
Основные абстракции
Процесс
Процесс — совокупность инструкций и данных, что находятся в оперативной памяти и обрабатываются процессором. Другими словами - исполнение программы в целом (не путать с потоком исполнения).
В рамках ОС, это абстракция, которая предоставляет иллюзию персональной машины. То есть то, что данный исполнимый код полностью владеет всеми вычислительными ресурсами машины.
Состояние (контекст) процесса
С внешней стороны, процесс можно описать следующим:
- Состояние
- Состояние памяти
- Содержимое регистров процессора
- Адрестное пространство — у каждого процесса своё.
- Состояние исполнения — то, исполняется ли этот процесс на процессоре в данный момент или ожидает чего-либо.
- CPU - величина использовния процессорного времени.
Изнутри, процесс можно условно разделена на четыре части: Stack, Heap (кучу), Text (код) и данные (Data).
Состояния исполнения
Когда процесс выполняется, он проходит через разные состояния. Эти этапы могут различаться в разных операционных системах.
Общая картина выглядит так:
Информация о процессе
Вся информация о процессе содержится в специальной структуре данных, поддерживаемой операционной системой для каждого процесса – PCB (Process Control Block) - Блок управления процессов.
Информацию о процессах в целом, ОС хранит в специальной таблице процессов.
Поток
Процесс может делиться на потоки (threads). Они обеспечивают параллелизм, то есть одновременное исполнение нескольких потоков инструкций, на уровне программы.
Поток выполнения (нить, thread) — последовательность исполнения инструкций. Ход исполнения программы**.
Процесс является контейнером ресурсов(адресное пространство, процессорное время и тд), а поток – последовательность инструкций, которые исполняются внутри этого контейнера.
Потоки, существующие в рамках одного процесса, в его адресном пространстве, могут совместно использовать ресурсы процесса, например такие как память или файл. Тогда как процессы не разделяют этих ресурсов, так как каждый существует в своём адресном пространстве.
Чем хороши потоки
- Они минимизируют время переключения контекста (процессора).
- Их использование обеспечивает параллелизм процесса.
- Они эффективно общаются между собой.
- Потоки позволяют использовать многопроцессорные архитектуры в большем масштабе.
Файл
Это очень широкое и многогранное понятие. Но если выделить наиболее общее, то получится, что файл — это универсальный системный интерфейс для обращения к тем или иным данным.
А файловая система — это система имён. То есть возможность выделять те или иные объекты данных и присваивать им имена, а также выделять иерархию.
По другому, файл и файловую систему можно также представить как структуру данных и связи между этими структурами.
Реализация многозадачности
Осуществляется при помощи следующих механизмов:
- Прерывание таймера
- когда при запуске, ОС программирует таймер на то, чтобы он каждый квант времени передавал управление ОС.
- Переключение контекста
- сохранение состояния исполнения (регистров) процесса и установка на процессор контекста другого процесса.
- План блокировок, при наличии нескольких CPU
- Освобождение ресурсов при завершении процесса
Переключение контекста
Контекст процесса — это состояние регистров, при его выполнении на процессоре.
Следовательно, переключение контекста — это смена контекста одного процесса, на контекст другого, без потери данных сменяемого процесса - то есть, чтобы его потом можно было восстановить с того момента, где он был переключён.
При переключений контекста возникает три важных вопроса:
- Как?
- Когда?
- Между кем и кем?
Как?
- Значения регистров процесса записываются в Stack этого же процесса в оперативной памяти. Таким образом, процесс в своей памяти хранит свой же контекст.
- Контекст планировщика появляется на процессоре, выполняет анализ имеющихся процессов.
- Переключает процессор на контекст уже другого, нового процесса.
В целом, смена контекста происходит между состояниями «Готов», «Ожидает» и «Исполняется».
Критические секции и блокировки
Одна из основных проблем с которыми может столкнуться такая система с вытесняющей многозадачностью — порядок доступа процессов к их общим ресурсам.
Возникают, так называемые, критические секции – участки исполняемого кода программы, в которых производится доступ к общему ресурсу (данным или устройству), который не должен быть одновременно использован более чем одним потоком выполнения.
Может возникнуть такая ситуация, когда один поток, «потребитель», начинает использовать данные, которые должен подготовить другой поток, «производитель», но этот производитель ещё не закончил их подготовку и снялся с исполнения. Таким образом, «потребитель» использует некорректные данные, что с высокой долей вероятности приведёт к ошибке.
Данная проблема решается с помощью механизма блокировок – когда поток, получивший доступ к ресурсу, блокирует его, не давая другим потокам пользоваться этим захваченным ресурсом до разблокировки. То есть, если один поток хочет захватить (заблокировать) ресурс, а он уже занят другим потоком, то первый будет ожидать пока этот другой поток-владелец сам не освободит этот ресурс.
Чтобы лучше это понять, можно обратиться к аналогии с туалетом — им может пользоваться только один человек. Если другой хочет им воспользоваться, то ему нужно дождаться, когда его освободит уже им пользующийся.
Deadlock - взаимная блокировка
Из-за блокировки, захвата ресурса может возникнуть другая проблема: Deadlock - взаимная блокировка.
Deadlock — ситуация, при которой несколько потоков находятся в состоянии ожидания ресурсов, занятых друг другом, и ни один из них не может продолжать свое выполнение.
Итог
Начав с базовой архитектуры, мы разобрали причины появления такого комплекса программ, как операционная система и выделили главную её цель – обеспечение согласованного доступа к ресурсам компьютера множеству пользователям этих ресурсов, а также управление как самими ресурсами, так и пользователями.
Основные механизмы (сервисы)
Рассмотрели основные механизмы реализации этой цели: Scheduler (планировщик), Inter Process Communication (межпроцессное взаимодействие), Memory manager (управление памятью) и другие.
Абстракции
Ряд абстракций, которые вводит ОС: Process (процесс), Thread (поток исполнения), File (файл).