Структура процессов
На рис. 4.16 приводится общее сравнение структуры процессов в традиционной операционной системе UNIX со структурой процессов в операционной системе Solaris. В типичных реализациях UNIX в структуру процесса входят такие составляющие: идентификатор процесса, идентификаторы пользователя, таблица диспетчеризации сигналов; дескрипторы файлов, схема распределения памяти, структура состояния процессора. В операционной системе Solaris эта базовая структура остается, но в ней блок состояния процессора заменен списком структур, в котором для каждого облегченного процесса имеется свой блок данных.
В структуру данных облегченного процесса входят такие элементы:
• идентификатор облегченного процесса;
• приоритет данного облегченного процесса (и, следовательно, потока ядра, который его поддерживает);
• маска сигналов, предоставляющая ядру информацию о том, какие сигналы могут быть восприняты процессом;
• сохраненные значения регистров пользовательского уровня (когда облегченный процесс не выполняется);
• стек ядра данного облегченного процесса, в который входят аргументы системного вызова, результаты и коды ошибок каждого уровня;
• данные по использованию ресурсов и профилированию;
• указатель на соответствующий поток ядра;
• указатель на структуру процесса.
Выполнение потоков
На рис. 4.17 показана облегченная схема состояний выполнения потоков на пользовательском уровне и облегченных процессов. Выполнением потоков на пользовательском уровне управляет библиотека потоков. Рассмотрим сначала несвязанные состояния, т.е. состояния, которые совместно используют несколько облегченных процессов. Несвязанный поток может находиться в одном из четырех состояний: работоспособный, активный, ожидания или остановленный. Если поток на пользовательском уровне находится в активном состоянии, он закрепляется за облегченным процессом и выполняется до тех пор, пока выполняется лежащий в его основе поток ядра. Поток на пользовательском уровне может выйти из активного состояния по нескольким причинам. Рассмотрим активный поток Т1 на пользовательском уровне. Возможны такие события.
• Синхронизация. Чтобы скоординировать свои действия с другими потоками, поток Т1 вызывает один из примитивов, которые обсуждаются в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность", а сам переходит в состояние ожидания. После выполнения условия синхронизации поток Т1 переходит в работоспособное состояние.
• Приостановка. Любой из потоков (включая поток Т1) может стать причиной приостановки потока Т1 и его перехода в состояние остановки. ПотокТ1 остается в этом состоянии, пока другой поток не сгенерирует запрос на продолжение его выполнения, который и переводит остановленный поток в работоспособное состояние.
• Вытеснение. Активный поток (Т1 или какой-то другой) выполняет некоторое действие, благодаря которому становится работоспособным другой поток (Т2) с более высоким приоритетом. Если Т1 является активным потоком с наиболее низким приоритетом, он вытесняется и переходит в состояние готовности, а поток Т2 закрепляется за освободившимся облегченным процессом.
• Уступка. Если поток Т1 выполняет библиотечную команду thr_yield(), планировщик потоков этой библиотеки проверяет, есть ли другой работе способный поток (Т2) с тем же приоритетом. Если такой поток есть, Т1 переходит в работоспособное состояние, а поток Т2 закрепляется за освободившимся облегченным процессом. В противном случае продолжает выполняться поток Т1.
Во всех перечисленных выше случаях при выходе потока Т1 из активного состояния библиотека потоков выбирает другой несвязанный поток в работоспособном состоянии и запускает его на освободившемся облегченном процессе.
На рис. 4.17 показана также диаграмма состояний облегченных процессов. Эту диаграмму можно рассматривать как детализацию активного состояния потока на пользовательском уровне, так как несвязанному потоку облегченный процесс назначается только тогда, когда он находится в активном состоянии. Диаграмма состояний облегченного процесса почти не требует пояснений. Активный поток выполняется лишь тогда, когда его облегченный процесс находится в состоянии выполнения. Если активный поток делает блокирующий системный вызов, его облегченный процесс переходит в состояние блокировки. Однако на пользовательском уровне этот поток остается связанным с данным облегченным процессом до тех пор, пока библиотека потоков оставляет его в активном состоянии.
Взаимосвязь связанных потоков с облегченными процессами несколько другая. Например, если связанный поток на пользовательском уровне переходит в состояние ожидания наступления синхронизирующего события, его облегченный процесс тоже должен перестать выполняться.
Дата добавления: 2016-06-05; просмотров: 2027;