Наверх Системное программирование
Предыдущий раздел Оглавление Следующий раздел

3.2.1. Применение потоков

Необходимость в потоках обусловливается целым рядом причин. Основной причиной использования потоков является то, что многие приложения должны одновременно выполнять несколько действий, причем выполнение части которых необходимо периодически блокировать. Программирование таких приложений упрощается за счет разделения на несколько последовательных потоков, которые выполняются в псевдопараллельном режиме.

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

Второй отличительной особенностью потоков является легкость создания и завершения по сравнению с более «тяжеловесными» процессами. Многие системы создают потоки в 10 – 100 раз быстрее, чем процессы. Такое свойство потоков особенно пригодится, когда будет нужно быстро и динамично изменять количество выполняющихся потоков.

Третьим аргументом в пользу потоков выступает прирост производительности приложений при значительных вычислениях и возможных продолжительных ожиданиях операций ввода-вывода. Использование потоков будет особенно актуально для систем с несколькими центральными процессорами, где присутствует реальная возможность выполнять вычисления параллельно.

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

Работа веб-сервера может быть организована способом, показанным на рис. 3.5. Один из потоков, называемый диспетчером, читает входящие запросы из сети. Проанализировав запрос, он выбирает простаивающий (то есть который был заблокирован) рабочий поток, которому и передает запрос. После чего диспетчер переводит спящий рабочий поток из заблокированного состояния в состояние готовности.

После перевода в состояние готовности рабочий поток проверяет, возможно ли получить запрашиваемые данные из кэша веб-страниц, к которому есть доступ у всех потоков. Если таковых данных нет, то поток начинает операцию чтения с диска и блокируется до завершения данной операции. Когда один поток блокируется из-за необходимости дисковой операции, начинает выполняться другой поток (возобновляется работа диспетчера или выполняется другой рабочий поток, который находится в состоянии готовности).

Рис

Рис. 3.5. Использование многопоточности
в веб-сервере

Потоки дают возможность использовать концепцию последовательных процессов, которые осуществляют блокирующие системные вызовы и в то же время позволяют распараллелить работу. Блокирующие системные вызовы упрощают программирование, а параллельная работа повышает производительность.

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

Предыдущий раздел Оглавление Следующий раздел