Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kursovaOS_Horiacheva_331.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
471 Кб
Скачать
☆

Раздел 1. Разработка многопоточных приложений

1.1. Потоки и многопоточность

В обычных ОС каждому процессу соответсвует адресное пространство и одиночный управляющий поток. Фактически это и определяет процесс. Тем не менее, часто встречаются ситуации, в которых предпочтительно иметь несколько управляющих потоков в одном адресном пространстве, как если бы они были различнми процессами.

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

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

Концепция потоков доавляет к модели процесса возможность одновременного выполнения в одной и той же среде процесса несколько программ, в достаточной степени независимых. Несколько потоков, работающих параллельно в одном процессе, аналогичны нескольким процессам, идущим параллельно на одном компьютере. В первом случае потоки разделяют адресное пространство, открытые файлы и другие ресурсы. Во втором случае процессы совместно пользуются физической памятью, дискми, принтерами и другими ресурсами. Потоки обладают некоторыми свойствами процессов, поэтому их иногда называют упрощенными процессами. Термин многопоточность также используется для описания использования нескольких потоков в одном процессе [1].

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

Сутью многопоточности является квазимногозадачность на уровне одного исполняемого процесса, то есть все потоки выполняются в адресном пространстве процесса. К достоинствам многопоточности в программировании можно отнести следующее:

• Упрощение программы в некоторых случаях за счет использования общего адресного пространства.

• Меньшие относительно процесса временны́е затраты на создание потока.

• Повышение производительности процесса за счет распараллеливания процессорных вычислений и операций ввода/вывода[2].

1.2. Технология Intel tbb

Одним из подходов в программировании является повторное использование кода (использование библиотек). Так, для построения многопоточных приложений можно воспользоваться одной из таких библиотек – Intel TBB.

Назначение. Intel Threading Building Blocks (TBB) является библиотекой, которая упрощает написание многопоточных приложений, предлагая пользователям C++ дополнительные возможности абстрагирования для развертывания параллельных приложений. В библиотеке TBB разработчики используют привычные шаблоны C++, а сама библиотека отвечает за низкоуровневые детали многопоточности. Кроме того, TBB обеспечивает совместимость с различными архитектурами и операционными системами.

Использование библиотеки предполагает и дает возможность разработки параллельной программы в объектах. Библиотека скрывает низкоуровневую работу с потоками, упрощая тем самым процесс создания параллельной программы[3].

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

- распараллеливание циклов с известным числом повторений;

- распараллеливание циклов с известным числом повторений с редукцией;

- распараллеливание циклов с условием;

- распараллеливание рекурсии.

Также библиотека содержит:

• потокобезопасные контейнеры (аналогичны контейнерам STL, за исключением того, что накладных расходов при работе с ними в параллельных приложениях меньше, чем при использовании стандартных контейнеров STL);

• операторы выделения динамической памяти (аллокаторы);

• примитивы синхронизации.

Описание библиотеки. TBB является межплатформенной библиотекой – существуют реализации под операционные системы Microsoft Windows, Linux, Mac OS. Кроме того, библиотека свободно распространяется в некоммерческих целях.

В отличие от OpenMP библиотека Intel Threading Building Blocks не требует поддержки со стороны компилятора. Для сборки приложения необходима установленная версия TBB, а для запуска под операционной системой семейства Microsoft Windows достаточно иметь динамическую библиотеку tbb.dll [4].

Инициализация и завершение библиотеки. Для использования возможностей TBB по распараллеливанию вычислений необходимо иметь хотя бы один активный (инициализированный) экземпляр класса tbb::task_scheduler_init. Этот класс предназначен для создания потоков и внутренних структур, необходимых планировщику потоков для работы. Объект класса tbb::task_scheduler_init может находиться в одном из двух состояний: активном или неактивном.

Активировать экземпляр класса tbb::task_scheduler_init можно двумя способами:

- непосредственно при создании объекта tbb::task_scheduler_init. При этом число создаваемых потоков может определяться автоматически библиотекой или задаваться вручную пользователем;

- отложенной инициализацией при помощи вызова метода task_scheduler_init::initialize.

Доступны следующие варианты значений параметра number_of_threads: task_scheduler_init::automatic (значение по умолчанию; библиотека автоматически определяет и создает оптимальное количество потоков для данной вычислительной системы) и task_scheduler_init::deferred (отложенная инициализация объекта класса tbb::task_scheduler_init. Инициализация происходит только после вызова метода task_scheduler_init::initialize).

Создание и уничтожение логических задач. Создание задачи должно осуществляться только с помощью оператора new, перегруженного в библиотеке TBB:

new(task::allocate_root()) T – выполняет создание «главной» задачи типа T со следующими атрибутами (NULL, depth, 0). Для запуска этого типа задач необходимо использовать метод task::spawn_root_and_wait.

new(this.allocate_child()) T – выполняет создание подчиненной задачи типа T для задачи this со следующими атрибутами (this, depth + 1, 0). Атрибуты задачи this (parent, depth, refcount) автоматически изменяются на (parent, depth, refcount + 1).

В каждый момент времени задача может находиться в одном из 5 состояний.

Состояние задачи изменяется при вызове методов библиотеки или в результате выполнения определенных действий (например, завершение выполнения метода task::execute).

В библиотеке TBB реализован метод task::state, который возвращает текущее состояние задачи, для которой он был вызван. Данная информация может оказаться полезной при отладке приложений.

- state_type task::state(). Перечислимый тип task::state_type может принимать одно из следующих значений, которые отражают текущее состояние выполнения задачи:

- allocated – задача только что была создана или был вызван один из методов вида task::recycle_* (recycle_as_child_of, recycle_to_reexecute, recycle_as_continuation, recycle_as_safe_continuation);

- ready – задача находится в пуле готовых к выполнению задач или в процессе перемещения в/из него;

- executing – задача выполняется и будет уничтожена после завершения метода task::execute;

- freed – задача находится во внутреннем списке библиотеки свободных задач или в процессе перемещения в/из него;

- reexecute – задача выполняется и будет повторно запущена после завершения метода task::execute.

Для удобства работы с набором задач библиотекой поддерживается класс tbb::task_list. Этот класс фактически представляет собой контейнер задач. Класс tbb::task_list содержит два основных метода:

• task_list::push_back(task& task) – добавляет задачу в конец списка;

• task& task_list::pop_front() – извлекает задачу из начала списка.

Примитивы синхронизации. Основным способом решения задачи взаимоисключения является использование примитивов синхронизации:

• мьютекс (mutex);

• шаблонный класс tbb::atomic.

Методы этого класса являются атомарными, т.е. несколько потоков не могут одновременно выполнять методы этого класса. Если потоки пытаются одновременно выполнить методы класса tbb::atomic, то один из потоков блокируется и ожидает завершения выполнения метода другим.

Библиотека TBB содержит реализацию трех контейнеров, которые являются аналогами контейнеров STL:

- tbb::concurrent_queue – очередь;

- tbb::concurrent_hash_map – хеш-таблица;

- tbb::concurrent_vector – вектор.

Т.к. контейнеры библиотеки TBB предназначены для параллельной работы, то их интерфейс отличается от интерфейса STL контейнеров.

Отличия между std::queue и tbb::concurrent_queue заключаются в следующем: методы queue::front и queue::back не реализованы в tbb::concurrent_queue, т.к. их параллельное использование может быть небезопасно. В отличие от STL тип size_type является знаковым.

Метод concurrent_queue::size возвращает разницу между числом операций добавления элементов и операций извлечения элементов. Если в момент вызова этого метода выполняются методы добавления/извлечения методов, то они тоже учитываются.

Для tbb::concurrent_queue разрешен вызов метода pop для пустой очереди. После его вызова поток блокируется до тех пор пока в очередь не положат элемент. tbb::concurrent_queue содержит метод pop_if_present, который извлекает элемент из очереди, если в очереди есть элементы [4].

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]