Изменения

Нет описания правки
== Понятие программного средства и его жизненный цикл. Понятие качества ПС, критерии качества ПС ==
Целью программирования является описание процессов обработки данных (в дальнейшем — дальнейшем — просто процессов). Согласно ИФИПа [1.1]: данные (data)  — это представление фактов и идей в формализованном виде, пригодном для передачи и переработке в некоем процессе, а информация (information)  — это смысл, который придается данным при их представлении. Обработка данных (data processing)  — это выполнение систематической последовательности действий с данными. Данные представляются и хранятся на т. н н. носителях данных. Совокупность носителей данных, используемых при какой-либо обработке данных, будем называть информационной средой (data medium). Набор данных, содержащихся в какой-либо момент в информационной среде, будем называть состоянием этой информационной среды. Процесс можно определить как последовательность сменяющих друг друга состояний некоторой информационной среды.
Описать процесс — процесс — это значит определить последовательность состояний заданной информационной среды. Если мы хотим, чтобы по заданному описанию требуемый процесс порождался автоматически на каком-либо компьютере, необходимо, чтобы это описание было формализованным. Такое описание называется программой. С другой стороны, программа должна быть понятной и человеку, так как и при разработке программ, и при их использовании часто приходится выяснять, какой именно процесс она порождает. Поэтому программа составляется на удобном для человека формализованном языке программирования, с которого она автоматически переводится на язык соответствующего компьютера с помощью другой программы, называемой транслятором. Человеку (программисту), прежде чем составить программу на удобном для него языке программирования, приходится проделывать большую подготовительную работу по уточнению постановки задачи, выбору метода ее решения, выяснению специфики применения требуемой программы, прояснению общей организации разрабатываемой программы и многое другое. Использование этой информации может существенно упростить задачу понимания программы человеком, поэтому весьма полезно ее как-то фиксировать в виде отдельных документов (часто не формализованных, рассчитанных только для восприятия человеком).
Обычно программы разрабатываются в расчете на то, чтобы ими могли пользоваться люди, не участвующие в их разработке (их называют пользователями). Для освоения программы пользователем помимо ее текста требуется определенная дополнительная документация. '''Программа или логически связанная совокупность программ на носителях данных, снабженная программной документацией, называется программным средством (ПС).''' Программа позволяет осуществлять некоторую автоматическую обработку данных на компьютере. Программная документация позволяет понять, какие функции выполняет та или иная программа ПС, как подготовить исходные данные и запустить требуемую программу в процесс ее выполнения, а также: что означают получаемые результаты (или каков эффект выполнения этой программы). Кроме того, программная документация помогает разобраться в самой программе, что необходимо, например, при ее модификации.
* мобильность.
Функциональность — Функциональность — это способность ПС выполнять набор функций, удовлетворяющих заданным или подразумеваемым потребностям пользователей. Набор указанных функций определяется во внешнем описании ПС.
Надежность подробно обсуждалась в первой лекции.
Легкость применения — применения — это характеристики ПС, которые позволяют минимизировать усилия пользователя по подготовке исходных данных, применению ПС и оценке полученных результатов, а также вызывать положительные эмоции определенного или подразумеваемого пользователя.
Эффективность — Эффективность — это отношение уровня услуг, предоставляемых ПС пользователю при заданных условиях, к объему используемых ресурсов.
Сопровождаемость — Сопровождаемость — это характеристики ПС, которые позволяют минимизировать усилия по внесению изменений для устранения в нем ошибок и по его модификации в соответствии с изменяющимися потребностями пользователей.
Мобильность — Мобильность — это способность ПС быть перенесенным из одной среды (окружения) в другую, в частности, с одного компьютера на другой.
В технике известны четыре подхода обеспечению надежности [3.11]:
== Принципы модульного программирования ==
Приступая к разработке каждой программы ПС, следует иметь ввиду, что она, как правило, является большой системой, поэтому мы должны принять меры для ее упрощения. Для этого такую программу разрабатывают по частям, которые называются программными модулями [7.1, 7.2]. А сам такой метод разработки программ называют ''модульным'' программированием [7.3]. ''Программный модуль''  — это любой фрагмент описания процесса, оформляемый как самостоятельный программный продукт, пригодный для использования в описаниях процесса.
Не всякий программный модуль способствует упрощению программы [7.2]. Выделить хороший с этой точки зрения модуль является серьезной творческой задачей. Для оценки приемлемости выделенного модуля используются некоторые критерии. Так, Хольт [7.4] предложил следующие два общих таких критерия:
'''''Размер'' модуля''' измеряется числом содержащихся в нем операторов или строк. Модуль не должен быть слишком маленьким или слишком большим. Маленькие модули приводят к громоздкой модульной структуре программы и могут не окупать накладных расходов, связанных с их оформлением. Большие модули неудобны для изучения и изменений, они могут существенно увеличить суммарное время повторных трансляций программы при отладке программы. Обычно рекомендуются программные модули размером от нескольких десятков до нескольких сотен операторов.
'''''Прочность'' модуля'''  — это мера его внутренних связей. Чем выше прочность модуля, тем больше связей он может спрятать от внешней по отношению к нему части программы и, следовательно, тем больший вклад в упрощение программы он может внести. Для оценки степени прочности модуля Майерс [7.5] предлагает упорядоченный по степени прочности набор из семи классов модулей. Самой слабой степенью прочности обладает модуль, ''прочный по совпадению''. Это такой модуль, между элементами которого нет осмысленных связей. Такой модуль может быть выделен, например, при обнаружении в разных местах программы повторения одной и той же последовательности операторов, которая и оформляется в отдельный модуль. Необходимость изменения этой последовательности в одном из контекстов может привести к изменению этого модуля, что может сделать его использование в других контекстах ошибочным. Такой класс программных модулей не рекомендуется для использования. Вообще говоря, предложенная Майерсом упорядоченность по степени прочности классов модулей не бесспорна. Однако, это не очень существенно, так как только два высших по прочности класса модулей рекомендуются для использования. Эти классы мы и рассмотрим подробнее.
'''''Функционально прочный'' модуль'''  — это модуль, выполняющий (реализующий) одну какую-либо определенную функцию. При реализации этой функции такой модуль может использовать и другие модули. Такой класс программных модулей рекомендуется для использования.
'''''Информационно прочный'' модуль'''  — это модуль, выполняющий (реализующий) несколько операций (функций) над одной и той же структурой данных (информационным объектом), которая считается неизвестной вне этого модуля. Для каждой из этих операций в таком модуле имеется свой вход со своей формой обращения к нему. Такой класс следует рассматривать как класс программных модулей с высшей степенью прочности. Информационно прочный модуль может реализовывать, например, абстрактный тип данных.
В модульных языках программирования как минимум имеются средства для задания функционально прочных модулей (например, модуль типа FUNCTION в языке ФОРТРАН). Средства же для задания информационно прочных модулей в ранних языках программирования отсутствовали. Эти средства появились только в более поздних языках. Так в языке программирования Ада средством задания информационно прочного модуля является пакет [7.6].
'''''Сцепление'' модуля'''  — это мера его зависимости по данным от других модулей. Характеризуется способом передачи данных. Чем слабее сцепление модуля с другими модулями, тем сильнее его независимость от других модулей. Для оценки степени сцепления Майерс предлагает [7.5] упорядоченный набор из шести видов сцепления модулей. Худшим видом сцепления модулей является ''сцепление'' ''по содержимому''. Таким является сцепление двух модулей, когда один из них имеет прямые ссылки на содержимое другого модуля (например, на константу, содержащуюся в другом модуле). Такое сцепление модулей недопустимо. Не рекомендуется использовать также ''сцепление по общей области''  — это такое сцепление модулей, когда несколько модулей используют одну и ту же область памяти. Такой вид сцепления модулей реализуется, например, при программировании на языке ФОРТРАН с использованием блоков COMMON. Единственным видом сцепления модулей, который рекомендуется для использования современной технологией программирования, является ''параметрическое сцепление'' (сцепление по данным по Майерсу [7.5])  — это случай, когда данные передаются модулю либо при обращении к нему как значения его параметров, либо как результат его обращения к другому модулю для вычисления некоторой функции. Такой вид сцепления модулей реализуется на языках программирования при использовании обращений к процедурам (функциям).
'''''Рутинность'' модуля'''  — это его независимость от предыстории обращений к нему. Модуль будем называть ''рутинным'', если результат (эффект) обращения к нему зависит только от значений его параметров (и не зависит от предыстории обращений к нему). Модуль будем называть ''зависящим от предыстории'', если результат (эффект) обращения к нему зависит от внутреннего состояния этого модуля, изменяемого в результате предыдущих обращений к нему. Майерс [7.5] не рекомендует использовать зависящие от предыстории (непредсказуемые) модули, так как они провоцируют появление в программах хитрых (неуловимых) ошибок. Однако такая рекомендация является неконструктивной, так как во многих случаях именно зависящий от предыстории модуль является лучшей реализаций информационно прочного модуля. Поэтому более приемлема следующая (более осторожная) рекомендация:
* всегда следует использовать рутинный модуль, если это не приводит к плохим (не рекомендуемым) сцеплениям модулей;
Среди ада-объектов можно выделить ''объекты данных'' (то есть объекты, которым разрешено играть роль данных по отношению к каким-либо операциям). Каждый объект данных в Аде характеризуется определенным ''типом''. Своеобразие этого языка в значительной степени связано именно с системой типов. Для тех, кто работал только с Фортраном, Алголом и Бейсиком, многое в этой системе окажется совершенно незнакомым. В частности, возможность определять новые типы, отражающие особенности решаемой задачи. Для освоивших Паскаль адовские типы привычнее. По сравнению с Паскалем система адовских типов полнее и строже, лучше отвечает своему назначению.
Тип — Тип — важнейшая компонента аппарата прогнозирования-контроля. Приписывая объекту данных определенный тип, ограничивают его возможное поведение. С другой стороны, зная тип, получают возможность это поведение контролировать. Наконец, зная ограничения на возможное поведение, можно рационально выделять память и другие ресурсы. С типом в Аде связывают три основных ограничения:
Во-первых, тип ограничивает ''область значений'' объекта; во-вторых, ''набор операций'', в которых объекту разрешено фигурировать; в-третьих, набор допустимых для него ролей в этих операциях (скажем, в качестве второго операнда, результата и ти т. п п.).
Имеется четыре категории типов: ''скалярные'' типы (в том числе ''перечисляемые'' и ''числовые''), ''составные'' (в том числе ''регулярные'' типы (массивы) и ''комбинированные'' (записи, структуры)), ''ссылочные'' типы (указатели) и ''приватные'' типы (представление которых невидимо пользователю).
=== Скалярные типы ===
Когда определяют перечисляемый тип, явно указывают перечень лексем, которые и составляют область возможных значений объектов вводимого типа. Такой перечень может быть списком дней недели (понедельник, вторник, среда, четверг, пятница, суббота, воскресенье), списком символов некоторого алфавита (`A',`B',…,`Z') и ти т. п п. Перечисляемые типы избавляют программиста от необходимости кодировать содержательные объекты целыми числами. Перечисляемые типы BOOLEAN (логический) и CHARACTER (символьный) считаются ''предопределенными'', то есть встроенными в язык и действующими без предварительного явного объявления в программе. Набор символов типа CHARACTER соответствует алфавиту ASCII — ASCII — американскому стандарту на коды символов.
Числовые типы обеспечивают точные и приближенные вычисления. В точных вычислениях пользуются ''целыми'' типами. Область возможных значений для таких типов — типов — конечный диапазон целых чисел. В приближенных вычислениях пользуются либо ''абсолютными'' типами (для них задается абсолютная допустимая погрешность), либо ''относительными'' типами (задается относительная погрешность). Абсолютная погрешность задается явно и называется ''дельтой'', относительная погрешность вычисляется по заданному допустимому количеству значащих цифр в представлении числа. Подразумевается, что абсолютные типы будут представлены машинной арифметикой с фиксированной точкой (запятой), а относительные — относительные — с плавающей. Типы INTEGER (целый), FLOAT (плавающий), и DURATION (временные задержки для управления задачами) считаются предопределенными.
=== Составные типы ===
Скалярные типы (и перечисляемые, и числовые) выделяются тем, что объекты этих типов считаются атомарными (не имеющими составляющих). Составные типы, в отличие от скалярных, позволяют определять структурированные объекты (массивы и записи). Массивы служат значениями регулярных типов — типов — компоненты массивов доступны по индексам. «Регулярность» массивов проявляется в том, что все компоненты должны быть одного типа. Записи (структуры) служат значениями комбинированных типов — типов — их компоненты могут быть различных типов; компоненты записей доступны по именам-селекторам. Имена компонент одной и той же записи должны быть различны; компоненты называются также ''полями'' записи.
Строение записей одного типа может зависеть от значений выделенных полей, называемых ''дискриминантами''. Дискриминанты играют роль параметров комбинированного типа — типа — задавая набор дискриминантов, выбирают определенный вариант структуры объектов этого типа. Поэтому типы с дискриминантами называют также ''вариантными'' типами.
=== Ссылочные типы ===
Если структура объектов составных типов (в случае вариантных типов — типов — все варианты такой структуры) фиксируется статически (то есть до начала выполнения программы), то ссылочные типы позволяют создавать и связывать объекты динамически (при исполнении программы, точнее, при исполнении ''генераторов''). Тем самым появляется возможность динамически создавать сколь угодно сложные конгломераты объектов. Генератор создает объект указанного (статически известного) типа и обеспечивает доступ к вновь созданному объекту через переменную соответствующего ссылочного типа. Передавая (присваивая) ссылки, можно организовать произвольные структуры. Важно, что и элементы, и связи в таких динамических структурах можно менять при исполнении программы.
=== Приватные типы ===
Доступ к ''приватным'' объектам (их называют также абстрактными объектами, а соответствуюшие типы — типы — абстрактными типами данных или ''атд'') находится под полным контролем автора приватного типа. Такой тип всегда определяется в некотором пакете (который называется ''определяющим'' пакетом для этого типа). Спецификация определяющего пакета фиксирует полный набор операций и тех ролей в этих операциях, в которых могут фигурировать объекты нового типа (в модулях, использующих определяющий пакет). В определяющем пакете фиксируется и реализация приватного типа, однако в использующих модулях она непосредственно недоступна — недоступна — только через явно перечисленные автором допустимые операции. Поэтому реализацию можно изменять, не заставляя переделывать использующие модули.
Концепция типа в Аде дополнена аппаратом ''подтипов'', (они ограничивают область значений, не затрагивая допустимых операций), а также аппаратом ''производных'' типов (они образуются из уже известных типов, наследуя связанные с ними значения и операции).
== Принципы объектно-ориентированного программирования ==
'''Определение'''. Объектно-ориентированное программирование — программирование — это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса, а классы образуют иерархию на принципах наследования.
Ключевыми отличиями ООП от других методологий программирования являются следующие отличия:
=== Абстрагирование ===
'''Определение'''. Абстракция — Абстракция — это такие существенные характеристики некоторого объекта, которые отличают его от всех других видов объектов, и, таким образом четко определяют особенности данного объекта с точки зрения дальнейшего рассмотрения и анализа.
Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяет отделить самые существенные особенности поведения от деталей их осуществления.
=== Инкапсуляция (ограничение доступа) ===
'''Определение'''. Ограничение доступа — доступа — это процесс защиты отдельных элементов объекта, не затрагивающий существенных характеристик объекта как целого.
Ограничение доступа позволяет вносить в программу изменения, сохраняя ее надежность и позволяя минимизировать затраты на этот процесс.
=== Иерархия ===
'''Определение'''. Иерархия в ОО — ОО — это ранжированная или упорядоченная иерархия абстракций.
Основными видами иерархических структур применительно к сложным системам являются структура классов (иерархия по номенклатуре) и структура объектов (иерархия по составу).
Примеры иерархий:
* Наследование означает такое соотношение между классами, когда один класс использует структурную или функциональную часть одного или нескольких других классов (соответственно простое или множественное наследование). Иными словами, наследование — наследование — такая иерархия абстракций, в которой подклассы наследуют строение от одного или нескольких суперклассов. (Иерархия обобщение — обобщение — специализация)
* Агрегирование (отношение по составу). Объект состоит из подобъектов.
Принципы абстрагирования, ограничения доступа и иерархии конкурируют между собой. Абстрагирование данных состоит в установлении жестких границ, защищающих состояние и функции объекта; принцип наследования требует открыть доступ и к состоянию, и к функциям объекта для производных классов. В связи с этим интерфейсная часть класса может быть разделена на три части:
* Обособленную (private)  — видимая только для самого класса* Защищенную (protected)  — видимую также и для подклассов* Общедоступную (public)  — видимую для всех
=== Полиморфизм ===
'''Определение'''. Полиморфизм — Полиморфизм — это способность операции (функции) с одним и тем же именем выполнять различные действия в зависимости от типа своих операндов.
Полиморфизм может быть статическим и динамическим:
* Статический — Статический — перекрытие операций (Ада, C++,Object Pascal).* Динамический — Динамический — механизм виртуальных функций
Виртуальные функции являются примером полиморфных функций. Виртуальная функция может быть переопределена в производном классе, следовательно ее реализация зависит от всей последовательности методических описаний и наследственной иерархии. Какая именно из виртуальных функций будет вызвана — вызвана — зависит от динамического типа объекта и определяется в момент обращения к виртуальной функции. Для этого используется таблица виртуальных функций, определенная для каждого класса.
=== Дополнительные возможности ОО языков ===
Некоторые языки позволяют определять несколько специальных методов класса:
* Конструктор — Конструктор — специальная процедура класса для создания и/или инициализации начального состояния объекта. В частности, конструктор может инициализировать таблицу виртуальных функций.* Деструктор — Деструктор — специальная процедура класса, которая делает состояние объекта неопределенным и (или) ликвидирует сам объект.
Некоторые преимущества ОО подхода:
Также см. [[rupedia:Экспертная система]].
Работы по созданию Экспертных систем (ЭС)  — первая попытка практического применения результатов в области Искусственного интеллекта (ИИ).
'''Определение'''. Экспертная система (ЭС)  — вычислительная система, в которой представлены знания специалистов в некоторой конкретной узкоспециализированной предметной области и которая в рамках этой области способна принимать решения (решать задачи) на уровне эксперта-профессионала.
Основные особенности ЭС:
Типичные задачи, решаемые с помощью ЭС:
* Интерпретация — Интерпретация — описание ситуации по информации, поступающей от датчиков (SPE — SPE — определение концентрации гамма-глобулина в крови).* Прогноз — Прогноз — определение вероятных последствий заданных ситуаций (PLANT/cd — cd — определения потерь урожая от черной совки).* Планирование — Планирование — определение последовательности действий (TATR — TATR — планирование авиаударов по аэродромам противника).* Диагностика — Диагностика — выявление причин неправильного функционирования системы (MYCIN — MYCIN — диагностика бактериальных инфекций).* Отладка — Отладка — составление рецептов исправления неправильного функционирования системы (ONCOCIN — ONCOCIN — планирования химиотерапевтического лечения).* Ремонт — Ремонт — выполнение последовательности предписанных исправлений (TQMSTUNE — TQMSTUNE — настройка масс-спектрометра).* Проектирование — Проектирование — построение конфигурации объектов при заданных ограничениях (XCON (R1)  — выбор оптимальной конфигурации аппаратных средств (VAX)).* Наблюдение — Наблюдение — сравнение результатов наблюдения с ожидаемыми результатами (VM — VM — наблюдение за состоянием больного в палате интенсивной терапии).* Обучение — Обучение — диагностика, отладка и ремонт поведения обучаемого (GUIDON — GUIDON — обучение студентов-медиков (антибактериальная терапия)).* Управление — Управление — управление поведением системы как целого.
Решатель ЭС:
* Вызов процедур (модулей / правил) по образцу -> гибкая схема взаимодействия (управления).
* Продукция — Продукция — правило вида p:a->b (где: p — p — предусловие, a — a — антецедент, b — b — консеквент).
Основной цикл работы:
Обнаружение ошибок в правилах:
* ПР01: использовать известь — известь — нет антецедента
* ПР02: утечка: соляная кислота -> использовать известь
* ПР03: соляная кислота -> использовать известь — известь — проверить: не совпадает ли предусловие с предусловием предыдущего правила
* П9: если некоторое правило никогда не срабатывает, проверить его предусловие
=== Объяснение в ЭС ===
Цель — Цель — обосновать, аргументировать ответ в максимально естественной форме.
Что объяснять?
Параллельная обработка. Если некое устройство выполняет одну операцию за единицу времени, то тысячу операций оно выполнит за тысячу единиц. Если предположить, что есть пять таких же независимых устройств, способных работать одновременно, то ту же тысячу операций система из пяти устройств может выполнить уже не за тысячу, а за двести единиц времени. Аналогично система из N устройств ту же работу выполнит за 1000/N единиц времени.
Идея конвейерной обработки заключается в выделении отдельных этапов выполнения общей операции, причем каждый этап, выполнив свою работу, передавал бы результат следующему, одновременно принимая новую порцию входных данных. Получаем очевидный выигрыш в скорости обработки за счет совмещения прежде разнесенных во времени операций. Предположим, что в операции можно выделить пять микроопераций, каждая из которых выполняется за одну единицу времени. Если есть одно неделимое последовательное устройство, то 100 пар аргументов оно обработает за 500 единиц. Если каждую микрооперацию выделить в отдельный этап (или иначе говорят - говорят — ступень) конвейерного устройства, то на пятой единице времени на разной стадии обработки такого устройства будут находится первые пять пар аргументов, а весь набор из ста пар будет обработан за 5+99=104 единицы времени - времени — ускорение по сравнению с последовательным устройством почти в пять раз (по числу ступеней конвейера).
Казалось бы, конвейерную обработку можно с успехом заменить обычным параллелизмом, для чего продублировать основное устройство столько раз, сколько ступеней конвейера предполагается выделить. В самом деле, пять устройств предыдущего примера обработают 100 пар аргументов за 100 единиц времени, что быстрее времени работы конвейерного устройства! В чем же дело? Ответ прост, увеличив в пять раз число устройств, мы значительно увеличиваем как объем аппаратуры, так и ее стоимость.
Cамой ранней и наиболее известной является классификация архитектур вычислительных систем, предложенная в 1966 году М.Флинном. Классификация базируется на понятии потока, под которым понимается последовательность элементов, команд или данных, обрабатываемая процессором. На основе числа потоков команд и потоков данных Флинн выделяет четыре класса архитектур: SISD, MISD, SIMD, MIMD.
* SISD (single instruction stream / single data stream) -  — одиночный поток команд и одиночный поток данных. К этому классу относятся, прежде всего, классические последовательные машины, или иначе, машины фон-неймановского типа, например, PDP-11 или VAX 11/780. В таких машинах есть только один поток команд, все команды обрабатываются последовательно друг за другом и каждая команда инициирует одну операцию с одним потоком данных. Не имеет значения тот факт, что для увеличения скорости обработки команд и скорости выполнения арифметических операций может применяться конвейерная обработка - обработка — как машина CDC 6600 со скалярными функциональными устройствами, так и CDC 7600 с 7600 с конвейерными попадают в этот класс.* SIMD (single instruction stream / multiple data stream) -  — одиночный поток команд и множественный поток данных. В архитектурах подобного рода сохраняется один поток команд, включающий, в отличие от предыдущего класса, векторные команды. Это позволяет выполнять одну арифметическую операцию сразу над многими данными - данными — элементами вектора. Способ выполнения векторных операций не оговаривается, поэтому обработка элементов вектора может производиться либо процессорной матрицей, как в ILLIAC IV, либо с помощью конвейера, как, например, в машине CRAY-1.* MISD (multiple instruction stream / single data stream) -  — множественный поток команд и одиночный поток данных. Определение подразумевает наличие в архитектуре многих процессоров, обрабатывающих один и тот же поток данных. Однако ни Флинн, ни другие специалисты в области архитектуры компьютеров до сих пор не смогли представить убедительный пример реально существующей вычислительной системы, построенной на данном принципе.* MIMD (multiple instruction stream / multiple data stream) -  — множественный поток команд и множественный поток данных. Этот класс предполагает, что в вычислительной системе есть несколько устройств обработки команд, объединенных в единый комплекс и работающих каждое со своим потоком команд и данных.
Предложенная схема классификации вплоть до настоящего времени является самой применяемой при начальной характеристике того или иного компьютера. Если говорится, что компьютер принадлежит классу SIMD или MIMD, то сразу становится понятным базовый принцип его работы, и в некоторых случаях этого бывает достаточно. Однако видны и явные недостатки. В частности, некоторые заслуживающие внимания архитектуры, например dataflow и векторно-конвейерные машины, четко не вписываются в данную классификацию. Другой недостаток - недостаток — это чрезмерная заполненность класса MIMD. Необходимо средство, более избирательно систематизирующее архитектуры, которые по Флинну попадают в один класс, но совершенно различны по числу процессоров, природе и топологии связи между ними, по способу организации памяти и, конечно же, по технологии программирования.
=== Массивно-параллельные системы (MPP) ===
* локальную память (прямой доступ к памяти других узлов невозможен),
* коммуникационный процессор или сетевой адаптер
* иногда - иногда — жесткие диски (как в SP) и/или другие устройства В/В
К системе могут быть добавлены специальные узлы ввода-вывода и управляющие узлы. Узлы связаны через некоторую коммуникационную среду (высокоскоростная сеть, коммутатор и ти т.п п.)
Общее число процессоров в реальных системах достигает нескольких тысяч (ASCI Red, Blue Mountain).
* На каждом узле работает полноценная UNIX-подобная ОС (вариант, близкий к кластерному подходу). Пример: IBM RS/6000 SP + ОС AIX, устанавливаемая отдельно на каждом узле.
Программирование в рамках модели передачи сообщений ( MPI, PVM, BSPlib)
Примеры: IBM RS/6000 SP2, Intel PARAGON/ASCI Red, SGI/CRAY T3E, Hitachi SR8000, транспьютерные системы Parsytec.
Система состоит из нескольких однородных процессоров и массива общей памяти (обычно из нескольких независимых блоков). Все процессоры имеют доступ к любой точке памяти с одинаковой скоростью. Процессоры подключены к памяти либо с помощью общей шины (базовые 2-4 процессорные SMP-сервера), либо с помощью crossbar-коммутатора (HP 9000). Аппаратно поддерживается когерентность кэшей.
Наличие общей памяти сильно упрощает взаимодействие процессоров между собой, однако накладывает сильные ограничения на их число - число — не более 32 в реальных системах. Для построения масштабируемых систем на базе SMP используются кластерные или NUMA-архитектуры.
Вся система работает под управлением единой ОС (обычно UNIX-подобной, но для Intel-платформ поддерживается Windows NT). ОС автоматически (в процессе работы) распределяет процессы/нити по процессорам (scheduling), но иногда возможна и явная привязка.
=== Системы с неоднородным доступом к памяти (NUMA) ===
Система состоит из однородных базовых модулей (плат), состоящих из небольшого числа процессоров и блока памяти. Модули объединены с помощью высокоскоростного коммутатора. Поддерживается единое адресное пространство, аппаратно поддерживается доступ к удаленной памяти, т.е. то есть к памяти других модулей. При этом доступ к локальной памяти в несколько раз быстрее, чем к удаленной. В случае, если аппаратно поддерживается когерентность кэшей во всей системе (обычно это так), говорят об архитектуре cc-NUMA (cache-coherent NUMA)
Масштабируемость NUMA-систем ограничивается объемом адресного пространства, возможностями аппаратуры поддежки когерентности кэшей и возможностями операционной системы по управлению большим числом процессоров. На настоящий момент, максимальное число процессоров в NUMA-системах составляет 256 (Origin2000).
Обычно вся система работает под управлением единой ОС, как в SMP. Но возможны также варианты динамического "подразделения" «подразделения» системы, когда отдельные "разделы" «разделы» системы работают под управлением разных ОС (например, Windows NT и UNIX в NUMA-Q 2000).
Программирование аналогично SMP.
Узлы кластера могут одновременно использоваться в качестве пользовательских рабочих станций. В случае, когда это не нужно, узлы могут быть существенно облегчены и/или установлены в стойку.
Используются стандартные для рабочих станций ОС, чаще всего, свободно распространяемые - распространяемые — Linux/FreeBSD, вместе со специальными средствами поддержки параллельного программирования и распределения нагрузки.
Программирование, как правило, в рамках модели передачи сообщений (чаще всего - всего — MPI). Дешевизна подобных систем оборачивается большими накладными расходами на взаимодействие параллельных процессов между собой, что сильно сужает потенциальный класс решаемых задач.
Примеры: NT-кластер в NCSA, Beowulf-кластеры.
IBM 709 (1958): независимые процессоры ввода/вывода.
Процессоры первых компьютеров сами управляли вводом/выводом. Однако скорость работы самого быстрого внешнего устройства, а по тем временам это магнитная лента, была в 1000 раз меньше скорости процессора, поэтому во время операций ввода/вывода процессор фактически простаивал. В 1958г1958 г. к компьютеру IBM 704 присоединили 6 независимых процессоров ввода/вывода, которые после получения команд могли работать параллельно с основным процессором, а сам компьютер переименовали в IBM 709. Данная модель получилась удивительно удачной, так как вместе с модификациями было продано около 400 экземпляров, причем последний был выключен в 1975 году - году — 20 лет существования!
IBM STRETCH (1961): опережающий просмотр вперед, расслоение памяти.
CDC 6600 (1964): независимые функциональные устройства.
Фирма Control Data Corporation (CDC) при непосредственном участии одного из ее основателей, Сеймура Р.Крэя (Seymour R.Cray) выпускает компьютер CDC-6600 - 6600 — первый компьютер, в котором использовалось несколько независимых функциональных устройств.
CDC 7600 (1969): конвейерные независимые функциональные устройства.
CDC выпускает компьютер CDC-7600 с 7600 с восемью независимыми конвейерными функциональными устройствами - устройствами — сочетание параллельной и конвейерной обработки.
ILLIAC IV (1974): матричные процессоры.
CRAY 1 (1976): векторно-конвейерные процессоры
В 1972 году С.Крэй покидает CDC и основывает свою компанию Cray Research, которая в 1976г1976 г. выпускает первый векторно-конвейерный компьютер CRAY-1: время такта 12.5нс, 12 конвейерных функциональных устройств, пиковая производительность 160 миллионов операций в секунду, оперативная память до 1Мслова (слово - слово — 64 разряда), цикл памяти 50нс. Главным новшеством является введение векторных команд, работающих с целыми массивами независимых данных и позволяющих эффективно использовать конвейерные функциональные устройства.
=== Конвейерность и параллелизм ===
Выполнение типичной команды можно разделить на следующие этапы:
* выборка команды - команды — IF (по адресу, заданному счетчиком команд, из памяти
* извлекается команда);
* декодирование команды / выборка операндов из регистров - регистров — ID;* выполнение операции / вычисление эффективного адреса памяти - памяти — EX;* обращение к памяти - памяти — MEM;* запоминание результата - результата — WB.
Чтобы конвейеризовать эту схему, мы можем просто разбить выполнение команд на указанные выше этапы, отведя для выполнения каждого этапа один такт синхронизации, и начинать в каждом такте выполнение новой команды.
== Технология работы в сети Интернет (браузеры, способы описания сайтов) ==
 
== Литература ==
 
* Кауфман В. Ш. Языки программирования. Концепции и принципы. М.: Радио и связь, 1993.
* Жоголев Е. А. Лекции по технологии программирования. -
: http://sp.cs.msu.su в разделе «Информация» или
: http://www.sp.cs.msu.su в разделе «Информация».
* Машечкин И. В., Петровский М. И., Скулачев П. Д., Терехин А. Н. Системное Программное Обеспечение: файловые системы ОС Unix и Windows NT (конспект лекций). — М.: Диалог-МГУ, 1997.
* Робачевский А. Операционная система UNIX. — СПб: BHV — Санкт-Петербург, 1997.
* Дейт К.Дж. Введение в системы баз данных. — М. *Киев: Диалектика, 1998.
* Интеллектуализация ЭВМ. — М.: Высшая школа, 1989.
* Смирнов А. Д. Архитектура вычислительных систем. — М.: Наука, 1990.
* Нильсен М. Знакомьтесь: World Wide Web. — Киев: BHV, 1996.
 
Утверждено на Совете факультета ВМиК МГУ 29 марта 2000 г.
[[Категория:Учёба]]