
- •Глава 4.
- •Многопоточность
- •Функциональность потоков
- •Потоки на пользовательском уровне и на уровне ядра
- •Другие схемы
- •4.2 Симметричная многопроцессорная обработка
- •Организация симметричной многопроцессорной системы
- •Архитектура многопроцессорных операционных систем
- •4.3. Микроядра
- •Архитектура микроядра
- •Достоинства архитектуры с микроядром
- •Производительность микроядра
- •Архитектура микроядер
- •4.4. Потоки и smp в windows 2000
- •Объекты процессов и потоков
- •Многопоточность
- •Состояния потоков
- •Поддержка подсистем операционной системы
- •Поддержка симметричной многопроцессорной обработки
- •4.5. Управление потоками и smp в solaris
- •Мотивация
- •Структура процессов
- •Выполнение потоков
- •Прерывания в роли потоков
- •4 6. Управление процессамии потоками в linux
- •4.7. Резюме, ключевые термины и контрольные вопросы
- •Контрольные вопросы
- •4.8. Рекомендуемая литература
- •4.9. Задачи
Мотивация
Совместное использование потоков на пользовательском уровне и на уровне ядра дает возможность программисту выбрать вариант параллелизма, который будет наиболее эффективным для данного приложения и подойдет для него больше других.
В некоторых программах используется логический параллелизм, который позволяет упростить и структурировать код, но для которого не нужен аппаратный параллелизм. Например, приложение со многими окнами, из которых только одно является активным, можно эффективно реализовать в виде набора потоков на пользовательском уровне, которым отвечает один облегченный процесс. Преимущество использования для таких приложений только потоков на пользовательском уровне заключается в их эффективности. Потоки на пользовательском уровне можно создавать, уничтожать, блокировать, активизировать и т.д. без участия ядра. Если бы ядру было известно о каждом потоке на пользовательском уровне, оно должно было бы размещать структуры данных для каждого потока, а также выполнять переключение потоков. Как мы видели в табл. 4.1, при переключении потоков на уровне ядра потребляется больше ресурсов, чем при переключении потоков на пользовательском уровне.
Если в приложение входят потоки, которые могут быть блокированы, например, при выполнении ввода-вывода, то заманчиво использовать несколько облегченных процессов, поддерживающих такое же или большее количество потоков на пользовательском уровне. Чтобы в рамках этого же процесса могли выполняться и другие потоки, не нужно никакого вмешательства приложения или библиотеки потоков. Если один из потоков процесса будет блокирован, другие его потоки могут выполняться в оставшихся облегченных процессах.
В некоторых приложениях эффективным является взаимно однозначное отображение потоков на уровне ядра и облегченных процессов. Например, можно реализовать такое параллельное вычисление элементов массива, чтобы элементы, стоящие в разных строках, вычислялись в разных потоках. Если каждому потоку на пользовательском уровне соответствует свой облегченный процесс, то переключать потоки при вычислениях не потребуется.
Для некоторых приложений подходит смешанное использование потоков, постоянно связанных с облегченными процессами, и несвязанных потоков (при этом несколько облегченных процессов совместно используются несколькими потоками). Например, при реализации прикладной системы реального времени программист может захотеть, чтобы одни потоки обладали приоритетом в масштабе всей системы и планировались в реальном времени, а другие — выполняли функции в фоновом режиме и могли совместно использовать один или небольшое количество облегченных процессов.
Структура процессов
На рис. 4.16 приводится общее сравнение структуры процессов в традиционной операционной системе UNIX со структурой процессов в операционной системе Solaris. В типичных реализациях UNIX в структуру процесса входят такие составляющие: идентификатор процесса, идентификаторы пользователя, таблица диспетчеризации сигналов; дескрипторы файлов, схема распределения памяти, структура состояния процессора. В операционной системе Solaris эта базовая структура остается, но в ней блок состояния процессора заменен списком структур, в котором для каждого облегченного процесса имеется свой блок данных.
В структуру данных облегченного процесса входят такие элементы:
идентификатор облегченного процесса;
приоритет данного облегченного процесса (и, следовательно, потока ядра, который его поддерживает);
маска сигналов, предоставляющая ядру информацию о том, какие сигналы могут быть восприняты процессом;
сохраненные значения регистров пользовательского уровня (когда облегченный процесс не выполняется);
стек ядра данного облегченного процесса, в который входят аргументы системного вызова, результаты и коды ошибок каждого уровня;
данные по использованию ресурсов и профилированию;
указатель на соответствующий поток ядра;
указатель на структуру процесса.