Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 131
Текст из файла (страница 131)
Вначале они предназначались лля решения некоторых задач, стоящих перед операционными системами, но теперь нх можно использовать и в других программных приложениях. Например, многие программные системы разрабатываются для моделирования реальных физических систем, некоторые зачастую состоят из совокупности параллельных подсистем. Для этих приложений ограниченные формы управления подпрограммами не подходят. Параллельность на уровне операторов совершенно отличается от параллельности на уровне модулей. С точки зрения разработчика языка, параллельность на уровне операторов в основном сводится к определению того, каким именно образом следует распределить данные среди нескольких запоминающих устройств и какие операторы можно выполнять параллельно. Глава 1 2.
Параллельность Данная глава посвящена обсуждению аспектов параллельности. относящихся в большей степени к проблемам разработки языков программирования, и не является полным исследованием всех вопросов, связанных с параллельностью. Зто было бы совершенно неуместно в книге о языках программирования. 12.1.1. Многопроцессорные орхнтектуры Большое количество различных компьютерных архитектур имеют более одного процессора и могут полдерживать некоторые виды параллельного выполнения програмль Прежде чем начать обсуждение видов параллельного выполнения программ и оператороа, мы кратко опишем некоторые из этих архитектур.
Первые компьютеры, имевшие несколько процессоров, в действительности имели один процессор общего назначения и один иди несколько других процессоров, использовавшихся только для выполнения операций ввода и вывода. Зто позволяло компьютерам. появившимся в конце 1950-х годов, одновременно с выполнением одной программы осуществлять ввод или вывод данных для других пролрамм. Поскольку этот вид параллельности не требует языковой поддержки, в дальнейшем мы не будем его рассматривать. В начале 1960-х годов появились машины, имевшие несколько полноценных процессоров. Зти процессоры использовались как планировщики заданий, которые просто распределяли отдельные задания из очереди пакета среди отдельных процессоров. Системы с такой структурой поддерживают параллельность на уровне программ.
В середине 1960-х годов появились многопроцессорные компьютеры. имевшие несколько идентичных специализированных процессоров, получавших определенные команды из одного потока данных. Например, некоторые машины имели несколько процессоров только для умножения чисел с плавающей точкой. в то время как другие машины имели несколько полноценных модулей для выполнения всех арифметических операций над числами с плавающей точкой. Для таких машин были нужны компиляторы, которые определяли бы. какие именно команды можно выполнять параллельно, и соответствующим образом планировали бы их выполнение. Системы с такой структурой поддерживали параллельность на уровне команд. Сейчас существует много различных многопроцессорных компьютеров, две наиболее общие категории которых описываются в следующих абзацах.
Компьютеры, имеющие несколько процессоров, одновременно выполняющих одну и ту же команду. каждый со своим собственным набором данных, называются компьютерами, имеющими архитектуру с одним потоком команд и многими потокал~и данных (Б1М)у — з1пй!е 1пзггисгюп шпй1р!е-дага).
В Б!МО-компьютере каждый процессор имеет свою собственную локальную память, причем один процессор управляет выполнением операций другими процессорами. Поскольку все процессоры, за исключением контроллера, выполняют одну и ту же команду одновременно, в программном обеспечении не нужна синхронизация, Возможно, наиболее широко используемыми ЯМ0-машинами являются так называемые векторные процессоры. Они имеют группы регистров, хранящих операнды векторной операции, в которых одна и та же команда одновременно выполняется над целой группой операндов. Обычно наибольшую пользу из такой архитектуры извлекают программы для научных вычислений, в которых часто применяются многопроцессорные машины.
Компьютеры, имеющие несколько процессоров, действующих независимо, но операции которых можно синхронизировать, называются компьютерами, имеющими архитек- 12.1. Введение туру со многими потоками команд и многими потоками данных (М)МР— пш1бр!евыпкйоп пш!йр!е-ба!а). Каждый процессор в М)МР-компьютере выполняет свой собственный поток команд. М!МР-компьютер может иметь две различные конфигурации— системы с распределенной и совместно используемой памятью. Распределенные М1МР- машины. в которых каждый процессор имеет свою собственную память, могут быть либо построены в одном блоке, либо распределены на большой плошади. М!МР-машины с совместной памятью, очевидно, должны обеспечивать некоторые средства синхронизации для предотвращения конфлилтов при доступе к памяти.
Даже в распределенных М1МР-машинах требуется синхронизация для совместного выполнения отдельной программы. М!МР-компьютеры, являющиеся дорогими и более универсальными, очевидным образом поддерживают параллельность на уровне модулей. 12.1.2. Разновидности параллельности Существуют две разновидности параллельного управления модулями. Наиболее общая разновидность параллельности предполагает доступность нескольких процессов и одновременное, в буквальном смысле этого слова, выполнение одной и той же программы несколькими программными модулями.
Это — физическая параллельность (рЬуз!са! сопсцггепсу). Небольшое ослабление этой концепции параллельности позволяет программисту и программному обеспечению считать, что существует несколько процессоров, обеспечивающих реальную параллельность, тогда как в действительности имеет место поочередное выполнение программ на одном процессоре.
Это — логическая параллельность (!о81са! сопсцггепсу). Она создает иллюзию одновременного выполнения программ различных пользователей многопрограммной компьютерной системы. С точки зрения программиста и разработчика языка, логическая параллельность ничем не отличается от физической. Задачей реализации языка является отображение логической параллельности в соответствующем программном обеспечении. И логическую, и физическую параллельность можно использовать в качестве методологии разработки программ.
В оставшейся части главы под словом параллельность (без уточнения) мы будем подразумевать логическую параллельность. Для визуализации потока выполнения команд в программе полезно представить себе нить, протянутую через операторы исходного текста программы. Каждый оператор, достигнутый в ходе конкретного выполнения программы, как бы накрывается потоком, символизирующим это выполнение. Визуально следуя за этой нитью, проходящей через исходную программу, мы можем отследить поток выполнения, протекающий через исполняемый модуль. Поток управления (!Ьгеаб оГ сод!го!) в программе — это последовательность точек, которые достигаются при выполнении программы. Программы, имеющие сопрограммы (см.
главу 8), хотя иногда и называются квазипараллельными, имеют олин поток управления. Программы, выполняемые на основе физической параллельности, могут иметь несколько потоков управления. Каждый процессор выполняет только один из потоков. Несмотря на то что выполнение логически параллельных программ в действительности может иметь только один поток управления, такие программы разрабатывазотся и анализируются только на основе их представления в виде программ, имеющих несколько потоков управления. Когда многопоточная программа выполняется на однопроцессорной машине, ее потоки отображаются на один поток.
Она становится в таком случае виртуально многопоточной программой. 506 Глава 1 2. Параллельность Параллельность на уровне операторов является относительно простым понятием. Циклы, которые содержат операторы, выполняющие действия над элементами массива, развертываются так, что их обработку можно распределить среди многих процессоров. Например, цикл, который выполняет 500 повторений и содержит операторы, осуществляющие действия над одним из 500 элементов массива, можно развернуть так, что каждый из 1О отдельных процессоров будет одновременно обрабатывать 50 элементов массива.
12.1.3. Почему нужно изучать параллельность Существует, по крайней мере, две причины, по которым следут изучать параллельность. Первая и главная заключается в том, что параллельность обеспечивает метод концептуализации программных решений поставленных задач. Для большой части задач параллельность вполне естественна, примерно так же, как рекурсия является естественным способом решения некоторых задач.
Многие программы предназначены лля моделирования физических сущностей и процессов. Зачастую моделируемые системы состоят из нескольких сущностей, которые все делают одновременно, — например, полет самолета в контролируемой области. работа ретрансляционной станции в коммуникационной сети и функционирование машин в промышленном производстве. Для точного моделирования таких систем с помощью программного обеспечения необходимы программы, которые могут выполнять параллельные вычисления. Вторая причина, по которой мы обсуждаем параллельность, — то, что в настоящее время широко используются многопроцессорные компьютеры, и зто стимулирует создание программ. эффективно использующих возможности аппаратного обеспечения. Поскольку и параллельность на уровне операторов, и параллельность на уровне модулей имеют большое значение, необходимо разрабатывать и включать в современные языки программирования средства для их поддержки.