Программирование - это просто
Advertisement
Главная
26.04.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Теория операционных систем. Урок 2. Процессы – модель, иерархия, состояния, планировщик, переключени Печать E-mail
Автор megabax   
22.11.2023 г.
New Page 1

Теория операционных систем. Урок 2. Процессы – модель, иерархия, состояния, планировщик, переключения процессов.

Это последний урок из серии "Теория операционных систем", публикуемый в бесплатном разделе. Начиная со следующего, публикация уроков будет продолжена в платном разделе. В бесплатном же разделе, возможно, иногда будут публиковать некоторые статьи, посвященные некоторым отдельным аспектам операционных систем.

 

На прошлом уроке я говорил, что одной из важных функций операционной системы является управление процессами. Сегодня мы рассмотрим эту функцию более подробно.  Давайте для начала определимся с самим термином процесс. Существует, по меньшей мере, два определения.

Итак, процесс (или по-другому, задача) - это абстракция, описывающая выполняющуюся программу. Для операционной системы процесс представляет собой единицу работы, заявку на потребление системных ресурсов. Большинство ресурсов распределяются в режиме разделения времени. Ресурс выделяется задаче на заранее известный интервал времени, если программа не успеет за этот интервал закончить работу, то он изымается и отдается следующей задаче, а текущая задача – в конец очереди к этому ресурсу.

Другое определение. Процесс (задача) – это программа, находящаяся в режиме выполнения. С каждый процессом связывается его адресное пространство, из которого он может читать и в которое он может писать данные. Адресное пространство содержит:
 

  • саму программу;

  • данные к программе;

  • стек программы.

С каждым процессом связывается набор регистров, например:

  • счетчик команд (в процессоре) – регистр, в котором содержится адрес следующей стоящей в очереди на выполнение команды. После того, как команда выбрана из памяти, счетчик команд корректируется и указатель переходит к следующей команде.

  • указатель стека и другие.
     

Рассмотрим теперь модель процесса.

В многозадачной системе реальный процессор переключается с процесса на процесс, но для упрощения модели рассматривается набор процессов, идущих параллельно (псевдопараллельно). Рассмотрим схему с четырьмя работающими программами.

Теория операционных систем. Урок 2. Процессы – модель, иерархия, состояния, планировщик, переключения процессов.

Итак, из рисунка мы видим, что у нас работают четыре псевдопараллельных процесса. На самом же деле, просто каждому процессу выделятся какой то квант времени, в течении которого он работает. Так как квант времени относительно маленький, то создается иллюзия параллельности работы процессов.

На рисунке представлены параллельно работающие процессы, каждый со своим счетчиком команд. На самом деле существует только один физический счетчик команд, в который загружается логический счетчик команд текущего процесса. Когда время, отведенное текущему процессу, заканчивается, физический счетчик команд сохраняется в памяти, в логическом счетчике команд процесса:

Теория операционных систем. Урок 2. Процессы – модель, иерархия, состояния, планировщик, переключения процессов.

Рассмотрим создание процессов. Существуют четыре основных события, приводящие к созданию процессов:

  • инициализация системы;

  • выполнение изданного работающим процессом системного запроса на создание процесса;

  • запрос пользователя на создание процесса;

  • инициирование пакетного задания.
     

С технической точки зрения во всех случаях новый процесс формируется одинаково: текущий процесс выполняет системный запрос на создание нового процесса. В UNIX существует только один системный вызов, направленный на создание нового процесса: fork (ветвление или вилка). Этот запрос создает дубликат вызываемого процесса. В Windows вызов функции CreateProcess интерфейса Win32 управляет и созданием процесса, и запуском в нем нужной программы. После создания нового процесса родительский и дочерний процессы имеют собственные различные адресные пространства.

Процессы не только создаются, но могут быть и завершены. Рассмотрим, в каких случаях происходит завершение процесса:

  • Обычный выход (преднамеренно). В Unix это системный вызов exit, в Windows ExitProcess.

  • Выход по ошибке (преднамеренно).

  • Выход по неисправимой ошибке (непреднамеренно). Ошибка, вызванная самим процессом, чаще всего связанная с ошибкой в программе. Пример: выполнение недопустимой команды, обращение к несуществующей области памяти, деление на ноль.

  • Уничтожение другим процессом (непреднамеренно). Это выполнение другим процессом системного запроса на уничтожение процесса. В Unix kill, в Win32 – TerminateProcess.

Состояния процессов. Процесс может иметь одно из трех возможных состояний:

  • выполнение (в этот конкретный момент процесс использует процессор);

  • готовность (процесс временно приостановлен, чтобы позволить выполняться другому процессу);

  • ожидание (процесс не может быть запущен прежде, чем произойдет некое внешнее событие).

Графически эти состояния могут быть представлены так:

Теория операционных систем. Урок 2. Процессы – модель, иерархия, состояния, планировщик, переключения процессов.

Возможные следующие переходы между состояниями:
1. Процесс блокируется, ожидая входных данных.
2. Планировщик выбирает другой процесс.
3. Планировщик выбирает этот процесс.
4. Поступили входные данные.

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

Иерархия процессов. В некоторых системах родительский и дочерний процессы остаются связанными между собой определенным образом. Дочерний процесс может, в свою очередь, создавать процессы, формируя иерархию процессов. В UNIX-подобных ОС, например, заложена жесткая иерархия процессов. Каждый новый процесс, созданный системным вызовом fork, является дочерним к предыдущему процессу. Дочернему процессу достаются от родительского переменные, регистры и т.п. После вызова fork, как только родительские данные скопированы, последующие изменения в одном из процессов не влияют на другой, но процессы помнят о том, кто является родительским.В таком случае, в UNIX существует и прародитель всех процессов - процесс init.
В Windows не существует понятия иерархии процессов, и все процессы равноправны. Хотя можно задать специальный маркер родительскому процессу, позволяющий контролировать дочерний процесс.

Теперь поговорим о переключении процессов. Казалось бы, функция переключения процессов проста и понятна. В какой-то момент времени выполняющийся процесс прерывается и операционная система переводит в состояние выполнения другой процесс, передавая ему управление. Однако здесь возникают некоторые вопросы, касающиеся архитектуры операционной системы. Во-первых, какие события должны приводить к переключению процессов. Во-вторых, как установить различие между переключением режимов работы и переключением процессов. И наконец, что нужно делать операционной системе с различными структурами данных, находящимися под ее управлением, чтобы переключить процесс.

Разберем подробно все эти вопросы. Итак, когда нужно переключать процесс? Переключение процесса может произойти в любой момент, когда управление от выполняющегося процесса переходит к операционной системе. В таблице ниже перечислены возможные причины, по которым управление может перейти к операционной системе:

Механизм Причина Использует
Прерывание Внешняя по отношению к выполнению текущей команды Отклик на внешнее асинхронное событие
Ловушка Связана с выполнением текущей команды Обработку ошибки или исключительной ситуации
Вызов супервизора Запрос приложения Вызов функции операционной системы

Во-первых, рассмотрим системные прерывания. Фактически имеются системные прерывания двух видов. Первый вид — обычные прерывания, а второй — ловушки (trap). Прерывания первого вида происходят из-за событий определенного типа, не связанных с выполняющимся процессом и являющихся внешними по отношению к нему (таким событием может быть, например, завершение операции ввода-вывода). Ловушки связаны с ошибкой или исключительной ситуацией, возникшей в результате выполнения текущего процесса. В качестве примера можно привести попытку получения неразрешенного доступа к файлу, или, например, попытки деления на нуль.. При обычном прерывании управление передается обработчику прерываний, который осуществляет некоторые подготовительные действия, а затем — функции операционной системы, отвечающей за прерывания данного вида. Приведем конкретные примеры прерываний.

Рассмотрим, какие бывают прерывания.

Итак, прерывание таймера. Операционная система определяет, что текущий процесс выполняется в течение максимально разрешенного промежутка времени. Если это так, то данный процесс нужно переключить в состояние готовности и передать управление другому процессу.

Прерывание ввода-вывода. Операционная система определяет, что именно произошло, и если это то событие, которого ожидают один или несколько процессов, операционная система переводит все соответствующие блокированные процессы в состояние готовности (соответственно, блокированные приостановленные процессы она переводит в состояние готовых приостановленных процессов). Затем операционная система должна принять решение: возобновить выполнение текущего процесса или передать управление готовому к выполнению процессу с более высоким приоритетом.

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

В случае возникновения ловушки (trap) операционная система определяет, является ли ошибка или исключительная ситуация фатальной. Если это так, то выполняющийся в данный момент процесс переходит в состояние завершающегося, а управление переходит к другому процессу. В противном случае действия операционной системы будут зависеть от характера происшедшей ошибки, а также от конструкции самой операционной системы. Может быть предпринята попытка выполнить восстановительные процедуры или просто поставить пользователя в известность о происшедшей ошибке. Операционная система при этом может как выполнить переключение процессов, так и продолжить выполнение текущего процесса.
Наконец, ОС может быть активизирована в результате вызова супервизора (supervisor call), который исходит от выполняемой программы. Например, пусть в ходе работы пользовательского процесса нужно выполнить команду, для которой требуется операция ввода-вывода, например открытие файла. Такой вызов приведет к тому, что управление перейдет к процедуре, являющейся частью кода операционной системы. Вообще говоря, использование таких системных вызовов приводит к переходу процесса в блокированное состояние.
 

 

 
Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги