Э. Таненбаум, М. ван Стеен - Распределённые системы (принципы и парадигмы) (1162619), страница 43
Текст из файла (страница 43)
Переключение контекстов в результате вызова IPCИ, наконец, у разработчиков имеется особая причина использовать потокивыполнения: многие приложения просто легче разрабатывать, структурировав ихв виде набора взаимосвязанных потоков выполнения. Рассмотрим приложение,требующее выполнения нескольких (более или менее независимых) задач. Например, в случае текстового редактора в отдельные потоки можно выделить обработку ввода пользователя, проверку орфографии и грамматики, оформлениевнешнего вида документа, создание индекса и т.
п.Реализация потоков выполненияПотоки выполнения обычно существуют в виде пакетов. Подобные пакеты содержат механизмы для создания и уничтожения потоков, а также для работы с переменными синхронизации, такими как мьютексы и условные переменные. Существует два основных подхода к реализации пакетов для потоков выполнения.Первый из них состоит в создании библиотеки для работы с потоками выполнения, выполняющейся исключительно в режиме пользователя. Второй подходпредполагает, что за потоки выполнения отвечает (и управляет ими) ядро.Библиотека для работы с потоками выполнения на пользовательском уровнеимеет множество преимуществ. Во-первых, дешевле обходится создание и уничтожение потоков выполнения.
Поскольку все управление потоками реализуетсяв адресном пространстве пользователя, стоимость создания потока выполненияопределяется в первую очередь затратами на память, выделяемую для созданиястека под поток. Аналогично и уничтожение потока выполнения в основном состоит в освобождении памяти, задействованной под стек, после того как надобность в потоке отпадает. Обе операции достаточно дешевы.Второе преимущество потоков выполнения на пользовательском уровне состоит в том, что переключение контекста требует всего нескольких инструкций.3 .
1 . Потоки выполнения169В основном в сохранении и последующем восстановлении сохраненных значений при переключении с потока на поток нуждаются исключительно значениярегистров процессора. Нет необходимости изменять карты памяти, сбрасыватьбуфер TLB, контролировать загрузку процессора и т. д. Переключение контекстапотоков выполнения производится при необходимости в синхронизации двухпотоков, например, при обращении к секции совместно используемых данных.Основным недостатком потоков выполнения на пользовательском уровне является тот факт, что обращение к блокирующему системному вызову приводитк немедленной блокировке как процесса, к которому принадлежит поток выполнения, так и всех остальных потоков выполнения этого процесса.
Как мы говорили, потоки выполнения используются, в частности, для структурированиябольших приложений в виде набора одновременно исполняемых частей. В этомслучае блокировка по вводу-выводу не должна мешать работе исполняемых в тоже самое время частей программы. Для подобных приложений реализация потоков выполнения на пользовательском уровне неприемлема.Эти проблемы обычно можно обойти путем реализации потоков выполненияв ядре операционной системы. К сожалению, плата за это весьма высока: любаяоперация с потоками выполнения (создание, уничтожение, синхронизация и т.
п.),осуществляемая ядром, требует системного вызова. Переключение контекстов потоков выполнения становится столь же дорогостоящим, как и переключениеконтекстов процессов. В результате сходят на нет основные преимущества от замены процессов потоками выполнения.Пространство пользователяСостояние (данные)потока выполненияJHL2^-%ш^- Поток выполнения- Облегченный процессОблегченный процесс,выполняющий один из потоковПространство ядраРис. 3.2.
Сочетание облегченных процессов уровня ядраи потоков выполнения уровня пользователяРешение состоит в использовании «гибрида» из реализованных на уровнепользователя и на уровне ядра потоков выполнения (рис. 3.2). Такой гибрид носит название облегченных процессов (LightWeight Processes, LWP). Процессы LWPработают в контексте едх^ного полновесного процесса. На один процесс можетприходиться несколько LWP. Кроме LWP система предоставляет также пакет170Глава 3.
Процессыпотоков выполнения пользовательского уровня, предоставляющего приложениям операции по созданию и уничтожению потоков выполнения. Кроме того, этотпакет предоставляет средства синхронизации потоков выполнения, такие как мьютексы и условные переменные (см.
также раздел 1.4). Важным моментом здесьявляется то, что пакет для работы с потоками выполнения реализован целикомв пространстве пользователя. Другими словами, все операции с потоками выполнения производятся без участия ядра.Как показано на рисунке, пакет потоков выполнения может совместно использоваться несколькими облегченными процессами. Многопоточное приложение реализуется путем создания потоков выполнения с последующим назначением каждого из них своему облегченному процессу. Назначение потокавыполнения облегченному процессу обычно производится неявно и скрыто отпрограммиста.Сочетание потоков выполнения пользовательского уровня и облегченныхпроцессов работает так, как показано на рисунке.
Подключение следующего потока выполняется специальной планирующей процедурой, входящей в пакет потоков. При создании (путем срютемного вызова) облегченного процесса он получаетсобственный стек и указание выполнить планирующую процедуру д.яя поискапотока, который он должен исполнять. Если создается несколько облегченныхпроцессов, планирующую процедуру выполняет каждый из них. Таблица потоковвыполнения, предназначенная для отслеживания их текущего набора, используется облегченными процессами совместно. Защита этой таблицы для предотвращения одновременного доступа к ней реализуется при помощи мьютексов, создаваемых в пространстве пользователя. Иначе говоря, синхронизация междуоблегченными процессами не требует поддержки со стороны ядра.Когда облегченный процесс находит готовый к выполнению поток, он переключает свой контекст на этот поток.
В это время другие облегченные процессы могут искать себе другие готовые к выполнению потоки. Если потоквыполнения требуется заблокировать по значению мьютекса или условной переменной, он выполняет необходимое администрирование и, в конце концов,вызывает планирующую процедуру. Если будет обнаружен другой готовый квыполнению поток, контекст может переключиться на него. Прелесть всегоэтого состоит в том, что облегченный процесс, выполняющий поток, не уведомляется о переключении контекста, оно происходит исключительно в пространстве пользователя и воспринимается облегченным процессом как обычный кодпрограммы.Рассмотрим теперь, что происходит, когда поток делает блокирующий системный вызов. В этом случае выполнение переходит от пользовательского режимак режиму ядра, продолжая при этом оставаться в контексте текущего облегченного процесса. В тот момент, когда текущий облегченный процесс можно будетпрервать, операционная система может принять решение переключиться на другой облегченный процесс, в результате чего контекст переключится обратнов пользовательский режим.
Выбранный облегченный процесс просто продолжитсвою работу с того места, где он ранее был прерван.3.1. Потоки выполнения171Использование облегченных процессов в сочетании с пакетами потоков выполнения пользовательского режима дает определенные преимущества. Во-первых, создание, уничтожение и синхронизация потоков выполнения не требуетзадействовать ядро и поэтому относительно недорого.
Во вторых, предоставление процессу нескольких облегченных процессов приводит к тому, что блокирующий системный вызов не обеспечивает полной остановки процесса. В-третьих,приложению нет нужды знать об облегченных процессах. Все, что оно видит, —это потоки выполнения пользовательского уровня. В-четвертых, облегченные процессы легко могут быть приспособлены для работы в мультипроцессорных средах путем исполнения разных процессов на различных процессорах.