
ОС архив / Лекция 4
.docЛекция 4.
Процесс. Состояния процесса. Дескриптор процесса. Контекст процесса. Переключение контекста. Потоки. Структуры данных для управления процессами и потоками в Windows.
Разберем, что же понимается в программировании под термином «процесс». В большинстве учебников под процессом понимается абстрактное понятие, описывающее работу программы. Это определение не вполне точно. Понятие процесса характеризует некоторую совокупность набора исполняющихся команд, ассоциированных с ним ресурсов (выделенная для исполнения память или адресное пространство, стеки, используемые файлы и устройства ввода-вывода и т. д.) и текущего момента его выполнения (значения регистров, программного счетчика, состояния стека и значения переменных), находящуюся под управлением операционной системы. Не существует взаимнооднозначного соответствия между процессами и программами, обрабатываемыми вычислительными системами. Процесс находится под управлением операционной системы, поэтому в нем может выполняться часть кода ее ядра – при использовании системных вызовов, обработке внешних прерываний.
При использовании такой абстракции все, что выполняется в вычислительных системах (в том числе и части операционной системы), организованно в виде набора процессов. С позиции данной абстрактной модели, у каждого процесса есть собственный виртуальный (а для мультипроцессорных систем – реальный) центральный процессор.
Процесс имеет:
-
собственные области памяти под код и данные, включая значения регистров и счетчика команд;
-
собственный стек;
-
собственное отображение виртуальной памяти (в системах с виртуальной памятью) на физическую.
Любой процесс в операционной системе характеризуется своим состоянием. Количество состояний и переход между состояниями процесса различны в разных операционных системах. Рассмотрим типичные состояния процесса и переходы из одного состояния в другое.
Рис. 4.1. Диаграмма состояний процесса
Представленная на рисунке диаграмма состояний процесса может отличаться от принятой в конкретной операционной системе. Но, тем не менее, она отражает типичный жизненный цикл процесса: рождение – готовность – выполнение – уничтожение.
При рождении процесс получает в свое распоряжение адресное пространство, в которое загружается программный код процесса. Ему выделяется стек и системные ресурсы, устанавливается начальное значение программного счетчика процесса и т.д.
Существуют четыре основных события, приводящие к созданию процессов:
1. Инициализация системы.
2. Исполнение запущенным процессом системного вызова создания процесса.
3. Запрос пользователя на создание процесса.
4. Инициализация пакетного задания.
При загрузке операционной системы обычно создаются несколько процессов. Некоторые из них являются процессами, взаимодействующими с пользователями и выполняющими для них определенную работу. Другие процессы являются фоновыми: они не связаны с конкретными пользователями, однако имеют определенное функциональное назначение. Процессы, выполняемые в фоновом режиме и осуществляющие определенную деятельность (например печать), часто называют демонами. Процессы могут создаваться не только при загрузке операционной системы, но и во время ее работы. Запущенный процесс может создать один или несколько новых процессов, которые помогают ему выполнять свои функции. Таким образом, процессы в операционной системы образуют дерево.
В любом случае новый процесс создается путем выполнения соответствующего системного вызова существующим процессом. В качестве последнего может выступать пользовательский процесс, системный процесс, активизируемый клавиатурой или мышью, а также менеджер пакетной обработки. Процесс исполняет системный вызов, запрашивающий у операционной системы создание нового процесса, и указывает (прямо или косвенно), какая программа должна быть запущена в этом процессе.
Всякий новый процесс, появляющийся в системе, попадает в состояние готовность. Операционная система, пользуясь алгоритмом планирования, выбирает один из готовых процессов и переводит его в состояние исполнение. В этом состоянии происходит непосредственное выполнение программного кода процесса. Выйти из этого состояния процесс может по следующим причинам:
-
операционная система прекращает выполнение процесса;
-
процесс не может продолжать свою работу, пока не произойдет некоторое событие. В этом случае операционная система переводит процесс в состояние ожидания; После того, как событие произошло, операционная система возвращает процесс в состояние готовность.
-
в результате возникновения прерывания в вычислительной системе (например, от таймера по истечении предусмотренного времени выполнения) операционная система возвращает процесс в состояние готовность.
После завершения своей деятельности процесс переходит в состояние уничтожение.
Процесс завершается одним из следующих четырех способов:
1. Нормальное завершение (добровольное).
2. Завершение вследствие ошибки (добровольное).
3. Завершение вследствие фатальной ошибки (принудительное).
4. Уничтожение другим процессом (принудительное).
По завершении работы операционная система освобождает все ресурсы, ассоциированные с данным процессом.
При управлении процессами операционная система использует два основных типа информационных структур: дескриптор процесса и контекст процесса. Дескриптор процесса содержит такую информацию о процессе, которая необходима ядру в течение всего жизненного цикла процесса независимо от того, в каком состоянии он находится, а также находится ли образ процесса в оперативной памяти или выгружен на диск. Под образом процесса понимается совокупность его кодов и данных.
Дескрипторы отдельных процессов объединены в список, образующий таблицу процессов. Память для таблицы процессов отводится динамически в области ядра. На основании информации, содержащейся в таблице процессов, операционная система осуществляет планирование и синхронизацию процессов. В дескрипторе прямо или косвенно (через указатели на связанные с процессом структуры) содержится информация о состоянии процесса, о расположении образа процесса в оперативной памяти и на диске, о значении отдельных составляющих приоритета, а также о его итоговом значении – глобальном приоритете, об идентификаторе пользователя, создавшего процесс, о родственных процессах, о событиях, осуществления которых ожидает данный процесс, и некоторая другая информация.
Контекст процесса содержит менее оперативную часть информации о процессе, необходимую для возобновления выполнения процесса с прерванного места: содержимое регистров процессора, коды ошибок выполняемых процессором системных вызовов, информация о всех открытых данным процессом файлах и незавершенных операциях ввода-вывода и другие данные, характеризующие состояние вычислительной системы в момент прерывания. Контекст, также как и дескриптор процесса, доступен только программам ядра, то есть находится в виртуальном адресном пространстве операционной системы, однако хранится он не в области ядра, а непосредственно примыкает к образу процесса и перемещается вместе с ним, если это необходимо, из оперативной памяти на диск.
Большинство современных операционных систем позволяют работать сразу с большим количеством процессов. Это позволяет лучше загружать ресурсы вычислительной системы: в то время как выполняющийся процесс может оказаться заблокированным в результате ожидания некоторого события или ресурса (например, ожидает данные из внешней памяти), другие процессы могут находиться в состоянии готовности, и какой-либо из них будет переведен в состояние выполнения. Таким образом, в результате изменения состояния процесса операционной системе приходится переключаться с одного процесса на другой. Для корректного переключения процессов необходимо сохранить контекст исполнявшегося процесса и восстановить контекст процесса, на который будет переключен процессор. Такая процедура сохранения/восстановления работоспособности процессов называется переключением контекста.
Рис. 4.2. Переключение контекста
На рисунке 4.2. показано, как происходит переключение контекста при возникновении прерывания. Видно, что время, затрачиваемое на переключение контекста, складывается из времени сохранения контекста первого процесса, времени обработки самого прерывания, времени, затрачиваемого операционной системой на планирование (определения того процесса, который будет выполняться), и времени восстановления контекста второго процесса. Это время не используется вычислительной системой для совершения полезной работы и представляет собой накладные расходы, снижающие производительность системы. Это время зависит от конкретных особенностей вычислительной системы и может составлять от 1 до 1000 микросекунд.
Существенно сократить накладные расходы позволяет расширенная модель процессов, включающая в себя понятие потоков или нитей (threads of execution – нитей исполнения).
Рассмотренная выше модель процесса базируется на двух независимых концепциях: группировании ресурсов и выполнении программ. Иногда их полезно разделять. При этом и появляется понятие потока.
С одной стороны, процесс можно рассматривать как способ группирования родственных ресурсов в одну группу. У процесса есть адресное пространство, содержащее код программы и данные, а также другие ресурсы. Ресурсами могут быть открытые файлы, обработчики сигналов, учетная информация и многое другое. С другой стороны, процесс можно рассматривать как поток исполняемых команд, или просто поток. У потока есть счетчик команд, отслеживающий порядок выполнения действий. У него есть регистры, в которых хранятся текущие переменные. У него есть свой собственный стек. Таким образом, процессы используются для группирования ресурсов, а потоки являются объектами, поочередно выполняющимися на процессоре.
Концепция потоков добавляет к модели процесса возможность одновременного выполнения в одной и той же среде процесса нескольких программ, в достаточной степени независимых. Несколько потоков, работающих параллельно в одном процессе, аналогичны нескольким процессам, идущим параллельно на одном компьютере.
Потоки имеют некоторыми свойствами процессов, поэтому их иногда называют упрощенными или легкими процессами.
В многопоточном режиме процесс обычно запускаются с одним потоком, который называют основным или главным потоком. Более того, без потока процесс не может выполняться. В дальнейшем главный поток может создавать новые потоки.
Рассмотрим, какие элементы процесса совместно используются всеми потоками, а что является индивидуальным для каждого потока:
Элементы процесса, разделяемые потоками |
Элементы, индивидуальные для потока |
Адресное пространство |
Счетчик команд |
Глобальные переменные |
Регистры |
Открытые файлы |
Стек |
Дочерние процессы |
Состояние |
Сигналы и их обработчики |
|
Информация об использовании ресурсов |
|
Из таблицы видно, что все потоки совместно используют набор ресурсов процесса, а индивидуальными являются элементы, относящиеся к выполнению некоторой задачи.
Как и процессы, потоки могут находиться в одном из состояний: готовность, ожидание, исполнение, уничтожение. Количество состояний может варьироваться в различных операционных системах (например, в Windows XP для потока определено 7 состояний, в Windows 2003 Server – 8). Исполняющийся поток взаимодействует с процессором, ожидающий – заблокирован возникновения некоторого события. Поток в состоянии готовности будет запущен, как только до него дойдет очередь и т.д.
Иногда операционная система не заботится о программных потоках. Другими словами, управление программными потоками происходит целиком в пользовательском режиме. Например, когда программный поток блокируется, то, перед тем как остановиться, он решает, какой программный поток должен выполняться следующим, и запускает его. Существуют и широко используются несколько библиотек для поддержки пользовательских программных потоков, в том числе пакет PThreads от POSIX. Переключение с одного потока на другой в этом происходит существенно быстрее, чем при использовании процессов, так как требует сохранения только счетчика команд и регистров и может производиться без использования ядра.
В других случаях ОС учитывает существование множества потоков, и когда один программный поток переходит в состояние блокировки, система выбирает для запуска следующий поток в том же самом процессе или в другом. Чтобы поддерживать такую функциональность, ядро системы должно хранить таблицу всех программных потоков в системе, наподобие таблицы процессов.
Рассмотрим, например, структуры данных, которые использует Windows для управления процессами и потоками.
Рис. 4.3. Структуры данных, сопоставляемые с процессами и потоками в Windows
Из рис. 4.3 видно, что блок процесса (структура EPROCESS) находится в адресном пространстве ядра. Он содержит основную информацию о процессе. В адресном пространстве ядра также находится блок процесса Windows (структура KPROCESS), иногда называемый блоком управления процессом (Process Control Block, PCB). Он содержит базовую информацию, необходимую ядру Windows для потоков. В адресном пространстве процесса находится блок переменных окружения процесса (PEB, Process Environment Block). Он содержит информацию, необходимую загрузчику образов и другим системным модулям Windows для доступа из пользовательского режима. Кроме блоков управления процессами, имеются и соответствующие блоки, предназначенные для управления потоками (блок потока ETHREAD, блок переменных окружения потока – Thread Environment Block, блок потока ядра KTHREAD).
Таким образом, в Windows потоки управляются ядром ОС.