|
Программирование >> Разработка устойчивых систем
Многопоточное программирование Объекты позволяют разделить программу на независимые компоненты. Но во многих случаях программы также делятся на отдельные независимо работающие подзадачи. При использовании иеханизиа многопоточности каждая из этих независимых подзадач работает в отдельном программном потоке. Программа пищется так, словно каждый программный поток монопольно распоряжается процессором. Процессорное время распределяется операционной системой, но обычно программисту беспокоиться об этом не нужно, что упрощает многопоточное программирование. Процессом называется самостоятельная программа, выполняемая в отдельном адресном пространстве. В многозадачных операционных системах параллельно выполняются сразу несколько процессов (программ), для чего система периодически передает процессор от задачи к задаче. Программный поток представляет собой отдельную логическую подзадачу внутри процесса. Таким образом, один процесс может содержать несколько параллельно работающих программных потоков. Так как программные потоки работают внутри одного процесса, они совместно используют память и другие ресурсы. Основные трудности с написанием многопоточных программ возникают из-за необходимости делить эти ресурсы между разными потоками. Многопоточность находит много возможных практических применений, но чаще всего она требуется тогда, когда некоторая часть вашей программы привязывается к некоторому событию или ресурсу. Чтобы не мешать работе остальных частей программы, вы создаете для этого события или ресурса отдельный программный поток и позволяете ему работать независимо от основной программы. Многопоточное, или параллельное, программирование открывает перед программистом совершенно новый мир. Переход на него сродни изучению нового языка программирования или, по крайней мере, новых языковых концепций. С появлением многопоточной поддержки в большинстве микрокомпьютерных операционных систем многопоточные расширения стали появляться в языках программирования и библиотеках. Многопоточное программирование всегда: 532 Глава И Многопоточное программирование необычно и требует коренных изменений в подходе к программированию; работает на основе одних и тех же принципов во всех языках (если вы поняли, как работают программные потоки, считайте, что вы освоили новый объединенный язык программирования). Понимание параллельного программирования требует примерно таких же усилий, как понимание полиморфизма. Общие принципы можно представить без особого труда, но чтобы действительно разобраться в этой теме, потребуется основательно потрудиться. В этой главе мы постараемся заложить надежный фундамент в области параллельного программирования, чтобы вы поняли основные концепции и смогли писать собственные многопоточные программы. Только не впадайте в излишнюю самоуверенность - если вам потребуется написать что-нибудь нетривиальное, обратитесь к специализированной литературе по этой теме. Мотивация Одно из самых очевидных применений многопоточности - повышение скорости реакции пользовательского интерфейса. Допустим, у вас имеется программа, в работе которой интенсивно используется процессор; это приводит к тому, что программа перестает реагировать на действия пользователя. Нужно, чтобы программа продолжала свою работу, но в то же время периодически возвращала управление пользовательскому интерфейсу для обработки действий пользователя. Если на форме имеется кнопка закрытия, было бы нежелательно опрашивать ее состояние во всех фрагментах программы, которые потенциально могли бы вьшолняться в момент опроса (сопровождение таких программ вызывает массу проблем). С другой стороны, кнопка все-таки должна реагировать на нажатие, словно вы периодически проверяете ее состояние. Обычная функция не способна продолжать свою работу, и в то же время возвращать управление другим частям программы. На первый взгляд задача кажется неразрешимой - процессор вроде бы должен заниматься несколькими делами одновременно. Но именно такую иллюзию создает механизм многопоточности (хотя в многопроцессорных системах это нечто большее, чем иллюзия). Многопоточность также может использоваться для оптимизации ввода-вывода. Например, программа может делать что-нибудь полезное в процессе ожидания данных в порте ввода-вывода. Без применения многопоточности существует единственное разумное решение - периодический опрос порта. Однако этот вариант получается громоздким и вызывает затруднения. В многопроцессорной системе программные потоки могут распределяться между разными процессами, что приводит к заметному повышению быстродействия. Такая ситуация часто наблюдается на мощных многопроцессорных веб-серверах, которые распределяют многочисленные пользовательские запросы между процессорами в программах и создают для запросов отдельные программные потоки. Многопоточная программа на однопроцессорном компьютере в любой момент времени все равно решает только одну задачу, поэтому теоретически ту же программу можно написать без использования потоков. Тем не менее, многопоточность обладает важными структурными преимуществами: она кардинально упро- Параллелизм в Сн-+ Когда комитет по стандартизации С++ работал над первой версией стандарта С++, механизмы параллельных вычислений не вошли в нее. Во-первых, их не было в С; во-вторых, в то время существовало несколько альтернативных подходов к их реализации. Разработчики стандарта посчитали, что ограничивать программиста только одним из них было бы неправильно. Однако на практике все обернулось еще хуже. Чтобы написать многопоточную программу, приходилось искать и изучать новую библиотеку, учитывая все ее специфические особенности. Привязка к возможностям конкретного разработчика тоже не добавляла уверенности. Не было никаких гарантий, что такая библиотека будет работать на разных компиляторах и на разных платформах. Кроме того, поскольку параллелизм не был частью стандартного языка, было трудно найти программистов С++, которые бы разбирались в многопоточном программировании. Другим фактором, повлиявшим на отношение к многопоточности в С++, стал язык Java, в котором поддержка многопоточности интегрирована в базовый син- Эта формулировка относится к системам с квантованием по времени (например, Windows). В Solaris используется модель многопоточности на базе очереди: если управление не будет передано потоку с более высоким приоритетом, текущий программный поток выполняется до тех пор, пока сам не отдаст процессор. При условии, что она специально спроектирована для многопроцессорных систем. В противном случае код, нормально работающий в системе с квантованием времени, иногда перестает работать в многопроцессорной системе. Дело в том, что дополнительные процессоры могут выявить проблемы, которые остаются скрытыми в однопроцессорных системах. щает программу. Некоторые классы задач (например, имитация в видеоиграх) плохо рещаются без поддержки многопоточности. Многопоточная модель - не более чем вспомогательная программная конструкция, упрощающая переключения между несколькими операциями в одной программе: система периодически вмешивается в ход событий и предоставляет каждому потоку часть процессорного времени. Каждый поток считает, что он единолично распоряжается процессором, хотя в действительности процессорное время распределяется между всеми потоками. Тем не менее, одно из основных преимуществ многопоточности заключается в том, что программист абстрагируется от этого уровня, поэтому программе не нужно знать, выполняется она на одном процессоре или на нескольких. Таким образом, многопоточность открывает путь к повышению вычислительной мощности, прозрачному для программиста: если программа работает слишком медленно, ее можно легко ускорить, установив на компьютер дополнительные процессоры. Многозадачность и многопоточность обычно обеспечивают наиболее эффективное использование многопроцессорных систем. Многопоточность сопряжена с определенными затратами ресурсов, однако общий выигрыш благодаря простоте архитектуры, балансировке ресурсов и удобстве для пользователя обычно оказывается гораздо большим. Как правило, программные потоки помогают ослабить жесткую привязку компонентов архитектуры; в противном случае отдельным частям вашей программы придется специально следить за выполнением задач, которые за счет программных потоков обычно решаются автоматически.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |