Процесс представляет собой программу в состоянии выполнения, причем в UNIX в рамках одного процесса не могут выполняться никакие параллельные действия

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

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

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

Обычно в UNIX-системах определены приоритеты прерываний. Например, если нужно без помех обрабатывать важные для системы прерывания от таймера, можно так определить приоритеты, чтобы во время обработки другого прерывания, скажем, от сетевого устройства, было разрешено поступление прерываний от таймера, но не наоборот.


2. Управление процессами

Процессом в системе UNIX называется единица исполнения программного кода (классическая UNIX не поддерживает потоки).

Типы процессов (рис. 14.3).

Рис. 14.3. Типы процессов

Атрибуты процесса (рис. 14.4).

Рис. 14.4. Атрибуты процесса

В основе UNIX лежит концепция процесса - единицы управления и единицы потребления ресурсов.

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

Основные структуры данных процесса (рис. 14.5).

Рис. 14.5. Основные структуры данных процесса

При управлении процессами операционная система использует два основных типа информационных структур:

  • дескриптор процесса (структура proc)
  • и контекст процесса (структура user).

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

Память для таблицы процессов отводится динамически в области ядра.

На основании информации, содержащейся в таблице процессов, операционная система осуществляет планирование и синхронизацию процессов.

В дескрипторе прямо или косвенно (через указатели на связанные с ним структуры) содержится информация о

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

Контекст процесса (рис. 6).

Рис. 14.6. Контекст процесса

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

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

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

Режимы выполнения процесса.

В UNIX для процессов предусмотрены два режима выполнения: привилегированный режим - " система " и обычный режим - " пользователь ".

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

В режиме "система" выполняются программы ядра, а в режиме "пользователь" - оболочка и прикладные программы.

При необходимости выполнить привилегированные действия пользовательский процесс обращается с запросом к ядру в форме так называемого системного вызова.

В результате системного вызова управление передается соответствующей программе ядра. С момента начала выполнения системного вызова процесс считается системным.

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

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

Диспетчеризация процессов. Уровни приоритетов.

В UNIX реализована диспетчеризация на основе динамического приоритета процессов, согласно которому для выполнения каждый раз выбирается процесс с наивысшим приоритетом.

При этом диспетчер вычисляет приоритеты процессов с учетом их поведения, а не назначает им статические приоритеты при создании.

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

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


3. Состояния процесса операционной системы Unix(рис. 14.7, 14.8)

На рис. 14.7, 14.8 приведена схема состояний процессов UNIX от момента создания процесса при помощи вызова fork () до завершения его работы посредством вызова exit (), а также переходов между этими состояниями.

Рис. 14.7. Состояния процесса

Рис. 14.8. Переходы между состояниями процессов

Сначала процесс создается и направляется на выполнение:

  • с-гп: только что созданному процессу выделяется некоторый объем основной памяти;
  • гп-вя: процесс направляется на выполнение с некоторым начальным приоритетом;
  • вя-вп: перешел из режима ядра в пользовательский режим.

Далее процесс работает в пользовательском режиме - он либо будет прерван, либо выполнит системный вызов.

  • вп-вя: процесс, работающий в пользовательском режиме, произвел системный вызов и теперь выполняет код ядра или же произошло прерывание, например от устройства или таймера, и это прерывание обрабатывается в контексте данного процесса;
  • вя-вп: возврат из системного состояния в пользовательское после обработки прерывания или по окончании функционирования вызванной системной процедуры (либо сразу, либо после периода сна, когда процесс пробуждается и направляется на выполнение: вя-сп-гп-вя);
  • вя-в: процесс вытеснен в тот момент, когда должен был перейти в пользовательское состояние (это могло произойти из-за того, что процесс ядра был переведен в состояние готовности в результате прерывания или же по причине того, что после прерывания от таймера выяснилось, что время данного процесса истекло;
  • в- вп: ни один из системных процессов не находится в состоянии готовности, поэтому на выполнение направляется вытесненный процесс;
  • вя-вя: произошло прерывание, которое обрабатывается в контексте прерванного процесса; если этот процесс выполнялся в пользовательском режиме, механизм прерывания изменяет его состояние на системное;
  • вя-сп: процесс, выполняющий код ядра, засыпает в ожидании события;
  • сп-гп: произошло событие, которого ожидал процесс, и он переводится в состояние готовности;
  • гп-вп: процесс направляется на выполнение в соответствии с тем приоритетом, который был у него на момент блокировки;
  • сп-со: спящий процесс откачан из памяти на диск;
  • со-го: произошло событие, которого ждал процесс, и он переводится в состояние готовности, но все еще находится на диске;
  • го-гп: процесс загружается с диска в память;
  • гп-го: готовый к выполнению процесс откачивается из памяти на диск;
  • с-го: для нового процесса недостаточно памяти;
  • ря-з: процесс выполняет системный вызов exit() (вп-вс) и удаляется из системы; он остается «зомби» до тех пор, пока его код не будет присоединен родительским процессом.

При переходах вя-сп и гп-вя производится проверка сигналов, связанных со взаимодействием процессов; кроме того, сигналы проверяются и обрабатываются, когда процесс намерен перейти в пользовательское состояние (вя-вп или в-вп).

Приведенная схема отражает процедурную природу UNIX.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: