Это самый простой тип многопроцессных приложений. Для каждой пользовательской сессии или даже для каждого запроса создается свой процесс. Он обрабатывает запрос или несколько запросов и завершается.
Иногда такие процессы "взаимодействуют" при записи сообщений в лог-файл. Для разрешения
возникающих при этом коллизий в Unix-системах предусмотрен флаг O_APPEND при
открытии файла. При записи в файлы, открытые с этим флагом, указатель записи всегда
перемещается на конец файла. Таким образом, записи в логе, выполняемые разными
процессами, никогда несмешиваются. В более современныхUnix-системах для ведения логов
предоставляется специальный сервис syslog(3C).
Преимущества:
Недостатки:
В Unix-системах предпринимается целый комплекс мер для того, чтобы сделать создание процесса и запуск новой программы в процессе как можно более дешевыми операциями. Однако нужно понимать, что создание нити в рамках существующего процесса всегда будет дешевле, чем создание нового процесса.
Примеры: apache 1.x (сервер HTTP)
Перечисленные средства IPC (
Преимущества:
Даже если в каком-то из процессов будет обнаружена ошибка, допускающая удаленное исполнение кода, взломщик сможет получить лишь уровень доступа, с которым исполнялся этот процесс.
Недостатки:
Ограничение на общее количество сокетов TCP/IP – не более 65536 на сетевой интерфейс (обусловлено форматом заголовков TCP). Очереди сообщений
В качестве разделяемой памяти может использоваться разделяемая память
Преимущества:
Недостатки:
Это может привести к повышению общей стоимости разработки в 3–5 раз по сравнению с однопоточными или более простыми многозадачными архитектурами.
Это часто приводит к аварийному завершению остальных задач приложения. Некоторые приложения, например Lotus Domino, специально убивают всесерверные процессы при аварийном завершении любого из них.
Поэтому данная архитектура оптимальна не для всех приложений.
То есть, в худшем случае, взломщик может получить уровень доступа, соответствующий наивысшему из уровней доступа процессов приложения.
Фактически, данная архитектура сочетает недостатки многопроцессных и собственно многопоточных приложений. Тем не менее, ряд популярных приложений, разработанных в 80е и начале 90х, до того, как в Unix были стандартизованы многопоточные API, используют эту архитектуру. Это многие серверы баз данных, как коммерческие (Oracle, DB2, Lotus Domino), такисвободно распространяемые,современные версии Sendmail инекоторые другие почтовые серверы.
Потоки или нити приложения исполняются в пределах одного процесса. Все адресное пространство процесса разделяется между потоками. На первый взгляд кажется, что это позволяет организовать взаимодействие между потоками вообще без каких-либо специальных API. В действительности, это не так – если несколько потоков работает с разделяемой структурой данных или системным ресурсом, и хотя бы один из потоков модифицирует эту структуру, то в некоторые моменты времени данные будут несогласованными.
Поэтому потоки должны использовать специальные средства для организации взаимодействия.
Наиболее важные средства – это примитивы взаимоисключения (мутексы и блокировки
чтения-записи). Используя эти примитивы, программист может добиться того, чтобы ни один
поток не обращался к разделяемым ресурсам, пока они находятся в несогласованном состоянии
(это и называется взаимоисключением). POSIX thread library предоставляет и другие
примитивы (например,
Преимущества:
Недостатки:
В целом можно сказать, что многопоточные приложения имеют почти те же преимущества и недостатки, что и многопроцессные приложения, использующие разделяемую память.
Однако стоимость исполнения многопоточного приложения ниже, а разработка такого приложения в некоторых отношениях проще, чем приложения, основанного наразделяемой памяти. Поэтому в последние годы многопоточные приложения становятся все более и более популярны.
В событийно-ориентированной архитектуре мы отказываемся от взгляда на исполнение программы как на последовательный процесс. Вместо этого мыреализуем программу ввиде набора функций или методов-обработчиков, которые вызываются в ответ на возникновение событий. События могут быть как внешними по отношению к нашей программе (например, прибытие порции данных из сетевого соединения, сработка таймера или нажатие клавиши пользователем), так и внутренними. Внутренние события используются для взаимодействия между разными обработчиками.
Как правило, событийно-ориентированная архитектура предполагает наличие специального модуля, называемогодиспетчером илименеджером событий. Этот модуль темили иным образом собирает информацию о возникших событиях, организует сообщения о событиях и обработчики в очереди в соответствии с теми или иными правилами и вызывает обработчики.
Главная сложность при разработке событийно-ориентированного приложения – это гарантировать, что все обработчики событий будут завершаться достаточно быстро.
Как правило это означает, что обработчики не должны вызывать блокирующихся системных вызовов. Если удастся соблюсти это требование, то событийно-ориентированная архитектура позволяет получить многие преимущества многозадачности и многопоточности без использования собственно многопоточности. В этом смысле можно даже сказать, что событийно-ориентированная архитектура – это альтернатива многозадачным и многопоточным приложениям.
Событийно-ориентированные архитектуры применяются во множестве различных случаев. Таким образом реализуются программы с графическим пользовательским интерфейсом, сетевые серверы и некоторые клиентские сетевые программы, приложения реального времени, игры и др. Ядра большинства современных операционных систем, таких, как Windows, Linux и BSD Unix, также имеют событийно-ориентированную архитектуру.
Преимущества
Некоторые событийно-ориентированные приложения обрабатывают сотни итысячи сетевых соединений в одном потоке.
Недостатки:
Однако важно понимать, что очень часто
В конце лекции 9 мы рассматривали архитектуру "рабочих нитей" (worker threads), сочетающую многопоточность с событийной ориентацией. Ряд приложений, в том числе Apache 2.0, используют такую архитектуру.
Ранее мы рассматривали преимущества и недостатки многопроцессных и многопоточных архитектур с точки зрения приложений, занимающихся обработкой внешних событий – серверных и интерактивных приложений. Однако большой интерес представляют также вычислительные приложения, предназначенные для научных и инженерных расчетов.
Такие приложения не занимаются обработкой внешних событий и в ряде отношений работают в тепличных условиях (по сравнению, скажем, с серверными приложениями, подключенными к Интернет). Так, разработчика вычислительной программы, как правило, не интересуют вопросы безопасности: его задача работает с минимальным уровнем привилегий на выделенном компьютере и не взаимодействует с внешним миром, поэтому заниматься ее взломом обычно и неинтересно, и практически невозможно.
Однако и для вычислительных задач не существует единой оптимальной архитектуры, приемлемой для всех случаев.
Решающим вопросом при выборе архитектуры является вопрос о том, насколько хорошо распараллеливается алгоритм, какой объем разделяемых данных должны иметь процессы или нити и как часто им нужно синхронизовать эти данные.
Важным параметром задачи является также предсказуемость времени исполнения ее частей. Действительно, если время исполнения нитей алгоритма строго одинаково, мы легко можем распределить эти нити между процессорами или между машинами вычислительного кластера.
Если же время исполнения нитей различается и при этом трудно предсказуемо, у нас может возникнуть желание переносить нити или задачи между процессорами во время исполнения.
Такая ситуация возникает при расчете трехмерных изображений методом трассировки лучей с реалистичным моделированием рассеивания света. Перенос процессов сопряжен с большими сложностями и хорошие алгоритмы балансировки загрузки не известны (даже при известных временах исполнения процессов задача их распределения по процессорам является NP-полной, так называемой "задачей о рюкзаке"), поэтому разработчики параллельных задач все-таки стараются обеспечить равномерное распределение расчетов между процессами или нитями. В случаях, когда это не удается, обычно создается большое количество процессов – значительно большее, чем количество процессоров – и затем эти процессы распределяются между процессорами случайным образом.
Примеры очень хорошо распараллеливающихся задач с малым объемом разделяемых данных –
взлом шифра методом "грубой силы" (например, перебором пространства ключей) или
вычисление интеграла методом Монте-Карло. Примеры вовсе не распараллеливаемых задач –
вычисление ряда, определяемого индуктивной формулой a(n)=f(a(n-1)) или поиск минимума
многомерной функции
Два основных подхода к реализации параллельных вычислительных программ – это параллельные программы с разделяемой памятью и программы, обменивающиеся сообщениями.
Программы с разделяемой памятью удобны, когда нити алгоритма должны часто обмениваться большими объемами данных и/или осуществлять произвольный доступ к разделяемым данным большого объема. Программы, обменивающиеся сообщениями, удобны, когда объем разделяемых данных невелик, а эти данные изменяются редко и в предсказуемых местах.
Крайний случай программ, обменивающихся сообщениями –это уже упоминавшийся взлом шифра, когда каждая программа при запуске получает свой участок работы (дешифруемое сообщение, критерий успешности расшифровки и диапазон пространства ключей), выполняет свою часть работы независимо отдругих и сообщает о результате.
Наиболее распространенная технология параллельных вычислений с разделяемой памятью –
OpenMP. Приложения OpenMP разрабатываются на специальных диалектах языков C и Fortran.
Эти диалекты отличаются от базовых языков наличием специальных директив (в C это #pragma
omp ), описывающих, какие участки кода следует исполнять параллельно и какие переменные
должны разделяться между нитями. Кроме директив компилятора OpenMP предоставляет
также API для взаимодействия нитей. Некоторые компиляторы, например Sun Studio 11, могут
автоматически распараллеливать программы, написанные на обычном C и Fortran.
OpenMP использует fork-join модель многопоточности, когда программа в начале блока
разветвляетсяна нескольконитей, а вконце блока собирает результаты исполнения этих нитей.
Таким образом, параллелизм программы имеет блочную структуру, аналогичную структуре кода в C и Java. Разумеется, это резко сужает количество возможных программ, но в то же время это значительно упрощает разработку и отладку. Поэтому считается, что OpenMP предоставляет более высокоуровневую модель многопоточности, чем POSIX Threads.
OpenMP позволяет управлять количеством нитей программы во время запуска при помощи
переменной среды OMP_NUM_THREADS. Сама программа также может управлять
количеством нитей через специальный API. Как правило, рекомендуется, чтобы количество
нитей программы на машине с N процессорами было равно N или N-1. По умолчанию
программа OpenMP запускается с количеством нитей, которое равно количеству доступных
процессоров. Если несколько пользователей запускают свои задачи на одной машине, им
следует договориться об используемом количестве процессоров. Solaris предоставляет
средства для принудительного управления количеством процессоров, доступных пользователю,
такие, как зоны, контейнеры и проекты.
Программы OpenMP исполняются как несколько потоков в рамках одного процесса. Это практически исключает возможность исполнения таких программ – во всяком случае, в чистом виде - на многомашинных комплексах. Тем не менее, существуют вычислительные комплексы с большим количеством процессоров, предоставляющие разделяемую память, пригодную для исполнения многопоточных программ – так называемые NUMA-системы (Non-Uniform Memory Access, неоднородный доступ к памяти). Такие системы состоят из процессорных модулей, которые обычно имеют несколько процессоров и локальную память. Модули соединены между собой высокоскоростной коммутируемой или маршрутизуемой магистралью, которая обеспечивает доступ к ОЗУ других модулей. Разумеется, доступ к памяти другого модуля происходит медленнее, чем к локальному ОЗУ, но все-таки быстрее, чем копирование содержимого ОЗУ по сети. Многие реализации NUMA -CC-NUMA (Cache Coherent NUMA, NUMA с когерентным кэшем), COMA (Cache Only Memory Architecture) в том или ином виде реализуют локальное кэширование при межмодульном доступе к памяти.
NUMA системы с умеренным количеством процессоров (16, 32 или 64) применяются не только для вычислений, но и в качестве серверов баз данных и серверов приложений и производятся серийно. Именно такую архитектуру имеют старшие модели серверов Sun Fire. Для вычислительных задач иногда применяются NUMA-системы с сотнями и тысячами процессоров. Межмодульная магистраль в таких системах обычно представляет собой маршрутизуемую сеть сложной (чаще всего гиперкубической) топологии. Такие машины делаются на заказ или небольшими сериями и, как правило, допускают установку дополнительных процессорных модулей. Именно такую архитектуру имел компьютер IBM DeepBlue, который в 1997 году выиграл матч у чемпиона мира по шахматам Г. Каспарова.
Наиболее распространенная технология разработки параллельных вычислительных программ с обменом сообщениями так и называется – MPI (Message Passing Interface, интерфейс передачи сообщений). MPI представляет собой библиотеку, реализующую высокоуровневый обмен типизованными сообщениями между процессами. Передача сообщений может осуществляться как по сети, так и через локальные средства IPC. Также предоставляется имитация семафоров, барьеров и разделяемой памяти при помощи сообщений.MPI обеспечивает запуск многопроцессных вычислительных приложений как на одном компьютере (даже однопроцессорном – это может быть полезно при отладке), так и на многомашинных вычислительных кластерах. Для большинства задач необходимо, чтобы эти машины были соединены высокопроизводительными сетевыми интерфейсами.
В последние годы возник интерес к гибридным приложениям MPI/OpenMP. Действительно, в современных вычислительных кластерах часто используются многопроцессорные машины. Кроме того, приложения MPI часто проводят довольно много времени в ожидании обмена данными; в это время машина могла бы заниматься исполнением другой части работы. На некоторых задачах использование гибридной вычислительной модели позволяет достичь улучшения на десятки процентов и даже в разы по сравнению с чистыми MPI и OpenMP.
Для задач, которыенуждаются в редком обменесообщениями небольшого объема, интересны вычислительные сети типа GRID. Такие сети представляют собой обычные персональные компьютеры, соединенные обычной офисной локальной сетью или даже через Интернет. Эти сети часто допускают произвольное подключение и отключение машин. В этом случае, GRID система позволяет использовать персональные компьютеры во время простоя. Например, в научно-исследовательском учреждении во время рабочего дня компьютеры используются сотрудниками, а ночью или даже во время обеденного перерыва они подключаются к GRID и занимаются вычислениями. Разумеется, это возможно только если алгоритм допускает разбиение на совершенно автономные подзадачи, не нуждающиеся во взаимодействии друг с другом. Примерами таких задач являются уже упоминавшиеся взлом шифров методом грубой силы и вычисление интегралов методом Монте-Карло, а также поиск внеземных цивилизаций (Seti@Home), поиск генных последовательностей, многие задачи имитационного моделирования.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.