Э. Таненбаум, М. ван Стеен - Распределённые системы (принципы и парадигмы) (1162619), страница 44
Текст из файла (страница 44)
Подобнаяпараллельная обработка может происходить абсолютно незаметно для приложения. Единственным минусом облегченных процессов в сочетании с потоками выполнения пользовательского уровня можно считать необходимость создания иуничтожения самих облегченных процессов. Затраты на эти операции не отличаются от обычных затрат на работу с потоками выполнения уровня ядра. Однаков создании и уничтожении облегченных процессов мы нуждаемся лишь от случая к случаю, и нередко эти процессы полностью находятся под управлениемоперационной системы.Альтернативным, но схожим с облегченными процессами подходом [14] являются активизации планировщика {scheduler activations). Основная разница между активизацией планировщика и облегченными процессами состоит в том, чтокогда ядро блокируется системным вызовом, оно передает вызов в пакет потоков, который осуществляет вызов процедуры планировщика.
Вызванный планировщик переключает выполнение на следующий поток. Те же самые действияповторяются и после того, как процесс будет разблокирован. Преимущество подобного подхода состоит в том, что все управление облегченными процессамиоказывается сосредоточенным в ядре. Однако передача вызовов на уровень пользователя выглядит менее элегантно, поскольку нарушает структуру многоуровневой системы, для которой допустима передача вызовов только на соседний с текущим нижний уровень.3.1.2.
Потоки выполненияв распределенных системахВажным свойством потоков выполнения является удобная реализация блокирующих системных вызовов, которые происходят без блокирования всего процесса на время выполнения потока. Это свойство потоков выполнения особеннопривлекательно в распределенных системах, поскольку оно значительно упрощает представление взаимодействия как одновременное поддержание значительного количества логических соединений.
Мы проиллюстрируем это утверждение,рассматривая многопоточных клиентов и серверов.Многопоточные клиентыЧтобы добиться высокой степени прозрачности распределения, распределенныесистемы, работающие в глобальных сетях, могут нуждаться в маскировке боль-172Глава 3. Процессыших задержек сообщений, курсирующих между процессами. Цикл задержкив глобальных сетях легко может достигать порядка сотен миллисекунд, а временами и секунд.Традиционный способ скрыть задержки связи — инициировав взаимодействие, немедленно перертти к другой работе. Типичным примером примененияэтой методики являются web-браузеры. Во многих случаях web-документ, содержащийся в файле формата HTML, содержит, кроме текста, набор изображений,значков и т.
п. Для получения элементов web-докуменга браузер открывает соединение TCP/IP, читает поступающие данные и преобразует их в компонентывизуального представления. Установка соединения, так же как и чтение данных,представляет собой блокирующие операции. При работе с медленными коммуникациями мы ощущаем неудобства, связанные с тем, что время, требующеесядля завершения каждой из операций, может быть довольно длительным.Web-браузер обычно сначала получает страницу HTML-кода, а затем показывает ее. Для того чтобы по возможности скрыть задержки связи, некоторыебраузеры начинают показывать данные по мере их получения.
Когда текст с механизмами прокрутки становится доступным пользователю, браузер продолжаетполучение остальных файлов, необходимых для правильного отображения страницы, таких как картинки. По мере поступления они отображаются на экране.Таким образом, для того чтобы увидеть страницу, пользователь не должен дожидаться получения всех ее компонентов.В результате мы видим, что web-браузер выполняет несколько задач одновременно. Понятно, что разработка браузера в виде многопоточного клиента весьмаупрощает это занятие.
Как то.яько мы получаем основной файл HTML, активизируются отдельные потоки выполнения, отвечающие за дозагрузку других частей страницы. Каждый из потоков выполнения создает отдельное соединениес сервером и получает от него данные. Установление соединения и чтение данныхс сервера может быть запрограммировано с использованием стандартных (блокирующих) системных вызовов.
Это предполагает, что блокирующие вызовы нев состоянии приостановить основной процесс. Как показано в [438], код каждогоиз потоков выполнения одинаков и в основном несложен. В результате пользователь, хотя и замечает задержку в показе картинок и прочих украшательств, вполне может просматривать документ.Использование многопоточных web-браузеров, которые в состоянии открывать несколько соединений, дает также и другой выигрыш.
В предыдущем примере мы создавали несколько соединений с одним и тем же сервером. Если этотсервер сильно загружен или просто медленный, нам не удастся добиться значительного повышения производительности по сравнению с последовательным (одного за другим) получением файлов.Однако во многих случаях web-серверы могут быть реплицированы на несколько машин, при этом каждый из серверов будет содержать одинаковый набор web-документов. Реплицированные серверы находятся в одном и том же месте и имеют одно и то же имя. При поступлении запроса на web-страницу этотзапрос передается одному из серверов, обычно с использованием алгоритма циклического обслул<ивания или другого алгоритма выравнивания нагрузки [227].3.1.
Потоки выполнения173При наличии многопоточного клиента соединения могут быть установлены с различными репликами, что приведет к параллельной передаче данных, а это будетэффективно способствовать тому, что web-документ будет показан полностьюзначительно быстрее, чем в случае нереплицированного сервера. Этот подходсрабатывает, только если клиент в состоянии обработать истинно параллельныепотоки входящих данных. В этом случае потоки выполнения идеально подходятдля обработки потоков данных.Многопоточные серверыХотя многопоточные клиенты, как мы видели, обладают весомыми достоинствами, основные достоинства многопоточности в распределенных системах приходятся на сторону сервера.
Практика показывает, что многопоточность не толькосущественно упрощает код сервера, но и делает гораздо проще разработку техсерверов, в которых для достижения высокой производительности требуетсяпараллельное выполнение нескольких приложений. В число таковых входяти мультипроцессорные системы. Даже сейчас, когда мультипроцессорные компьютеры активно выпускаются в виде рабочих станций общего назначения, использование для параллельной обработки многопоточности не потеряло своей актуальности.Чтобы ощутить достоинства потоков выполнения для написания кода серверов, рассмотрим организацию файлового сервера, который периодически оказывается блокированным ожиданием дртска. Файловый сервер обычно ожидаетвходящего запроса на операции с файлами, после чего обрабатывает полученныйзапрос и возвращает ответ.
Одна из возможных и особо популярных организаций показана на рис. 3.3. Здесь один из потоков выполнения, диспетчер, считывает приходящие запросы на файловые операции. Запросы посылаются клиентами с указанием конечной точки данного сервера. После проверки запроса сервервыбирает (то есть блокирует) находящийся в состоянии ожидания рабочий поток выполнения и передает запрос ему.ЗапросперенаправляетсяПоток-диспетчер рабочему потокуV/Серверj^Рабочий потокЗапрос,приходящийиз сетиРис.
3.3. Многопоточный сервер, организованныйпо схеме диспетчер—рабочий174Глава 3. ПроцессыРабочий поток осуществляет блокирующее чтение из локальной файловойсистемы, что приводит к приостановке потока выполнения до считывания данных с диска. На то время, пока поток выполнения приостановлен, управлениеможет быть передано другому потоку выполнения. Например, дополнительнуюработу может выполнить поток-диспетчер. Либо он может выбрать другой готовый к запуску рабочий поток.Теперь обсудим, как файловый сервер мог бы вести запись в отсутствии потоков выполнения.
Одна из возможностей — действовать так, как будто имеетсяединственный поток выполнения. Основной цикл файлового сервера получаетзапрос, проверяет его и передает на выполнение раньше, чем получит следующий. Пока сервер ожидает окончания дисковых операций, он не обрабатываетдругие запросы. Таким образом, запросы других клиентов не обрабатываются.Кроме того, если файловый сервер работает на выделенной машине (а так обычно и бывает), процессор во время дисковых операций просто ничем не занят.В результате обрабатывается значительно меньшее количество запросов в секунду, чем могло бы.
Таким образом, потоки выполнения обеспечивают значительное повышение производительности, и это несмотря на то, что они запускаютсяна выполнение поочередно.Таким образом, мы наблюдаем две возможные архитектуры — многопоточиый файловый сервер и однопоточный файловый сервер. Возможно также, чтопотоки выполнения отсутствуют вообще, если разработчики системы сочтут, чтопадение производительности из-за использования однопоточной архитектуры делает ее применение невозможным.