Анализ преимуществ, недостатков, проблем многопоточности
Цель работы: научиться проводить анализ преимуществ, недостатков, проблем многопоточности
Оборудование:Персональный компьютер с ОС Linux
Индивидуальное задание.Провести анализ преимуществ, недостатков, проблем многопоточности при взаимодействии потоков
Теоретические сведения
Многопоточность — свойство платформы (например, операционной системы, виртуальной машины и т. д.) или приложения, состоящее в том, что процесс, порождённый в операционной системе, может состоять из нескольких потоков, выполняющихся «параллельно», то есть без предписанного порядка во времени. При выполнении некоторых задач такое разделение может достичь более эффективного использования ресурсов вычислительной машины.
Такие потоки называют также потоками выполнения (от англ. threadofexecution); иногда называют «нитями» (буквальный перевод англ. thread) или неформально «тредами».
Сутью многопоточности является квазимногозадачность на уровне одного исполняемого процесса, то есть все потоки выполняются в адресном пространстве процесса. Кроме этого, все потоки процесса имеют не только общее адресное пространство, но и общие дескрипторы файлов. Выполняющийся процесс имеет как минимум один (главный) поток.
Многопоточность (как доктрину программирования) не следует путать ни с многозадачностью, ни с многопроцессорностью, несмотря на то, что операционные системы, реализующие многозадачность, как правило, реализуют и многопоточность.
К достоинствам многопоточности в программировании можно отнести следующее:
Упрощение программы в некоторых случаях за счет использования общего адресного пространства.
Меньшие относительно процесса временны́е затраты на создание потока.
Повышение производительности процесса за счет распараллеливания процессорных вычислений и операций ввода-вывода.
Типы реализации потоков
Поток в пространстве пользователя. Каждый процесс имеет таблицу потоков, аналогичную таблице процессов ядра.
Достоинства и недостатки этого типа следующие: Недостатки
Отсутствие прерывания по таймеру внутри одного процесса
При использовании блокирующего системного запроса для процесса все его потоки блокируются.
Сложность реализации
Поток в пространстве ядра. Наряду с таблицей процессов в пространстве ядра имеется таблица потоков.
«Волокна» (англ. fibers). Несколько потоков режима пользователя, исполняющихся в одном потоке режима ядра. Поток пространства ядра потребляет заметные ресурсы, в первую очередь физическую память и диапазон адресов режима ядра для стека режима ядра. Поэтому было введено понятие «волокна» — облегчённого потока, выполняемого исключительно в режиме пользователя. У каждого потока может быть несколько «волокон».
Взаимодействие потоков
В многопоточной среде часто возникают проблемы, связанные с использованием параллельно исполняемыми потоками одних и тех же данных или устройств. Для решения подобных проблем используются такие методы взаимодействия потоков, как взаимоисключения (мьютексы), семафоры, критические секции и события
Взаимоисключения (mutex, мьютекс) — это объект синхронизации, который устанавливается в особое сигнальное состояние, когда не занят каким-либо потоком. Только один поток владеет этим объектом в любой момент времени, отсюда и название таких объектов (от английского mutuallyexclusiveaccess — взаимно исключающий доступ) — одновременный доступ к общему ресурсу исключается. После всех необходимых действий мьютекс освобождается, предоставляя другим потокам доступ к общему ресурсу. Объект может поддерживать рекурсивный захват второй раз тем же потоком, увеличивая счетчик, не блокируя поток, и требуя потом многократного освобождения. Такова, например, критическая секция в Win32. Тем не менее, есть и такие реализации, которые не поддерживают такое и приводят к взаимной блокировке потока при попытке рекурсивного захвата. Это FAST_MUTEX в ядре Windows.
Семафоры представляют собой доступные ресурсы, которые могут быть приобретены несколькими потоками в одно и то же время, пока пул ресурсов не опустеет. Тогда дополнительные потоки должны ждать, пока требуемое количество ресурсов не будет снова доступно. Семафоры очень эффективны, поскольку они позволяют одновременный доступ к ресурсам. Семафор есть логическое расширение мьютекса — семафор со счетчиком 1 эквивалентен мьютексу, но счетчик может быть и более 1.
События. Объект, хранящий в себе 1 бит информации «просигнализирован или нет», над которым определены операции «просигнализировать», «сбросить в непросигнализированное состояние» и «ожидать». Ожидание на просигнализированном событии есть отсутствие операции с немедленным продолжением исполнения потока. Ожидание на непросигнализированном событии приводит к приостановке исполнения потока до тех пор, пока другой поток (или же вторая фаза обработчика прерывания в ядре ОС) не просигнализирует событие. Возможно ожидание нескольких событий в режимах «любого» или «всех». Возможно также создание события, автоматически сбрасываемого в непросигнализированное состояние после пробуждения первого же — и единственного — ожидающего потока (такой объект используется как основа для реализации объекта «критическая секция»). Активно используются в MS Windows, как в режиме пользователя, так и в режиме ядра. Аналогичный объект имеется и в ядре Linux под названием kwait_queue.
Критические секции обеспечивают синхронизацию подобно мьютексам, за исключением того, что объекты, представляющие критические секции, доступны в пределах одного процесса. События, мьютексы и семафоры также можно использовать в однопроцессном приложении, однако реализации критических секций в некоторых ОС (например, Windows NT) обеспечивают более быстрый и более эффективный[1][2] механизм взаимно-исключающей синхронизации — операции «получить» и «освободить» на критической секции оптимизированы для случая единственного потока (отсутствия конкуренции) с целью избежать любых ведущих в ядро ОС системных вызовов. Подобно мьютексам объект, представляющий критическую секцию, может использоваться только одним потоком в данный момент времени, что делает их крайне полезными при разграничении доступа к общим ресурсам.
Семафоры - это объект синхронизации, задающий количество процессов и/или потоков, имеющих одновременный доступ к разделяемому ресурсу
Критическая секция – участок программного кода, который допускается выполнять только единственным потоком (процессом)
Взаимное исключение (мьютекс, mutualexclusion, mutex) – способ синхронизации потоков за счёт использования захвата совместно используемого ресурса, также называемого мьютексом
Mutex (mutualexclusion) – механизм синхронизации, предназначенный для устранения недостатков семафоров.
Событие – оповещение процесса со стороны ОС о возникновении межпроцессного взаимодействия.
Ход работы:
1. Ознакомиться с теоретическими сведениями.
2. Провести анализ многопоточности, выявить достоинства и недостатки. Результаты оформить в таблице.
3. Проанализировать взаимодействие потоков.
Содержание отчета
Отчет по практической работе должен содержать следующие пункты:
- название практической работы;
- цель работы;
- краткие теоретические сведения;
- индивидуальное задание для выполнения практической работы;
- краткое описание хода выполнения работы;
- результаты выполнения работы;
- выводы.
Контрольные вопросы:
1. Что такое многопоточность?
2. Какие достоинства имеет многопоточность?
3. Какие недостатки имеет многопоточность?
4. Что такое взаимоисключение?
5. Что такое семафоры?
6. Для чего предназначены критические секции и события?
Практическая работа №11