Управление, синхронизация и взаимодействие процессов
Важнейшей частью операционной системы, непосредственно влияющей на функционирование вычислительной машины, является подсистема управления процессами. Процесс (или по-другому, задача) — абстракция, описывающая выполняющуюся программу. Для операционной системы процесс представляет собой единицу работы, заявку на потребление системных ресурсов. Подсистема управления процессами планирует выполнение процессов, то есть распределяет процессорное время между несколькими одновременно существующими в системе процессами, а также занимается созданием и уничтожением процессов, обеспечивает процессы необходимыми системными ресурсами, поддерживает взаимодействие между процессами.
Мультипрограммирование или многозадачность – это способ организации вычислительного процесса, при котором на одном процессоре попеременно выполняется сразу несколько программ. Если такой способ в операционной системе не предусмотрен, то она называется однозадачной.
Состояние процессов
В многозадачной (многопроцессной) системе процесс может находиться в одном из трех основных состояний:
ВЫПОЛНЕНИЕ — активное состояние процесса, во время которого процесс обладает всеми необходимыми ресурсами и непосредственно выполняется процессором;
ОЖИДАНИЕ — пассивное состояние процесса, процесс заблокирован, он не может выполняться по своим внутренним причинам, он ждет осуществления некоторого события, например, завершения операции ввода-вывода, получения сообщения от другого процесса, освобождения какого-либо необходимого ему ресурса;
ГОТОВНОСТЬ — также пассивное состояние процесса, но в этом случае процесс заблокирован в связи с внешними по отношению к нему обстоятельствами: процесс имеет все требуемые для него ресурсы, он готов выполняться, однако процессор занят выполнением другого процесса.
В ходе жизненного цикла каждый процесс переходит из одного состояния в другое в соответствии с алгоритмом планирования процессов, реализуемым в данной операционной системе. Типичный граф состояний процесса показан на рисунке 4.1.
Рисунок 4.1 — Граф состояний процесса в многозадачной среде
В состоянии ВЫПОЛНЕНИЕ в однопроцессорной системе может находиться только один процесс, а в каждом из состояний ОЖИДАНИЕ и ГОТОВНОСТЬ — несколько процессов, эти процессы образуют очереди соответственно ожидающих и готовых процессов. Жизненный цикл процесса начинается с состояния ГОТОВНОСТЬ, когда процесс готов к выполнению и ждет своей очереди. При активизации процесс переходит в состояние ВЫПОЛНЕНИЕ и находится в нем до тех пор, пока либо он сам освободит процессор, перейдя в состояние ОЖИДАНИЯ какого-нибудь события, либо будет насильно «вытеснен» из процессора, например, вследствие исчерпания отведенного данному процессу кванта процессорного времени. В последнем случае процесс возвращается в состояние ГОТОВНОСТЬ. В это же состояние процесс переходит из состояния ОЖИДАНИЕ, после того, как ожидаемое событие произойдет.
Контекст и дескриптор процесса
На протяжении существования процесса его выполнение может быть многократно прервано и продолжено. Для того, чтобы возобновить выполнение процесса, необходимо восстановить состояние его операционной среды. Состояние операционной среды отображается состоянием регистров и программного счетчика, режимом работы процессора, указателями на открытые файлы, информацией о незавершенных операциях ввода-вывода, кодами ошибок выполняемых данным процессом системных вызовов и т.д. Эта информация называется контекстом процесса .
Кроме этого, операционной системе для реализации планирования процессов требуется дополнительная информация: идентификатор процесса, состояние процесса, данные о степени привилегированности процесса, место нахождения кодового сегмента и другая информация. В некоторых ОС (например, в ОС UNIX) информацию такого рода, используемую ОС для планирования процессов, называют дескриптором процесса .
Дескриптор процесса по сравнению с контекстом содержит более оперативную информацию, которая должна быть легко доступна подсистеме планирования процессов. Контекст процесса содержит менее актуальную информацию и используется операционной системой только после того, как принято решение о возобновлении прерванного процесса.
Очереди процессов представляют собой дескрипторы отдельных процессов, объединенные в списки. Таким образом, каждый дескриптор, кроме всего прочего, содержит по крайней мере один указатель на другой дескриптор, соседствующий с ним в очереди. Такая организация очередей позволяет легко их переупорядочивать, включать и исключать процессы, переводить процессы из одного состояния в другое.
Программный код только тогда начнет выполняться, когда для него операционной системой будет создан процесс. Создать процесс — это значит:
Алгоритмы планирования процессов
В однозадачной ОС используется группа алгоритмов «без переключения». К ним относятся алгоритмы: FIFO (первый пришел, первый обслужен), SJF (кратчайшее задание — первым), HRN (модификация алгоритма SJF , учитывающая длительность ожидания задания в очереди).
Планирование процессов в мультипрограммных ОС включает в себя решение следующих задач:
Первые две задачи решаются программными средствами, а последняя в значительной степени аппаратно.
Существует множество различных алгоритмов планирования процессов, по разному решающих вышеперечисленные задачи, преследующих различные цели и обеспечивающих различное качество мультипрограммирования. Среди этого множества алгоритмов рассмотрим подробнее две группы наиболее часто встречающихся алгоритмов: алгоритмы, основанные на квантовании, и алгоритмы, основанные на приоритетах .
В соответствии с алгоритмами, основанными на квантовании, смена активного процесса происходит, если:
· процесс завершился и покинул систему,
· процесс перешел в состояние ОЖИДАНИЕ,
· исчерпан квант процессорного времени, отведенный данному процессу.
Процесс, который исчерпал свой квант, переводится в состояние ГОТОВНОСТЬ и ожидает, когда ему будет предоставлен новый квант процессорного времени, а на выполнение в соответствии с определенным правилом выбирается новый процесс из очереди готовых. Таким образом, ни один процесс не занимает процессор надолго, поэтому квантование широко используется в системах разделения времени. Граф состояний процесса, изображенный на рисунке 2.1, соответствует алгоритму планирования, основанному на квантовании.
Кванты, выделяемые процессам, могут быть одинаковыми для всех процессов или различными. Кванты, выделяемые одному процессу, могут быть фиксированной величины или изменяться в разные периоды жизни процесса. Процессы, которые не полностью использовали выделенный им квант (например, из-за ухода на выполнение операций ввода-вывода), могут получить или не получить компенсацию в виде привилегий при последующем обслуживании. По разному может быть организована очередь готовых процессов: циклически, по правилу «первый пришел — первый обслужился» (FIFO) или по правилу «последний пришел — первый обслужился» (LIFO).
Для обеспечения более «справедливого» распределения времени процессора используются многоуровневые очереди с обратными связями. Новый процесс входит в сеть очередей с конца верхней очереди. Он перемещается по этой очереди, реализующей принцип FIFO , пока не получит в свое распоряжение ЦП. Если задание завершается или освобождает ЦП, чтобы подождать завершения операции ввода-вывода или наступления некоторого события, то оно, это задание, выходит из сети очередей. Если выделенные квант времени истекает до того, как процесс добровольно освободит ЦП, этот процесс помещается в конец следующей очереди более низкого уровня. Этот процесс в следующий раз получит в свое распоряжение ЦП, когда он достигнет начала данной очереди, если при этом не будет ожидающих в первой очереди. Если данный процесс будет продолжать использовать полный квант времени, предоставляемый на каждом уровне, он продолжит переход в конец очереди следующего нижележащего уровня. Обычно в системе предусматривается некоторая очередь самого нижнего уровня, которая реализует принцип циклического обслуживания и в которой данный процесс циркулирует до тех пор, пока не завершится.Во многих структурах многоуровневых очередей с обратными связями квант времени, предоставляемый данному процессу при переходе в каждую очередь более низкого уровня, увеличивается.
Другая группа алгоритмов использует понятие «приоритет» процесса. Приоритет — это число, характеризующее степень привилегированности процесса при использовании ресурсов вычислительной машины, в частности, процессорного времени: чем выше приоритет, тем выше привилегии.
Приоритет может выражаться целыми или дробными, положительным или отрицательным значением. Чем выше привилегии процесса, тем меньше времени он будет проводить в очередях. Приоритет может назначаться директивно администратором системы в зависимости от важности работы или внесенной платы, либо вычисляться самой ОС по определенным правилам, он может оставаться фиксированным на протяжении всей жизни процесса либо изменяться во времени в соответствии с некоторым законом. В последнем случае приоритеты называются динамическими.
Существует две разновидности приоритетных алгоритмов: алгоритмы, использующие относительные приоритеты, и алгоритмы, использующие абсолютные приоритеты.
В обоих случаях выбор процесса на выполнение из очереди готовых осуществляется одинаково: выбирается процесс, имеющий наивысший приоритет. По разному решается проблема определения момента смены активного процесса. В системах с относительными приоритетами активный процесс выполняется до тех пор, пока он сам не покинет процессор, перейдя в состояние ОЖИДАНИЕ (или же произойдет ошибка, или процесс завершится). В системах с абсолютными приоритетами выполнение активного процесса прерывается еще при одном условии: если в очереди готовых процессов появился процесс, приоритет которого выше приоритета активного процесса. В этом случае прерванный процесс переходит в состояние готовности. На рисунке 4.2 показаны графы состояний процесса для алгоритмов с относительными (а) и абсолютными (б) приоритетами.
Рисунок 4.2 — Графы состояний процессов в системах
(а) с относительными приоритетами; (б)с абсолютными приоритетами
Во многих операционных системах алгоритмы планирования построены с использованием как квантования, так и приоритетов. Например, в основе планирования лежит квантование, но величина кванта и/или порядок выбора процесса из очереди готовых определяется приоритетами процессов.
Вытесняющие и невытесняющие алгоритмы планирования
Существует два основных типа процедур планирования процессов — вытесняющие (preemptive) и невытесняющие (non-preemptive).
Non-preemptive multitasking — невытесняющая многозадачность — это способ планирования процессов, при котором активный процесс выполняется до тех пор, пока он сам, по собственной инициативе, не отдаст управление планировщику операционной системы для того, чтобы тот выбрал из очереди другой, готовый к выполнению процесс.
Preemptive multitasking — вытесняющая многозадачность — это такой способ, при котором решение о переключении процессора с выполнения одного процесса на выполнение другого процесса принимается планировщиком операционной системы, а не самой активной задачей.
Понятия preemptive и non-preemptive иногда отождествляются с понятиями приоритетных и бесприоритетных дисциплин, что совершенно неверно, а также с понятиями абсолютных и относительных приоритетов, что неверно отчасти. Вытесняющая и невытесняющая многозадачность — это более широкие понятия, чем типы приоритетности. Приоритеты задач могут как использоваться, так и не использоваться и при вытесняющих, и при невытесняющих способах планирования. Так в случае использования приоритетов дисциплина относительных приоритетов может быть отнесена к классу систем с невытесняющей многозадачностью, а дисциплина абсолютных приоритетов — к классу систем с вытесняющей многозадачностью. А бесприоритетная дисциплина планирования, основанная на выделении равных квантов времени для всех задач, относится к вытесняющим алгоритмам.
Основным различием между preemptive и non-preemptive вариантами многозадачности является степень централизации механизма планирования задач. При вытесняющей многозадачности механизм планирования задач целиком сосредоточен в операционной системе, и программист пишет свое приложение, не заботясь о том, что оно будет выполняться параллельно с другими задачами. При этом операционная система выполняет следующие функции: определяет момент снятия с выполнения активной задачи, запоминает ее контекст, выбирает из очереди готовых задач следующую и запускает ее на выполнение, загружая ее контекст.
При невытесняющей многозадачности механизм планирования распределен между системой и прикладными программами. Прикладная программа, получив управление от операционной системы, сама определяет момент завершения своей очередной итерации и передает управление ОС с помощью какого-либо системного вызова, а ОС формирует очереди задач и выбирает в соответствии с некоторым алгоритмом (например, с учетом приоритетов) следующую задачу на выполнение. Такой механизм создает проблемы как для пользователей, так и для разработчиков.
Для пользователей это означает, что управление системой теряется на произвольный период времени, который определяется приложением (а не пользователем). Если приложение тратит слишком много времени на выполнение какой-либо работы, например, на форматирование диска, пользователь не может переключиться с этой задачи на другую задачу, например, на текстовый редактор, в то время как форматирование продолжалось бы в фоновом режиме. Эта ситуация нежелательна, так как пользователи обычно не хотят долго ждать, когда машина завершит свою задачу.
Поэтому разработчики приложений для non-preemptive операционной среды, возлагая на себя функции планировщика, должны создавать приложения так, чтобы они выполняли свои задачи небольшими частями. Например, программа форматирования может отформатировать одну дорожку дискеты и вернуть управление системе. После выполнения других задач система возвратит управление программе форматирования, чтобы та отформатировала следующую дорожку. Подобный метод разделения времени между задачами работает, но он существенно затрудняет разработку программ и предъявляет повышенные требования к квалификации программиста. Программист должен обеспечить «дружественное» отношение своей программы к другим выполняемым одновременно с ней программам, достаточно часто отдавая им управление. Крайним проявлением «недружественности» приложения является его зависание, которое приводит к общему краху системы. В системах с вытесняющей многозадачностью такие ситуации, как правило, исключены, так как центральный планирующий механизм снимет зависшую задачу с выполнения.
Однако распределение функций планировщика между системой и приложениями не всегда является недостатком, а при определенных условиях может быть и преимуществом, потому что дает возможность разработчику приложений самому проектировать алгоритм планирования, наиболее подходящий для данного фиксированного набора задач. Так как разработчик сам определяет в программе момент времени отдачи управления, то при этом исключаются нерациональные прерывания программ в «неудобные» для них моменты времени. Кроме того, легко разрешаются проблемы совместного использования данных: задача во время каждой итерации использует их монопольно и уверена, что на протяжении этого периода никто другой не изменит эти данные. Существенным преимуществом non-preemptive систем является более высокая скорость переключения с задачи на задачу.
Примером эффективного использования невытесняющей многозадачности является файл-сервер NetWare, в котором, в значительной степени благодаря этому, достигнута высокая скорость выполнения файловых операций. Менее удачным оказалось использование невытесняющей многозадачности в операционной среде Windows 3.х.
Однако почти во всех современных операционных системах, ориентированных на высокопроизводительное выполнение приложений (UNIX, Windows NT, OS/2, VAX/VMS), реализована вытесняющая многозадачность. В последнее время дошла очередь и до ОС класса настольных систем, например, OS/2 Warp и Windows. Возможно в связи с этим вытесняющую многозадачность часто называют истинной многозадачностью.
Планирование процессов в Windows
В разных ОС процессы реализуются по-разному. Эти различия заключаются в том, какими структурами данных представлены процессы, как они именуются, какими способами защищены друг от друга и какие отношения существуют между ними. Процессы Windows NT имеют следующие характерные свойства:
— Процессы Windows NT реализованы в форме объектов, и доступ к ним осуществляется посредством службы объектов.
— Процесс Windows NT имеет многонитевую организацию.
— Как объекты-процессы, так и объекты-нити имеют встроенные средства синхронизации.
— Менеджер процессов Windows NT не поддерживает между процессами отношений типа «родитель-потомок».
В любой системе понятие «процесс» включает следующее:
— собственное адресное пространство, которое представляет собой совокупность виртуальных адресов, которые может использовать процесс,
— ресурсы системы, такие как файлы, семафоры и т.п., которые назначены процессу операционной системой.
— хотя бы одну выполняемую нить.
Адресное пространство каждого процесса защищено от вмешательства в него любого другого процесса. Это обеспечивается механизмами виртуальной памяти. Операционная система, конечно, тоже защищена от прикладных процессов. Чтобы выполнить какую-либо процедуру ОС или прочитать что-либо из ее области памяти, нить должна выполняться в режиме ядра. Пользовательские процессы получают доступ к функциям ядра посредством системных вызовов. В пользовательском режиме выполняются не только прикладные программы, но и защищенные подсистемы Windows NT.
В Windows NT процесс — это просто объект, создаваемый и уничтожаемый менеджером объектов. Объект-процесс, как и другие объекты, содержит заголовок, который создает и инициализирует менеджер объектов. Менеджер процессов определяет атрибуты, хранимые в теле объекта-процесса, а также обеспечивает системный сервис, который восстанавливает и изменяет эти атрибуты.
В число атрибутов тела объекта-процесса входят:
— Идентификатор процесса — уникальное значение, которое идентифицирует процесс в рамках операционной системы.
— Токен доступа — исполняемый объект, содержащий информацию о безопасности.
— Базовый приоритет — основа для исполнительного приоритета нитей процесса.
— Процессорная совместимость — набор процессоров, на которых могут выполняться нити процесса.
— Предельные значения квот — максимальное количество страничной и нестраничной системной памяти, дискового пространства, предназначенного для выгрузки страниц, процессорного времени — которые могут быть использованы процессами пользователя.
— Время исполнения — общее количество времени, в течение которого выполняются все нити процесса.
Объект-нить имеет следующие атрибуты тела:
— Идентификатор клиента — уникальное значение, которое идентифицирует нить при ее обращении к серверу.
— Контекст нити — информация, которая необходима ОС для того, чтобы продолжить выполнение прерванной нити. Контекст нити содержит текущее состояние регистров, стеков и индивидуальной области памяти, которая используется подсистемами и библиотеками.
— Динамический приоритет — значение приоритета нити в данный момент.
— Базовый приоритет — нижний предел динамического приоритета нити.
— Процессорная совместимость нитей — перечень типов процессоров, на которых может выполняться нить.
— Время выполнения нити — суммарное время выполнения нити в пользовательском режиме и в режиме ядра, накопленное за период существования нити.
— Состояние предупреждения — флаг, который показывает, что нить должна выполнять вызов асинхронной процедуры.
— Счетчик приостановок — текущее количество приостановок выполнения нити.
Как видно из перечня, многие атрибуты объекта-нити аналогичны атрибутам объекта-процесса. Весьма сходны и сервисные функции, которые могут быть выполнены над объектами-процессами и объектами-нитями: создание, открытие, завершение, приостановка, запрос и установка информации, запрос и установка контекста и другие функции.
В Windows NT реализована вытесняющая многозадачность, при которой операционная система не ждет, когда нить сама захочет освободить процессор, а принудительно снимает ее с выполнения после того, как та израсходовала отведенное ей время (квант), или если в очереди готовых появилась нить с более высоким приоритетом. При такой организации разделения процессора ни одна нить не займет процессор на очень долгое время.
В ОС Windows NT нить в ходе своего существования может иметь одно из шести состояний (рисунок 1.3). Жизненный цикл нити начинается в тот момент, когда программа создает новую нить. Запрос передается NT executive, менеджер процессов выделяет память для объекта-нити и обращается к ядру, чтобы инициализировать объект-нить ядра. После инициализации нить проходит через следующие состояния:
Рис. 1.3. Граф состояний нити
— Готовность . При поиске нити на выполнение диспетчер просматривает только нити, находящиеся в состоянии готовности, у которых есть все для выполнения, но не хватает только процессора.
— Первоочередная готовность (standby). Для каждого процессора системы выбирается одна нить, которая будет выполняться следующей (самая первая нить в очереди). Когда условия позволяют, происходит переключение на контекст этой нити.
— Выполнение . Как только происходит переключение контекстов, нить переходит в состояние выполнения и находится в нем до тех пор, пока либо ядро не вытеснит ее из-за того, что появилась более приоритетная нить или закончился квант времени, выделенный этой нити, либо нить завершится вообще, либо она по собственной инициативе перейдет в состояние ожидания.
— Ожидание . Нить может входить в состояние ожидания несколькими способами: нить по своей инициативе ожидает некоторый объект для того, чтобы синхронизировать свое выполнение; операционная система (например, подсистема ввода-вывода) может ожидать в интересах нити; подсистема окружения может непосредственно заставить нить приостановить себя. Когда ожидание нити подойдет к концу, она возвращается в состояние готовности.
— Переходное состояние . Нить входит в переходное состояние, если она готова к выполнению, но ресурсы, которые ей нужны, заняты. Например, страница, содержащая стек нити, может быть выгружена из оперативной памяти на диск. При освобождении ресурсов нить переходит в состояние готовности.
— Завершение . Когда выполнение нити закончилось, она входит в состояние завершения. Находясь в этом состоянии, нить может быть либо удалена, либо не удалена. Это зависит от алгоритма работы менеджера объектов, в соответствии с которым он и решает, когда удалять объект. Если executive имеет указатель на объект-нить, то она может быть инициализирована и использована снова.
Диспетчер ядра использует для определения порядка выполнения нитей алгоритм, основанный на приоритетах, в соответствии с которым каждой нити присваивается число — приоритет, и нити с более высоким приоритетом выполняются раньше нитей с меньшим приоритетом. В самом начале нить получает приоритет от процесса, который создает ее. В свою очередь, процесс получает приоритет в тот момент, когда его создает подсистема той или иной прикладной среды. Значение базового приоритета присваивается процессу системой по умолчанию или системным администратором. Нить наследует этот базовый приоритет и может изменить его, немного увеличив или уменьшив. На основании получившегося в результате приоритета, называемого приоритетом планирования, начинается выполнение нити. В ходе выполнения приоритет планирования может меняться.
Windows NT поддерживает 32 уровня приоритетов, разделенных на два класса — класс реального времени и класс переменных приоритетов. Нити реального времени, приоритеты которых находятся в диапазоне от 16 до 31, являются более приоритетными процессами и используются для выполнения задач, критичных ко времени.
Каждый раз, когда необходимо выбрать нить для выполнения, диспетчер прежде всего просматривает очередь готовых нитей реального времени и обращается к другим нитям, только когда очередь нитей реального времени пуста. Большинство нитей в системе попадают в класс нитей с переменными приоритетами, диапазон приоритетов которых от 0 до 15. Этот класс имеет название «переменные приоритеты» потому, что диспетчер настраивает систему, выбирая (понижая или повышая) приоритеты нитей этого класса.
Алгоритм планирования нитей в Windows NT объединяет в себе обе базовых концепции — квантование и приоритеты. Как и во всех других алгоритмах, основанных на квантовании , каждой нити назначается квант, в течение которого она может выполняться. Нить освобождает процессор, если: блокируется, уходя в состояние ожидания; завершается; исчерпан квант; в очереди готовых появляется более приоритетная нить.
Использование динамических приоритетов , изменяющихся во времени, позволяет реализовать адаптивное планирование, при котором не дискриминируются интерактивные задачи, часто выполняющие операции ввода-вывода и недоиспользующие выделенные им кванты. Если нить полностью исчерпала свой квант, то ее приоритет понижается на некоторую величину. В то же время приоритет нитей, которые перешли в состояние ожидания, не использовав полностью выделенный им квант, повышается. Приоритет не изменяется, если нить вытеснена более приоритетной нитью.
Для того, чтобы обеспечить хорошее время реакции системы, алгоритм планирования использует наряду с квантованием концепцию абсолютных приоритетов . В соответствии с этой концепцией при появлении в очереди готовых нитей такой, у которой приоритет выше, чем у выполняющейся в данный момент, происходит смена активной нити на нить с самым высоким приоритетом.
В многопроцессорных системах при диспетчеризации и планировании нитей играет роль их процессорная совместимость: после того, как ядро выбрало нить с наивысшим приоритетом, оно проверяет, какой процессор может выполнить данную нить и, если атрибут нити «процессорная совместимость» не позволяет нити выполняться ни на одном из свободных процессоров, то выбирается следующая в порядке приоритетов нить.
Большая Энциклопедия Нефти и Газа
Дескриптор процесса содержит параметры процесса, которые нужны всегда, независимо от того, находится процесс в оперативной памяти или выгружен. Системные данные, используемые ядром при нахождении процесса в оперативной памяти, образуют контекст процесса. Область контекста занимает 1К байтов и не входит в адресное пространство процесса. [1]
В дескрипторе процесса отображается текущее состояние процесса и указателя стека и записаны приоритет процесса ( целое число из диапазона 1 — 255) и адрес регистра состояния ВУ, если процесс предназначен для ввода или вывода данных. Процесс может находиться в одном из следующих состояний: активен; готов к выполнению; ждет событие или сообщение; ждет событие или сообщение с заданным тайм-аутом; ждет прерывания. [3]
Заметим: дескриптор процесса остается корректным даже после окончания процесса. Когда программа завершится с использованием дескриптора, она может закрыть его, передавая дескриптор в функцию Win32 API: : CloseHandle. Если программа не закрыла дескриптор, то он закроется автоматически при завершении программы. Когда все дескрипторы данного процесса будут закрыты, Windows освобождает память от информации, которая поддерживала процесс. [4]
Программа может передавать дескриптор дочернего процесса другим функциям Win32 API, предназначенным для управления им, например, в функцию: : SetPriorityClass для изменения приоритета процесса или в функцию: : TerminateProcess для его немедленного прекращения. [5]
Если рр — указатель на дескриптор процесса , то это поле доступно как элемент структуры рр — — р — pri. [6]
Функция: : CreateProcess предоставляет дескриптор дочернего процесса . Родительский процесс передает его одной из нескольких функций Win32 API: функции: : GetExitCodeProcess для получения кода возврата процесса, функции: : WaitForSingleObject для ожидания завершения процесса, функции: : SetPriorityClass для изменения приоритета процесса или: : TerminateProcess для его остановки. [7]
Это относится не только к дескрипторам процессов , но и ко всем другим системным структурам данных в ядре. Их количество можно варьировать при генерации; во время работы системы превышение заданных при генерации предельных чисел недопустимо. [8]
Как только дескриптор объекта помещен в таблицу дескрипторов процесса , любой поток процесса может его использовать. [10]
Программа передает в функцию Win32 API: : WaitForSingleObject дескриптор дочернего процесса , чтобы подождать его завершения ( см. гл. [11]
Параметр binheritHandles определяет, сможет ли дочерний процесс наследовать дескрипторы родительского процесса ( еще одна мера безопасности), и в нашем случае должен иметь значение True. Параметр dwcreationFiags позволяет указать флажки, влияющие на создание процесса. Флажки DETACHED PROCESS и CREATE NEW CONSOLE связаны с наследованием. По умолчанию дочерний процесс наследует консоль родительского процесса. Если мы устанавливаем флаг DETACHED PROCESS, процесс не наследует консоль, и в этом случае он может выполняться, вообще не имея консоли, если таковая не будет создана, например, с помощью функции Aiiocconsole. Если мы устанавливаем флаг CREATE NEW CONSOLE, дочерний процесс автоматически получает новую консоль. Процессу с графическим интерфейсом консоль, естественно, не нужна. [12]
Системные данные, используемые ядром в течение всего вре менк жизни процесса, образуют дескриптор процесса . Множество дескрипторов составляет таблицу процессов, которая располагается в ядре системы и адресуется непосредственно в режиме система. Дескриптор резервируется при порождении процесса и освобождается при его завершении. [13]
Приоритет пользовательского процесса вычисляется более сложным образом. В вычислении участвуют значения двух полей дескриптора процесса : р — nice и р ери. Первое из них формируется пользователем и может быть названо пользовательской составляющей приоритета процесса, второе — формируется системой и называется системной составляющей. [14]
Для каждого процесса система ведет подсчет времени его непрерывного пребывания на данном уровне памяти. Подсчитанное время хранится в поле р time дескриптора процесса . [15]
Что такое дескриптор процесса
Процессы и потоки, диспетчер задач windows, синхронизация потоков.
В этой статье мы поговорим на такие темы, как процессы и потоки, дискрипторы процесса, поговорим о синзронизации потоков и затронем всеми любимый диспетчер задач windows.
На протяжении существования процесса его выполнение может быть многократно прервано и продолжено. Для того, чтобы возобновить выполнение процесса, необходимо восстановить состояние его операционной среды. Состояние операционной среды отображается состоянием регистров и программного счетчика, режимом работы процессора, указателями на открытые файлы, информацией о незавершенных операциях ввода-вывода, кодами ошибок выполняемых данным процессом системных вызовов и т.д. Эта информация называется контекстом процесса.
Для того чтобы ОС могла управлять процессами, она должна располагать всей необходимой для этого информацией. С этой целью на каждый процесс заводится дескриптор процесса.
Дескриптор – специальная информационная структура, которая заводится на каждый процесс (описатель задачи, блок управления задачей).
В общем случае дескриптор содержит следующую информацию:
Дескриптор процесса по сравнению с контекстом содержит более оперативную информацию, которая должна быть легко доступна подсистеме планирования процессов. Контекст процесса содержит менее актуальную информацию и используется операционной системой только после того, как принято решение о возобновлении прерванного процесса.
Дескрипторы, как правило, постоянно располагаются в оперативной памяти с целью ускорить работу супервизора, который организует их в списки (очереди) и отображает изменение состояния процесса перемещением соответствующего описателя из одного списка в другой.
Для каждого состояния (за исключением состояния выполнения для однопроцессорной системы) ОС ведет соответствующий список задач, находящийся в этом состоянии. Однако для состояния ожидания может быть не один список, а столько, сколько различных видов ресурсов могут вызывать состояние ожидания.
Например, состояний ожидания завершения операции ввода/вывода может быть столько, сколько устройств ввода/вывода содержится в системе.
Процессы и потоки
Чтобы поддерживать мультипрограммирование, ОС должна определить и оформить для себя те внутренне единицы работы, между которыми будет разделяться процессор и другие ресурсы компьютера. В настоящее время в большинстве ОС определены два типа единиц работы:
В общем случае процессы просто никак не связаны между собой и могут принадлежать даже различным пользователям, разделяющим одну вычислительную систему. Другими словами, в случае процессов ОС считает их совершенно несвязанными и независимыми. При этом именно ОС отвечает за конкуренцию между процессами по поводу ресурсов.
Для повышения быстродействия процессов есть возможность задействовать внутренний параллелизм в самих процессах.
Например, некоторые операции, выполняемые приложением, могут требовать для своего исполнения достаточно длительного использования ЦП. В этом случае при интерактивной работе с приложением пользователь вынужден долго ожидать завершения заказанной операции и не может управлять приложением до тех пор, пока операция не выполнится до самого конца. Такие ситуации встречаются достаточно часто, например, при обработке больших изображений в графических редакторах. Если же программные модули, исполняющие такие длительные операции, оформлять в виде самостоятельных «подпроцессов» (потоков), которые будут выполняться параллельно с другими «подпроцессами», то у пользователя появляется возможность параллельно выполнять несколько операций в рамках одного приложения (процесса).
Можно выделить следующие отличия потоков от процессов:
Главное, что обеспечивает многопоточность, — это возможность параллельно выполнять несколько видов операций в одной прикладной программе. За счет чего реализуется эффективное использование ресурсов ЦП, а суммарное время выполнения задач становится меньше.
Например, если табличный процессор или текстовый процессор были разработаны с учетом возможностей многопоточной обработки, то пользователь может запросить пересчет своего рабочего листа или слияние нескольких документов и одновременно продолжать заполнять таблицу или открывать для редактирования следующий документ.
Диспетчер задач WINDOWS
В диспетчере задач отображаются сведения о программах и процессах, выполняемых на компьютере. Кроме того, там можно просмотреть наиболее часто используемые показатели быстродействия процессов.
Диспетчер задач служит для отображения ключевых показателей быстродействия компьютера. Для выполняемых программ можно просмотреть их состояние и завершить программы, переставшие отвечать на запросы. Имеется возможность просмотра активности выполняющихся процессов с использованием до 15 параметров, а также графиков и сведений об использовании ЦП и памяти.
Кроме того, если имеется подключение к сети, можно просматривать состояние сети и параметры ее работы. Если к компьютеру подключились несколько пользователей, можно увидеть их имена, какие задачи они выполняют, а также отправить им сообщение.
На вкладке Процессы отображаются сведения о выполняющихся на компьютере процессах: сведения об использовании ЦП и памяти, счетчике процессов и некоторые другие параметры:
На вкладке Быстродействие, отображаются сведения о счетчике дескрипторов и потоках, параметры памяти:
Потребность в синхронизации потоков возникает только в мультипрограммной ОС и связана с совместным использованием аппаратных и информационных ресурсов компьютера. Синхронизация необходима для исключения гонок (см. далее) и тупиков при обмене данными между потоками, разделении данных, при доступе к процессору и устройствам ввода-вывода.
Синхронизация потоков и процессов заключается в согласовании их скоростей путем приостановки потока до наступления некоторого события и последующей его активизации при наступлении этого события.
Пренебрежение вопросами синхронизации в многопоточной системе может привести к неправильному решению задачи или даже к краху системы.
Пример. Задача ведения базы данных клиентов некоторого предприятия.
Каждому клиенту отводится отдельная запись в базе данных, в которой имеются поля Заказ и Оплата. Программа, ведущая базу данных, оформлена как единый процесс, имеющий несколько потоков, в том числе:
Оба эти потока совместно работают над общим файлом базы данных, используя однотипные алгоритмы:
Обозначим шаги 1-3 для потока А как А1-А3, а для потока В как В1-В3. Предположим, что в некоторый момент поток А обновляет поле Заказ записи о клиенте N. Для этого он считывает эту запись в свой буфер (шаг А1), модифицирует значение поля Заказ (шаг А2), но внести запись в базу данных не успевает, так как его выполнение прерывается, например, вследствие истечение кванта времени.
Предположим, что потоку В также потребовалось внести сведения об оплате относительно того же клиента N. Когда подходит очередь потока В, он успевает считать запись в свой буфер (шаг В1) и выполнить обновление поля Оплата (шаг В2), а затем прерывается. Заметим, что в буфере у потока В находится запись о клиенте N, в которой поле Заказ имеет прежнее, не измененное значение.
Важным понятием синхронизации процессов является понятие «критическая секция» программы. Критическая секция — это часть программы, в которой осуществляется доступ к разделяемым данным. Чтобы исключить эффект гонок по отношению к некоторому ресурсу, необходимо обеспечить, чтобы в каждый момент в критической секции, связанной с этим ресурсом, находился максимум один процесс. Этот прием называют взаимным исключением.
Простейший способ обеспечить взаимное исключение — позволить процессу, находящемуся в критической секции, запрещать все прерывания. Однако этот способ непригоден, так как опасно доверять управление системой пользовательскому процессу; он может надолго занять процессор, а при крахе процесса в критической области крах потерпит вся система, потому что прерывания никогда не будут разрешены.
Другим способом является использование блокирующих переменных. С каждым разделяемым ресурсом связывается двоичная переменная, которая принимает значение 1, если ресурс свободен (то есть ни один процесс не находится в данный момент в критической секции, связанной с данным процессом), и значение 0, если ресурс занят. На рисунке ниже показан фрагмент алгоритма процесса, использующего для реализации взаимного исключения доступа к разделяемому ресурсу D блокирующую переменную F(D). Перед входом в критическую секцию процесс проверяет, свободен ли ресурс D. Если он занят, то проверка циклически повторяется, если свободен, то значение переменной F(D) устанавливается в 0, и процесс входит в критическую секцию. После того, как процесс выполнит все действия с разделяемым ресурсом D, значение переменной F(D) снова устанавливается равным 1.
Если все процессы написаны с использованием вышеописанных соглашений, то взаимное исключение гарантируется. Следует заметить, что операция проверки и установки блокирующей переменной должна быть неделимой. Поясняется это следующим образом. Пусть в результате проверки переменной процесс определил, что ресурс свободен, но сразу после этого, не успев установить переменную в 0, был прерван. За время его приостановки другой процесс занял ресурс, вошел в свою критическую секцию, но также был прерван, не завершив работы с разделяемым ресурсом. Когда управление было возвращено первому процессу, он, считая ресурс свободным, установил признак занятости и начал выполнять свою критическую секцию. Таким образом, был нарушен принцип взаимного исключения, что потенциально может привести к нежелаемым последствиям. Во избежание таких ситуаций в системе команд машины желательно иметь единую команду «проверка-установка», или же реализовывать системными средствами соответствующие программные примитивы, которые бы запрещали прерывания на протяжении всей операции проверки и установки.
Реализация критических секций с использованием блокирующих переменных имеет существенный недостаток: в течение времени, когда один процесс находится в критической секции, другой процесс, которому требуется тот же ресурс, будет выполнять рутинные действия по опросу блокирующей переменной, бесполезно тратя процессорное время. Для устранения таких ситуаций может быть использован так называемый аппарат событий. С помощью этого средства могут решаться не только проблемы взаимного исключения, но и более общие задачи синхронизации процессов. В разных операционных системах аппарат событий реализуется по-своему, но в любом случае используются системные функции аналогичного назначения, которые условно называются WAIT(x) и POST(x), где x — идентификатор некоторого события.
Если ресурс занят, то процесс не выполняет циклический опрос, а вызывает системную функцию WAIT(D), здесь D обозначает событие, заключающееся в освобождении ресурса D. Функция WAIT(D) переводит активный процесс в состояние ОЖИДАНИЕ и делает отметку в его дескрипторе о том, что процесс ожидает события D. Процесс, который в это время использует ресурс D, после выхода из критической секции выполняет системную функцию POST(D), в результате чего операционная система просматривает очередь ожидающих процессов и переводит процесс, ожидающий события D, в состояние ГОТОВНОСТЬ.
Обобщающее средство синхронизации процессов предложил Дейкстра, который ввел два новых примитива. В абстрактной форме эти примитивы, обозначаемые P и V, оперируют над целыми неотрицательными переменными, называемыми семафорами. Пусть S такой семафор. Операции определяются следующим образом:
V(S): переменная S увеличивается на 1 одним неделимым действием; выборка, инкремент и запоминание не могут быть прерваны, и к S нет доступа другим процессам во время выполнения этой операции.
P(S): уменьшение S на 1, если это возможно. Если S=0, то невозможно уменьшить S и остаться в области целых неотрицательных значений, в этом случае процесс, вызывающий P-операцию, ждет, пока это уменьшение станет возможным. Успешная проверка и уменьшение также является неделимой операцией.
В частном случае, когда семафор S может принимать только значения 0 и 1, он превращается в блокирующую переменную. Операция P заключает в себе потенциальную возможность перехода процесса, который ее выполняет, в состояние ожидания, в то время как V-операция может при некоторых обстоятельствах активизировать другой процесс, приостановленный операцией P.
Взаимоблокировка процессов
При организации параллельного выполнения нескольких процессов одной из главных функций ОС является корректное распределение ресурсов между выполняющимися процессами и обеспечение процессов средствами взаимной синхронизации и обмена данными.
При параллельном исполнении процессов могут возникать ситуации, при которых два или более процесса все время находятся в заблокированном состоянии. Самый простой случай – когда каждый из двух процессов ожидает ресурс, занятый другим процессом. Из-за такого ожидания ни один из процессов не может продолжить исполнение и освободить в конечном итоге ресурс, необходимый другому процессу. Эта тупиковая ситуация называется дедлоком (dead lock), тупиком, клинчем или взаимоблокировкой.
Говорят, что в мультизадачной системе процесс находится в состоянии тупика, если он ждет события, которое никогда не произойдет.
Тупиковые ситуации надо отличать от простых очередей, хотя и те и другие возникают при совместном использовании ресурсов и внешне выглядят похоже: процесс приостанавливается и ждет освобождения ресурса. Однако очередь — это нормальное явление, неотъемлемый признак высокого коэффициента использования ресурсов при случайном поступлении запросов. Она возникает тогда, когда ресурс недоступен в данный момент, но через некоторое время он освобождается, и процесс продолжает свое выполнение. Тупик же является в некотором роде неразрешимой ситуацией.
Проблема тупиков включает в себя следующие задачи:
Тупики могут быть предотвращены на стадии написания программ, то есть программы должны быть написаны таким образом, чтобы тупик не мог возникнуть ни при каком соотношении взаимных скоростей процессов. Так, если бы в предыдущем примере процесс А и процесс В запрашивали ресурсы в одинаковой последовательности, то тупик был бы в принципе невозможен. Второй подход к предотвращению тупиков называется динамическим и заключается в использовании определенных правил при назначении ресурсов процессам, например, ресурсы могут выделяться в определенной последовательности, общей для всех процессов.
В некоторых случаях, когда тупиковая ситуация образована многими процессами, использующими много ресурсов, распознавание тупика является нетривиальной задачей. Существуют формальные, программно-реализованные методы распознавания тупиков, основанные на ведении таблиц распределения ресурсов и таблиц запросов к занятым ресурсам. Анализ этих таблиц позволяет обнаружить взаимные блокировки.
Если же тупиковая ситуация возникла, то не обязательно снимать с выполнения все заблокированные процессы. Можно снять только часть из них, при этом освобождаются ресурсы, ожидаемые остальными процессами, можно вернуть некоторые процессы в область свопинга, можно совершить «откат» некоторых процессов до так называемой контрольной точки, в которой запоминается вся информация, необходимая для восстановления выполнения программы с данного места. Контрольные точки расставляются в программе в местах, после которых возможно возникновение тупика.
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
Управление процессами в операционной системе
Процесс (задача) – абстракция, описывающая выполняющуюся в рамках ОС программу. Для ОС процесс – единица работы, которая потребляет системные ресурсы.
Задачи, решаемые подсистемой управления процессами:
С понятием управления процессами в ОС связаны следующие технологии:
Содержание
Состояния процесса в ОС
Состояние процесса в ходе жизненного цикла в ОС
В ходе жизненного цикла каждый процесс переходит из одного состояния в другое в соответствии с алгоритмом планирования процессов, реализуемым в данной операционной системе.

Информация о процессе:
Информационные структуры описывающие процессы
Контекст процесса
Контекст процесса содержит информацию о внутреннем состоянии процесса, а также отражает состояние аппаратуры в момент прерывания процесса и включает параметры операционной среды. Содержит часть информации необходимой для возобновления выполнения процесса с прерванного места.
В состав контекста процесса входит:
Дескриптор процесса
Дескриптор процесса – это информационная структура, которая описывает внешнюю структуру (информацию) процессе (нужна планировщику для выполнения процесса, а так же нужна ядру в течение всего жизненного цикла процесса)
В состав дескриптора входят:
Дескрипторы присутствуют в качестве элементов списка. Для того, чтобы ОС выбирала процессы надо иметь идентификаторы процессов и т.д., т.е. дескрипторы. Дескрипторы отдельных процессов объединены в список, образующих таблицу процессов. Память для таблицы процессов отводиться динамически в области ядра. На основании соседних в таблице процессов ОС осуществляет планирование и синхронизацию процессов. Потоки образуют очереди готовых и ожидающих потоков путём объединения в списки дескрипторов отдельных потоков. Такая организация очередей позволяет легко их переупорядочить, включать и исключать процессы, переводить процессы из одного состояния в другое.
Алгоритмы планирования процессов в ОС
Задача планирования процессов состоит из трех действий:
Первые два действия выполняются на программном уровне (специально написанный код) и относятся к планированию, третье – на аппаратном уровне и относится к диспетчеризации.
Создание процесса
С этого момента можно считать, что процесс стартовал.
Разберём подробно вопрос создания процесса. Когда запускается приложение, Операционная Система создаёт две информационные структуры: контекст и дескриптор (идентификатор и т.д.). Кодовый элемент грузится в оперативную память (информацию о нём заносится в контекст). Затем дескриптор процесса включается в очередь процессов; далее планировщик решает, что процесс должен быть выполнен, а дескриптор процесса находится в очереди готовых процессов. Прежде прервать выполнение процесса, ОС вначале сохраняет его контекст, чтобы в последствие использовать эту инструкцию для последовательного возобновления. Затем контекст обновляется (переключение контекста) и активный контекст получает информацию о новом процессе. Далее процессу выделяются ресурсы, процессорное время и т.д. При удалении процесса: уничтожается дескриптор и удаляется контекст. Новый процесс может получить дескриптор с тем же номером.
Алгоритмы планирования процессов
В зависимости от того, какие критерии накладываются, алгоритмы планирования могут основываться на:
Алгоритмы, основанные на квантовании времени
Алгоритмы, основанные на квантовании времени – любому процессу на выполнение отводится определенный квант времени (несколько милисекунд). Переключение активного процесса происходит если:
По истечении выделенного времени планировщик ставит другой процесс. Если до истечения времени процесс находится в режиме ожидания, запускается другой процесс. Кванты времени выделенные процессами, могут быть для разных процессов одинаковыми или различными. Кванты, выделяемые одному процессу могут быть фиксированной величины, а могут и изменяться в разные периоды жизни процесса. Некоторые из процессов используют полученные кванты времени не полностью из-за необходимости выполнить операции ввода-вывода. Тогда возникает ситуация, когда процессы с интенсивными обращениями к вводу-выводу используют только небольшую часть выделенного им процессорного времени. В качестве компенсации за не полностью использованные кванты, процессы получают привилегии при последующем обслуживании (создают две очереди готовых процессов, прежде всего просматривается вторая очередь; если она пуста, квант выделяется процессу из первой очереди)
Выбор новых процессов может быть построен по принципам:
Алгоритмы, основанные на приоритетах
Приоритет – число, характеризующее степень привилегированности процесса (обычно выражается числом). В каждой ОС это число трактуется по своему, оно может быть фиксированным или изменяться. В случае если изменяется, то называется динамическим (начальное значение устанавливает администратор) в отличие от неизменяемых, фиксированных приоритетов. Чем выше приоритет, тем выше привелегия, тем меньше времени проводит поток в очереди.
Существует 2 разновидности таких алгоритмов:
Алгоритмы планирования с относительными приоритетами – активный процесс выполняется пока не завершится или не перейдет в состояние ожидания.
Алгоритмы планирования с абсолютными приоритетами – смена процесса происходит в тот момент, когда в системе появляется процесс, приоритет которого выше приоритета выполняемого процесса.
Реально используются смешанные схемы планирования.
Вытесняющий и невытесняющий алгоритмы планирования
Основным различием между preemptive и non-preemptive вариантами многозадачности является степень централизации механизма планирования задач. При вытесняющей многозадачности механизм планирования задач целиком сосредоточен в операционной системе, и программист пишет свое приложение, не заботясь о том, что оно будет выполняться параллельно с другими задачами. При этом операционная система выполняет следующие функции: определяет момент снятия с выполнения активной задачи, запоминает ее контекст, выбирает из очереди готовых задач следующую и запускает ее на выполнение, загружая ее контекст.
При невытесняющей многозадачности механизм планирования распределен между системой и прикладными программами. Прикладная программа, получив управление от операционной системы, сама определяет момент завершения своей очередной итерации и передает управление ОС с помощью какого-либо системного вызова, а ОС формирует очереди задач и выбирает в соответствии с некоторым алгоритмом (например, с учетом приоритетов) следующую задачу на выполнение. Такой механизм создает проблемы, как для пользователей, так и для разработчиков.
Для пользователей это означает, что управление системой теряется на произвольный период времени, который определяется приложением (а не пользователем). Если приложение тратит слишком много времени на выполнение какой-либо работы, например, на форматирование диска, пользователь не может переключиться с этой задачи на другую задачу, например, на текстовый редактор, в то время как форматирование продолжалось бы в фоновом режиме. Эта ситуация нежелательна, так как пользователи обычно не хотят долго ждать, когда машина завершит свою задачу.
Поэтому разработчики приложений для non-preemptive операционной среды, возлагая на себя функции планировщика, должны создавать приложения так, чтобы они выполняли свои задачи небольшими частями. Например, программа форматирования может отформатировать одну дорожку дискеты и вернуть управление системе. После выполнения других задач система возвратит управление программе форматирования, чтобы та отформатировала следующую дорожку. Подобный метод разделения времени между задачами работает, но он существенно затрудняет разработку программ и предъявляет повышенные требования к квалификации программиста. Программист должен обеспечить «дружественное» отношение своей программы к другим выполняемым одновременно с ней программам, достаточно часто отдавая им управление. Крайним проявлением «недружественности» приложения является его зависание, которое приводит к общему краху системы. В системах с вытесняющей многозадачностью такие ситуации, как правило, исключены, так как центральный планирующий механизм снимет зависшую задачу с выполнения.
Однако распределение функций планировщика между системой и приложениями не всегда является недостатком, а при определенных условиях может быть и преимуществом, потому что дает возможность разработчику приложений самому проектировать алгоритм планирования, наиболее подходящий для данного фиксированного набора задач. Так как разработчик сам определяет в программе момент времени отдачи управления, то при этом исключаются нерациональные прерывания программ в «неудобные» для них моменты времени. Кроме того, легко разрешаются проблемы совместного использования данных: задача во время каждой итерации использует их монопольно и уверена, что на протяжении этого периода никто другой не изменит эти данные. Существенным преимуществом non-preemptive систем является более высокая скорость переключения с задачи на задачу.
Однако почти во всех современных операционных системах, ориентированных на высокопроизводительное выполнение приложений (UNIX, Windows NT, OS/2), реализована вытесняющая многозадачность. Вытесняющую многозадачность часто называют истинной многозадачностью.
Синхронизация процессов в ОС
Проблема синхронизации процессов
Рассмотрим пример: в системе два прикладных процесса, которые будут работать с очередью печати.
1. Процесс
Процесс
Компьютерная программа о выполняемых действиях с определенным набором данных является базовой единицей системы для распределения и планирования ресурсов и основой структуры операционной системы. В ранней компьютерной архитектуре, ориентированной на процесс, процесс является основным исполняющим элементом программы; в современной ориентированной на поток компьютерной архитектуре процесс является контейнером потока. Программа — это описание инструкций, данных и их организации, а процесс — это сущность программы.
- Парафраз: Процесс выполнения программы
- характерная черта: Динамический, независимый, асинхронный, параллельный
- Состав: Процедуры, данные иБлок управления процессом
- Связанные понятия: Тема, монитор
определение
Узкое определение: процесс — это экземпляр выполняемой компьютерной программы.
Широкое определение:
Процесс — это выполняющееся действие определенного набора данных программы с определенной независимой функцией.
Это базовая единица динамического выполнения операционной системы. В традиционной операционной системе процесс является одновременно базовой единицей распределения и основной исполнительной единицей.
В концепции процесса есть два основных момента:
первое,Процесс — это сущность。
во-вторых,Процесс — это «программа в процессе»。
характерная черта
Динамический: Суть процесса — однократное выполнение программы в многопрограммной системе, процесс динамически генерируется и динамически умирает.
Параллелизм: Любой процесс может выполняться одновременно с другими процессами
Независимость: Процесс — это базовая единица, которая может работать независимо, а также независимая единица для распределения и планирования системных ресурсов;
Асинхронность: Из-за взаимных ограничений между процессами, процессы имеют прерывистое выполнение, то есть процессы продвигаются с независимой и непредсказуемой скоростью.
Состав: Процесс состоит из трех частей: программы, данных и блока управления процессом.
Несколько разных процессов могут содержать одну и ту же программу: программа в разных наборах данных составляет разные процессы и может получать разные результаты; но программу нельзя изменить во время выполнения .
содержание
Процесс компьютерной системы включает (или "владеет") следующими данными:
Образ памяти исполняемого машинного кода этой программы. Выделенная память (обычно включая область виртуальной памяти). Содержимое памяти включает исполняемый код, данные, относящиеся к процессу (ввод, вывод), стек вызовов, стек (используется для сохранения данных, сгенерированных на полпути во время выполнения). Дескрипторы ресурсов операционной системы, назначенные процессу, такие как дескрипторы файлов (терминология Unix) или дескрипторы файлов (Windows), источники данных и терминалы данных. Функции безопасности, такие как владелец процесса и набор разрешений процесса (допустимые операции). Состояние процессора (текст), например содержимое регистра, адресация физической памяти и т. Д. Когда процесс запущен, состояние обычно сохраняется в регистрах, а другие условия хранятся в памяти.
Переключатель
Переключение процессов заключается в том, чтобы вывести процессор из запущенного процесса, а затем заставить выполняемый процесс занять процессор.
Восстановление процессора из процесса, упомянутого здесь, по сути, заключается в поиске места для хранения промежуточных данных, хранящихся в регистрах процессора в процессе, тем самым освобождая регистры процессора. Вышли для использования другими процессами. Так где же промежуточные данные приостановленного процесса? Конечно, это место должно быть приватным стеком процесса.
Позвольте процессу занять процессор, по сути сохраняя данные регистров процесса в частном стеке (промежуточные данные с момента предыдущего прерывания процесса), а затем восстанавливая их процессору. В регистре точка останова процесса, который должен быть запущен, отправляется на указатель программы PC процессора, поэтому запускаемый процесс начинает выполняться процессором, то есть процесс имеет право использовать процессор.
Это похоже на то, что несколько студентов хотят использовать одну и ту же парту при разделении времени. Так называемое лишение права пользоваться партой студента, который пользуется партой, по сути, означает, что он позволяет ему брать то, что ему принадлежит Уберите его; и дать однокласснику право пользоваться столом — значит позволить ему класть свои вещи на стол.
При переключении промежуточные данные процесса, хранящиеся в каждом регистре процессора, называются контекстом процесса, поэтому переключение процесса по сути является переключением между контекстом прерванного процесса и процессом, который должен быть запущен. Когда процесс не занимает процессор, контекст процесса сохраняется в частном стеке процесса.
положение дел
Прерывистый характер процесса определяет, что процесс может иметь несколько состояний. Фактически, запущенный процесс может иметь следующие три основных состояния.
1) Состояние готовности (Ready):
Процесс получил требуемые ресурсы, кроме процессора, и ожидает выделения ресурсов процессора; процесс может выполняться, пока процессор выделен. Готовый процесс можно поставить в очередь согласно множеству приоритетов. Например, когда процесс входит в состояние готовности из-за исчерпания временного интервала, он помещается в очередь с низким приоритетом; когда процесс входит в состояние готовности по завершении операции ввода-вывода, он помещается в очередь с высоким приоритетом.
2) Статус работы (Работает):
Процессы занимают ресурсы процессора; количество процессов в этом состоянии меньше или равно количеству процессоров. Когда никакие другие процессы не могут быть выполнены (например, все процессы находятся в состоянии блокировки), неактивные процессы системы обычно выполняются автоматически.
3) Заблокировано:
Поскольку процесс ожидает определенного условия (например, операции ввода-вывода или синхронизации процесса), он не может продолжить выполнение, пока условие не будет выполнено. Даже если ресурсы процессора были выделены процессу до события, он не мог работать.
Разница
программа
Программа — это упорядоченный набор инструкций и данных, не имеющий операционного значения и представляющий собой статичное понятие. Процесс — это процесс выполнения программы на процессоре, это динамическое понятие.
Программа может существовать как своего рода данные программного обеспечения долгое время, а процесс имеет определенный срок жизни. Программа постоянная, а процесс временный.
Процесс может описать параллелизм более реалистично, но программа не может;
Процесс состоит из трех частей: блока управления процессом, сегмента программы и сегмента данных;
Процесс имеет функцию создания других процессов, а программа — нет.
Одна и та же программа работает с несколькими наборами данных одновременно, она будет принадлежать нескольким разным процессам, а это означает, что одна и та же программа может соответствовать нескольким процессам.
В традиционных операционных системах программы не могут работать независимо. Базовыми единицами распределения ресурсов и независимой работы являются процессы.
Связь между процессами и потоками
Обычно вПроцесс может содержать несколько потоков, Они могут использовать ресурсы, принадлежащие процессу. В операционной системе, которая вводит потоки, процесс обычно используется как базовая единица для распределения ресурсов, а поток используется как базовая единица для независимой работы и независимого планирования. Поскольку потоки меньше, чем процессы, По сути, он не владеет системными ресурсами, поэтому затраты на его планирование будут намного меньше, что может более эффективно улучшить степень одновременного выполнения нескольких программ в системе.
Текущие общие операционные системы представили потоки для дальнейшего улучшения параллелизма системы и считают это важным показателем современных операционных систем.
контроль
Управление процессами — самая основная функция в управлении процессами. Он используется для создания нового процесса, завершения завершенного процесса или завершения процесса, который не может быть запущен из-за события, а также отвечает за изменение состояния во время процесса.
Создать процесс
1. Событие, вызвавшее процесс создания
В среде мультипрограммирования только (как) процесс (время) может выполняться в системе. Следовательно, чтобы программа могла работать, для нее должен быть создан процесс. Типичные события, которые заставляют один процесс создавать другой процесс, могут быть следующих четырех категорий:
1) Логин пользователя
В системе с разделением времени после того, как пользователь вводит команду входа в систему на терминале, если это законный пользователь, система устанавливает процесс для терминала и вставляет его в очередь готовности.
2) Планирование работы
В системе пакетной обработки, когда планировщик заданий планирует задание в соответствии с определенным алгоритмом, он загружает задание в память, выделяет для него необходимые ресурсы и немедленно передает его. Создайте процесс и вставьте его в очередь готовности.
3) Предоставлять услуги
Когда запущенная пользовательская программа делает определенный запрос, система создает специальный процесс для предоставления услуги, которая нужна пользователю. Например, если пользовательской программе требуется печать файла, операционная система будет Создайте процесс печати так, чтобы не только процесс печати мог выполняться одновременно с пользовательским процессом, но также было легко рассчитать время, затрачиваемое на выполнение задачи печати.
4) Заявка на заявку
В трех вышеуказанных случаях ядро системы создает для него новый процесс, и этот тип события основан на потребностях процесса приложения, который создает новый процесс. Для того, чтобы новый процесс выполнил определенную задачу в режиме параллельной работы.
2. Процесс создания процесса
Как только операционная система обнаруживает событие, требующее создания нового процесса, она вызывает примитив создания процесса create () для создания нового процесса на следующих этапах.
1) Подайте заявку на получение пустой печатной платы. Подайте заявку на получение уникального цифрового идентификатора для нового процесса и запросите пустую печатную плату из коллекции печатных плат.
2) Выделите ресурсы для нового процесса. Выделите необходимое пространство памяти для программы и данных нового процесса и пользовательского стека. Очевидно, что операционная система должна знать объем памяти, необходимый новому процессу в это время.
3) Инициализировать блок управления процессом. Инициализация печатной платы включает:
①Инициализировать идентификационную информацию и заполнить новую плату идентификатором, присвоенным системой, и идентификатором родительского процесса.
②Инициализировать информацию о состоянии процессора, сделать так, чтобы счетчик программы указывал на адрес входа программы, а указатель стека указывал на вершину стека.
③Инициализировать управляющую информацию процессора, установить состояние процесса в состояние готовности или статическое состояние готовности. Для приоритета обычно устанавливается самый низкий приоритет, если только пользователь явно не Способы выдвижения первоочередных требований.
4) Вставьте новый процесс в очередь готовности.Если очередь готовности процессов может принять новый процесс, вставьте новый процесс в очередь готовности.
Прекращение процесса
1. Событие, вызвавшее завершение процесса.
1) Нормальный конец
В любой компьютерной системе должно быть указание на то, что процесс завершился. Например, в системе пакетной обработки инструкция Hold или системный вызов для завершения обычно размещаются в конце программы. Когда программа выполняет инструкцию Hold, будет сгенерировано прерывание, чтобы уведомить ОС о завершении процесса.
2) Аномальный конец
Во время выполнения из-за некоторых ошибок и сбоев процесс принудительно завершается. Существует много видов аномальных событий, наиболее частыми из них являются: ошибка выхода за границы, ошибка защиты, недопустимая инструкция, ошибка привилегированной инструкции, тайм-аут выполнения, тайм-аут ожидания, ошибка арифметической операции, сбой ввода-вывода.
3) Внешнее вмешательство
Внешнее вмешательство не означает, что во время работы этого процесса происходит ненормальное событие, но означает, что процесс завершается по запросу внешнего мира. Эти вмешательства: вмешательство оператора или операционной системы, запрос родительского процесса, завершение родительского процесса.
- Прекращение процесса
Если в системе происходит событие, требующее завершения процесса, ОС вызывает примитив завершения процесса и выполняет процесс, описанный ниже, для завершения указанного процесса.
1) В соответствии с идентификатором завершенного процесса извлечь плату процесса из набора плат и прочитать из нее состояние процесса.
2) Если завершенный процесс находится в состоянии выполнения, выполнение процесса должно быть немедленно прекращено, а флаг планирования установлен в значение true. Используется для указания того, что процесс должен быть запланирован снова после его завершения.
3) Если у процесса есть потомки, все дочерние процессы должны быть прекращены, чтобы они не стали неконтролируемыми.
4) Вернуть все ресурсы, принадлежащие завершенному процессу, либо его родительскому процессу, либо системе.
5) Завершенный процесс (его печатная плата) будет удален из очереди (или связанного списка), где он расположен, ожидая, пока другие программы соберут информацию.
Блокировать пробуждение
1. События, вызывающие блокировку процесса и пробуждение
1) Запросить системное обслуживание
Когда выполняющий процесс запрашивает у операционной системы предоставление услуг, по какой-то причине, когда операционная система не сразу отвечает требованиям процесса, процесс может только перейти в заблокированное состояние для ожидания. Как только требования выполнены, процесс пробуждается.
2) Начать операцию
Когда процесс запускает операцию, если процесс должен быть выполнен после завершения операции, процесс должен быть сначала заблокирован, чтобы дождаться завершения операции. После завершения операции Разбуди процесс.
3) Новые данные еще не поступили
Для взаимодействующих друг с другом процессов, если одному из процессов необходимо получить данные, предоставленные другим (совместным) процессом, прежде чем он сможет работать для обработки данных, это происходит потому, что требуемые данные еще не прибыли. Процесс только (ожидающий) блокируется, а когда поступают данные, процесс пробуждается.
4) Никакой новой работы
Система часто настраивает некоторые системные процессы с определенной функцией. Каждый раз, когда такой процесс завершает свою задачу, он блокируется, ожидая прибытия новой задачи. После поступления новой задачи процесс блокируется. проснуться.
2. Процесс блокировки процесса
Выполняемый процесс после обнаружения события, упомянутого выше, не может продолжить выполнение, поэтому процесс блокирует себя, вызывая блокирующий примитив block (). Видно, что блокировка процесса — это активное поведение самого процесса. После входа в процесс блока, поскольку процесс все еще находится в состоянии выполнения в это время, выполнение должно быть немедленно остановлено, текущее состояние в блоке управления процессом изменяется с выполнения на блокировку, а печатная плата вставляется в очередь блокировки. Если в системе установлено несколько блокирующих очередей, заблокированных разными событиями, процесс должен быть вставлен в блокирующую (ожидающую) очередь с тем же событием. Наконец, перенесите планировщик для перепланирования, назначьте процессор другому готовому процессу и переключите, то есть сохраните состояние процессора заблокированного процесса (на плате), а затем нажмите процессор на печатной плате нового процесса. Состояние установки окружения процессора.
- Процесс пробуждения процесса
Когда происходит событие, ожидаемое заблокированным процессом, например завершение ввода-вывода или ожидаемые данные, соответствующий процесс (например, исчерпал и освободил ввод-вывод) / O device process) вызывают примитив пробуждения wakeup (), чтобы разбудить процесс, ожидающий события. Процесс пробуждения примитивов состоит в том, чтобы сначала удалить заблокированный процесс из очереди блокировки, ожидающей события, изменить текущий статус на плате с заблокированного на готовый, а затем вставить плату в очередь готовности.
Алгоритм планирования
Алгоритм планирования процесса включает:
В системах реального времени: FIFO (первый вход — первый выход), SJF (сначала кратчайшее задание, алгоритм приоритета кратчайшего задания), SRTF (сначала наименьшее оставшееся время, сначала наименьшее оставшееся время) алгоритм).
Интерактивная система: RR (Round Robin, алгоритм ротации квантов времени), HPF (High Priority First, алгоритм наивысшего приоритета), многоуровневая очередь, самый короткий приоритет процесса, гарантированное планирование, планирование лотереи, планирование справедливого распределения.
стадия
Процесс состоит из трех частей: блока управления процессом, сегмента программы и сегмента данных.. Процесс может содержать несколько потоков (Thread), которые могут помочь приложению делать несколько вещей одновременно (например, один поток записывает файл на диск, а другой принимает ключевую операцию пользователя и вовремя отвечает, не мешая друг другу). После запуска программы первое, что нужно сделать системе, — это создать поток по умолчанию для программного процесса, а затем программа может добавлять или удалять связанные потоки по мере необходимости. Это программа, которая может выполняться одновременно. Выполняемый процесс для набора данных — это независимая единица системы для распределения ресурсов и планирования. Он также называется действием, путем или задачей. Он имеет два свойства: активность и параллелизм. Процессы можно разделить на три состояния: запущен, заблокирован и готов, и они преобразуются друг в друга в соответствии с определенными условиями: готово к работе, запущено-блокируется и готово к блокировке.
Процесс — это запущенный экземпляр приложения, который представляет собой динамическое выполнение приложения. Казалось бы, продвинутое, мы можем просто понять это как: это текущая исполнительная программа операционной системы. Выполняемые в настоящее время в системе программы включают в себя: система управляет отдельным компьютером и программами, необходимыми для выполнения различных операций; дополнительные программы, открываемые и выполняемые пользователем, конечно, включают незаконные программы, которые пользователь не знает, но которые запускаются автоматически (они могут Это вирусная программа).
Во-вторых, дескриптор процесса
1. Концепция
В Linux у каждого процесса есть дескриптор процесса. Этот «дескриптор процесса» представляет собой структуру, называемую task_struct, и много информации об управлении процессом хранится в task_struct.
task_struct — это структура данных ядра Linux, которая будет загружена в ОЗУ и содержать информацию о процессе. Каждый процесс помещает свою информацию в структуру данных task_struct, и
2.task_struct содержание
Идентификатор: Уникальный идентификатор, описывающий этот процесс, используемый для различения других процессов.
положение дел: Статус задачи, код выхода, сигнал выхода и т. Д.
приоритет: Приоритет относительно других процессов.
Счетчик команд: Адрес следующей инструкции, которая будет выполняться в программе.
Указатель памяти: Включает указатели на программный код и данные, относящиеся к процессу, а также указатели на блоки памяти, совместно используемые с другими процессами.
Данные контекста: Данные в регистре процессора во время выполнения процесса.
Информация о состоянии ввода / вывода: Включая отображаемый запрос ввода-вывода, устройство ввода-вывода, назначенное процессу, и список файлов, используемых процессом.
Учетная информация: может включать общее время процессора, общее количество используемых часов, временные ограничения, номера счетов и т. Д.
3. Классификация task_struct
Запланировать элементы данных
(1) volatile long состояния; // Статус процесса
(2) unsigned long flags; // Обрабатываем флаг
(3) long priority; // Используется для сохранения динамического приоритета
(4) unsigned long rt_priority; // Используется для сохранения приоритета реального времени, диапазон значений 0
99
(5) long counter;
(6) unsigned long policy;
Обработка сигналов
(1) unsigned long signal;
(2) unsigned long blocked;
(3) struct signal_struct *sig;
Указатель очереди процесса
(1) struct task_struct *next_task,*prev_task;
(2) struct task_struct *next_run,*prev_run;
(3) struct task_struct * p_opptr, * p_pptr; и struct task_struct * p_cptr, * p_ysptr, * p_osptr;
ID процесса
(1) unsigned short uid,gid;
(2) int groups[NGROUPS];
(3) unsigned short euid,egid;
(4) unsigned short fsuid,fsgid;
(5) unsigned short suid,sgid;
(6) int pid,pgrp,session;
(7) int leader;
Член данных времени
(1) unsigned long timeout;
(2) unsigned long it_real_value,it_real_iner;
(3) struct timer_list real_timer;
(4) unsigned long it_virt_value,it_virt_incr;
(5) unsigned long it_prof_value,it_prof_incr;
(6) long utime,stime,cutime,cstime,start_time;
Член данных семафора
(1) struct sem_undo *semundo;
(2) struct sem_queue *semsleeping;
Контекст процесса
(1) struct desc_struct *ldt;
(2) struct thread_struct tss;
(3) unsigned long saved_kernel_stack;
(4) unsigned long kernel_stack_page;
Член данных файловой системы
(1) struct fs_struct *fs;
(2) struct files_struct *files;
(3) int link_count;
Член данных памяти
Управление страницей
(1) int swappable:1;
(2) unsigned long swap_address;
(3) unsigned long min_flt,maj_flt;
(4) unsigned long nswap;
(5) unsigned long cmin_flt,cmaj_flt,cnswap;
(6) unsigned long old_maj_flt,dec_flt;
(7) unsigned long swap_cnt;
Члены данных при поддержке симметричного многопроцессорного режима (SMP)
(1) int processor;
(2) int last_processor;
(3) int lock_depth;
Другие члены данных
(1) unsigned short used_math;
(2) char comm[16];
(3) struct rlimit rlim[RLIM_NLIMITS];
(4) int errno;
(5) long debugreg[8];
(6) struct exec_domain *exec_domain;
(7) unsigned long personality;
(8) struct linux_binfmt *binfmt;
(9) int exit_code,exit_signal;
(10) int dumpable:1;
(11) int did_exec:1;
(12) int tty_old_pgrp;
(13) struct tty_struct *tty;
(14) struct wait_queue *wait_chldexit;
Глобальные переменные технологической очереди
(1) current;
(2) struct task_struct init_task;
(3) struct task_struct *task[NR_TASKS];
(4) unsigned long volatile jiffies;
(5) int need_resched;
(6) unsigned long intr_count;