Когда у нас есть программа, то обычно это набор инструкций для процессора. Чаще всего этого какой-то файл записанный где-то в памяти и его можно запустить. Когда OC дает ей некоторую свободу, когда ОС дает программе доступ к железу, к оперативной памяти, жесткому диску и т.д. к ресурсам компьютера. И вот в процессе запуска, в процессе того, когда программа потребляет ресурсы компьютера - это и называется процесс.
ОC помимо основных функций по абстракции выполняет и другие немаловажные функции:
- Она должна управлять запуском нескольких процессов
- Предоставлять необходимые ресурсы процессу и защищать ресурсы процесса от остальных
- Позволять процессам обмениваться информацией. Например, у меня есть фильм, который нужно как-то смонтировать. Для этого существует программа монтажа. У неё есть несколько процессов. Один процесс отвечает за отображение интерфейс, один процесс отвечает за рендер видео, другой процесс там обращается к файлам, и естественно эти процессы как-то должны коммуницироваться.
- Позволять процессам синхронизироваться
Если ОС дает доступ к ресурсам ПК к каким-то программам, то на этом к сожалению или к счастью, то просто так остановиться на этом в современных реалиях уже нельзя. Это было в меньше степени проблемой на заре Пк был один процесс в один момент времени.
Процесс состоит из нескольких элементов, да в зависимости от OC, от архитектуры их может быть очень много, но в целом структура такая.
- Идентификатор
- Состояние
- Приоритет
- Счетчик команд
- Указатели на память
- Контекст
- Информация о статусе I/O
Идентификатор
Нам нужно понимать по какому-либо признаку, что тот или иной процесс потребляет какое-то количество ресурсов. Этой характеристикой или свойством является Идентификатор процесса, который как правило генерируется самой ОС.
Состояние
Нам нужно также понимать и состояние процесса. Например, процесс отработал свои функции, соответственно он в состоянии - "Завершен". Поэтому ОС должна уничтожить этот процесс и освободить участок памяти.
Приоритет
У процесса как и у нас собственно в жизни есть приоритеты. ОС должна учитывать эту характеристику и без этого в целом нормальное функционирования вычислительной системы просто невозможно.
Счетчик команд
Здесь идет речь о регистрах процессора. Конечно в процессе не может быть этого регистра, но там может быть состояние этого счетчика. Т.е. то, что записано в данный момент.
Это просто указатель или адрес, который указывает процессору следующую по счету инструкцию (команду).
Указатель на память
Процесс в какой-то момент времени обращается к памяти, работает с памятью и сответственно нам нужен какой-то указатель на память, своего рода идентификатор, но на какой-то адрес в памяти.
Самая главная идея в многозадачности. Нам нужно в любой момент времени уметь заморозить программу, запомнить ее состояние, перейти к следующей, а потом при необходимости вернуться обратно.
Всё, что нужно сделать, это иметь в процессе информацию необходимую для того, чтобы этот процесс отложить а потом продолжить свою работу.
Структура данных, которая используется ОС для представления процесса называется Process Control Block. Это грубо говоря:
- Программа
- Данные
- Контекст
Создание процесса
ОС создает структура данных для процесса
Процессы обычно создаются самой ОС, но часто процессы могут создавать новые процессы.
Уничтожение
В самом процессе уничтожения необходимо чтобы было понятно, когда процесс завершен.
Это может быть специальный сигнал, который OC понимает и уничтожает этот процесс, уничтожает память.
Сигнал HALT
Это может быть действие пользователя
Ошибка
Завершение родительского процесса
Пять состояний процесса
Если помните, то у нас в целом есть устройства ввода/вывода, которые для процессора являются очень медленными. И ставить процессы, связанные с устройствами I/O в одну очередь с теми, которые "готовы" не очень выгодно.
Есть процессы, которые "готовы" работать, но не запущены. Т.е. просто сидят в очереди, а есть процессы, которые "не готовы" и не "запущены". Они заблокированы и они ожидают какого-то события. Например, ответа от диска. Поэтому из состояния "запущенного" у нас есть два пути назад.
- Это переход в состояние "готов". По таймауту
- Переход в "заблокирован"
Получается вот такая вот "двойная очередь".
Еще более очевидный шаг, более логичный. Это двойная очередь или множественная очередь. Да у нас есть процессы, которые готовы к запуску. OC не будет ставить в очередь те процессы, которые не готовы. Но таких процессов тоже может быть много. Какой-то процесс ждет диск, какой-то процесс человека и т.д.
События могут быть разными. Процесс, который ждёт действия от человека и процесс, который ждет сигнал от диск сильно отличаются. И ставить их в одну очередь это тоже не очень эффективно.
Эта самая эффективная организация процессов. Кажется, что да ОС придется теперь очень много "думать", ей придется создавать какие-то таблицы, придется организовывать всю эту очередь бесконечных процессов и это правда. Но на деле вычислительная система с такой организацией процессов очень эффективна.
Также в множественной очереди у нас добавляется еще одно состояние.
Приостановленные или suspended процессы
Возможно такое, что все процессы ждут I/O
Их можно перенести на диск, чтобы освободить память для более актуальных процессов
Заблокированный процесс становится приостановленным
Два новых состояния:
- Заблокирован/ Приостановлен
- Готов/ Приостановлен
Также нужно понимать отличие "приостановленного" процесса и "заблокированного". На самом деле это практически одно и тоже, но есть отличие. "Заблокированный" процесс условно работает в режиме "стоп", но находится в оперативной памяти, "Приостановленный" процесс это тоже самое, только меняется его физическое местоположение. Этот процесс переносится на вторичный накопитель, дабы освободить оперативную память для более важных процессов.
Что же может заставить операционную систему приостановить процесс?
1) Swapping. Сам процесс, когда переходит из одного состояния в другое, в частности, когда процесс переходит из работающего состояния (из памяти) в какое-то другое вторичное хранилище вроде жесткого диска называется Swapping.
2) Решение ОС. Операционная система довольно сложная вещь, и она знает что какой-то процесс будет ждать чего-то очень долго, она знает, что какой-то процесс важнее, какой-то менее важнее и в зависимости от этого операционная система может переносить процессы в Swap-раздел или обратно.
3) Решение пользователя
4) Расписание. Некоторые процессы запускаются по расписанию. У ОС есть знание, когда этот процесс будет запущен и если процесс не будет запущен какое-то определенно количество времени (например, 5с), то это очень долго. Соответственно этого достаточно, что перенести этот процесс на жесткий диск, использовать эту освобожденную память и потом перенести его обратно.
5) Решение родительского процесса
Контрольные структуры ОС
1) ОС должна иметь информацию о текущем статусе процессов и ресурсов. Если ОС управляет всеми процессами и их доступом к ресурсам, то она должна в любой момент времени знать какой процесс хочет использовать тот или иной ресурс, чем занимается процессор и т.д.
Контроль этой сложной структуры достигается чаще всего таблицами
2) Для каждой сущности, управляемой ОС, создается таблица, некая база. У ОС есть таблица для процессов, есть таблица для файлов, есть таблица для устройств ввода/вывода
Таблицы памяти
Таблицы памяти отвечают за основную (озу) и вторичную память (hdd). В этих таблицах есть информация о том какие разделы основной и вторичной памяти предоставлены тем или иным процессам. Там также записана информация о том, как общие участки (разделы памяти) защищены.
Таблица ввода/вывода
Системе в любой момент времени нужно знать доступно ли устройство, что происходит с этим устройством и нужно также знать адрес в памяти, которая используется для ввода или вывода. Т.е если с жесткого диска загружается файл, то ОС должна знать куда в основную память этот файл загружается. Для этого используется данная таблица
Режимы работы
С точки зрения процессов существует как минимум два режима, в котором работает компьютер.
1. Пользовательский
В пользовательском режиме процесс, в принципе, не может навредить системе. Все, что делает этот процесс, работает под надзором какой-то сущности. Это может быть ОС, это может быть реализовано на аппаратном уровне, но так или иначе у процесса нет абсолютного доступа к железу.
2. Системный
В системном режиме у процесса есть полный доступ ко всему, что есть в компьютере. Да, это опасно, но этот режим, в котором работают самые важные части операционной системы.
Возникает вопрос, ОС - это процесс? Эта программа, она работает чаще всего на другом уровне, она имеет больший доступ к железу и в целом, она управляет всеми остальными процессами, но ОС чем-то похожа на сам процесс. Это программа, она запущена, она работает на компьютере и здесь все конечно же решают разработчики ОС.
Процесс - это концепция операционной системы, поэтому есть 3 основные идеи работы ОС как "процесса" и его взаимодействие с ними.
Когда мы говорим про отдельное ядро, то ядро ОС (в принципе это тоже процесс, эта программа, она запущена на компьютере, но она не похожа на остальные процессы и не является ими по своему определению). Ядро запущено вне процессов, оно находится в отдельной области памяти, оно функционирует в своем привилегированном режиме и имеет полный доступ к железу.
Функции ОС могут быть представлены в самих пользовательских процессах, в контексте выполнения каждого процесса. В этом есть свой плюс, т.к. при переключении процесса или когда нам нужно выполнить какую-то функцию ОС, то нет необходимости в большом переключении контекста.
Большая часть ОС может быть запущена на пользовательском уровне. С точки зрения безопасности это достаточно неплохо, т.к. если какие-то функции ОС сделаны не самым лучшим образом, то они не сломаются, они запущены также как и пользовательские процессы, они не имеют полного доступа к компьютеру.
Минус в том, что эти процессы все-таки должны иметь доступ к тому, что нет у пользовательских процессов. Переключаться между режимами придется намного чаще а это определенное время.