Симметричная многопроцессорная обработка (Symmetric MultiProcessing - SMP) являет еще один пример фундаментальной компьютерной технологии, которая от уникальных вычислительных систем проложила себе путь к относительно массовым и недорогим платформам, используемым в локальных вычислительных сетях. То, что раньше было доступно для избранных производителей дорогой аппаратуры, превратилось в высокотехнологичное, но посильное поприще для многих производителей сетевых серверов на платформе Intel. Можно с уверенностью сказать, что сетевые операционные системы и прикладные программы для ПК получают возможность воспользоваться преимуществами аппаратного обеспечения SMP. Компания Intel подготовила солидный плацдарм для этого, представив значительно обновленный контроллер прерываний APIC, а главное, разработав спецификацию многопроцессорной архитектуры и добившись ее популярности у своих ведущих партнеров-производителей ПК-серверов.
Вооруженные спецификацией MPS, многие разработчики сетевых ОС выдвигаются на рубежи симметричной многопроцессорности. (С успехами на этом поприще разработчиков различных вариантов ОС UNIX для RISC-платформ читатель может познакомиться, обратившись к первому номеру "Открытых систем" за 1995 год.) У симметрично-многопроцессорных платформ на базе Intel-процессоров свои герои. Вслед за Solaris 2.4 компании Sun, доступным отныне и для ПК и Open Server З.х компании The Santa Cruz Operation, в шеренгу приверженцев SMP встают все новые и новые производители операционных систем. IBM завершила SMP-версию OS/2. Весной прошлого года Novell представила свою трехэтапную стратегию введения различных вариантов многопроцессорной обработки в NetWare, а в преддверии года нового анонсировала ОС UnixWare 2.0, которая такую обработку поддерживает.
Но, быть может, самого пристального внимания заслуживает среди таких ОС Windows NT Advanced Server, который изначально создавался для работы с симметрично-многопроцессорными компьютерами.
По существу дела
По сути, для многопроцессорной обработки всегда требуются и соответствующие аппаратные платформы, и операционные системы. Однако ОС могут использовать многопроцессорные платформы несколькими разными способами.
При асимметричной многопроцессорной обработке процессы прикладных программ назначаются конкретному процессору на аппаратной платформе. Нити каждого процесса должны ждать, пока назначенный им процессор освободится. Такой метод, как правило, менее эффективен, чем симметричный метод. Симметричная многопроцессорная обработка предполагает, что все процессоры имеют одинаковые возможности. Advanced Server запускает нить на первом освободившемся процессоре, как только выполнение нити после приоритетного прерывания ОС возобновляется. В SMP-модели нагрузка динамически распределяется между процессорами, так что невозможна ситуация, в которой одни центральные процессоры перегружены, в то время, как другие ничем не заняты.
Есть две общие реализации SMP, известные как сильносвязанная и слабосвязанная. Сильносвязанная реализация базируется на схеме, согласно которой процессоры совместно используют данные из пула общих ресурсов, прежде всего, из общей памяти. Слабосвязанные системы используют механизм обмена сообщениями между процессами для совместного использования ресурсов, когда это необходимо. В некоторых слабосвязанных системах каждый процессор может даже иметь свой собственный контроллер диска и другие подсистемы.
Windows NT Advanced Server использует сильносвязанную симметричную модель. Он обеспечивает мощную поддержку симметричной многопроцессорной обработки, так как планировщик в ядре ОС функционирует на уровне нити, поэтому сервер может назначить две нити одного процесса различным процессорам. Это особенно полезно для прикладных программ баз данных, где запросы могут быть расщеплены на нити и распределены между процессорами, что ведет к значительному увеличению производительности.
Чтобы полнее воспользоваться преимуществами SMP при организации многозадачности, выполнение нитей процесса контролируется с помощью приоритетных прерываний. Приоритетное прерывание позволяет операционной системе поддерживать контроль над программами: какую программу и когда запускать, так что сбившиеся программы не могут поработить систему и вызвать проблемы. При приоритетных прерываниях - постоянный, занимающие считанные микросекунды запуск и остановка нескольких программ - как только возобновляется выполнение нити, ОС может назначить ее другому процессору.
Основным преимуществом такой архитектуры является то, что прикладные программы имеют в своем распоряжении столько центральных процессоров, сколько имеется в наличии у сервера. Так как операционная система занимается планированием работы процессоров, прикладным программам нет необходимости знать о количестве имеющихся процессоров. Операционная система назначит каждую нить первому свободному процессору. Планировщик позволяет распределять нагрузку и в конечном итоге выполнять программы точно с той же скоростью, с какой несколько центральных процессоров и могут с ними справиться.
Наиболее высокопроизводительными серверами, работающими под управлением Windows NT, являются компьютеры Symmetry компании Sequent, допускающие установку до обслуживать до шестнадцати процессоров. Впрочем, надо признать, что среди производителей наиболее популярны менее дорогие двух-четырехпроцессорные компьютеры.
Решающий фактор
Одним из преимуществ Advanced Server, как и других SMP-платформ, является его масштабируемость. Компания, реализовавшая однопроцессорную систему с таким сервером, в будущем будет иметь возможность реализовать SMP с той же самой версией ОС. Если задачи растут постепенно, необязательно выкладывать сразу все деньги. Напротив, можно приобрести сначала сервер только с одним процессором, а позднее добавлять дополнительные процессоры. Если масштабируемость реальна, то по мере того, как развивается информационная система и, соответственно, требования пользователей к мощности системы, можно добавить еще один процессор без какого-либо изменения программного обеспечения.
Для достижения масштабируемости важно Advanced Server использует также асинхронные операции. При асинхронном вводе/выводе процессу не надо Ожидать завершения чтения или записи, прежде чем он приступит к выполнению другой задачи. Каждый процесс Windows NT Advanced Server создается с использованием единственной нити, которая выступает отдельным блоком при выполнении процессором команд программы. Программы могут запускать новые нити по мере потребности, и сервер NT назначает и контролирует их без участия высокоуровневой прикладной системы.
Прикладная программа может использовать несколько нитей, не нарушая основной поток программы. Программа может создать отдельную нить для каждой операции. Каждая из этих нитей, или операций, с точки зрения пользователя, может выполняться на отдельном процессоре без контроля со стороны прикладной программы.
Такая архитектура имеет еще одно преимущество. Накладные расходы связаны скорее с процессом, чем с нитью. Кроме того, нити создаются быстрее, чем процессы, и они совместно используют память внутри процесса, так что нитям нет необходимости осуществлять какую-либо специальную передачу данных. Помимо этого, все ресурсы процесса доступны всем нитям внутри процесса.
Конечно, для работы с текстовыми редакторами и электронными таблицами мощь многопроцессорной архитектуры не потребуется. Однако с появлением видео, используемого в реальном масштабе времени и других настольных прикладных программ, требующих больших затрат центрального процессора, применение SMP-архитектур встает на повестку дня. Еще более актуальным оно является в рамках сетевого сервера или сервера базы данных, ответственного за оперативную обработку транзакций, поступающих от большого числа пользователей.
Как это работает
При выборе прикладной программы для сервера Windows NT вам необходимо выяснить, использует ли продукт все преимущества ОС на уровне нити, а не на уровне процесса. Определяя производительность и гибкость какой-либо системы как единого целого, необходимо иметь в виду, что аппаратное обеспечение, сетевая операционная система и прикладное программное обеспечение работают вместе.
Все основные поставщики баз данных имеют или планируют иметь версии своих продуктов, которые используют преимущества многонитевой и многопроцессорной обработки, реализованные в операционной системе (см. статью "Развитие архитектур баз данных" в этом выпуске журнала).
Говоря коротко, использование преимуществ, которые сулит базовая SMP-поддержка, основывается на том, что каждому пользователю, взаимодействующему с многонитевым сервером базы данных назначается не полноценный процесс со всеми атрибутами, а своя отдельная нить, выполняющаяся на процессоре, который в данный момент свободен. Подобный подход позволяет серьезно сэкономить память сервера. В случае Windows NT Advanced Server на это требуется 55 КБайт памяти вместо 350 КБайт.
Кроме того, SQL Server выполняет операции различных пользователей параллельно. Так как каждому пользователю назначена его собственная нить, различные функции базы данных могут быть распределены между процессорами.
Масштабируемость теоретическая и реальная
Можно ли сказать, чему равно оптимальное число процессоров в системе?
Необходимо иметь в виду, что эффективность не растет линейно при добавлении еще одного процессора. Для любой SMP-системы выгода от дополнительного процессора постепенно сходит на нет с добавлением каждого последующего процессора. Сервер, поддерживающий наибольшее число процессоров, не обязательно оказывается лучшим сервером для Вашей среды.
Производительность не растет линейно, поскольку сетевая ОС должна управлять каждым процессором и, следовательно, взаимодействием процессора с внутренними вызовами и периферийными устройствами на шине. Когда нить в однопроцессорной системе не может более выполняться до осуществления некоторого условия, процессор маскирует программное прерывание так, что никакой другой процесс не может воспользоваться данным ресурсом. Затем он сохраняет состояние нити, чтобы выполнение кода могло возобновиться при осуществлении условия.
Когда есть только один процессор, довольно просто сохранять описание уровней прерывания и масок, контролирующих доступ к структурам данных ОС.
С добавлением каждого нового процессора эта задача становится все более трудной. Операционная система для SMP-платформы должна уточнить, что только один процессор в данный момент выполняет сегмент кода, который меняет глобальную структуру данных.
Конфликты на шине
В системе с одним процессором маскированное прерывание предотвращает использование процессором ресурса. Но в SMP-среде этот механизм не дает возможности гарантировать, что различные процессы не будут иметь доступа к тому же самому ресурсу через другое прерывание.
Windows NT Advanced Server использует метод взаимоблокировки для управления прерываниями между процессорами. По сути, взаимоблокировка является программной процедурой, которая блокирует доступ второго процессора к уже занятому ресурсу. Например, когда ядро хочет получить доступ к защищенной области, такой как очередь отложенных вызовов процедур, оно должно "приобрести" замок, который связан с очередью. Если замок находится в распоряжении какого-либо процессора, то другой процессор пытается получить замок до тех пор, пока его не освободит другой процессор.
Такой метод позволяет предотвратить порчу процессорами глобальных структур данных на уровне ядра. Однако, при непродуманной реализации, он может привести к тому, что процессоры будут бездействовать в течение длительного периода, ожидая освободившийся спинлок. Windows NT Advanced Server спроектирован так, что минимизирует число выполняемых команд, пока ядро сохраняет права на замок.
Спинлок хорошо работают, когда выполняются небольшие фрагменты кода. Такой код наиболее часто используется в функциях ядра, которые не вызывают внешние процедуры, не вытесняются из памяти и не генерируют прерываний. Таким образом, во многих случаях взаимоблокировка не действует, в то время как ядро должно синхронизировать нити между процессорами.
Ядро также может управлять нитью, назначая ей одно из трех состояний: готова, выполняется или ждет. Когда нить ждет результатов запроса, ядро изменяет состояние нити с "выполняется" на "ждет" и удаляет ее из очереди на выполнение. После того как нить получила ожидаемую ею информацию, ядро изменяет состояние нити с "ждет" на "готова" и возвращает ее в очередь. Нить выполняется, когда появляется возможность.
Хотя это объяснение поверхностно, оно все же показывает, насколько сложным для операционной системы оказывается управление синхронизацией нескольких процессов. По мере добавления новых процессоров к системе накладные расходы на управление конфликтами возрастают, и это уменьшает отдачу от ОС, ориентированных на симметрично-многопроцессорную обработку.
Разумно предположить, что это обстоятельство как сейчас, так и впредь будет ограничивать число процессоров, которое оправдано установить в SMP-платформу. Действительно, наиболее узким местом, как видно из вышесказанного, является системная шина, а ее порпускная способность, несмотря на все нововведения, только-только поспевает за ростом производительности центральных процессоров - а тут еще надо справиться с ростом их числа.
Сервер Windows NT поддерживает до четырех процессоров. Если же необходимо более четырех процессоров, требуется внести изменения в так называемый Hardware Abstraction Layer. HAL - это компонент программного обеспечения, которое пишет каждый производитель аппаратуры, адаптирующий Windows NT Advanced Server к своей платформе. Благодаря этому слою абстракции, Windows NT Advanced Server легко переносим и доступен на многих SMP-платформах.