Всё для Учёбы — студенческий файлообменник
1 монета
doc

Студенческий документ № 020593 из ГЭИ

Институт информационных технологий

Программное обеспечение вычислительной техники и информационных систем

УТВЕРЖДЕНО

Ученым советом ИИТ

подпись Зуев А.Н. " " 2011 г.

ПРОГРАММА

ГОСУДАРСТВЕННОГО ЭКЗАМЕНА

Государственный экзамен (название государственного экзамена в соответствии с учебным планом) по специальности

230105.65 Программное обеспечение вычислительной техники и автоматизированных систем (код и наименование)

2012 ГОД

Программа разработана в соответствии с государственным образовательным стандартом высшего профессионального образования по направлению подготовки (специальности)

230105.65 Программное обеспечение вычислительной техники и автоматизированных систем (код и наименование)

Программа обсуждена на заседании кафедры

Программное обеспечение вычислительной техники и информационных систем (полное наименование кафедры) протокол № 1б от " 10 " октября 2011 г.

Составитель Ершов Евгений Валентинович (фамилия, имя, отчество) Д.т.н., профессор, зав. кафедрой ученая степень, ученое звание, должность

Заведующий кафедрой,

Д.т.н., профессор

Ершов Е.В. (подпись) (расшифровка подписи)

Программа рассмотрена на заседании Ученого совета

Института информационных технологий (полное наименование института (факультета)) протокол № от " " 2011 г.

Директор института Зуев А.Н. (подпись) (расшифровка подписи)

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

1. Основные задачи государственного экзамена

Определение соответствия знаний, умений и навыков студентов по комплексу общепрофессиональных, специальных дисциплин и дисциплин специализации требованиям государственного образовательного стандарта.

2. Содержание государственного экзамена

Комплекс общепрофессиональных, специальных дисциплин и дисциплин специализации:

- Компьютерная графика,

- Программирование на языке высокого уровня,

- Организация ЭВМ и систем,

- Операционные системы,

- Базы данных,

- Сети ЭВМ и телекоммуникации,

- Методы и средства защиты компьютерной информации,

- Системное программирование,

- Структуры и алгоритмы обработки данных,

- Функциональное и логическое программирование,

- Объектно-ориентированное программирование,

- Теория вычислительных процессов,

- Теория языков программирования и методы трансляции,

- Архитектура вычислительных систем,

- Технология разработки программного обеспечения,

- Человеко-машинное взаимодействие,

- Системы искусственного интеллекта,

- Проектирование информационных систем,

- Сетевая операционная система WINDOWS NT,

- Сетевая операционная система UNIX,

- Сетевая операционная система NETWARE,

- Программное обеспечение распределенных систем и сетей,

- Разработка корпоративного WEB-узла,

- Комплексные программные платформы.

3. Структура экзаменационного билета

Экзаменационный билет содержит три вопроса теоретического характера, одним из которых может быть практическое задание. Задания могут предполагать использование компьютера.

4. Требования к ответу на вопросы экзаменационного билета

На каждый вопрос экзаменационного билета должен быть дан полный, точный и обоснованный ответ, продемонстрировано уверенное владение терминологией и умение обосновывать принимаемые решения.

5. Критерии оценки ответа

Результат ответа студента оценивается по 5-ти балльной системе.

Оценка 5 (отлично) ставится, если студент полно и точно ответил на все вопросы.

Оценка 4 (хорошо) ставится, если студент полностью ответил на все вопросы, однако имелись некоторые неточности.

Оценка 3 (удовлетворительно) ставится, если студент не полностью ответил на все вопросы и имел некоторые неточности.

Оценка 2 (неудовлетворительно) ставится, если студент не ответил на один или более вопросов и не дал ответов на дополнительные вопросы.

ПРОГРАММА?

I. ОБЩЕПРОФЕССИОНАЛЬНЫЕ ДИСЦИПЛИНЫ

Раздел 1. Программирование на языке высокого уровня

1. Цели и принципы структурного и объектно-ориентированного программирования. Модульное программирование. Восходящий и нисходящий подход. Основные этапы разработки программ. Классификация языков программирования, сравнительная характеристика. Алфавит, синтаксис, семантика языков программирования.

Структурное программирование - методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков.

Цели структурного программирования:

1.повысить надежность программ; для этого нужно, чтобы программа легко поддавалась тестированию и не создавала проблем при отладке. Достигается это хорошим структурированием программы при ее проектировании;

2.повысить эффективность программ; она может быть достигнута при структурировании программы, при разбиении ее на модули так, чтобы можно было бы легко находить и корректировать ошибки, а также, чтобы текст любого модуля с целью повышения эффективности его работы можно было переделать независимо от других;

3) уменьшить время и стоимость программной разработки. Достижимо при повышении производительности труда программиста;

4) улучшить читабельность программ; это значит, что необходимо избегать использования языковых конструкций с неочевидной семантикой, стремиться к локализации действия управляющих конструкций и использования структур данных, разрабатывать программу так, чтобы ее можно было бы читать от начала до конца без управляющих переходов на другую страницу;

Основные принципы структурной методологии:

1. Принцип абстракции. Этот принцип предполагает рассмотрение всей программной систем, как многоуровневые системы. Каждый уровень является детализацией предыдущих.

2. Принцип формальностей. Каждая программа должна реализовывать некоторый алгоритм, который построен на определенной математической модели решения задач. Математическая модель содержит математические зависимости и формы, а также ограничения, накладываемые на исходные данные. При этом формулы предназначаются для преобразования исходных данных в результат.

3. Принцип "разделяй и властвуй". Определяет способ решения трудных задач путем разделения этой задачи на множество мелких, легко решаемых. Этот принцип реализуется путем создания подпрограмм.

4. Принцип модульности. Определяет способ создания больших программ, у которых возникают проблемы с оперативной памятью, вследствие их большого объема или большого объема обрабатываемых ими данных. Принцип модульности ускоряет создание больших программ за счет использования ранее созданных описаний.

5. Принцип открытости. Программы должны быть открытыми для быстрых модификаций, поэтому они должны быть понятны и хорошо откомментированы. Использование структурной методологии позволило повысить надежность и эффективность программ, а также сократить сроки создания и сопровождения программ.

Объектно-ориентированное программирование (ООП) определяется как технология создания сложного программного обеспечения, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного типа (класса), а классы образуют иерархию с наследованием свойств. Взаимодействие программных объектов в такой системе осуществляется путем передачи сообщений.

Объектно-ориентированная программа состоит из объектов, которые посылают друг другу сообщения. Каждый объект может состоять из других объектов (а может и не состоять). Каждый объект принадлежит определенному классу (типу), который задает поведение объектов, созданных на его основе. Класс - это описание объектов определенного типа. В каком-то смысле - это абстракция без материального воплощения, которая позволяет систематизировать объекты той или иной системы.

На основе классов создаются объекты. Может быть множество объектов, принадлежащих одному классу. С другой стороны, может быть класс без объектов, реализованных на его основе.

Основные принципы объектно-ориентированного программирования:

1. Абстрагирование подразумевает собой процесс изменения уровня детализации программы. Основная его роль - выделение существенных характеристик некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четкое определение его концептуальных границ с точки зрения наблюдателя.

2. Инкапсуляция есть объединение в едином объекте данных и кодов, оперирующих с этими данными. В терминологии объектно-ориентированного программирования данные называются членами данных (data members) объекта, а коды - объектными методами иди функциями-членами (methods, member functions)

3. Наследование состоит в процессе создания новых объектов (потомков) на основе уже имеющихся объектов (предков) с передачей их свойств и методов по наследству. Наследование позволяет модифицировать поведение объектов и придает объектно-ориентированному программированию исключительную гибкость.

4. Полиморфизм - это свойство родственных объектов (то есть тех объектов, классы которых являются производными от одного родителя) вести себя по-разному в зависимости от ситуации, возникающей в момент выполнения программы. Слово полиморфизм происходит от греческих слов poly (много) и morphos (форма) и означает множественность форм методов объектов.

Суть модульного программирования состоит в разбиении сложной задачи на некоторое число более простых подзадач и составлении программ для решения достаточно независимо друг от друга. Модульность является одним из основных принципов построения программных проектов. В общем случае модуль - отдельная функционально законченная программная единица, некоторым образом идентифицируемая и объединяемая с другими, средство определения логически связанной совокупности объектов, средство их выделения и изоляции.

Восходящий подход. При использовании восходящего подхода сначала проектируют и реализуют компоненты нижнего уровня, затем предыдущего и т.д. По мере завершения тестирования и отладки компонентов осуществляют их сборку, причем компоненты нижнего уровня при таком подходе часто помещают в библиотеки компонентов.

Для тестирования и отладки компонентов проектируют и реализуют специальные тестирующие программы.

Подход имеет следующие недостатки:

- увеличение вероятности несогласованности компонентов вследствие неполноты спецификаций;

- наличие издержек на проектирование и реализацию тестирующих программ, которые нельзя преобразовать в компоненты;

- позднее проектирование интерфейса, а соответственно невозможность продемонстрировать его заказчику для уточнения спецификаций и т.д.

Нисходящий подход. Нисходящий подход предполагает, что проектирование и последующая реализация компонентов выполняется "сверху-вниз", т.е. вначале проектируют компоненты верхних уровней иерархии, затем следующих и так далее до самых нижних уровней. В той же последовательности выполняют и реализацию компонентов. При этом в процессе программирования компоненты нижних, еще не реализованных уровней заменяют специально разработанными отладочными модулями - "заглушками", что позволяет тестировать и отлаживать уже реализованную часть.

Нисходящий подход обычно используют и при объектно-ориентированном программировании. В соответствии с рекомендациями подхода вначале проектируют и реализуют пользовательский интерфейс программного обеспечения, затем разрабатывают классы некоторых базовых объектов предметной области, а уже потом, используя эти объекты, проектируют и реализуют остальные компоненты.

Нисходящий подход обеспечивает:

- максимально полное определение спецификаций проектируемого компонента и согласованность компонентов между собой;

- раннее определение интерфейса пользователя, демонстрация которого заказчику позволяет уточнить требования к создаваемому программному обеспечению;

- возможность нисходящего тестирования и комплексной отладки.

Основные этапы разработки программ:

-Постановка задачи - техническое задание

-Анализ требований и разработка спецификаций - Эскизный проект

-Проектирование - Технический проект

-Реализация - Рабочий проект

-Внедрение

-Сопровождение

Языки программирования:

- процедурные

- функциональные

- логические

- объектно-ориентированные

Программа на процедурном языке программирования состоит из последовательности операторов (инструкций), задающих те или иные действия. Одним из важнейших квалификационных признаков процедурных языков является их уровень, характеризующий степень близости языка программирования и машинного языка. За начало отсчета уровней принимается машинный язык, уровень которого равен нулю. Язык человека рассматривается как язык наивысшего уровня.

Функциональные языки программирования. Программа на таком языке представляет собой совокупность описаний функций и выражения, которые необходимо вычислить. Оно вычисляется посредством редукции (т. е. серии упрощений). Функциональное программирование не использует концепцию памяти как хранилища значений переменных. Операторы присваивания отсутствуют, вследствие чего переменные обозначают не области памяти, а объекта программы, что полностью соответствует понятию переменной в математике. Наличие стройной математической основы обеспечивает возможность использования алгебраических методов создания структуры, преобразования и исследования программ. Это в какой-то мере приближает их к описанию структуры мышления человека.

Примером функционального языка является язык LISP (List Processing-обработка списков) Разработан и реализован в Массачусетском технологическом институте в 1959 г. Рассматривается специалистами как основной язык программирования систем искусственного интеллекта.

Логическое программирование. Логика и программирование долгое время были непересекающимися областями исследований. Только в 1973 впервые было опубликовано описание языка PROLOG (PROgramming in LOGic- программирование в терминах логики) Центральным понятием в логическом программировании является отношение. Программа представляет собой совокупность определений отношений между объектами и цели. В логическом программировании нужно только специфицировать факты, на которых алгоритм основывается, а не определять последовательность шагов, которые требуется выполнить. Логические программы отличаются принципиально низким быстродействием. Так как вычисления осуществляются методом проб и ошибок (посредством поиска с возвратами). В настоящее время для ПК существует около двух десятков реализации PROLOG'а, некоторые из которых оформлены в виде интегрированных сред.

Объектно-ориентированное программирование. Корни объектно - ориентирования уходят в одну из ветвей логики, в которой первичной является не отношение, а объект. Прототипом объектно-ориентированного программирования явился язык SIMULA-67. Но оформилось оно в самостоятельный стиль программ ирония с появлением языка (SMALLTALK-1972 г.), первоначально предназначенного для реализаций функций машинной графики. Этот стиль программирования характеризуется богатыми графическими возможностями и средой программирования, развитой модульной структурой программ. Именно модульность упрощает разработку сложных программных продуктов. Как пример объектно-ориентированного языка можно назвать Visual Basic и Delphi.

Алфавит - фиксированный для данного языка набор символов (букв, цифр, специальных знаков и т.д.), которые могут быть использованы при написании программы.

Синтаксис - правила построения из символов алфавита специальных конструкций, с помощью которых составляется алгоритм.

Семантика - система правил толкования конструкций языка. Таким образом, программа составляется с помощью соединения символов алфавита в соответствии с синтаксическими правилами и с учетом правил семантики.

2. Система типов данных языка высокого уровня: скалярные стандартные и пользовательские типы данных, тождественность и совместимость типов данных, строки, массивы, множества, записи (структуры, объединения), файлы, последовательный и прямой доступ к компонентам файлов.

Тип данных - характеристика множества значений, которые могут принимать переменные этого типа.

Традиционно, типы данных подразделяются на несколько подвидов:

а) логический - (boolean). Выражение логического типа может принимать всего два значения, соответствующие логической истине и логической лжи.

б) целочисленный - (integer). Переменные и выражения целочисленных типов предназначены для хранения числовой информации, если не требуются вычисления с использованием дробной части.

в) вещественный - (real). Данный тип применяется, если вычисления не могут быть выполнены без использования дробных значений. Значения вещественного типа возвращаются многими стандартными математическими функциями и операцией деления. Вещественные значения разделяются на разновидности согласно их точности и диапазону принимаемых значений. В памяти ЭВМ такие значения представлены в форме с плавающей точкой.

г) символьный - (char, string). Переменные строковых типов используются для хранения и обработки текстовой информации. Переменная типа char содержит одиночный символ, типа string - последовательность символов. Константы символьного типа бывают двух разновидностей, первая из которых подразумевает использование символа, вторая - кода символа.

Тождественность и совместимость типов:

Два типа, скажем T1 и T2, являются тождественными, если является истинным одно из следующих утверждений: T1 и T2 представляют собой один и тот же идентификатор типа; T1 описан как эквивалентный типу, тождественному T2.

Совместимость типов имеет место, если выполняется, по крайней мере, одно из следующих условий:

• Оба типа являются одинаковыми.

• Оба типа являются вещественными типами.

• Оба типа являются целочисленными.

• Один тип является поддиапазоном другого.

• Оба типа являются отрезками одного и того же основного типа.

• Оба типа являются множественными типами с совместимыми базовыми типами.

• Один тип является строковым типом, а другой - строковым типом, упакованным строковым типом или типом PChar;

• Один тип - это тип Pointer, а другой - любой ссылочный тип.

• Оба типа являются процедурными с идентичными типами результатов, одинаковым числом параметров и соответствием между параметрами.

Пользовательские типы данных:

перечисляемый тип (перем1, перем2, .. , перемN), диапазон (конс1 .. конс2)

Одномерный массив - ограниченная последовательность однотипных ячеек, каждая из которых адресуется по номеру (индексу). Синтаксис объявления массивов в языке Pascal следующий:

: array [, ..] of Integer;

Часто при передаче большого объёма разнородной (разнотипной) информации бывает удобно создавать группы значений. Такие группы называются структурами или записями (Record). Запись включает в себя одно или несколько полей, каждое из которых может иметь свой тип. В отличие от массивов, поля записи различаются не индексами, а идентификаторами.

Общий синтаксис объявления переменной типа запись:

Record :; :;

... :; Case [имя параметра]: of

: (); ... : ();

End;

Диапазон значений множественного типа представляет собой мощность множества для определенного порядкового типа (базового типа). Синтаксис: Set of . Для множеств применимы операции пересечение (*), объединение (+), разность (-).

Файлы: Файловая переменная в Паскале - это любая переменная файлового типа. В Паскале имеются три класса файлов: типизированный файл (file of тип), текстовый файл (text) и нетипизированный файл (file). Основные операции по работе с файлами приведены в таблице.

По способу доступа к компонентам различают файлы последовательного и прямого доступа.

Файлом последовательного доступа называется файл, к компонентам которого обеспечивается доступ только после просмотра всех предшествующих компонентов. Для поиска нужного компонента в таком файле необходимо последовательно при помощи указателя перебирать все компоненты файла, начиная с нулевого до требуемого компонента. При использовании файла последовательного доступа нельзя одновременно читать данные из файла и записывать данные в этот же файл. Примером таких файлов являются текстовые файлы.

Файлом прямого доступа называется файл, доступ к компонентам которого осуществляется по адресу компонента. При поиске нужного компонента в таком файле достаточно указать номер его позиции. Примерами файлов прямого доступа могут быть типизированные и нетипизированные файлы.

3. Динамический тип данных, линейные динамические структуры данных: стек, очередь, списки; нелинейные динамические структуры данных: мультисписки, деревья.

Имя переменной является ее своеобразным (буквенным) адресом. Однако у любой переменной есть также и обычный (цифровой или физический) адрес: номер ячейки, выделенной под эту переменную. Для того чтобы хранить (цифровые) адреса, нужны особые переменные. Их называют указателями и относят к специальному типу данных. При описании типизированного указателя необходимо сообщить компилятору, адреса переменных какого типа он может хранить:

var : ^;

Кроме того, существуют универсальные нетипизированные указатели, которые могут хранить адрес переменной любого типа:

var : pointer; Значением переменной-указателя является или nil (то есть пустое значение), или адрес значения, указывающий на динамическую переменную. Ссылка на динамическую переменную, на которую указывает переменная-указатель, записывается в виде переменной-указателя, после которой ставится символ указателя (^). Динамические переменные и значения их указателей создаются с помощью стандартных процедур New и GetMem. Вы можете использовать операцию @ и стандартную функцию Ptr для создания значений указателя, которые рассматриваются как указатели динамических переменных.

Рассматриваемые ниже структуры, по сути, являются различными видами списков. Они применяются, например, в таких ситуациях:

• программист заранее ничего не знает о том, какой именно объем памяти может потребоваться его программе;

• некоторые (особенно "тяжелые") переменные нужны поочередно, и после того как первые "отработали свое", их можно смело стирать из памяти, не дожидаясь конца работы программы, - освобождать место для других "тяжелых" переменных;

• в процессе обработки данных нужно провести большую работу по перестройке всей структуры "на ходу"; и т.д.

Однонапраленний список - элементы содержат указатель на следующий по порядку элемент.

Двунаправленный список - элементы содержат указатели на предыдущий и последующий элементы.

Дерево - элементы содержат указатели, число которых равно максимальному числу потомков для любого узла дерева (для бинарного - две ссылки)

Мультисписок. В программных системах, обрабатывающих объекты сложной структуры, могут решаться разные подзадачи, каждая из которых требует, возможно, обработки не всего множества объектов, а лишь какого-то его подмножества. Для того, чтобы при выборке каждого подмножества не выполнять полный просмотр с отсеиванием записей, к требуемому подмножеству не относящихся, в каждую запись включаются дополнительные поля ссылок, каждое из которых связывает в линейный список элементы соответствующего подмножества. В результате получается многосвязный список или мультисписок, каждый элемент которого может входить одновременно в несколько односвязных списков.

Иерархический список - представляет собой набор "вложенных" списков. В этом случае вершины списка первого уровня содержат помимо указателей следующего элемента, еще и указатель на первый элемент вложенного списка. Типы списков могут как совпадать, так и различаться. Примером может служить реализация для представления графа списка смежности: в одном линейном списке содержатся номера "начальных вершин", а в остальных - номера смежных вершин или указатели на эти вершины

4. Процедуры и функции: описание, вызов, передача параметров, программирование рекурсивных алгоритмов.

Функции объявляются следующим образом

function имя_функции [(список_параметров)]тип_результата;

В отличие от констант и переменных, объявление подпрограммы может быть оторвано от ее описания. В этом случае после объявления нужно указать ключевое слово forward function имя_функции

[(параметры)]тип_результата; forward;

Процедуры следует объявлять так procedure имя_процедуры [(список_параметров)];

Если объявление процедуры оторвано от ее описания, нужно поставить после него ключевое слово forward

procedure имя_процедуры [(список_параметров)]; forward;

В заголовке подпрограммы (в ее объявлении) указывается список формальных параметров переменных, которые принимают значения, передаваемые в подпрограмму извне во время ее вызова.

При вызове в подпрограмму передаются фактические параметры или аргументы (в круглых скобках после имени подпрограммы, разделенные запятыми)

имя_подпрограммы(список_аргументов)

Аргументами могут быть переменные, константы и выражения, включающие в себя вызовы функций. Аргументы могут передавться тремя типами

• [пусто]. Параметр передается по значению т.е. создается копия переменной основной программы.

• [var]. Параметр-переменная. Работа в подпрограмме идет напрямую с переменной основной программы.

• [const]. Неизменяемый параметр.

Глобальные объекты - это типы данных, константы и переменные, объявленные в начале программы до объявления любых подпрограмм. Эти объекты будут видны во всей программе, в том числе и во всех ее подпрограммах. Глобальные объекты существуют на протяжении всего времени работы программы.

Локальные объекты объявляются внутри какой-нибудь подпрограммы и видны только этой подпрограмме и тем подпрограммам, которые были объявлены как внутренние для нее. Локальные объекты не существуют, пока не вызвана подпрограмма, в которой они объявлены, а также после завершения ее работы. Если имеются глобальная и локальная переменные с одинаковым именем, то изнутри подпрограммы к глобальной переменной можно обратиться, приписав к ней спереди имя программы

имя_программы.имя_глобальной переменной

Процедурный тип данных. Имена подпрограмм могут выступать в роли аргументов для других подпрограмм.

Описание В разделе type процедурный тип данных задается одним из следующих способов

имя_типа = function[(список_параметров)]тип_результата;

или имя_типа = procedure[(список_параметров)];

Например type func = function(a,binteger)integer;

В программировании рекурсивной называется подпрограмма, исполнение которой приводит к ее же повторному вызову.

Если подпрограмма просто вызывает сама себя, то такая рекурсия называется прямой.

Если же несколько подпрограмм вызывают друг друга, но эти вызовы замкнуты в кольцо, то такая рекурсия называется косвенной.

В момент вызова подпрограммы в памяти создается ее контекст выделяется место под все ее параметры, локальные переменные и константы. Уничтожается этот контекст только после того, как будет достигнут оператор end, закрывающий подпрограмму, либо в ее тексте встретится оператор exit, насильственно прерывающий ее выполнение.

Следовательно, каждая рекурсивная подпрограмма должна содержать в себе признак окончания - своеобразный забор, определяющий максимальную глубину вложенности для этой рекурсии. Признак конца рекурсии может быть как явным (например, в случае реализации факториала), так и неявным.

Каждая переменная имеет тип и принадлежит к некоторому классу памяти. Время жизни и область действия идентификатора определяются ассоциированным с ним классом памяти. Существуют четыре разновидности классов памяти (С++)

auto - автоматический - локальные идентификаторы, память для которых выделяется при входе в блок, т.е. составной оператор, и освобождается при выходе из блока. Слово auto является сокращением слова automatic.

static - статический - локальные идентификаторы, существующие в процессе всех выполнений блока. В отличие от идентификаторов типа auto, для идентификаторов типа static память выделяется только один раз - в начале выполнения программы, и они существуют, пока программа выполняется.

extern - внешний - идентификаторы, называемые внешними, external, используются для связи между функциями, в том числе независимо скомпилированными функциями, которые могут находиться в различных файлах. Память, ассоциированная с этими идентификаторами, является постоянной, однако ее содержимое может меняться. Эти идентификаторы описываются вне функции.

register - регистровый - идентификаторы, подобные идентификаторам типа auto. Их значения, если это возможно, должны помещаться в регистрах машины для обеспечения быстрого доступа к данным.

5. Основы доказательства правильности программ: метод математической индукции, принципы простой и модифицированной индукции, доказательство правильности схем программ, метод индуктивных утверждений.

Математическая индукция представляет собой некоторый общий способ доказательства в математике. Он, хотя об этом не всегда явно говорят, положен в основу всех приемов доказательства правильности программ для вычислительных машин.

Принцип простой индукции:

Пусть S(N) - некоторое высказывание о целом числе N и требуется доказать, что S(N) справедливо для всех положительных чисел N.

Согласно простой математической индукции, для этого необходимо

1. Доказать, что справедливо высказывание S(1).

2. Доказать, что если для любого положительного числа N справедливо высказывание S(N), то справедливо и высказывание S(N + 1).

Принцип модифицированной простой индукции:

Иногда необходимо доказать, что высказывание S(N) справедливо для всех целых N>N0. Для этого можно довольно легко модифицировать принцип простой индукции. Чтобы доказать, что высказывание S(N) справедливо для всех целых N, необходимо:

1. Доказать, что справедливо S(N0)

2. Доказать, что если S(N) справедливо для всех целых N>N0, то справедливо и S(N+ 1).

Простая нисходящая индукция:

1. Доказать, что справедливо S (п0)

2. Доказать, что если справедливо S (п), то для любых целых n0 0 и операцию умножения использовать нельзя. Для этого можно использовать операцию сложения и вычислить сумму из M слагаемых (каждое равно N). В результате получим M • N. Рассмотрим блок-схему, реализующую такое вычисление. Нужно доказать, что приведенная программа правильно вычисляет произведение двух любых це-лых чисел M и N при условии M>0, т. е. если программа выполняется с целы-ми числами M и N, где M>0, то она в конце концов окончится (достигнув точ-ки 5) со значением J=M*N.

Попробуем доказать это методом индукции по N - числу проходов через точку 2.

1. При первом попадании (N = 1) в точку 2 (сюда мы приходим из точки 7) имеем I = 0 и J=0. Утверждение J = I*N = 0*N = 0, таким образом, справедливо.

2. Предположим, что J = I*N справедливо при N-ом попадании в точку 2. Нужно показать, что если мы попадем в точку 2 в N+1-й раз, то утверждение J=I*N опять будет справедливо. Пусть I и J при N-ом проходе через точку 2 принимают значения IN и JN. Тогда гипотеза индукции есть JN=IN*N. Единственный способ вновь попасть в точку 2 - выполнить тело цикла (точнее, пройти "по петле"), пройдя через точки 3, 4 и возвратясь опять в точку 2. Если это именно так, то, однажды проследив выполнение тела цикла, мы видим, что при возвращении в точку 2 новое значение I равно предыдущему значению плюс 1, а новое значение J - предыдущему значению плюс N.

Следовательно, если мы вновь попадем в точку 2 в п N+1-й раз, то J = I*N. Доказательство по индукции на этом заканчивается, и мы видим, что при любом попадании в точку 2 справедливо утверждение J = I • N.

Докажем с помощью восходящей индукции по M - переменной, удовлетворяющей условию 0 1/2, то - в позицию (1,1). Для принятия решения, куда заносить очередной пиксел, вводится величина отклонения Е точной позиции от середины между двумя возможными растровыми точками в направлении наименьшей относительной координаты. Знак Е используется как критерий для выбора ближайшей растровой точки.

Если Е 0 коэффициент растяжения вдоль оси ох,b>0 коэффициент растяжения вдоль оси оy,c>0 коэффициент растяжения вдоль оси оz

Виды проектирования. При расчетах в трехмерном пространстве для отображения построенного объекта требуется выполнить операцию проецирования на плоскость. Существует множество видов проецирования. Всех их можно разделить на два основных класса центральное и параллельное.

Для получения проекции объекта на плоскость требуется провести прямую через каждую точку объекта и определить координаты пересечения этих прямых с плоскостью проекции. В случае параллельного проецирования все прямые должны быть параллельны. При центральном проецировании все прямые выходят из одной точки - центра. Параллельное проецирование можно рассматривать как частный случай центрального (центр удален от плоскости проецирования на бесконечность).

Рисунок 8

9. Трехмерная графика: алгоритмы отсечения нелицевых граней, ограничивающие тела, разбиение пространства, удаление невидимых линий алгоритмом Робертса, количественная невидимость, алгоритм Аппеля, удаление невидимых граней методом Z- буффера, метод трассировки лучей, алгоритмы упорядочивания граней методом художника, методы двоичного разбиения пространства, алгоритм Варнока, специальные методы оптимизации, метод порталов, потенциально видимые множества граней.

Удаление невидимых линий и поверхностей. Сложность задачи удаления невидимых линий и поверхностей привела к появлению большого числа различных способов ее решения, различных алгоритмов, но наилучшего решения поставленной задачи не существует. Главным недостатком всех алгоритмов является значительный объем вычислений, необходимых для определения удаляемых линий и поверхностей.

В начале реализации любого алгоритма удаления невидимых линий и поверхностей для повышения эффективности его работы обычно проводится сортировка координат объектов синтезируемой сцены. Основная идея сортировки заключается в том, что, чем дальше расположен объект от точки визирования, тем больше вероятность того, что он будет полностью или частично экранироваться одним из объектов, более близких к точке наблюдения.

Алгоритмы удаления невидимых линий и поверхностей классифицируются по способу выбора систем координат или пространства, в котором они работают.

Первый класс - это алгоритмы, работаюшие в объектном пространстве, имеющие дело с физической системой координат (мировые координаты), в которой они описаны.

Второй класс алгоритмов работает в пространстве изображения и имеет дело с системой координат того устройства, на котором эти объекты синтезируются.

Алгоритмы первого класса используются в тех случаях, когда требуется высокая точность изображения объектов. Синтезируемые в этом случае изображения можно свободно увеличивать (уменьшать) во много раз, сдвигать или поворачивать. Точность вычислений алгоритмов второго класса ограничивается разрешающей способностью экрана. Результаты, полученные в пространстве изображения, а затем увеличенные (уменьшенные) во много раз, не будут соответствовать исходной сцене.

Наиболее часто используются алгоритмы Робертса, Аппеля, Варнока, Вейлера-Азертона, алгоритм, использующий список приоритетов (упорядочений), метод Z-буфера, метод построчного сканирования.

На практике, сравнительный анализ существующих алгоритмов удаления невидимых линий крайне затруднителен. В различных случаях при работе с различными моделями синтезируемого пространства эффективны различные алгоритмы. Даже при работе с одной и той же моделью оказывается, что в зависимости от точки наблюдения следует использовать различные алгоритмы.

Отсечение нелицевых граней. Рассмотрим задачу удаления невидимых линий для многогранника. Несложно заметить, что если вектор нормали грани составляет с вектором, задающим направление наблюдения, тупой угол, то эта грань заведомо не может быть видна. Тупой угол или нет, определяется знаком скалярного произведения векторов. В случае, когда сцена представляет собой один выпуклый многогранник, удаление нелицевых граней полностью решает проблему удаления невидимых линий (в общем случае позволяет значительно сократить кол-во рассматриваемых граней).

Алгоритм Робертса. Самым первым алгоритмом, предназначенным для удаления невидимых линий был алгоритм Робертса. Сначала в нем отбрасываются все ребра, обе определяющие грани которых являются нелицевыми. Следующим шагом является проверка оставшихся ребер со всеми гранями многогранника на закрывание. Возможны следующие случаи :

грань не закрывает ребро;

грань полностью закрывает ребро;

грань частично закрывает ребро (в этом случае ребро разбивается на несколько частей, из к-рых видимыми являются не более двух).

Алгоритм Аппеля. Этот алгоритм основан на понятии количественной невидимости точки, как кол-ва лицевых граней, ее закрывающих. Точка является видимой только в том случае, если ее количественная невидимость = 0.

Метод Z-буфера. Одним из самых простых алгоритмов удаления невидимых граней и поверхностей является метод Z-буфера (буфера глубины). В силу крайней простоты этого метода (OpenGL) часто встречаются его аппаратные реализации. Сопоставим каждому пикселу (x, y) картинной плоскости его расстояние вдоль напрвления проектирования z(x, y) - его глубину. Изначально массив глубин инициализирутся бесконечностью. Для вывода на картинную плоскость произвольной грани она переводится в свое растровое представление и для каждого пиксела этой грани находится его глубина. В случае, если эта глубина меньше значения глубины, хранящегося в Z-буфере, то этот пиксел рисуется и его глубина заносится в Z-буфер.

При реализации всех обсуждавшихся алгоритмов удаления невидимых линий и поверхностей устанавливались приоритеты, т. е. глубины объектов сцены или их расстояния от точки наблюдения. Алгоритмы, использующие список приоритетов, пытаются получить преимущество посредством предварительной сортировки по глубине или приоритету. Цель такой сортировки состоит в том, чтобы получить окончательный список элементов сцены, упорядоченных по приоритету глубины, основанному на расстоянии от точки наблюдения. Если такой список окончателен, то никакие два элемента не будут взаимно перекрывать друг друга. Тогда можно записать все элементы в буфер кадра поочередно, начиная с элемента, наиболее удаленного от точки наблюдения. Более близкие к наблюдателю элементы будут затирать информацию о более далеких элементах в буфере кадра. Поэтому задача об удалении невидимых поверхностей решается тривиально. Эффекты прозрачности можно включить в состав алгоритма путем не полной, а частичной корректировки содержимого буфера кадра с учетом атрибутов прозрачных элементов. Для простых элементов сцены, например для многоугольников, этот метод иногда называют алгоритмом художника, поскольку он аналогичен тому способу, которым художник создает картину. Сначала художник рисует фон, затем предметы, лежащие на среднем расстоянии, и, наконец, передний план. Тем самым художник решает задачу об удалении невидимых поверхностей, или задачу видимости, путем построения картины в порядке обратного приоритета.

Основные идеи, на которые опирается алгоритм Варнока, обладают большой общностью. Они основываются на гипотезе о способе обработки информации, содержащейся в сцене, глазом и мозгом человека. Эта гипотеза заключается в том, что тратится очень мало времени и усилий на обработку тех областей, которые содержат мало информации. Большая часть времени и труда затрачивается на области с высоким информационным содержимым. В каждом случае, по мере сужения сферы интереса, возрастает уровень требуемой детализации. Далее, если на определенном уровне детализации на конкретный вопрос нельзя ответить немедленно, то он откладывается на время для последующего рассмотрения. В алгоритме Варнока и его вариантах делается попытка извлечь преимущество из того факта, что большие области изображения однородны, например поверхность стола в приведенном выше примере. Такое свойство известно как когерентность, т. е. смежные области (пиксели) вдоль обеих осей х и у имеют тенденцию к однородности. Поскольку алгоритм Варнока нацелен на обработку картинки, он работает в пространстве изображения. В пространстве изображения рассматривается окно и решается вопрос о том, пусто ли оно, или его содержимое достаточно просто для визуализации. Если это не так, то окно разбивается на фрагменты до тех пор, пока содержимое подокна не станет достаточно простым для визуализации или его размер не достигнет требуемого предела разрешения. В последнем случае информация, содержащаяся в окне, усредняется, и результат изображается с одинаковой интенсивностью или цветом. Устранение лестничного эффекта можно реализовать, доведя процесс разбиения до размеров, меньших, чем разрешение экрана на один пиксель, и усредняя атрибуты подпикселей, чтобы определить атрибуты самих пикселей.

Метод трассировки лучей - это фотореалистический метод визуализации или рендеринга (rendering), в котором изображение генерируется путем моделирования отражения лучей света в 3D сцене. В реальном мире лучи света исходят из одного или многих источников света и отражаются от объектов пока, в конце концов, не достигнут глаз. При компьютерном моделировании часто более эффективным является распространение лучей от глаза наблюдателя, чем от источников света. Это позволяет сохранить значительное количество времени за счет исключения отслеживания путей лучей идущих до поверхностей, которые не видны наблюдателю. Такой подход используется и в методе трассировки лучей. Лучи света трассируются от глаз наблюдателя (позиции камеры) через каждый пиксель (pixel) видового экрана. Трассировка луча включает проверку всех объектов в сцене на пересечение с этим лучом (объекты моделируются как совокупности поверхностей (граней), которые могут быть ограничены треугольниками, прямоугольниками, или более сложными фигурами, типа 3-D сплайнов. Для таких начальных лучей должно быть определено ближайшее пересечение вдоль каждого луча. После определения видимости рассчитываются освещенность и закраска видимых объектов для каждого пикселя на пути следования лучей. При выполнении расчетов принимаются во внимание положение, цвет и яркость световых источников, включая рассеянное освещение. Цвет поверхности складывается из трех компонентов рассеянного (ambient), локального (local), и глобального (global) освещения. Учитываются также оптические свойства различных поверхностей: цвет (colour), степень отражения (reflectance), прозрачность (transmitance), рассеяние света (refraction), текстура (texture), так как это будет влиять на цвет и яркость луча. Метод трассировки лучей в особенности применим для решения задач, которые требуют реалистического представления отражающих и прозрачных материалов, таких как металл и стекло.

Порталы. Этот метод создан для так называемых indoor environments - т.е. для замкнутого пространства. Суть его в том, что вся сцена разбивается на комнаты. Комнаты связаны между собой полигонами, которые называются порталами. Для отрисовки сцены нам надо отрисовать сначала комнату, в которой находится камера, если камера "видит" какой-то портал, то аналогично рисуем комнату, которую видно через этот портал, отсекая ее по проекции полигона-портала.

BSP - деревья. Метод BSP - деревьев (Binary Space Partitioning Tree) - метод двоичного разбиения пространства. Для начала, нам надо построить двоичное дерево. В качестве главного узла в двоичном дереве берется произвольный полигон. Плоскость, в которой он лежит, делит пространство на два полупространства, в каждом полупространстве берутся следующие произвольные полигоны - это будут следующие узлы дерева; если часть вершин полигона после разбивки лежит в одном полупространстве, а часть - в другом, то он разбивается на 2 полигона. Дерево строится, пока остаются незадействованные в сортировке полигоны.

10. Элементы виртуальной реальности: физические и психологические факторы, учитываемые при создании реалистичных изображений, простая модель освещения, методы закрашивания Гуро, Фонга, расчет освещенности сцен, текстурирование поверхностей, общий метод и частные случаи, пирамидальное фильтрование, прикладное использование трехмерной машинной графики и реалистических изображений.

Построение реалистических изображений включает как физические, так и психологические процессы. Свет, т. е. электромагнитная энергия, после взаимодействия с окружающей средой попадает в глаз, где в результате физических и химических реакций вырабатываются электроимпульсы, воспринимаемые мозгом. Восприятие - это приобретаемое свойство.

Человеческий глаз - очень сложная система. Он имеет почти сферическую форму с диаметром около 20 мм. Воспринимаемый свет с помощью гибкого хрусталика фокусируется на сетчатке глаза, в которой есть два типа рецепторов: колбочки и палочки. В центре задней полусферы глаза собрано 6-7 млн. колбочек, чувствительных только к сравнительно высоким уровням освещенности, причем каждая из них присоединена к отдельному нерву. Колбочки позволяют различать мелкие детали. В сетчатке также находится 75-150 млн. палочек, чувствительных к очень низким уровням освещенности. К одному нерву присоединено сразу несколько палочек, поэтому они не способны различать мелкие детали. Интересно, что цвет воспринимается только колбочками, т. е. при низкой освещенности, когда колбочки теряют свою чувствительность, предметы кажутся черно-белыми.

Интенсивность зеркально отраженного света зависит от угла падения, длины волны падающего света и свойств вещества. Основное уравнение Френеля приводится в любой книге по геометрической оптике. Зеркальное отражение света является направленным. Угол отражения от идеальной отражающей поверхности (зеркала) равен углу падения, в любом другом положении наблюдатель не видит зеркально отраженный свет. Это означает, что вектор наблюдения S совпадает с вектором отражения R. Если поверхность не идеальна, то количество света, достигающее наблюдателя, зависит от пространственного распределения зеркально отраженного света. У гладких поверхностей распределение узкое или сфокусированное, у шероховатых - более широкое.

В простых моделях освещения обычно пользуются эмпирической моделью Буи-Туонга Фонга , так как физические свойства зеркального отражения очень сложны.

Методом Гуро можно получить сглаженное изображение. Для того чтобы изобразить объект методом построчного сканирования, нужно в соответствии с моделью освещения рассчитать интенсивность каждого пиксела вдоль сканирующей строки. Нормали к поверхности аппроксимируются в вершинах многоугольников. Однако сканирующая строка не обязательно проходит через вершины многоугольника. При закраске Гуро сначала определяется интенсивность вершин многоугольника, а затем с помощью билинейной интерполяции вычисляется интенсивность каждого пиксела на сканирующей строке.

Хотя метод Фонга устраняет большинство недостатков метода Гуро, он тоже основывается на линейной интерполяции. Поэтому в местах разрыва первой производной интенсивности заметен эффект полос Маха, хотя и не такой сильный, как при закраске Гуро. Однако, иногда этот эффект проявляется сильнее у метода Фонга, например для сфер. Кроме того, оба метода могут привести к ошибкам при изображении невыпуклых многоугольников. Первая сканирующая строка использует данные из вершин QRS, а вторая, лежащая ниже, берет также данные вершины Р. Это может нарушить непрерывность закраски.

Наложение текстур - наиболее трудоемкий и сложный этап ЗD-конвейера, который сопровождается появлением многочисленных дефектов на изображении. Именно на этом этапе используется большая часть разнообразного арсенала аппаратных средств ЗD-акселератора, предназначенного для коррекции изображения.

Для создания реалистичной картины при рендеринге близко расположенных и удаленных частей сцены необходимо использовать различное разрешение. Большинство поклонников первых трехмерных игр хорошо помнят характерный недостаток: гладкая на расстоянии, стена или дверь при приближении искажается за счет эффекта пикселизации, превращаясь в набор цветных квадратов. Причина проста: в этих играх для рендеринга удаленных и близких поверхностей используются текстуры с одинаковым, низким разрешением.

Увеличение размеров объекта при приближении к нему сопровождается масштабированием растровой картинки текстуры. В результате проявляется хорошо известный всем эффект - пикселизация (лестничный эффект). Пути решения проблемы оптимального использования текстур очевидны: при изменении расстояния до объекта необходимо оперативно изменять разрешение накладываемых текстур. Для этого в ЗD-акселераторе используется технология, называемая мип-мэппингом (MIP-mapping) или М/Р-текстурированием. Суть ее состоит в том, что в локальной памяти акселератора хранятся несколько вариантов одной и той же текстуры, но с разным разрешением, или уровнем детализации (LOD - Level OfDetalization). Размер каждой текстуры следующего уровня в 4 раза больше размера предыдущей. Совокупность всех вариантов одной и той же текстуры называют MIP-каскадом.

В последнее время трехмерная машинная графика широко используется в различных областях мировой компьютерной индустрии. Так например, компьютерные игры используют самые последние достижения из области 3D-технологий. Кроме того, широкое применение 3D-графика нашла в области создания различных компьютерных тренажеров-симуляторов (автосимуляторы, авиасимуляторы и пр.) Очень распространено использование реалистичных сцен в киноиндустрии: при создании спецэффектов широко используются возможности компьютерной графики.

Раздел 3. Организация ЭВМ и систем

11. Архитектура ЭВМ, периферийные устройства, организация ввода-вывода информации.

Вопросы организации ввода/вывода в вычислительной системе иногда оказываются вне внимания потребителей. Это привело к тому, что при оценке производительности системы часто используются только оценки производительности процессора, а оценкой системы ввода/вывода пренебрегают. Такое отношение к системам ввода/вывода, как к некоторым не очень важным понятиям, проистекает также из термина "периферия", который применяется к устройствам ввода/вывода.

Однако это противоречит здравому смыслу. Компьютер без устройств ввода/вывода - как автомобиль без колес - на таком автомобиле далеко не уедешь. Очевидно одной из наиболее правильных оценок производительности системы является время ответа (время между моментом ввода пользователем задания и получения им результата), которое учитывает все накладные расходы, связанные с выполнением задания в системе, включая ввод/вывод.

Кроме того, важность системы ввода/вывода определяется еще и тем, что быстрое увеличение производительности процессоров настолько изменило принципы классификации компьютеров, что именно по организации ввода/вывода мы можем как-то грубо их отличать: разница между мейнфреймом и миникомпьютером заключается в том, что мейнфрейм может поддерживать намного больше терминалов и дисков; разница между миникомпьютером и рабочей станцией заключается в том, что рабочая станция имеет экран, клавиатуру и мышь; разница между файл-сервером и рабочей станцией заключается в том, что файл-сервер имеет диски и ленточные устройства, а экран, клавиатура и мышь отсутствуют; разница между рабочей станцией и персональным компьютером заключается лишь в том, что рабочие станции всегда соединены друг с другом с помощью локальной сети.

Как правило периферийные устройства компьютеров делятся на устройства ввода, устройства вывода и внешние запоминающие устройства (осуществляющие как ввод данных в машину, так и вывод данных из компьютера). Основной обобщающей характеристикой устройств ввода/вывода может служить скорость передачи данных (максимальная скорость, с которой данные могут передаваться между устройством ввода/вывода и основной памятью или процессором). На рис. 9.3. представлены основные устройства ввода/вывода, применяемые в современных компьютерах, а также указаны примерные скорости обмена данными, обеспечиваемые этими устройствами.

Дисковые накопители. Дисковый накопитель обычно состоит из набора пластин, представляющих собой металлические диски, покрытые магнитным материалом и соединенные между собой при помощи центрального шпинделя. Для записи данных используются обе поверхности пластины. В современных дисковых накопителях используется от 4 до 9 пластин. Шпиндель вращается с высокой постоянной скоростью (обычно 3600, 5400 или 7200 оборотов в минуту). Каждая пластина содержит набор концентрических записываемых дорожек. Обычно дорожки делятся на блоки данных объемом 512 байт, иногда называемые секторами. Количество блоков, записываемых на одну дорожку зависит от физических размеров пластины и плотности записи.

Данные записываются или считываются с пластин с помощью головок записи/считывания, по одной на каждую поверхность. Линейный двигатель представляет собой электро-механическое устройство, которое позиционирует головку над заданной дорожкой. Обычно головки крепятся на кронштейнах, которые приводятся в движение каретками. Цилиндр - это набор дорожек, соответствующих одному положению каретки. Накопитель на магнитных дисках (НМД) представляет собой набор пластин, магнитных головок, кареток, линейных двигателей плюс воздухонепроницаемый корпус. Дисковым устройством называется НМД с относящимися к нему электронными схемами.

В состав компьютеров часто входят специальные устройства, называемые дисковыми контроллерами. К каждому дисковому контроллеру может подключаться несколько дисковых накопителей. Между дисковым контроллером и основной памятью может быть целая иерархия контроллеров и магистралей данных, сложность которой определяется главным образом стоимостью компьютера. Поскольку время передачи часто составляет очень небольшую часть общего времени доступа к диску, контроллер в высокопроизводительной системе разъединяет магистрали данных от диска на время позиционирования так, что другие диски, подсоединенные к контроллеру, могут передавать свои данные в основную память. Поэтому время доступа к диску может увеличиваться на время, связанное с накладными расходами контроллера на организацию операции ввода/вывода.

Варианты применения высокопроизводительных подсистем ввода/вывода широко варьируются в зависимости от требований, которые к ним предъявляются. Они охватывают диапазон от обработки малого числа больших массивов данных, которые необходимо реализовать с минимальной задержкой (ввод/вывод суперкомпьютера), до большого числа простых заданий, которые оперируют с малыми объемами данных (обработка транзакций).

Запросы на ввод/вывод заданной рабочей нагрузки можно характеризовать в терминах трех метрик: производительность, время ожидания и пропускная способность. Производительность определяется числом запросов на обслуживание, получаемых в единицу времени. Время ожидания определяет время, необходимое на обслуживание индивидуального запроса. Пропускная способность определяет количество данных, передаваемых между устройствами, требующими обслуживания, и устройствами, выполняющими обслуживание.

Ввод/вывод суперкомпьютера почти полностью определяется последовательным механизмом. Обычно данные передаются с диска в память большими блоками, а результаты записываются обратно на диск. В таких применениях требуется высокая пропускная способность и минимальное время ожидания, однако они характеризуются низкой производительностью. В отличие от этого обработка транзакций характеризуется огромным числом случайных обращений, относительно небольшими отрезками работы и требует умеренного времени ожидания при очень высокой производительности.

Другим направлением развития систем хранения информации являются магнитооптические диски. Запись на магнитооптические диски (МО-диски) выполняется при взаимодействии лазера и магнитной головки. Луч лазера разогревает до точки Кюри (температуры потери материалом магнитных свойств) микроскопическую область записывающего слоя, которая при выходе из зоны действия лазера остывает, фиксируя магнитное поле, наведенное магнитной головкой. В результате данные, записанные на диск, не боятся сильных магнитных полей и колебаний температуры. Все функциональные свойства дисков сохраняются в диапазоне температур от -20 до +50 градусов Цельсия.

МО-диски уступают обычным жестким магнитным дискам лишь по времени доступа к данным. Предельное достигнутое МО-дисками время доступа составляет 19 мс. Магнитооптический принцип записи требует предварительного стирания данных перед записью, и соответственно, дополнительного оборота МО-диска. Однако завершенные недавно исследования в SONY и IBM показали, что это ограничение можно устранить, а плотность записи на МО-дисках можно увеличить в несколько раз. Во всех других отношениях МО-диски превосходят жесткие магнитные диски.

12. Системы ЭВМ: вычислительные системы и сети, сопроцессоры, мультипроцессорные вычислительные системы, матричные и конвейерные вычислительные системы, связные устройства, модемы, протоколы обмена.

На рис. показана блок-схема ВС (вычислительной сети). В верней части блок-схемы показано ОЗУ, разделенное на отдельные блоки. Каждый блок имеет свое местное устройство управления оперативной памяти. Нумерация страниц в ОЗУ и быстрой ВЗУ делается сквозной. Обмен между ОЗУ и быстрой ВЗУ (МД) происходит сравнительно большими объемами информации достаточно быстро и оперативно. Программирование упрощается, так как пользователю дают весь объем памяти (ОЗУ + МД) для прямой поячеечной адресации. Такие адреса носят названия виртуальных. Физическими адресами данных являются только адреса ОЗУ. В первом блоке ОЗУ размещена резидентная часть ОС (часть блоков ОС которые часто используются). Под системой коммутации располагаются процессоры: центральный процессор (ЦП) и периферийные процессоры ввода-вывода (ППВВ), выполняющие функции обмена между ОЗУ и периферийными устройствами. Простейшие ППВВ, по терминологии для отечественных ЭВМ, также называют каналами. Левый канал подключен к ВЗУ. Поскольку скорость передачи данных высокая и, следовательно, время обмена короткое, канал поддерживает связь ОЗУ с выбранным ВЗУ все время, пока не закончится обмен. Поэтому этот канал называется селекторным, то есть канал выбирает устройство на все время обмена. К правому каналу подключены более медленные периферийные устройства ввода вывода (УВВ). Чтобы полностью использовать пропускную способность канала, его снабжают своим быстродействующим ЗУ и системой переключения с одного УВВ на другое. Этот канал работает в 2 такта: во-первых, он накапливает данные из УВВ в ячейках памяти, закрепленных за этим УВВ, переключаясь, по мере готовности передать или принять данные, с одного УВВ на другое, а во-вторых, обменивается более крупными порциями данных между своим буферным ЗУ и ОЗУ. Этот тип канала за способность к быстрому переключению получил название мультиплексного. Для стандартизации подключения всех ВЗУ и УВВ к магистралям, идущим от каналов к устройствам, все электрические параметры этих магистралей стандартизированы. Этот стандарт называется главным интерфейсом ВС.

Интерфейс - это стандарт на сопряжение информационных блоков, определяющий число линий в этом сопряжении, назначение каждой линии, тип передаваемой по каждой линии информации и направление передачи, кодировку информации, передаваемой по линиям, все электрические и временные параметры сигналов и конструктивы соединения (разъемы). Устройство, согласующее главный интерфейс и интерфейс устройства называется адаптером. В некоторых случаях адаптер получается достаточно сложным и в тоже время может использоваться в каждый момент времени только с одним устройством, например одним диском из нескольких имеющихся в селекторном канале. Такое устройство, совмещающее функции адаптера и мультиплексора, называется контроллером (К1 и К2 на рис.)

Математический сопроцессор предназначен для расширения вычислительных возможностей центрального процессора - выполнения арифметических, тригонометрических, экспоненциальных и логарифмических операций. Применение сопроцессора повышает производительность вычислений в сотни раз. С программной точки зрения сопроцессор и процессор выглядят как единое целое. Физически сопроцессор может быть отдельной микросхемой (387-й), подключаемой к локальной шине основного процессора, или располагаться прямо на кристалле центрального процессора (486+). В любом случае сопроцессор исполняет только свои специфические команды, а всю работу по декодированию инструкций и доставке данных осуществляет CPU. Сопроцессор может выполнять вычисления параллельно с работой центрального процессора, не обращая внимание и на переключение задач в защищенном режиме. Сопроцессор может работать в реальном и защищенном режиме.

Конвейерная и векторная обработка. Основу конвейерной обработки составляет раздельное выполнение некоторой операции в несколько этапов (за несколько ступеней) с передачей данных одного этапа следующему. Производительность при этом возрастает благодаря тому, что одновременно на различных ступенях конвейера выполняются несколько операций. Конвейеризация эффективна только тогда, когда загрузка конвейера близка к полной, а скорость подачи новых операндов соответствует максимальной производительности конвейера. Если происходит задержка, то параллельно будет выполняться меньше операций и суммарная производительность снизится. Векторные операции обеспечивают идеальную возможность полной загрузки вычислительного конвейера.

При выполнении векторной команды одна и та же операция применяется ко всем элементам вектора (или чаще всего к соответствующим элементам пары векторов). Для настройки конвейера на выполнение конкретной операции может потребоваться некоторое установочное время, однако затем операнды могут поступать в конвейер с максимальной скоростью, допускаемой возможностями памяти. При этом не возникает пауз ни в связи с выборкой новой команды, ни в связи с определением ветви вычислений при условном переходе. Таким образом, главный принцип вычислений на векторной машине состоит в выполнении некоторой элементарной операции или комбинации из нескольких элементарных операций, которые должны повторно применяться к некоторому блоку данных. Таким операциям в исходной программе соответствуют небольшие компактные циклы.

Матричная обработка. Машины типа SIMD. Машины типа SIMD состоят из большого числа идентичных процессорных элементов, имеющих собственную память. Все процессорные элементы в такой машине выполняют одну и ту же программу. Очевидно, что такая машина, составленная из большого числа процессоров, может обеспечить очень высокую производительность только на тех задачах, при решении которых все процессоры могут делать одну и ту же работу. Модель вычислений для машины SIMD очень похожа на модель вычислений для векторного процессора: одиночная операция выполняется над большим блоком данных.

В отличие от ограниченного конвейерного функционирования векторного процессора, матричный процессор (синоним для большинства SIMD-машин) может быть значительно более гибким. Обрабатывающие элементы таких процессоров - это универсальные программируемые ЭВМ, так что задача, решаемая параллельно, может быть достаточно сложной и содержать ветвления. Обычное проявление этой вычислительной модели в исходной программе примерно такое же, как и в случае векторных операций: циклы на элементах массива, в которых значения, вырабатываемые на одной итерации цикла, не используются на другой итерации цикла.

Модели вычислений на векторных и матричных ЭВМ настолько схожи, что эти ЭВМ часто обсуждаются как эквивалентные.

Машины типа MIMD. Термин "мультипроцессор" покрывает большинство машин типа MIMD и (подобно тому, как термин "матричный процессор" применяется к машинам типа SIMD) часто используется в качестве синонима для машин типа MIMD. В мультипроцессорной системе каждый процессорный элемент (ПЭ) выполняет свою программу достаточно независимо от других процессорных элементов. Процессорные элементы, конечно, должны как-то связываться друг с другом, что делает необходимым более подробную классификацию машин типа MIMD. В мультипроцессорах с общей памятью (сильносвязанных мультипроцессорах) имеется память данных и команд, доступная всем ПЭ. С общей памятью ПЭ связываются с помощью общей шины или сети обмена. В противоположность этому варианту в слабосвязанных многопроцессорных системах (машинах с локальной памятью) вся память делится между процессорными элементами и каждый блок памяти доступен только связанному с ним процессору. Сеть обмена связывает процессорные элементы друг с другом.

Базовой моделью вычислений на MIMD-мультипроцессоре является совокупность независимых процессов, эпизодически обращающихся к разделяемым данным. Существует большое количество вариантов этой модели. На одном конце спектра - модель распределенных вычислений, в которой программа делится на довольно большое число параллельных задач, состоящих из множества подпрограмм. На другом конце спектра - модель потоковых вычислений, в которых каждая операция в программе может рассматриваться как отдельный процесс. Такая операция ждет своих входных данных (операндов), которые должны быть переданы ей другими процессами. По их получении операция выполняется, и полученное значение передается тем процессам, которые в нем нуждаются. В потоковых моделях вычислений с большим и средним уровнем гранулярности, процессы содержат большое число операций и выполняются в потоковой манере.

Многопроцессорные машины с SIMD-процессорами. Многие современные супер-ЭВМ представляют собой многопроцессорные системы, в которых в качестве процессоров используются векторные процессоры или процессоры типа SIMD. Такие машины относятся к машинам класса MSIMD.

Связь между процессорами. Одной из отличительных особенностей многопроцессорной вычислительной системы является сеть обмена, с помощью которой процессоры соединяются друг с другом или с памятью. Существуют две основные модели межпроцессорного обмена: одна основана на передаче сообщений, другая - на использовании общей памяти. В многопроцессорной системе с общей памятью один процессор осуществляет запись в конкретную ячейку, а другой процессор производит считывание из этой ячейки памяти. Чтобы обеспечить согласованность данных и синхронизацию процессов, обмен часто реализуется по принципу взаимно исключающего доступа к общей памяти методом "почтового ящика".

В архитектурах с локальной памятью непосредственное разделение памяти невозможно. Вместо этого процессоры получают доступ к совместно используемым данным посредством передачи сообщений по сети обмена. Эффективность схемы коммуникаций зависит от протоколов обмена, основных сетей обмена и пропускной способности памяти и каналов обмена.

В сетях с коммутацией каналов и в сетях с коммутацией пакетов по мере возрастания требований к обмену следует учитывать возможность перегрузки сети. Здесь межпроцессорный обмен связывает сетевые ресурсы: каналы, процессоры, буферы сообщений. Объем передаваемой информации может быть сокращен за счет тщательной функциональной декомпозиции задачи и тщательного диспетчирования выполняемых функций.

Как уже было отмечено, любая крупномасштабная многопроцессорная система должна использовать множество устройств памяти, которые физически распределяются вместе с процессорами. Имеется две альтернативных организации адресации этих устройств памяти и связанных с этим два альтернативных метода для передачи данных между процессорами. Физически отдельные устройства памяти могут адресоваться как логически единое адресное пространство, что означает, что любой процессор может выполнять обращения к любым ячейкам памяти, предполагая, что он имеет соответствующие права доступа. Такие машины называются машинами с распределенной разделяемой (общей) памятью (DSM - distributed shared memory).

В альтернативном случае, адресное пространство состоит из отдельных адресных пространств, которые логически не связаны, и доступ к которым не может быть осуществлен аппаратно другим процессором. В таком примере каждый модуль процессор-память представляет собой отдельный компьютер, поэтому такие системы называются многомашинными (multicomputers).

С каждой из этих организаций адресного пространства связан свой механизм обмена. Для машины с единым адресным пространством это адресное пространство может быть использовано для обмена данными посредством операций загрузки и записи. Поэтому эти машины и получили название машин с разделяемой (общей) памятью. Для машин с множеством адресных пространств обмен данными должен использовать другой механизм: передачу сообщений между процессорами; поэтому эти машины часто называют машинами с передачей сообщений.

Каждый из этих механизмов обмена имеет свои преимущества. Для обмена в общей памяти это включает:

• Совместимость с хорошо понятными используемыми как в однопроцессорных, так и маломасштабных многопроцессорных системах, механизмами, которые используют для обмена общую память.

• Простота программирования, когда модели обмена между процессорами сложные или динамически меняются во время выполнения. Подобные преимущества упрощают конструирование компилятора.

• Более низкая задержка обмена и лучшее использование полосы пропускания при обмене малыми порциями данных.

• Возможность использования аппаратно управляемого кэширования для снижения частоты удаленного обмена, допускающая кэширование всех данных как разделяемых, так и неразделяемых.

Основные преимущества обмена с помощью передачи сообщений являются:

• Аппаратура может быть более простой, особенно по сравнению с моделью разделяемой памяти, которая поддерживает масштабируемую когерентность кэш-памяти.

• Модели обмена понятны, принуждают программистов (или компиляторы) уделять внимание обмену, который обычно имеет высокую, связанную с ним стоимость.

При оценке любого механизма обмена критичными являются три характеристики производительности:

• Полоса пропускания: в идеале полоса пропускания механизма обмена будет ограничена полосами пропускания процессора, памяти и системы межсоединений, а не какими-либо аспектами механизма обмена. Связанные с механизмом обмена накладные расходы (например, длина межпроцессорной связи) прямо воздействуют на полосу пропускания.

• Задержка: в идеале задержка должна быть настолько мала, насколько это возможно. Для ее определения критичны накладные расходы аппаратуры и программного обеспечения, связанные с инициированием и завершением обмена.

• Упрятывание задержки: насколько хорошо механизм скрывает задержку путем перекрытия обмена с вычислениями или с другими обменами.

Каждый из этих параметров производительности воздействует на характеристики обмена. В частности, задержка и полоса пропускания могут меняться в зависимости от размера элемента данных. В общем случае, механизм, который одинаково хорошо работает как с небольшими, так и с большими объемами данных будет более гибким и эффективным.

Модем предназначен для передачи сигнала по "выделенной" линии на большие расстояния. Информация передается в двоичной последовательной форме.

Прием: определяют середину интервала и на ней берут значение - получают сигнал.

При передаче на большие расстояния (1 км) накладываются внешние помехи и сопротивление кабеля. На большие расстояния лучше передавать высокочастотные сигналы.

f1, f2 - частоты.

Источник (модулятор): 1 преобразовал в f1.

Приемние (демодулятор): f1 преобразовал в 1.

Недостатки: при расхождении частоты на 5% генератор практически не работает. Если в модемах расхождение на 1-2%, большая вероятность ошибок.

Преимущество: можно связать абсолютно разные объекты, и при этом не нужно никаких специализированных линий (только телефонная).

Установка соединеия между модемами: модемы договариваются между собой о взаимно одинаковых частотах.

При передаче сигнала используются различные алгоритмы против воздействия помех. Например: избыточное кодирование (5 + 1 бит на четность).

Для повышения скорости передачи информации вводят кодирование пар бит: 00, 01, 10, 11 вместо 0, 1 . В этом случае скорость передачи возрастает в 2 раза.

13. Организация памяти ЭВМ: Иерархия ЗУ. Понятие основной памяти. Блочная организация основной памяти. Расслоение памяти. ОЗУ (принцип действия, область применения, классификация). ПЗУ (принцип действия, область применения, классификация). Стековая память. Ассоциативная память. Кэш-память. Способы отображения основной памяти на кэш-память. Внешняя память (область применения, основные характеристики, принцип действия, основные виды ВЗУ).

По форме записанной информации запоминающие устройства (ЗУ) делятся на:

аналоговые и

цифровые запоминающие устройства.

По устойчивости записи и возможности перезаписи ЗУ делятся на:

Постоянные (ПЗУ), содержание которых не может быть изменено конечным пользователем (например, BIOS). ПЗУ в рабочем режиме допускает только считывание информации.

Записываемые (ППЗУ), в которые конечный пользователь может записать информацию только один раз (например, CD-R).

Многократно перезаписываемые (ПППЗУ) (например, CD-RW).

Оперативные (ОЗУ) - обеспечивают режим записи, хранения и считывания информации в процессе её обработки. Быстрые, но дорогие ОЗУ (SRAM) строят на триггерах, более медленные, но более дешёвые разновидности ОЗУ - динамические ЗУ (DRAM) строят на элементах состоящих из ёмкости (конденсатора) и полевого транзистора, используемого в качестве ключа разрешения записи-чтения. В обоих видах ЗУ информация исчезает после отключения от источника питания (например, тока).

По типу доступа:

С последовательным доступом (например, магнитные ленты).

С произвольным доступом (RAM; например, оперативная память).

С прямым доступом (например, жёсткие диски).

С ассоциативным доступом (специальные устройства, для повышения производительности баз данных).

По геометрическому исполнению:

дисковые (магнитные диски, оптические, магнитооптические);

ленточные (магнитные ленты, перфоленты);

барабанные (магнитные барабаны);

карточные (магнитные карты, перфокарты, флэш-карты, и др.)

печатные платы (карты DRAM, картриджи).

По физическому принципу:

перфорационные (с отверстиями или вырезами)

перфокарта

перфолента

с магнитной записью

магнитные сердечники (пластины, стержни, кольца, биаксы)

магнитные диски

Жёсткий магнитный диск

Гибкий магнитный диск

магнитные ленты

магнитные карты

оптические

CD DVD

HD-DVD Blu-ray Disc

магнитооптические:

CD-MO использующие накопление электростатического заряда в диэлектриках (конденсаторные ЗУ, запоминающие электроннолучевые трубки);

использующие эффекты в полупроводниках (EEPROM, флэш-память)

звуковые и ультразвуковые (линии задержки);

использующие сверхпроводимость (криогенные элементы);

другие. По количеству устойчивых (распознаваемых) состояний одного элемента памяти:

двоичные

троичные

десятичныеОЗУ - техническое устройство, реализующее функции оперативной памяти. ОЗУ большинства современных компьютеров представляет собой модули динамической памяти, содержащие полупроводниковые ИС ЗУ, организованные по принципу устройств с произвольным доступом. Память динамического типа дешевле, чем статического, и её плотность выше, что позволяет на том же пространстве кремниевой подложки размещать больше ячеек памяти, но при этом её быстродействие ниже. Статическая, наоборот, более быстрая память, но она и дороже. В связи с этим массовую оперативную память строят на модулях динамической памяти, а память статического типа используется для построения кеш-памяти внутри микропроцессора.

(ПЗУ) - энергонезависимая память, используется для хранения массива неизменяемых данных. По разновидностям микросхем ПЗУ

По технологии изготовления кристалла:

ROM - (англ. read-only memory, постоянное запоминающее устройство), масочное ПЗУ, изготавливается фабричным методом. В дальнейшем нет возможности изменить записанные данные.

PROM - (англ. programmable read-only memory, программируемое ПЗУ (ППЗУ)) - ПЗУ, однократно "прошиваемое" пользователем.

EPROM - (англ. erasable programmable read-only memory, перепрограммируемое ПЗУ (ПППЗУ)). Например, содержимое микросхемы К537РФ1 стиралось при помощи ультрафиолетовой лампы. Для прохождения ультрафиолетовых лучей к кристаллу в корпусе микросхемы было предусмотрено окошко с кварцевым стеклом.

EEPROM - (англ. electrically erasable programmable read-only memory, электрически стираемое перепрограммируемое ПЗУ). Память такого типа может стираться и заполняться данными несколько десятков тысяч раз. Используется в твердотельных накопителях. Одной из разновидностей EEPROM является флеш-память (англ. flash memory).

ПЗУ на магнитных доменах, например К1602РЦ5, имело сложное устройство выборки и хранило довольно большой объём данных в виде намагниченных областей кристалла, при этом не имея движущихся частей (см. Компьютерная память). Обеспечивалось неограниченное количество циклов перезаписи.

NVRAM, non-volatile memory - "неразрушающаяся" память, строго говоря, не является ПЗУ. Это ОЗУ небольшого объёма, конструктивно совмещённое с батарейкой. В СССР такие устройства часто назывались "Dallas" по имени фирмы, выпустившей их на рынок. В NVRAM современных ЭВМ батарейка уже конструктивно не связана с ОЗУ и может быть заменена.

По виду доступа:

С параллельным доступом (parallel mode или random access): такое ПЗУ может быть доступно в системе в адресном пространстве ОЗУ. Например, К573РФ5;

С последовательным доступом: такие ПЗУ часто используются для однократной загрузки констант или прошивки в процессор или ПЛИС, используются для хранения настроек каналов телевизора, и др. Например, 93С46, AT17LV512A.

По способу программирования микросхем (записи в них прошивки):

Непрограммируемые ПЗУ;

ПЗУ, программируемые только с помощью специального устройства - программатора ПЗУ (как однократно, так и многократно прошиваемые). Использование программатора необходимо, в частности, для подачи нестандартных и относительно высоких напряжений (до +/- 27 В) на специальные выводы.

Внутрисхемно (пере)программируемые ПЗУ (ISP, in-system programming) - такие микросхемы имеют внутри генератор всех необходимых высоких напряжений, и могут быть перепрошиты без программатора и даже без выпайки из печатной платы, программным способом.

Применение

В постоянную память часто записывают микропрограмму управления техническим устройством: телевизором, сотовым телефоном, различными контроллерами, или компьютером (BIOS или OpenBoot на машинах SPARC).

BootROM - прошивка, такая, что если её записать в подходящую микросхему ПЗУ, установленную в сетевой карте, то становится возможна загрузка операционной системы на компьютер с удалённого узла локальной сети. Для встроенных в ЭВМ сетевых плат BootROM можно активировать через BIOS.

Ассоциативная память (АП) или Ассоциативное запоминающее устройство (АЗУ) является особым видом машинной памяти, используемой в приложениях очень быстрого поиска. Известна также как память, адресуемая по содержимому, ассоциативное запоминающее устройство, контентно-адресуемая память или ассоциативный массив

Адресуемая содержанием память часто используется в компьютерных сетевых устройствах. Например, когда сетевой коммутатор (switch) получает фрейм данных на один из его портов, это обновляет внутреннюю таблицу с источником MAC-адреса фрейма и порта, на который он был получен. Потом он ищет MAC-адрес назначения в таблице, чтобы определить, на какой порт фрейм должен быть отправлен, и отсылает его на этот порт. Таблица MAC- адресов обычно реализована на двоичной АП, таким образом порт назначения может быть найден очень быстро, уменьшая время ожидания коммутатора.

Кэш- промежуточный буфер с быстрым доступом, содержащий информацию, которая может быть запрошена с наибольшей вероятностью. Доступ к данным в кэше идёт быстрее, чем выборка исходных данных из оперативной (ОЗУ) и быстрее внешней (жёсткий диск или твердотельный накопитель) памяти, за счёт чего уменьшается среднее время доступа и увеличивается общая производительность компьютерной системы. Когда клиент кэша (ЦПУ, веб-браузер, операционная система) обращается к данным, прежде всего исследуется кэш. Если в кэше найдена запись с идентификатором, совпадающим с идентификатором затребованного элемента данных, то используются элементы данных в кэше. Такой случай называется попаданием кэша. Если в кэше не найдена запись, содержащая затребованный элемент данных, то он читается из основной памяти в кэш, и становится доступным для последующих обращений. Такой случай называется промахом кэша. Процент обращений к кэшу, когда в нём найден результат, называется уровнем попаданий или коэффициентом попаданий в кэш.

Раздел 4. Операционные системы

14. Понятие процесса: параллельные и псевдопараллельные процессы, диаграмма состояний процесса; взаимодействие процессов: синхронизация, взаимоисключение, взаимоблокировка, коммуникация между процессами; реализация мультипрограммирования: прерывания, механизмы реализации, супервизор, системные и пользовательские процессы.

Процессом называется выполняемое приложение, обладающее собственной памятью, описателями файлов и другими системными ресурсами. Потоком называется код, исполняемый внутри процесса. Процесс может иметь как один поток, так и множество параллельно выполняющихся потоков. Все пространство кода и данных процесса доступно всем его потокам. Несколько потоков могут обращаться к одним и тем же глобальным переменным или функциям. Потоками управляет операционная система, и у каждого потока есть свой собственный стек.

Параллельными называются процессы, у которых "интервалы времени выполнения перекрываются за счет использования разных ресурсов одной и той же вычислительной системы или за счет перераспределения одного и того же набора ресурсов" Псевдопараллельное выполнение процессов предполагает периодическую приостановку текущего процесса и его последующее возобновление. Для этого нужно уметь сохранять часть данных из PCB, которые обычно называют контекстом процесса, а операцию по сохранению данных одного процесса и восстановлению данных другого называют переключением контекстов.

Процесс характеризуется контекстом и дескриптором. Состояние регистров и программного счетчика, режим работы процессора, указатели на открытые файлы, информация о незавершенных операциях ввода-вывода и т.д - это контекст процесса. Идентификатор процесса, состояние процесса, данные о степени привилегированности процесса, место нахождения кодового сегмента и др. инф-я - дескриптор процесса.

В многозадачной (многопроцессной) системе процесс может находиться в одном из трех основных состояний:

• выполнение - активное состояние процесса, во время которого процесс обладает всеми необходимыми ресурсами и непосредственно выполняется процессором;

• ожидание - пассивное состояние процесса, процесс заблокирован, он не может выполняться по своим внутренним причинам, он ждет осуществления некоторого события, например, освобождения какого-либо необходимого ему ресурса;

• готовность - также пассивное состояние процесса, но в этом случае процесс заблокирован в связи с внешними по отношению к нему обстоятельствами: процесс имеет все требуемые для него ресурсы, он готов выполняться, однако процессор занят выполнением другого процесса. Граф состояний процесса показан на рисунке.

Алгоритмы планирования процессов

Планирование процессов включает в себя решение следующих задач:

1. определение момента времени для смены выполняемого процесса;

2. выбор процесса на выполнение из очереди готовых процессов;

3. переключение контекстов "старого" и "нового" процессов.

Основные алгоритмы: алгоритмы, основанные на квантовании, и алгоритмы, основанные на приоритетах.

В соответствии с алгоритмами, основанными на квантовании, смена активного процесса происходит, если:

• процесс завершился и покинул систему,

• произошла ошибка,

• процесс перешел в состояние ОЖИДАНИЕ,

• исчерпан квант процессорного времени, отведенный данному процессу.

Другая группа алгоритмов использует понятие "приоритет" процесса. Приоритет - это число, характеризующее степень привилегированности процесса при использовании ресурсов вычислительной машины, в частности, процессорного времени: чем выше приоритет, тем выше привилегии. Чем выше привилегии процесса, тем меньше времени он будет проводить в очередях. Приоритет может назначаться директивно администратором системы в зависимости от важности работы или внесенной платы, либо вычисляться самой ОС по определенным правилам, он может оставаться фиксированным на протяжении всей жизни процесса либо изменяться во времени в соответствии с некоторым законом. В последнем случае приоритеты называются динамическими.

Во многих операционных системах алгоритмы планирования построены с использованием как квантования, так и приоритетов процессов.

Вытесняющие и невытесняющие алгоритмы планирования

Существует два основных типа процедур планирования процессов - вытесняющие (preemptive) и невытесняющие (non-preemptive).

Non-preemptive multitasking - невытесняющая многозадачность - это способ планирования процессов, при котором активный процесс выполняется до тех пор, пока он сам, по собственной инициативе, не отдаст управление планировщику операционной системы для того, чтобы тот выбрал из очереди другой, готовый к выполнению процесс.

Preemptive multitasking - вытесняющая многозадачность - это такой способ, при котором решение о переключении процессора с выполнения одного процесса на выполнение другого процесса принимается планировщиком операционной системы, а не самой активной задачей.

Средства синхронизации и взаимодействия процессов

Проблема синхронизации

Процессам часто нужно взаимодействовать друг с другом, например, один процесс может передавать данные другому процессу, или несколько процессов могут обрабатывать данные из общего файла. Во всех этих случаях возникает проблема синхронизации процессов, которая может решаться приостановкой и активизацией процессов, организацией очередей, блокированием и освобождением ресурсов.

Критическая секция

Критическая секция - это часть программы, в которой осуществляется доступ к разделяемым данным. Чтобы исключить эффект гонок по отношению к некоторому ресурсу, необходимо обеспечить, чтобы в каждый момент в критической секции, связанной с этим ресурсом, находился максимум один процесс. Этот прием называют взаимным исключением.

Простейший способ обеспечить взаимное исключение - позволить процессу, находящемуся в критической секции, запрещать все прерывания. Однако этот способ непригоден, так как опасно доверять управление системой пользовательскому процессу; он может надолго занять процессор, а при крахе процесса в критической области крах потерпит вся система, потому что прерывания никогда не будут разрешены.

Другим способом является использование блокирующих переменных (рис. слева). С каждым разделяемым ресурсом связывается двоичная переменная, которая принимает значение 1, если ресурс свободен (то есть ни один процесс не находится в данный момент в критической секции, связанной с данным процессом), и значение 0, если ресурс занят.

Реализация критических секций с использованием блокирующих переменных имеет существенный недостаток: в течение времени, когда один процесс находится в критической секции, другой процесс, которому требуется тот же ресурс, будет выполнять действия по опросу блокирующей переменной, бесполезно тратя процессорное время. Для устранения такой ситуации используются системные функции аналогичного назначения, которые условно назовем WAIT(x) и POST(x), где x - идентификатор некоторого события (рис. справа). Если ресурс занят, то процесс не выполняет циклический опрос, а вызывает системную функцию WAIT(D), здесь D обозначает событие, заключающееся в освобождении ресурса D. Функция WAIT(D) переводит активный процесс в состояние ОЖИДАНИЕ и делает отметку в его дескрипторе о том, что процесс ожидает события D. Процесс, который в это время использует ресурс D, после выхода из критической секции выполняет системную функцию POST(D), в результате чего операционная система просматривает очередь ожидающих процессов и переводит процесс, ожидающий события D, в состояние ГОТОВНОСТЬ.

Обобщающее средство синхронизации процессов предложил Дейкстра, который ввел два новых примитива. В абстрактной форме эти примитивы, обозначаемые P и V, оперируют над целыми неотрицательными переменными, называемыми семафорами. Пусть S такой семафор. Операции определяются следующим образом:

V(S) : переменная S увеличивается на 1 одним неделимым действием; выборка, инкремент и запоминание не могут быть прерваны, и к S нет доступа другим процессам во время выполнения этой операции.

P(S) : уменьшение S на 1, если это возможно. Если S=0, то невозможно уменьшить S и остаться в области целых неотрицательных значений, в этом случае процесс, вызывающий P-операцию, ждет, пока это уменьшение станет возможным. Успешная проверка и уменьшение также является неделимой операцией.

В частном случае, когда семафор S может принимать только значения 0 и 1, он превращается в блокирующую переменную. Операция P заключает в себе потенциальную возможность перехода процесса, который ее выполняет, в состояние ожидания, в то время как V-операция может при некоторых обстоятельствах активизировать другой процесс, приостановленный операцией P.

Тупики

Одна из проблемм синхронизации - взаимные блокировки (тупики).

Пример тупика. Пусть двум процессам, выполняющимся в режиме мультипрограммирования, для выполнения их работы нужно два ресурса, например, принтер и диск. И пусть после того, как процесс А занял принтер (установил блокирующую переменную), он был прерван. Управление получил процесс В, который сначала занял диск, но при выполнении следующей команды был заблокирован, так как принтер оказался уже занятым процессом А. Управление снова получил процесс А, который в соответствии со своей программой сделал попытку занять диск и был заблокирован: диск уже распределен процессу В. В таком положении процессы А и В могут находиться сколь угодно долго.

Проблема тупиков включает в себя следующие задачи:

• предотвращение тупиков,

• распознавание тупиков,

• восстановление системы после тупиков.

Тупики могут быть предотвращены на стадии написания программ, то есть программы должны быть написаны таким образом, чтобы тупик не мог возникнуть ни при каком соотношении взаимных скоростей процессов. Так, если бы в предыдущем примере процесс А и процесс В запрашивали ресурсы в одинаковой последовательности, то тупик был бы в принципе невозможен. Второй подход к предотвращению тупиков называется динамическим и заключается в использовании определенных правил при назначении ресурсов процессам, например, ресурсы могут выделяться в определенной последовательности, общей для всех процессов.

Для того, чтобы облегчить написание корректных программ, было предложено высокоуровневое средство синхронизации, называемое монитором. Монитор - это набор процедур, переменных и структур данных. Процессы могут вызывать процедуры монитора, но не имеют доступа к внутренним данным монитора. Мониторы имеют важное свойство, которое делает их полезными для достижения взаимного исключения: только один процесс может быть активным по отношению к монитору. Компилятор обрабатывает вызовы процедур монитора особым образом. Обычно, когда процесс вызывает процедуру монитора, то первые несколько инструкций этой процедуры проверяют, не активен ли какой-либо другой процесс по отношению к этому монитору. Если да, то вызывающий процесс приостанавливается, пока другой процесс не освободит монитор. Таким образом, исключение входа нескольких процессов в монитор реализуется не программистом, а компилятором, что делает ошибки менее вероятными.

Прерывания - это принудительная передача управления от выполняющейся программы к системе, а через неё к соответствующей программе обработки прерываний, происходящая при определенном событии. Основная цель введения прерываний - реализация асинхронного режима работы и распараллеливания работы отдельных устройств вычислительного комплекса. Механизм прерываний реализуется аппаратно-программными средствами.

Механизм обработки прерываний включает в себя следующие элементы:

1. Установление факта прерывания (прием и идентификация сигнала на прерывание).

2. Запоминание состояния прерванного процесса (состояние процесса определяется значением счетчика команд, содержимым регистра процессора, спецификацией режима: пользовательский или привилегированный) .

3. Управление аппаратно передается программе обработки прерывания.

4. Обработка прерывания.

5. Восстановление информации относящейся к прерванному процессу.

6. Возврат в прерванную программу.

Во многих ОС секция обработки прерываний выделяется в специальный программный модуль, наз. супервизором прерываний. Этот модуль сохраняет в дескрипторе текущей задачи рабочие регистры процессора, которые определяют контекст прерываемого вычислительного процесса. Определяет ту подпрограмму, которая должна выполнять действия связанные с обслуживанием текущего запроса на прерывание. Перед тем. как передать управление этой подпрограмме супервизор прерываний устанавливает необходимый режим обработки прерывания. После выполнения подпрограммы управление передается вновь супервизору, но уже на тот модуль, который занимается диспетчеризацией задач. Диспетчер задач в свою очередь, в соответствии с принятым режимом распределения процессорного времени между выполняющимися процессами восстановит контекст той задачи, которой будет решено выделить процессор.

Обработка прерываний при участии супервизора ОС.

1. отключение прерываний. Производится в соотв. модулях ОС. Сохранение контекста прерванной задачи. Установка режима системы прерываний.

2. определение адреса программного модуля. который обслуживает запрос на прерывание и передача управления на него. Включение подпрограммы обработки прерываний.

Диспетчер задач: выбор готовой к выполнению задачи на основе принятой дисциплины обслуживания. Восстановление контекста прерванной задачи. Установление прежнего режима работы системы прерываний и передача управления этой задаче.

Процессы подразделяются на системные и пользовательские. Системные процессы принадлежат административным учетным именам, автоматически порождаются при старте системы и выполняются в режиме ядра. Они могут непосредственно манипулировать внутренними данными и структурами ядра. Пользовательские процессы принадлежат обычным - не административным учетным именам, исполняются в пользовательском режиме и для доступа к таблицам ядра используют системные вызовы.

15. Структура ядра ОС: монолитное ядро, микроядро; планирование и диспетчеризация: планирование с переключением и без переключения, выбор величины кванта, алгоритмы планирования (FIFO, RR, SJF, SRT, HNR), многоуровневое планирование.

Монолитное ядром хар-ся тем, что драйверы являются частью ядра и не имеют права исполнять обычные системные вызовы. Систе?мный вы?зов в программировании и вычислительной технике - обращение прикладной программы к ядру операционной системы для выполнения какой-либо операции.Ни один пользовательский процесс не может получить управление, пока какой-то из модулей ядра активен.

Микроядро - это минимальная функционально полная часть операционной системы, которая обычно состоит из планировщика и базовых средств передачи данных между процессами и синхронизации. Микроядро, таким образом, реализует базовые функции ОС, на которые опираются другие системные службы и приложения. Модули системы, не включенные в микроядро, являются отдельными процессами, взаимодействующими с ядром и друг с другом.

Алгоритмы планирования без переключений выбирают процесс и позволяют работать ему вплоть до блокировки, или пока он сам не отдаст процессор. Процесс не будет прерван, даже если он работает часами. Т. е. решения планирования не принимаются по прерываниям таймера. После обработки преравания таймера управление всегда возвращается приостановленному процессу.

Алгоритмы планирования с переключениями, выбирают процесс и позволяют работать ему некоторое максимально возможное фиксированное время. Если к концу заданного интервала процесс все еще работает, он приостанавливается и управление переходит к другому процессу. Приоритетное планирование требует прерываний по таймеру, происходящих в конце отведенного периода времени, чтобы передать управление планировщику.

Выбор величины кванта. Если установленное значение кванта больше среднего интервала работы процессора, переключение процессов будет происходить редко. Напротив, большинство процессов будет соверщать блокирующую операцию прежде, чем истечет длительность кванта, вызовая переключение процессов. Устранение принудительных переключений процессов улучшает производительность системы, так как переключения процессов будут происходить только тогда, когда это логически необходимо, т.е. когда процесс заблокировался и не может продолжать работу.

Вывод: слишком малый квант времени приведет к частому переключению процессов и небольшой эффективности, но слишком большой квант может привести к медленному реагированию на короткие интерактивные запросы. Значение кванта около 20-50 мс часто является наиболее оптимальным.

CPU burst - промежуток времени непрерывного использования процессора.

FIFO (первым пришел - первым обслужен). Процессор предоставляется процессам в том порядке, в котором они его запрашивают. Когда процесс переходит в состояние готовность, он помещается в конец очереди. Выбор нового процесса для исполнения осуществляется из начала очереди. Такой алгоритм выбора процесса осуществляет невытесняющее планирование. Процесс, получивший в свое распоряжение процессор, занимает его до истечения своего текущего CPU burst. После этого для выполнения выбирается новый процесс из начала очереди.

RR (Round Robin - это вид детской карусели в США). По сути дела это тот же самый алгоритм, только реализованный в режиме вытесняющего планирования. Можно представить себе все множество готовых процессов организованным циклически - процессы сидят на карусели. Карусель вращается так, что каждый процесс находится около процессора небольшой фиксированный квант времени, обычно 10 - 100 миллисекунд.Пока процесс находится рядом с процессором, он получает процессор в свое распоряжение и может исполняться.

Реализуется такой алгоритм так же, как и предыдущий, с помощью организации процессов, находящихся в состоянии готовность, в очередь FIFO. Планировщик выбирает для очередного исполнения процесс, расположенный в начале очереди, и устанавливает таймер для генерации прерывания по истечении определенного кванта времени. При выполнении процесса возможны два варианта:

• Время непрерывного использования процессора, требующееся процессу, (остаток текущего CPU burst) меньше или равно продолжительности кванта времени. Тогда процесс по своей воле освобождает процессор до истечения кванта времени, на исполнение выбирается новый процесс из начала очереди и таймер начинает отсчет кванта заново.

• Продолжительность остатка текущего CPU burst процесса больше, чем квант времени. Тогда по истечении этого кванта процесс прерывается таймером и помещается в конец очереди процессов готовых к исполнению, а процессор выделяется для использования процессу, находящемуся в ее начале.

SJF (Shortest-Job-First - кратчайшая работа первой). На выполнение выбирается процесс с минимальной длительностью CPU burst.

SJF алгоритм краткосрочного планирования может быть как вытесняющим, так и невытесняющим. При невытесняющем SJF планировании процессор предоставляется избранному процессу на все требующееся ему время, независимо от событий происходящих в вычислительной системе. При вытесняющем SJF планировании учитывается появление новых процессов в очереди готовых к исполнению (из числа вновь родившихся или разблокированных) во время работы выбранного процесса. Если CPU burst нового процесса меньше, чем остаток CPU burst у исполняющегося, то исполняющийся процесс вытесняется новым.

SRT (по наименьшему остающемуся времени). Принцип SRT - это аналог принципа SJF, но с переключением, применимый в системах с разделением времени. По принципу SRT всегда выполняется процесс, имеющий минимальное оценочное время до завершения, причем с учетом новых поступающих процессов. По принципу SJF задание, которое запущено в работу, выполняется до завершения. По принципу SRT выполняющийся процесс может быть прерван при поступлении нового процесса, имеющего более короткое оценочное время работы.

HRN (highest-response-ratio-next - по наибольшему относительному времени реакции). Это алгоритм планирования без переключений, по которому приоритет каждого задания определяется не только временем обслуживания этого задания, но также и временем, затраченным заданием на ожидание обслуживания. После того как задание получает в свое распоряжение ЦП, оно выполняется до завершения. Динамические приоритеты при алгоритме HRN вычисляются по формуле:

ПРИОРИТЕТ = (ВРЕМЯ ОЖИДАНИЯ + ВРЕМЯ ОБСЛУЖИВАНИЯ) / ВРЕМЯ ОБСЛУЖИВАНИЯ

Поскольку время обслуживания находится в знаменателе, предпочтение будет оказываться более коротким заданиям. Однако, поскольку в числителе имеется время ожидания, более длинные задания, которые уже довольно долго ждут, будут также получать определенное предпочтение. Сумма ВРЕМЯ ОЖИДАНИЯ + ВРЕМЯ ОБСЛУЖИВАНИЯ есть время ответа системы для данного задания, если бы это задание инициировалось немедленно.

Многоуровневые очереди

Для систем, в которых процессы могут быть легко рассортированы на разные группы, был разработан другой класс алгоритмов планирования. Для каждой группы процессов создается своя очередь процессов, находящихся в состоянии готовность (см. рисунок 3.5). Этим очередям приписываются фиксированные приоритеты. Например, приоритет очереди системных процессов устанавливается больше, чем приоритет очередей пользовательских процессов. А приоритет очереди процессов, запущенных студентами, - ниже, чем для очереди процессов, запущенных преподавателями. Это значит, что ни один пользовательский процесс не будет выбран для исполнения, пока есть хоть один готовый системный процесс, и ни один студенческий процесс не получит в свое распоряжение процессор, если есть процессы преподавателей, готовые к исполнению. Внутри этих очередей для планирования могут применяться самые разные алгоритмы. Так, например, для больших счетных процессов, не требующих взаимодействия с пользователем (фоновых процессов), может использоваться алгоритм FIFO, а для интерактивных процессов - алгоритм RR. Подобный подход, получивший название многоуровневых очередей, повышает гибкость планирования: для процессов с различными характеристиками применяется наиболее подходящий им алгоритм.

Многоуровневые очереди с обратной связью (Multilevel Feedback Queue)

Дальнейшим развитием алгоритма многоуровневых очередей является добавление к нему механизма обратной связи. Здесь процесс не постоянно приписан к определенной очереди, а может мигрировать из очереди в очередь, в зависимости от своего поведения.

Для простоты рассмотрим ситуацию, когда процессы в состоянии готовность организованы в 4 очереди, как на рисунке 3.6. Планирование процессов между очередями осуществляется на основе вытесняющего приоритетного механизма. Чем выше на рисунке располагается очередь, тем выше ее приоритет. Процессы в очереди 1 не могут исполняться, если в очереди 0 есть хотя бы один процесс. Если при работе процесса появляется другой процесс в какой-либо более приоритетной очереди, исполняющийся процесс вытесняется появившимся. Планирование процессов внутри очередей 0-2 осуществляется с использованием алгоритма RR, планирование процессов в очереди 3 основывается на алгоритме FCFS (он же FIFO).

Родившийся процесс поступает в очередь 0. При выборе на исполнение он получает в свое распоряжение квант времени размером 8 единиц. Если продолжительность его CPU burst меньше этого кванта времени, процесс остается в очереди 0. В противном случае, он переходит в очередь 1. Для процессов из очереди 1 квант времени имеет величину 16. Если процесс не укладывается в это время, он переходит в очередь 2. Если укладывается - остается в очереди 1. В очереди 2 величина кванта времени составляет 32 единицы. Если и этого мало для непрерывной работы процесса, процесс поступает в очередь 3, для которой квантование времени не применяется, и, при отсутствии готовых процессов в других очередях, он может исполняться до окончания своего CPU burst. Чем больше значение продолжительности CPU burst, тем в менее приоритетную очередь попадает процесс, но тем на большее процессорное время он может рассчитывать для своего выполнения. Таким образом, через некоторое время все процессы, требующие малого времени работы процессора окажутся размещенными в высокоприоритетных очередях, а все процессы, требующие большого счета и с низкими запросами к времени отклика, - в низкоприоритетных.

16. Монопольный доступ и взаимоисключение: обеспечение монопольного доступа к разделяемым ресурсам, семафоры, синхронизация при помощи семафоров, мониторы (кольцевой буфер, читатели и писатели), событийная синхронизация.

Взаимноеисключение (мьютекс) - одноместный семафор, служащий в программировании для синхронизации одновременно выполняющихся потоков.

Семафо?р - объект, позволяющий войти в заданный участок кода не более чем n потокам.

Семафоры используются при передаче данных через разделяемую память. Вот некоторые из проблем, которые могут решать семафоры.

запрет одновременного выполнения заданных участков кода;

поочерёдный доступ к критическому ресурсу (важному ресурсу, для которого невозможен одновременный доступ).

Мьютексы - это простейшие двоичные семафоры, которые могут находиться в одном из двух состояний - отмеченном или неотмеченном (открыт и закрыт соответственно). Когда какой-либо поток, принадлежащий любому процессу, становится владельцем объекта mutex, последний переводится в неотмеченное состояние. Если задача освобождает мьютекс, его состояние становится отмеченным.

Одной из особенностей мьютексов, отличающей их от других средств синхронизации, например от критических секций, является то, что данными объектами управляет операционная система. Следсвием этого являются дополнительные затраты процессорного времени, требуемые на переключение между режимом пользователя и ядра.

Атомарность (в программировании) - свойство непрерывности операции. Атомарная операция выполняется полностью (или происходит отказ в выполнении), без прерываний. Атомарность имеет особое значение в многопроцессорных компьютерах (и многозадачных операционных системах), т.к. доступ к неразделяемым ресурсам должен быть обязательно атомарным.

Атомарная операция открыта влиянию только одного потока.

Атомарность бывает аппаратная (когда непрерывность обеспечивается аппаратурой) и программной, когда используются специальные средства межпрограммного взаимодействия (мьютекс, семафор). По своей сути программные средства обеспечения атомарности представляют собой два этапа - блокировка ресурса и выполнение самой операции. Блокировка представляет собой атомарную операцию, которая либо успешна, либо возвращает сообщение о занятости.

Критическая секция (критическая область) - часть программы в которой происходит обращение к совместно используемым данным.

К примитивам взаимоисключения относятся:запрет на прерывание - при входе процесса в критическую область запрещаются любые прерывания и разрешения на прерывания восстанавливаются при выходе процесса из критической области.

Переменные блокировки - есть совметноиспользуемая переменная блокировки, относящаяся к той или иной критической области. Если процесс хочет войти в эту критическую область он считывает переменную блокировки. Если в ней находится запрещающий ключ, то процесс ждёт пока он изменится на противоположенный. Войдя в критическую секцию процесс изменяет ключ переменной блокировки на "занято" и выполняет критическую секцию. Выйдя из неё меняет ключ на "свободно".

Метод строгого чередования;

Алгоритм Петерсона; Аппаратное решение - команда TSL (Test and Set Look);

17. Тупики: условия возникновения, методы борьбы, стратегия Ханвендера; метод редукции графа - представление состояний системы в виде направленных графов; представление графа - матричное, с помощью связного списка; алгоритмы обнаружения тупиков - метод прямого обнаружения, алгоритм со счетчиком ожиданий; обход тупиков - алгоритм банкира; обнаружение и восстановление работоспособности системы.

Одна из проблемм синхронизации - взаимные блокировки (тупики).

Пример тупика. Пусть двум процессам, выполняющимся в режиме мультипрограммирования, для выполнения их работы нужно два ресурса, например, принтер и диск. И пусть после того, как процесс А занял принтер (установил блокирующую переменную), он был прерван. Управление получил процесс В, который сначала занял диск, но при выполнении следующей команды был заблокирован, так как принтер оказался уже занятым процессом А. Управление снова получил процесс А, который в соответствии со своей программой сделал попытку занять диск и был заблокирован: диск уже распределен процессу В. В таком положении процессы А и В могут находиться сколь угодно долго.

Условия возникновения тупиков

1. Условие взаимоисключения (Mutual exclusion). Каждый ресурс выделен в точности одному процессу или доступен. Процессы требуют предоставления им монопольного управления ресурсами, которые им выделяются.

2. Условие ожидания ресурсов (Hold and wait). Процессы удерживают за собой ресурсы, уже выделенные им, ожидая в то же время выделения дополнительных ресурсов (которые при этом обычно удерживаются другими процессами).

3. Условие неперераспределяемости (No preemtion). Ресурс, данный ранее, не может быть принудительно забран у процесса. Освобождены они могут быть только процессом, который их удерживает.

4. Условие кругового ожидания (Circular wait). Существует кольцевая цепь процессов, в которой каждый процесс удерживает за собой один или более ресурсов, требующихся другим процессам цепи.

Для тупика необходимо выполнение всех четырех условий.

Основные направления борьбы с тупиками:

1. Игнорировать данную проблему

2. Обнаружение тупиков

3. Восстановление после тупиков

4. Предотвращение тупиков за счет тщательного выделения ресурсов или нарушения одного из условий возникновения тупиков.

Алгоритм страуса. Простейший подход - игнорировать проблему тупиков.

Стратегия Хавендера.

Первый стратегический принцип Хавендера требует, чтобы процесс сразу же запрашивал все ресурсы, которые ему понадобятся. Система должна предоставлять эти ресурсы по принципу "все или ничего". Если набор ресурсов, необходимый процессу, имеется, то система может предоставить все эти ресурсы данному процессу сразу же, так что он получит возможность продолжить работу. Если в текущий момент полного набора ресурсов, необходимых процессу, нет, этому процессу придется ждать, пока они не освободятся. Однако когда процесс находится в состоянии ожидания, он не должен удерживать какие-либо ресурсы. Благодаря этому предотвращается возникновение условия "ожидания дополнительных ресурсов" и тупиковые ситуации просто невозможны.

Второй стратегический принцип Хавендера требует, чтобы процесс, имеющий в своем распоряжении некоторые ресурсы, если он получает отказ на запрос о выделении дополнительных ресурсов, должен освобождать свои ресурсы и при необходимости запрашивать их снова вместе с дополнительными.

Третий стратегический принцип Хавендера исключает круговое ожидание. Поскольку всем ресурсам присваиваются уникальные номера и поскольку процессы должны запрашивать ресурсы в порядке возрастания номеров, круговое ожидание возникнуть не может.

Обнаружение тупиков. Обнаружение тупика это установление факта, что возникла тупиковая ситуация и определение процессов и ресурсов, вовлеченных в эту ситуацию. Как правило, алгоритмы обнаружения применяются, когда выполнены первые три необходимых условия возникновения тупиковой ситуации. Затем проверяется наличие режима кругового ожидания. При этом активно используются графы распределения ресурсов.

Представление графа с пом-ю связного списка

Пример: • Процесс A удерживает ресурс R и ожидает ресурс S.

• Процесс B претендует на ресурс T.

• Процесс C претендует на ресурс S.

• Процесс D удерживает ресурс U и ожидает ресурсы S и T.

• Процесс E удерживает ресурс T и ожидает ресурс V.

• Процесс F удерживает ресурс W и ожидает ресурс S.

• Процесс G удерживает ресурс V и ожидает ресурс U.

Вопрос состоит в том, является ли данная ситуация тупиковой, и если да, то какие процессы в ней участвуют.

Рис. 1. (а) Граф ресурсов. (б) Цикл, извлеченный из графа (a).

Для ответа на этот вопрос можно сконструировать граф ресурсов, как показано на рис. 7.2. Из рисунка видно, что имеется цикл, моделирующий условие кругового ожидания, и процессы D,E,G в тупиковой ситуации

Матричное представление графа

m - число классов ресурсов. E - вектор существующих ресурсов, где Ei - количество ресурсов класса i (пр. E1=2 - означ., что в системе есть два диска). В любой момент времени некоторые из ресурсов могут оказаться занятыми и, соответственно, недоступными. Пусть А будет вектором доступных ресурсов, где Аi равно количеству экзампляров ресурса i, доступных в текущий момент.

Два массива: C - матрица текущего распределения и R - матрица запросов. i-я строка в матрице С говорит о том, сколько представителей каждого класса ресурсов в данный момент использует процесс Pi. Сij - это количество экземпляров ресурса j, которые занимает процесс i. Rij - это количество экземпляров ресурса j, которые хочет получить процесс i.

Алгоритм обнаружения тупиков состоит из следующих шагов:

1. Ищем немаркированный процесс Pi для которого i-я строка матрицы R меньше вектора А или равна ему.

2. Если такой процесс найден, прибавляем i-ю строку матрицы С к вектору А, маркируем процесс и возвращаемся к шагу 1.

3. Если таких процессов не существует, работа алгоритма заканчивается.

Завершение алгоритма означает, что все немаркированные процессы, если такие есть, попали в тупик.

Алгоритм банкира, предложенный Дейкстрой

Когда при описании алгоритма банкира мы будем говорить о ресурсах, мы будем подразумевать ресурсы одного и того же типа, однако этот алгоритм можно легко распространить на пулы ресурсов нескольких различных типов. Рассмотрим, например, проблему распределения некоторого количества t идентичных лентопротяжных устройств. Операционная система должна обеспечить распределение некоторого фиксированного числа t одинаковых лентопротяжных устройств между некоторым фиксированным числом пользователей и каждый пользователь заранее указывает максимальное число устройств, которые ему потребуются во время выполнения своей программы на машине. Операционная система примет запрос пользователя в случае, если максимальная потребность этого пользователя в лентопротяжных устройствах не превышает t.

Пользователь может занимать или освобождать устройства по одному. Возможно, что иногда пользователю придется ждать выделения дополнительного устройства, однако операционная система гарантирует, что ожидание будет конечным. Текущее число устройств, выделенных пользователю, никогда не превысит указанную максимальную потребность этого пользователя. Если операционная система в состоянии удовлетворить максимальную потребность пользователя в устройствах, то пользователь гарантирует, что эти устройства будут использованы и возвращены операционной системе в течение конечного периода времени.

Алгоритм банкира, который предложил Дейкстра, говорит о том, что выделять лентопротяжные устройства пользователям можно только в случае, когда после очередного выделения устройств состояние системы остается надежным. Надежное состояние - это состояние, при котором общая ситуация с ресурсами такова, что все пользователи имеют возможность со временем завершить свою работу. Ненадежное состояние - это состояние, которое может со временем привести к тупику.

Восстановление после тупиков

Сложность восстановления обусловлена рядом факторов.

• в большинстве систем нет достаточно эффективных средств для приостановки процесса, вывода его из системы и возобновления впоследствии;

• если даже такие средства есть, то их использование требует затрат и внимания оператора;

• восстановление после серьезного тупика может потребовать много работы.

Восстановление при помощи перераспределения ресурсов

Один из способов восстановления - принудительный вывод некоторого процесса из системы для последующего использования его ресурсов. Для определения того, какой процесс выводить из системы зачастую требуются усилия оператора. В некоторых случаях может оказаться возможным временно забрать ресурс у его текущего владельца и передать его другому процессу.

Восстановление через откат назад

Это, по всей вероятности, самый эффективный способ приостановки и возобновления.

В ряде систем реализованы средства рестарта с контрольной точки (сохранение состояния системы в какой-то момент времени). Там где эти средства не предусмотрены, их должны организовать разработчики прикладных программ. Если проектировщики системы знают, что тупик вероятен, они могут периодически организовывать для процессов контрольные точки. Когда тупик обнаружен, видно какие ресурсы вовлечены в цикл кругового ожидания. Чтобы осуществить восстановление, процесс, который владеет таким ресурсам, должен быть отброшен к моменту времени, предшествующему его запросу на этот ресурс.

Восстановление через ликвидацию одного из процессов

Грубый, но простейший способ устранить тупик - убить один или более процессов. Например, убить процесс, который в цикле. Тогда при удаче остальные процессы смогут выполняться. Если это не помогает, то можно ликвидировать еще один процесс.

18. Иерархия памяти: уровни иерархии, вертикальное и горизонтальное управление, распределение основной памяти, особенности основной памяти как ресурса ВС, алгоритмы распределения памяти, защита памяти.

Память - функциональная часть компьютера, предназначенная для записи, хранения и считывания информации. Технически память реализуется в виде запоминающих устройств.

В самом простейшем случае можно выделить основную память и внешнюю память. Основные классы памяти, которые могут присутствовать на современных компьютерах.

В основе иерархии памяти современных компьютеров лежат два принципа.

• Принцип локальности обращений. Большинство запросов процессов на обращение к памяти имеет, как правило, неравномерный характер с высокой степенью локальной концентрации, как временной, так и пространственной;

• Соотношение скорость доступа - объем памяти. Чем быстрее может быть осуществлен доступ к памяти, тем она более дорогая. Следовательно, тем менее она практична с точки зрения использования и тем меньше будет ее объем, который разумно устанавливать в компьютер.

Распределение памяти может быть:

• статическим, когда привязка к конкретным ячейкам памяти выполняется либо до, либо во время загрузки модуля;

• динамическим, когда задание может перемешаться в памяти, допуская настройку и получение абсолютных значений ячеек памяти при каждом обращении к ним.

Существуют следующие основные способы реализации отображения памяти:

• оверлеи (overlay) - возможность расположить модули в памяти таким образом, чтобы один из них (корневой) постоянно находился там, а остальные - попеременно загружались в ходе выполнения программы в одну и ту же область, сменяя и перекрывая друг друга;

• свопинг (swapping) - разрешение системе вводить в память и выводить из нее задания целиком;

• поблочное отображение - возможность группировать элементы информации в блоки (если блоки имеют одинаковый размер, то это страницы, если разный, то сегменты).

Основная память

Привязка адресов

• Функция именования, которая однозначно отображает данное пользовательское имя в идентификатор информации, к которому относится имя. Эта функция реализуется обычно редактором связей.

• Функция памяти, которая однозначно отображает определение идентификатора в истинные номера ячеек памяти, в которых он будет находиться. Эта функция реализуется частью операционной системы, называемой загрузчиком.

Управление виртуальной памятью

Распределенная общая память

Защита памяти - это еще одна важная задача операционной системы, которая состоит в том, чтобы не позволить выполняемому процессу записывать или читать данные из памяти, назначенной другому процессу. Эта функция, как правило, реализуется программными модулями ОС в тесном взаимодействии с аппаратными средствами.

Вертикальное и горизонтальное управление

Все методы управления памятью могут быть разделены на два класса: методы, которые используют перемещение процессов между оперативной памятью и диском (вертикальное управление), и методы, которые не делают этого(горизонтальное управление).

Распределение памяти фиксированными разделами

Разделение памяти на несколько разделов фиксированной величины. Это может быть выполнено вручную оператором во время старта системы или во время ее генерации. Очередная задача, поступившая на выполнение, помещается либо в общую очередь, либо в очередь к некоторому разделу.

Подсистема управления памятью в этом случае выполняет следующие задачи:

• сравнивая размер программы, поступившей на выполнение, и свободных разделов, выбирает подходящий раздел,

• осуществляет загрузку программы и настройку адресов.

При очевидном преимуществе - простоте реализации - данный метод имеет существенный недостаток - жесткость. Так как в каждом разделе может выполняться только одна программа, то уровень мультипрограммирования заранее ограничен числом разделов не зависимо от того, какой размер имеют программы. Даже если программа имеет небольшой объем, она будет занимать весь раздел, что приводит к неэффективному использованию памяти. С другой стороны, даже если объем оперативной памяти машины позволяет выполнить некоторую программу, разбиение памяти на разделы не позволяет сделать этого.

Распределение памяти разделами переменной величины

В этом случае память машины не делится заранее на разделы. Сначала вся память свободна. Каждой вновь поступающей задаче выделяется необходимая ей память. Если достаточный объем памяти отсутствует, то задача не принимается на выполнение и стоит в очереди. После завершения задачи память освобождается, и на это место может быть загружена другая задача. Таким образом, в произвольный момент времени оперативная память представляет собой случайную последовательность занятых и свободных участков (разделов) произвольного размера.

Программный код не перемещается во время выполнения, то есть может быть проведена единовременная настройка адресов посредством использования перемещающего загрузчика.

Выбор раздела для вновь поступившей задачи может осуществляться по разным правилам, таким, например, как "первый попавшийся раздел достаточного размера", или "раздел, имеющий наименьший достаточный размер", или "раздел, имеющий наибольший достаточный размер". Все эти правила имеют свои преимущества и недостатки.

По сравнению с методом распределения памяти фиксированными разделами данный метод обладает гораздо большей гибкостью, но ему присущ очень серьезный недостаток - фрагментация памяти. Фрагментация - это наличие большого числа несмежных участков свободной памяти очень маленького размера (фрагментов). Настолько маленького, что ни одна из вновь поступающих программ не может поместиться ни в одном из участков, хотя суммарный объем фрагментов может составить значительную величину, намного превышающую требуемый объем памяти.

Перемещаемые разделы

Одним из методов борьбы с фрагментацией является перемещение всех занятых участков в сторону старших либо в сторону младших адресов, так, чтобы вся свободная память образовывала единую свободную область. В дополнение к функциям, которые выполняет ОС при распределении памяти переменными разделами, в данном случае она должна еще время от времени копировать содержимое разделов из одного места памяти в другое, корректируя таблицы свободных и занятых областей. Эта процедура называется "сжатием". Сжатие может выполняться либо при каждом завершении задачи, либо только тогда, когда для вновь поступившей задачи нет свободного раздела достаточного размера. В первом случае требуется меньше вычислительной работы при корректировке таблиц, а во втором - реже выполняется процедура сжатия. Так как программы перемещаются по оперативной памяти в ходе своего выполнения, то преобразование адресов из виртуальной формы в физическую должно выполняться динамическим способом.

Хотя процедура сжатия и приводит к более эффективному использованию памяти, она может потребовать значительного времени, что часто перевешивает преимущества данного метода.

19. Виртуальная память: страничная, сегментная, сегментно-страничная организация памяти, коллективное использование и защита информации; файлы, отображаемые в память.

Виртуальная память - это совокупность программно-аппаратных средств, позволяющих пользователям писать программы, размер которых превосходит имеющуюся оперативную память; для этого виртуальная память решает следующие задачи:

• размещает данные в запоминающих устройствах разного типа, например, часть программы в оперативной памяти, а часть на диске;

• перемещает по мере необходимости данные между запоминающими устройствами разного типа, например, подгружает нужную часть программы с диска в оперативную память;

• преобразует виртуальные адреса в физические.

Наиболее распространенными реализациями виртуальной памяти является страничное, сегментное и странично-сегментное распределение памяти.

Страничное распределение

Виртуальное адресное пространство каждого процесса делится на части одинакового, фиксированного для данной системы размера, называемые виртуальными страницами. В общем случае размер виртуального адресного пространства не является кратным размеру страницы, поэтому последняя страница каждого процесса дополняется фиктивной областью.

Вся оперативная память машины также делится на части такого же размера, называемые физическими страницами (или блоками).

Размер страницы обычно выбирается равным степени двойки. Это позволяет упростить механизм преобразования адресов.

При загрузке процесса часть его виртуальных страниц помещается в оперативную память, а остальные - на диск. Смежные виртуальные страницы не обязательно располагаются в смежных физических страницах. При загрузке операционная система создает для каждого процесса информационную структуру - таблицу страниц, в которой устанавливается соответствие между номерами виртуальных и физических страниц для страниц, загруженных в оперативную память, или делается отметка о том, что виртуальная страница выгружена на диск. Кроме того, в таблице страниц содержится управляющая информация, такая как признак модификации страницы, признак невыгружаемости (выгрузка некоторых страниц может быть запрещена), признак обращения к странице (используется для подсчета числа обращений за определенный период времени) и другие данные, формируемые и используемые механизмом виртуальной памяти.

При активизации очередного процесса в специальный регистр процессора загружается адрес таблицы страниц данного процесса.

При каждом обращении к памяти происходит чтение из таблицы страниц информации о виртуальной странице, к которой произошло обращение. Если данная виртуальная страница находится в оперативной памяти, то выполняется преобразование виртуального адреса в физический. Если же нужная виртуальная страница в данный момент выгружена на диск, то происходит так называемое страничное прерывание. Выполняющийся процесс переводится в состояние ожидания, и активизируется другой процесс из очереди готовых. Параллельно программа обработки страничного прерывания находит на диске требуемую виртуальную страницу и пытается загрузить ее в оперативную память. Если в памяти имеется свободная физическая страница, то загрузка выполняется немедленно, если же свободных страниц нет, то решается вопрос, какую страницу следует выгрузить из оперативной памяти.

Сегментное распределение

При страничной организации виртуальное адресное пространство процесса делится механически на равные части. Это не позволяет дифференцировать способы доступа к разным частям программы (сегментам), а это свойство часто бывает очень полезным. Например, можно запретить обращаться с операциями записи и чтения в кодовый сегмент программы, а для сегмента данных разрешить только чтение. Кроме того, разбиение программы на "осмысленные" части делает принципиально возможным разделение одного сегмента несколькими процессами.

Виртуальное адресное пространство процесса делится на сегменты, размер которых определяется программистом с учетом смыслового значения содержащейся в них информации.

При загрузке процесса часть сегментов помещается в оперативную память (при этом для каждого из этих сегментов операционная система подыскивает подходящий участок свободной памяти), а часть сегментов размещается в дисковой памяти. Сегменты одной программы могут занимать в оперативной памяти несмежные участки. Во время загрузки система создает таблицу сегментов процесса (аналогичную таблице страниц), в которой для каждого сегмента указывается начальный физический адрес сегмента в оперативной памяти, размер сегмента, правила доступа, признак модификации, признак обращения к данному сегменту за последний интервал времени и некоторая другая информация. Если виртуальные адресные пространства нескольких процессов включают один и тот же сегмент, то в таблицах сегментов этих процессов делаются ссылки на один и тот же участок оперативной памяти, в который данный сегмент загружается в единственном экземпляре.

Система с сегментной организацией функционирует аналогично системе со страничной организацией: время от времени происходят прерывания, связанные с отсутствием нужных сегментов в памяти, при необходимости освобождения памяти некоторые сегменты выгружаются, при каждом обращении к оперативной памяти выполняется преобразование виртуального адреса в физический. Кроме того, при обращении к памяти проверяется, разрешен ли доступ требуемого типа к данному сегменту.

"-"- фрагментация на уровне сегментов и более медленное по сравнению со страничной организацией преобразование адреса.

Странично-сегментное распределение

Виртуальное пространство процесса делится на сегменты, а каждый сегмент в свою очередь делится на виртуальные страницы, которые нумеруются в пределах сегмента. Оперативная память делится на физические страницы. Загрузка процесса выполняется операционной системой постранично, при этом часть страниц размещается в оперативной памяти, а часть на диске. Для каждого сегмента создается своя таблица страниц, структура которой полностью совпадает со структурой таблицы страниц, используемой при страничном распределении. Для каждого процесса создается таблица сегментов, в которой указываются адреса таблиц страниц для всех сегментов данного процесса. Адрес таблицы сегментов загружается в специальный регистр процессора, когда активизируется соответствующий процесс.

Отображаемые в память файлы

По сравнению с доступом к памяти, традиционный доступ к файлам выглядит запутанным и неудобным. Некоторые ОС обеспечивают отображение файлов в адресное пространство выполняемого процесса. Это выражается в появлении двух новых системных вызовов: MAP (отобразить) и UNMAP (отменить отображение). Первый вызов передает операционной системе в качестве параметров имя файла и виртуальный адрес, и операционная система отображает указанный файл в виртуальное адресное пространство по указанному адресу.

Отображение файлов лучше всего работает в системе, которая поддерживает сегментацию. В такой системе каждый файл может быть отображен в свой собственный сегмент, так что k-ый байт в файле является k-ым байтом сегмента.

Хотя отображение файлов исключает потребность в выполнении ввода-вывода и тем самым облегчает программирование, этот способ порождает и некоторые новые проблемы.

"-" -для системы сложно узнать точную длину выходного файла

"-" - если один процесс отображает файл, а другой процесс открывает его для обычного файлового доступа и первый процесс изменяет страницу, то это изменение не будет отражено в файле на диске до тех пор, пока страница не будет вытеснена на диск.

"-" - файл может быть больше, чем сегмент, и даже больше, чем все виртуальное адресное пространство. Единственный способ ее решения состоит в реализации вызова MAP таким образом, чтобы он мог отображать не весь файл, а его часть. Хотя такая работа, очевидно, менее удобна, чем отображение целого файла.

Коллективное использование и защита информации

Кольца защиты

Система Pentium поддерживает 4 уровня защиты (уровень 0 - наиболее привилегированный, уровень 3 -наименее привилегированный). В каждый момент времени работающая программа находится на определенном уровне, что отмечается 2-битовым полем в его регистре слова состояния программы. Каждый сегмент в системе также имеет свой уровень.

До тех пор пока программа сама ограничивает использование сегментов на своем собственном уровне, система прекрасно работает. Разрешаются попытки доступа к данным высшего уровня. Попытки доступа к данным более низкого уровня запрещены и вызывают прерывания. Попытки вызвать процедуры различного уровня позволяются, но тщательно контролируемым образом. Ч.б. сделать межуровневый вызов , инструкция CALL должна содержать селектор вместо адреса. Этот селектор определяет дескриптор, называемый шлюзом вызова, который передает адрес вызываемой процедуры. Таким образом перепрыгнуть в середину произвольного сегмента кода другого уровня невозможно. Могут использоваться только официальные точки входа.

Уровень 0 : ядро ОС занимающееся обработкой операций В/В, управлением памятью и др. наиболее важными вопросами.

Уровень 1 : обработчик системных вызовов, где пользовательские программы могут обращаться к процедурам для выполнения системных вызовов, но только к определенному и защищенному списку процедур.

Уровень 2 : библиотечные процедуры для совместного доступа программ. Могут только читать данные.

Уровень 3 : пользовательские программы .Наименьшая степень защиты.

20. Файловая система ОС: состав, управление, типы файловых систем; логическая и физическая организация файла, методы доступа, операции над файлами, отображаемые файлы.

Файловая система - это часть операционной системы, назначение которой состоит в том, чтобы обеспечить пользователю удобный интерфейс при работе с данными, хранящимися на диске, и обеспечить совместное использование файлов несколькими пользователями и процессами.

Файловая система включает:

• совокупность всех файлов на диске,

• наборы структур данных, используемых для управления файлами, такие, например, как каталоги файлов, дескрипторы файлов, таблицы распределения свободного и занятого пространства на диске,

• комплекс системных программных средств, реализующих управление файлами, в частности: создание, уничтожение, чтение, запись, именование, поиск и другие операции над файлами.

Управление

Файловая система имеет многоуровневую структуру, на верхнем уровне которой располагается так называемый переключатель файловых систем . Он обеспечивает интерфейс между запросами приложения и конкретной файловой системой, к которой обращается это приложение. Переключатель файловых систем преобразует запросы в формат, воспринимаемый следующим уровнем - уровнем файловых систем.

Каждый компонент уровня файловых систем выполнен в виде драйвера соответствующей файловой системы и поддерживает определенную организацию файловой системы. Переключатель является единственным модулем, который может обращаться к драйверу файловой системы. Приложение не может обращаться к нему напрямую. Драйвер файловой системы может быть написан в виде реентерабельного кода, что позволяет сразу нескольким приложениям выполнять операции с файлами. Каждый драйвер файловой системы в процессе собственной инициализации регистрируется у переключателя, передавая ему таблицу точек входа, которые будут использоваться при последующих обращениях к файловой системе.

Для выполнения своих функций драйверы файловых систем обращаются к подсистеме ввода-вывода, образующей следующий слой файловой системы новой архитектуры. Подсистема ввода вывода - это составная часть файловой системы, которая отвечает за загрузку, инициализацию и управление всеми модулями низших уровней файловой системы. Обычно эти модули представляют собой драйверы портов, которые непосредственно занимаются работой с аппаратными средствами. Кроме этого подсистема ввода-вывода обеспечивает некоторый сервис драйверам файловой системы, что позволяет им осуществлять запросы к конкретным устройствам. Подсистема ввода-вывода должна постоянно присутствовать в памяти и организовывать совместную работу иерархии драйверов устройств.

Типы файловых систем:

FAT-16,FAT-32, NTFS, HPFS,NFS и др.

Файловая система FAT-16 - старая файловая система MS-DOS. В ней используются 16-разрядные дисковые адреса, что ограничивает размер дискового раздела двумя Гигабайтами.

Файловая система FAT-32 - используются 32-разрядные дисковые адреса и поддерживаются дисковые разделы размером до 2 Тбайт.

Файловая система NTFS- используются 64-разрядные дисковые адреса и теоретически может поддерживать дисковые разделы размером до 264 байт (по техническим причинам их размер ограничен меньшими размерами).

Файловая система NFS - сетевая файловая система, использующаяся на всех современных системах UNIX для объединения на логическом уровне файловых систем отдельных компьютеров в единое целое.

Логическая организация файла

Программист имеет дело с логической организацией файла, представляя файл в виде определенным образом организованных логических записей. Логическая запись - это наименьший элемент данных, которым может оперировать программист при обмене с внешним устройством. Записи могут быть фиксированной длины или переменной длины. Записи могут быть расположены в файле последовательно (последовательная организация) или в более сложном порядке, с использованием так называемых индексных таблиц, позволяющих обеспечить быстрый доступ к отдельной логической записи (индексно-последовательная организация). Для идентификации записи может быть использовано специальное поле записи, называемое ключом.

Физическая организация

Физическая организация файла описывает правила расположения файла на устройстве внешней памяти, в частности на диске. Файл состоит из физических записей - блоков. Блок - наименьшая единица данных, которой внешнее устройство обменивается с оперативной памятью.

Непрерывное размещение - простейший вариант физической организации, при котором файлу предоставляется последовательность блоков диска, образующих единый сплошной участок дисковой памяти. Для задания адреса файла в этом случае достаточно указать только номер начального блока.

"-" - во время создания файла заранее не известна его длина, а значит не известно, сколько памяти надо зарезервировать для этого файла;

"-" - при таком порядке размещения неизбежно возникает фрагментация, и пространство на диске используется не эффективно, так как отдельные участки маленького размера (минимально 1 блок) могут остаться не используемыми.

Размещение в виде связанного списка блоков дисковой памяти - в начале каждого блока содержится указатель на следующий блок. В этом случае адрес файла также может быть задан одним числом - номером первого блока. В отличие от предыдущего способа, каждый блок может быть присоединен в цепочку какого-либо файла, следовательно фрагментация отсутствует. Файл может изменяться во время своего существования, наращивая число блоков.

"-" - сложность реализации доступа к произвольно заданному месту файла: для того, чтобы прочитать пятый по порядку блок файла, необходимо последовательно прочитать четыре первых блока, прослеживая цепочку номеров блоков;

"-" - количество данных файла, содержащихся в одном блоке, не равно степени двойки (одно слово израсходовано на номер следующего блока), а многие программы читают данные блоками, размер которых равен степени двойки.

Связанный списка индексов -с каждым блоком связывается некоторый элемент - индекс. Индексы располагаются в отдельной области диска . Если некоторый блок распределен некоторому файлу, то индекс этого блока содержит номер следующего блока данного файла. При такой физической организации сохраняются все достоинства предыдущего способа, но снимаются оба отмеченных недостатка: во-первых, для доступа к произвольному месту файла достаточно прочитать только блок индексов, отсчитать нужное количество блоков файла по цепочке и определить номер нужного блока, и, во-вторых, данные файла занимают блок целиком, а значит имеют объем, равный степени двойки.

Методы доступа и операции над файлами

Определить права доступа к файлу - значит определить для каждого пользователя набор операций, которые он может применить к данному файлу. В разных файловых системах может быть определен свой список дифференцируемых операций доступа. Этот список может включать следующие операции:

• создание файла,

• уничтожение файла,

• открытие файла,

• закрытие файла,

• чтение файла,

• запись в файл,

• дополнение файла,

• поиск в файле,

• получение атрибутов файла,

• установление новых значений атрибутов,

• переименование,

• выполнение файла,

• чтение каталога

В самом общем случае права доступа могут быть описаны матрицей прав доступа, в которой столбцы соответствуют всем файлам системы, строки - всем пользователям, а на пересечении строк и столбцов указываются разрешенные операции . В некоторых системах пользователи могут быть разделены на отдельные категории. Для всех пользователей одной категории определяются единые права доступа.

Различают два основных подхода к определению прав доступа:

• избирательный доступ, когда для каждого файла и каждого пользователя сам владелец может определить допустимые операции;

• мандатный подход, когда система наделяет пользователя определенными правами по отношению к каждому разделяемому ресурсу (в данном случае файлу) в зависимости от того, к какой группе пользователь отнесен.

Отображаемые в память файлы

По сравнению с доступом к памяти, традиционный доступ к файлам выглядит запутанным и неудобным. Некоторые ОС обеспечивают отображение файлов в адресное пространство выполняемого процесса. Это выражается в появлении двух новых системных вызовов: MAP (отобразить) и UNMAP (отменить отображение). Первый вызов передает операционной системе в качестве параметров имя файла и виртуальный адрес, и операционная система отображает указанный файл в виртуальное адресное пространство по указанному адресу.

Отображение файлов лучше всего работает в системе, которая поддерживает сегментацию. В такой системе каждый файл может быть отображен в свой собственный сегмент, так что k-ый байт в файле является k-ым байтом сегмента.

Хотя отображение файлов исключает потребность в выполнении ввода-вывода и тем самым облегчает программирование, этот способ порождает и некоторые новые проблемы.

"-" -для системы сложно узнать точную длину выходного файла

"-" - если один процесс отображает файл, а другой процесс открывает его для обычного файлового доступа и первый процесс изменяет страницу, то это изменение не будет отражено в файле на диске до тех пор, пока страница не будет вытеснена на диск.

"-" - файл может быть больше, чем сегмент, и даже больше, чем все виртуальное адресное пространство. Единственный способ ее решения состоит в реализации вызова MAP таким образом, чтобы он мог отображать не весь файл, а его часть. Хотя такая работа, очевидно, менее удобна, чем отображение целого файла.

Раздел 5. Базы данных

21. Реляционный подход к организации баз данных: фундаментальные свойства отношений, реляционная модель данных, реляционная алгебра, реляционное исчисление, проектирование реляционных баз данных с использованием нормализации, семантическое моделирование данных, ER-диаграммы.

Фундаментальные свойства отношений

1. Отсутствие кортежей-дубликатов

Следует из определения отношения как множества кортежей (каждое множество состоит из различных элементов).

Из этого свойства вытекает наличие у каждого отношения первичного ключа - набора атрибутов, значения которых однозначно определяют кортеж отношения. Для каждого отношения по крайней мере полный набор его атрибутов обладает этим свойством(в набор атрибутов первичного ключа должны входить только те атрибуты, которые однозначно определяют кортеж).

2. Отсутствие упорядоченности кортежей

Отсутствие требования к поддержанию порядка на множестве кортежей отношения дает дополнительную гибкость СУБД при хранении баз данных во внешней памяти и при выполнении запросов к базе данных.

3. Отсутствие упорядоченности атрибутов

Атрибуты отношений не упорядочены, поскольку по определению схема отношения есть множество пар {имя атрибута, имя домена}. Дает возможность добавления и удаления атрибутов.

4. Атомарность значений атрибутов

Значения всех атрибутов являются атомарными. Это следует из определения домена как потенциального множества значений простого типа данных, т.е. среди значений домена не могут содержаться множества значений (отношения).

Реляционная модель данных

Модель данных описывает некоторый набор родовых понятий и признаков, которыми должны обладать все конкретные СУБД и управляемые ими базы данных.

Реляционная модель состоит из трех частей, описывающих разные аспекты реляционного подхода: структурной части, манипуляционной части и целостной части.

В структурной части модели фиксируется, что единственной структурой данных, используемой в реляционных БД, является нормализованное n-арное отношение.

Понятия структурной составляющей реляционной модели:

Понятие тип данных в реляционной модели данных полностью адекватно понятию типа данных в языках программирования.

Понятие домена как допустимого потенциального множества значений данного типа.

Схема отношения - это именованное множество пар {имя атрибута, имя домена (или типа)}. Степень или "арность" схемы отношения - мощность этого множества.

Схема БД - это набор именованных схем отношений.

Кортеж- это множество пар {имя атрибута, значение}, которое содержит одно вхождение каждого имени атрибута, принадлежащего схеме отношения. "Значение" является допустимым значением домена данного атрибута (или типа данных).

В манипуляционной части модели утверждаются два фундаментальных механизма манипулирования реляционными БД - реляционная алгебра и реляционное исчисление. Первый механизм базируется в основном на классической теории множеств, а второй - на классическом логическом аппарате исчисления предикатов первого порядка.

В целостной части реляционной модели данных фиксируются два базовых требования целостности, которые должны поддерживаться в любой реляционной СУБД. Первое требование называется требованием целостности сущностей- любое отношение должно обладать первичным ключом.

Второе требование называется требованием целостности по ссылкам. Сложные сущности реального мира представляются в реляционной БД в виде нескольких кортежей нескольких отношений. Требование целостности по ссылкам, или требование внешнего ключа состоит в том, что для каждого значения внешнего ключа, появляющегося в ссылающемся отношении, в отношении, на которое ведет ссылка, должен найтись кортеж с таким же значением первичного ключа, либо значение внешнего ключа должно быть неопределенным (т.е. ни на что не указывать).

Реляционная алгебра

Базируется на традиционных теоретико-множественных операциях, дополненных некоторыми специальными операциями, специфичными для баз данных.

В состав теоретико-множественных операций входят операции:

объединения отношений(отношение, включающее все кортежи, входящие хотя бы в одно из отношений-операндов.);

пересечения отношений(отношение, включающее все кортежи, входящие в оба отношения-операнда);

взятия разности отношений(включает все кортежи, входящие в отношение - первый операнд, такие, что ни один из них не входит в отношение, являющееся вторым операндом);

прямого произведения отношений(отношение, кортежи которого являются конкатенацией (сцеплением) кортежей первого и второго операндов).

Специальные реляционные операции включают:

ограничение отношения(отношение, включающее кортежи отношения-операнда, удовлетворяющее заданному условию)

проекцию отношения(отношение, кортежи которого производятся путем взятия соответствующих значений из кортежей отношения-операнда);

соединение отношений(образуется результирующее отношение, кортежи которого являются конкатенацией кортежей первого и второго отношений и удовлетворяют заданному условию);

деление отношений(результирующее отношение состоит из одноатрибутных кортежей, включающих значения первого атрибута кортежей первого операнда таких, что множество значений второго атрибута (при фиксированном значении первого атрибута) совпадает со множеством значений второго операнда).

Кроме того, в состав алгебры включается операция присваивания, позволяющая сохранить в базе данных результаты вычисления алгебраических выражений, и операция переименования атрибутов(отношение, тело которого совпадает с телом операнда, но имена атрибутов изменены), дающая возможность корректно сформировать заголовок (схему) результирующего отношения.

Реляционное исчисление

Обычно говорят, что алгебраическая формулировка является процедурной, т.е. задающей правила выполнения запроса, а логическая - описательной (или декларативной), поскольку она всего лишь описывает свойства желаемого результата. Реляционное исчисление является прикладной ветвью формального механизма исчисления предикатов первого порядка. Базисными понятиями исчисления являются понятие переменной с определенной для нее областью допустимых значений и понятие правильно построенной формулы, опирающейся на переменные, предикаты и кванторы. В зависимости от того, что является областью определения переменной, различаются исчисление кортежей и исчисление доменов. В исчислении кортежей областями определения переменных являются отношения базы данных, т.е. допустимым значением каждой переменной является кортеж некоторого отношения. В исчислении доменов областями определения переменных являются домены, на которых определены атрибуты отношений базы данных, т.е. допустимым значением каждой переменной является значение некоторого домена. Правильно построенные формулы служат для выражения условий, накладываемых на кортежные переменные.

Проектирование реляционных баз данных с использованием нормализации

Процесс проектирования представляет собой процесс нормализации схем отношений, причем каждая следующая нормальная форма обладает свойствами лучшими, чем предыдущая. Каждой нормальной форме соответствует некоторый определенный набор ограничений, и отношение находится в некоторой нормальной форме, если удовлетворяет свойственному ей набору ограничений. В теории реляционных баз данных обычно выделяется следующая последовательность нормальных форм:

первая нормальная форма (1NF);

вторая нормальная форма (2NF);

третья нормальная форма (3NF);

нормальная форма Бойса-Кодда (BCNF);

четвертая нормальная форма (4NF);

пятая нормальная форма (5NF).

Основные свойства нормальных форм:

каждая следующая нормальная форма в некотором смысле лучше предыдущей;

при переходе к следующей нормальной форме свойства предыдущих нормальных свойств сохраняются.

В основе процесса проектирования лежит метод нормализации, декомпозиция отношения, находящегося в предыдущей нормальной форме, в два или более отношения, удовлетворяющих требованиям следующей нормальной формы.

Отношение находится в 1НФ если значения всех атрибутов отношения атомарные.

Отношение находится во 2НФ, когда находится в 1НФ, и каждый неключевой атрибут полностью зависит от первичного ключа.

Отношение находится в 3НФ ,если находится в 2НФ и каждый неключевой атрибут нетранзитивно зависит от первичного ключа.

Отношение R находится в нормальной форме Бойса-Кодда (BCNF), если каждый детерминант является возможным ключом.

Отношение R находится в четвертой нормальной форме (4NF), если в случае существования многозначной зависимости A -> -> B все остальные атрибуты R функционально зависят от A.

Отношение R находится в пятой нормальной форме, когда любая зависимость соединения в R следует из существования некоторого возможного ключа в R.

Семантическое моделирование данных

Любая развитая семантическая модель данных включает структурную, манипуляционную и целостную части, главным назначением семантических моделей является обеспечение возможности выражения семантики (смысла) данных. На практике семантическое моделирование используется на первой стадии проектирования базы данных.

Переход от семантической модели к реляционной может производится:

Вручную(процесс выполняется под управлением методик, в которых достаточно четко оговорены все этапы такого преобразования);

Автоматизированная компиляция(известны два подхода: на основе явного представления семантической модели как исходной информации для компилятора и построения интегрированных систем проектирования с автоматизированным созданием семантической модели на основе интервью с экспертами предметной области);

Работа с базой данных в семантической модели, т.е. СУБД, основанные на семантических моделях данных

Семантическая модель данных - модель "Сущность-Связи"( ER-диаграммы)

Основными понятиями являются: сущность, связь и атрибут.

Сущность - это реальный или представляемый объект, информация о котором должна сохраняться и быть доступна. Сущность представляется в виде прямоугольника, содержащего имя сущности. При этом имя сущности - это имя типа, а не некоторого конкретного экземпляра этого типа.

Связь - это графически изображаемая ассоциация, устанавливаемая между двумя сущностями. Эта ассоциация всегда является бинарной и может существовать между двумя разными сущностями или между сущностью и ей же самой (рекурсивная связь). В любой связи выделяются два конца, на каждом из которых указывается имя конца связи, степень конца связи (сколько экземпляров данной сущности связывается), обязательность связи (т.е. любой ли экземпляр данной сущности должен участвовать в данной связи).

Связь представляется в виде линии, связывающей две сущности или ведущей от сущности к ней же самой. При это в месте "стыковки" связи с сущностью используются трехточечный вход в прямоугольник сущности, если для этой сущности в связи могут использоваться много экземпляров сущности, и одноточечный вход, если в связи может участвовать только один экземпляр сущности. Обязательный конец связи изображается сплошной линией, а необязательный - прерывистой линией.

Атрибутом сущности является любая деталь, которая служит для уточнения, идентификации, классификации, числовой характеристики или выражения состояния сущности. Имена атрибутов заносятся в прямоугольник, изображающий сущность, под именем сущности и изображаются малыми буквами.

22. Управление транзакциями, сериализация транзакций (синхронизационные захваты, метод временных меток), изолированность пользователей.

Транзакция- неделимая с точки зрения воздействия на БД последовательность операторов манипулирования данными (чтения, удаления, вставки, модификации) такая, что либо результаты всех операторов, входящих в транзакцию, отображаются в БД, либо воздействие всех этих операторов полностью отсутствует. При завершении транзакции оператором COMMIT результаты гарантированно фиксируются во внешней памяти ;при завершении транзакции оператором ROLLBACK результаты гарантированно отсутствуют во внешней памяти.

Изолированность пользователей

Предельной задачей системы является обеспечение изолированности пользователей, т.е. создание иллюзии того, что каждый из пользователей работает с БД в одиночку.

В связи со свойством сохранения целостности БД транзакции являются подходящими единицами изолированности пользователей. Возможны следующие уровни изолированности транзакций:

Первый уровень - отсутствие потерянных изменений. Рассмотрим следующий сценарий совместного выполнения двух транзакций. Транзакция 1 изменяет объект базы данных A. До завершения транзакции 1 транзакция 2 также изменяет объект A. Транзакция 2 завершается оператором ROLLBACK (например, по причине нарушения ограничений целостности). Тогда при повторном чтении объекта A транзакция 1 не видит изменений этого объекта, произведенных ранее. (ситуацией потерянных изменений). Естественно, она противоречит требованию изолированности пользователей. Чтобы избежать такой ситуации в транзакции 1 требуется, чтобы до завершения транзакции 1 никакая другая транзакция не могла изменять объект A. Отсутствие потерянных изменений является минимальным требованием к СУБД по части синхронизации параллельно выполняемых транзакций.

Второй уровень - отсутствие чтения "грязных данных". Рассмотрим следующий сценарий совместного выполнения транзакций 1 и 2. Транзакция 1 изменяет объект базы данных A. Параллельно с этим транзакция 2 читает объект A. Поскольку операция изменения еще не завершена, транзакция 2 видит несогласованные "грязные" данные (в частности, операция транзакции 1 может быть отвернута при проверке немедленно проверяемого ограничения целостности). Не соответствует требованию изолированности пользователей (каждый пользователь начинает свою транзакцию при согласованном состоянии базы данных и в праве ожидать видеть согласованные данные). Чтобы избежать ситуации чтения "грязных" данных, до завершения транзакции 1, изменившей объект A, никакая другая транзакция не должна читать объект A (минимальным требованием является блокировка чтения объекта A до завершения операции его изменения в транзакции 1).

Третий уровень - отсутствие неповторяющихся чтений. Рассмотрим следующий сценарий. Транзакция 1 читает объект базы данных A. До завершения транзакции 1 транзакция 2 изменяет объект A и успешно завершается оператором COMMIT. Транзакция 1 повторно читает объект A и видит его измененное состояние. Чтобы избежать неповторяющихся чтений, до завершения транзакции 1 никакая другая транзакция не должна изменять объект A. В большинстве систем это является максимальным требованием к синхронизации транзакций, хотя, как мы увидим немного позже, отсутствие неповторяющихся чтений еще не гарантирует реальной изолированности пользователей.

К более тонким проблемам изолированности транзакций относится проблема кортежей-"фантомов", вызывающая ситуации, которые также противоречат изолированности пользователей. Рассмотрим следующий сценарий. Транзакция 1 выполняет оператор A выборки кортежей отношения R с условием выборки S (т.е. выбирается часть кортежей отношения R, удовлетворяющих условию S). До завершения транзакции 1 транзакция 2 вставляет в отношение R новый кортеж r, удовлетворяющий условию S, и успешно завершается. Транзакция 1 повторно выполняет оператор A, и в результате появляется кортеж, который отсутствовал при первом выполнении оператора. Конечно, такая ситуация противоречит идее изолированности транзакций и может возникнуть даже на третьем уровне изолированности транзакций. Чтобы избежать появления кортежей-фантомов, требуется более высокий "логический" уровень синхронизации транзакций.

Сериализация транзакций

Чтобы добиться изолированности транзакций, в СУБД должны использоваться методы регулирования совместного выполнения транзакций.

План (способ) выполнения набора транзакций называется сериальным, если результат совместного выполнения транзакций эквивалентен результату некоторого последовательного выполнения этих же транзакций.

Сериализация транзакций - это механизм их выполнения по некоторому сериальному плану.

Между транзакциями могут существовать следующие виды конфликтов:

W-W - транзакция 2 пытается изменять объект, измененный не закончившейся транзакцией 1;

R-W - транзакция 2 пытается изменять объект, прочитанный не закончившейся транзакцией 1;

W-R - транзакция 2 пытается читать объект, измененный не закончившейся транзакцией 1.

Практические методы сериализации транзакций основывается на учете этих конфликтов.

Существуют два базовых подхода к сериализации транзакций - основанный на синхронизационных захватах объектов базы данных и на использовании временных меток. Суть обоих подходов состоит в обнаружении конфликтов транзакций и их устранении.

Синхронизационных захватов объектов БД

Перед выполнением любой операции в транзакции T над объектом базы данных r от имени транзакции T запрашивается синхронизационный захват объекта r в соответствующем режиме.

Основными режимами синхронизационных захватов являются:

совместный режим - S (Shared), означающий разделяемый захват объекта и требуемый для выполнения операции чтения объекта;

монопольный режим - X (eXclusive), означающий монопольный захват объекта и требуемый для выполнения операций занесения, удаления и модификации.

Захваты объектов несколькими транзакциями по чтению совместимы, т.е. нескольким транзакциям допускается читать один и тот же объект, захват объекта одной транзакцией по чтению не совместим с захватом другой транзакцией того же объекта по записи, и захваты одного объекта разными транзакциями по записи не совместимы.

Объектами синхронизационных захватов могут быть:

файл - физический объект, область хранения нескольких отношений и, возможно, индексов;

отношение - логический объект, соответствующий множеству кортежей данного отношения;

страница данных - физический объект, хранящий кортежи одного или нескольких отношений, индексную или служебную информацию;

кортеж - элементарный физический объект базы данных.

Чем крупнее объект синхронизационного захвата, тем меньше синхронизационных захватов будет поддерживаться в системе, и на это, будут тратиться меньшие накладные расходы. Но при использовании для захватов крупных объектов возрастает вероятность конфликтов транзакций и тем самым уменьшается допускаемая степень их параллельного выполнения.

Подобные рассуждения привели к разработки аппарата гранулированных синхронизационных захватов. При применении этого подхода синхронизационные захваты могут запрашиваться по отношению к объектам разного уровня: файлам, отношениям и кортежам. Требуемый уровень объекта определяется тем, какая операция выполняется.

Но для решения проблемы фантомов необходимо перейти от захватов индивидуальных объектов базы данных, к захвату условий (предикатов), которым удовлетворяют эти объекты. Проблема фантомов не возникает при использовании для синхронизации уровня отношений именно потому, что отношение как логический объект представляет собой неявное условие для входящих в него кортежей. Захват отношения - это простой и частный случай предикатного захвата.

"-": возможность возникновения тупиков между транзакциями. Основой обнаружения тупиковых ситуаций является построение (или постоянное поддержание) графа ожидания транзакций. Граф ожидания транзакций - это ориентированный двудольный граф, в котором существует два типа вершин - вершины, соответствующие транзакциям, и вершины, соответствующие объектам захвата. В этом графе существует дуга, ведущая из вершины-транзакции к вершине-объекту, если для этой транзакции существует удовлетворенный захват объекта. В графе существует дуга из вершины-объекта к вершине-транзакции, если транзакция ожидает удовлетворения захвата объекта. В системе существует ситуация тупика, если в графе ожидания транзакций имеется хотя бы один цикл.

Метод временных меток

Основная идея метода состоит в следующем: если транзакция T1 началась раньше транзакции T2, то система обеспечивает такой режим выполнения, как если бы T1 была целиком выполнена до начала T2.

Для этого каждой транзакции T предписывается временная метка t, соответствующая времени начала T. При выполнении операции над объектом r транзакция T помечает его своей временной меткой и типом операции (чтение или изменение).

Перед выполнением операции над объектом r транзакция T1 выполняет следующие действия:

Проверяет, не закончилась ли транзакция T, пометившая этот объект. Если T закончилась, T1 помечает объект r и выполняет свою операцию.

Если транзакция T не завершилась, то T1 проверяет конфликтность операций. Если операции неконфликтны, при объекте r остается или проставляется временная метка с меньшим значением, и транзакция T1 выполняет свою операцию.

Если операции T1 и T конфликтуют, то если t(T) > t(T1) (т.е. транзакция T является более "молодой", чем T), производится откат T и T1 продолжает работу.

Если же t(T) Delete); 3) любая из обратных операций журнализуется. Для индивид. отката это не нужно, может понадобиться в случае мягкого сбоя при индивид. откате; 4) при успешном завершении отката в журнал заносится запись о конце транзакции. С точки зрения журнала такая транзакция является зафиксированной.

Восстановление после мягкого сбоя.

К числу основных проблем восстановление после мягкого сбоя относится то, что одна логическая операция изменения БД может изменять несколько физических блоков БД, например, страницу данных и несколько страниц индексов. Страницы БД буферизуются в ОЗУ и выталкиваются независимо. Несмотря на применение протокола WAL после мягкого сбоя, часть страниц во внешней памяти соответствует объекту до изменения, а часть - после.

Состояние внешней памяти БД называется физически согласованным, если наборы страниц всех объектов согласованы, т.е. соответствуют состоянию объекта либо после его изменения, либо до изменения.

В журнале отмечаются точки физической согласованности БД (tpc) - моменты времени, в которые во внешней памяти содержатся согласованные результаты операций, завершившихся до соответствующего момента времени, и отсутствуют результаты операций, которые не завершились, а буфер журнала вытолкнут во внешнюю память.

К моменту мягкого сбоя возможны ситуации:

1) Для Т1 делать ничего не надо, т.к. она зафиксирована во внешней памяти. 2) Для Т2 нужно выполнить повторно часть операций (redo). 3) Для транзакции T3 нужно выполнить в обратном направлении первую часть операций (undo). Обратная интерпретация операций T3 корректна и приведет к согласованному состоянию БД. 4) Для транзакции T4, которая успела начаться после момента tpс и закончиться до момента мягкого сбоя, нужно выполнить полную повторную прямую интерпретацию операций (redo).5) Для T5 никаких действий предпринимать не требуется. Результаты операций этой транзакции полностью отсутствуют во внешней памяти базы данных.

Физическая согласованность БД.

Для восстановления состояния БД в момент tpc используются 2 основных подхода: 1) теневой механизм; 2) журнализация постраничных изменений БД.

1) При открытии файла таблица отображения номеров его логических блоков в адреса физических блоков внешней памяти считывается в ОЗУ. При модификации любого блока файла во внешней памяти выделяется новый блок. При этом текущая таблица отображения изменяется, а теневая - сохраняется неизменной. Если во время работы с открытым файлом происходит сбой, во внешней памяти автоматически сохраняется состояние файла до его открытия. Для явного восстания файла повторно считывается в ОЗУ теневая таблица. Теневой механизм: периодически выполняются операции установления точки физической согласованности БД. Для этого все логические операции завершаются, все буфера ОЗУ, не соответствующие содержимому страниц во внешней памяти, выталкиваются. Текущая таблица записывается на место теневой таблицы.

Восстановление к tpc происходит мгновенно: текущая таблица заменяется на теневую. Но может потребоваться много внешней памяти для этого механизма. Обеспечивается согласованное состояние внешней памяти в один общий для всех объектов момент времени.

2) Вместе с логической журнализацией операций изменения БД производится журнализация постраничных изменений. 1 этап восстановления после мягкого сбоя - постраничный откат незакончившихся логических операций. Последняя запись о постраничных изменениях от одной логической операции - запись о конце операции. Чтобы распознать, нуждается ли страница внешней памяти БД в восстановлении, при выталкивании любой страницы из буфера в нее помещается идентификатор последней записи о постраничном изменении этой страницы.

В этой ситуации может поддерживаться 1 из журналов: 1) общий журнал логических и страничных операций. Наличие 2-х видов записей усложняет его структуру. Постраничные изменения могут носить локальный характер и увеличивать размеры журнала; 2) отдельный короткий журнал постраничных изменений.

Восстановление после жесткого сбоя.

В этом случае для восстановления согласованного состояния необходим журнал и архивная копия. Архивная копия - полная копия БД к моменту начала заполнения журнала.

Восстановление начинается с обратного копирования БД из архивной копии. Затем по журналу в прямом направлении выполняются все, а для транзакций, которые не закончились к моменту сбоя, выполняется откат. Жесткий сбой не сопровождается утратой буферов ОЗУ, поэтому можно восстановить БД до такого уровня, чтобы можно было продолжить выполнение незакончившихся транзакций. Но обычно это не делается, потому что восстановление после жесткого сбоя - достаточно длительный процесс.

Если потерян журнал, то для восстановления используется только архивная копия. Архивация БД выполняется: 1) при переполнении журнала. В журнале вводится так называемая "желтая зона", при достижении которой образование новых транзакций временно блокируется. После этого архивируется БД и журнал заполняется снова; 2) архивацию БД можно выполнять реже, чем переполнится журнал. А при переполнении журнала архивировать сам журнал. Журнальная информация может быть существенно сжата

24. Язык SQL: функции и основные возможности, SEQUEL/SQL СУБД System R, типы данных, средства определения схемы, структура запросов, табличное выражение, агрегатные функции и результаты запросов, язык модулей, встроенный SQL, набор операторов манипулирования данными, динамический SQL в Oracle V.6.

SQL- язык запросов, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL основывается на исчислении кортежей.

Функции и основные возможности SEQUEL/SQL СУБД System R.

Язык был ориентирован на удобную и понятную пользователям формулировку запросов к реляционной БД, но на самом деле уже являлся полным языком БД, содержащим помимо операторов формулирования запросов и манипулирования БД средства определения и манипулирования схемой БД; определения ограничений целостности и триггеров; представлений БД; возможности определения структур физического уровня, поддерживающих эффективное выполнение запросов; авторизации доступа к отношениям и их полям; точек сохранения транзакции и откатов.

Типы данных.

В языке SQL/89 выделяется 3 класса типов данных:

1. Символьные типы. CHAR(n), CHARACTER(n), где n до 255. Размерность n байтов даже, если строка короче. CHARACTER - 1 символ. Символьный тип данных переменной длины: VARCHAR(n) - по 1 байту на каждый символ в соответствии с фактической длиной строки.

2. Точные числа. NUMERIC, DECIMAL (или DEC) - упакованное десятичное; INTEGER (или INT); SMALLINT; TYNIINT .

3. Приблизительные числа. FLOAT (с точностью до 15 знаков), REAL(с точностью до 7 зноков) и DOUBLE PRECISION. Спецификатор типа FLOAT имеет вид FLOAT [(n)]. Специфицируются приблизительные числа с двоичной точностью, равной или большей значения n.

Также имеются следующие типы данных: денежный (Many; smallmany), дата и время (DataTime; smalldatatime), двоичные данные (binary(n), n до 255; varbinary(n)), длинный текст (text), рисунок (image), булево значение (bit - 0 или 1).

Средства определения схемы.

В SQL/89 отсутствуют какие-либо средства изменения схемы БД: нет возможности удалить схему таблицы, добавить к схеме таблицы новый столбец и т.д. Во всех реализациях такие средства поддерживаются, но они могут различаться и синтаксисом, и семантикой.

В соответствии с правилами SQL/89 каждая таблица данной БД имеет простое и квалифицированное имена. В качестве квалификатора имени выступает "идентификатор полномочий" таблицы, который обычно в реализациях совпадает с именем некоторого пользователя, и квалифицированное имя таблицы имеет вид: ..

Оператор CREATE TABLE определяет базовую таблицу, т.е. реальное хранилище данных.

Оператор определения столбца включает обязательную часть, в которой определяется имя столбца и его тип данных, и два необязательных раздела: раздел значения столбца по умолчанию и раздел ограничений целостности столбца.

Для одной таблицы может быть задано несколько ограничений целостности, в том числе те, которые неявно порождаются ограничениями целостности столбцов (ограничение уникальности, ограничение по ссылкам, проверочные ограничения). Стандарт SQL/89 устанавливает, что ограничения таблицы фактически проверяются при выполнении каждого оператора SQL.

Механизм представлений (view) является мощным средством языка SQL, позволяющим скрыть реальную структуру БД от некоторых пользователей за счет определения представления БД, которое реально является некоторым хранимым в БД запросом с именованными столбцами, а для пользователя ничем не отличается от базовой таблицы БД. Обычно вычисление представляемой таблицы (материализация соответствующего запроса) производится каждый раз при использовании представления.

Контроль прав доступа пользователя к таблицам БД производится на основе механизма привилегий, который состоит в том, что для выполнения любого действия над таблицей пользователь должен обладать соответствующей привилегией. Пользователь, создавший таблицу, автоматически становится владельцем всех возможных привилегий на выполнение операций над этой таблицей. В число этих привилегий входит привилегия на передачу всех или некоторых привилегий по отношению к данной таблице другому пользователю, включая привилегию на передачу привилегий.

Структура запросов.

Язык допускает 3 типа синтакс.конструкций, начинающихся с ключевого слова SELECT: спецификация курсора, оператор выборки и подзапрос. Основой всех них является синтакс. конструкция "табличное выражение". Семантика табличного выражения состоит в том, что на основе последовательного применения разделов from, where, group by и having из заданных в разделе from таблиц строится некоторая новая результирующая таблица, порядок следования строк которой не определен и среди строк которой могут находиться дубликаты. На самом деле именно структура табличного выражения наибольшим образом характеризует структуру запросов языка SQL/89.

1. Курсор - это понятие языка SQL, позволяющее с помощью набора специальных операторов получить построчный доступ к результату запроса к БД. К табличным выражениям, участвующим в спецификации курсора, не предъявляются какие-либо ограничения. При определении спецификации курсора используются три дополнительных конструкции: спецификация запроса, выражение запросов и раздел ORDER BY. В спецификации запроса задается список выборки (список арифметических выражений над значениями столбцов результата табличного выражения и констант). Выражение запросов - это выражение, строящееся по указанным синтакс.правилам на основе спецификаций запросов. Единственной операцией, которую разрешается использовать в выражениях запросов, является операция UNION (объединение таблиц) с возможной разновидностью UNION ALL. К таблицам-операндам выражения запросов предъявляется то требование, что все они должны содержать одно и то же число столбцов, и соответствующие столбцы всех операндов должны быть одного и того же типа. Раздел ORDER BY позволяет установить желаемый порядок просмотра результата выражения запросов.

2. Оператор выборки - это отдельный оператор языка SQL/89, позволяющий получить результат запроса в прикладной программе без привлечения курсора. При его выполнении возникают ограничения на результат табличного выражения. Он должен быть помещен в переменные прикладной программы. Возникает ограничение, что результирующая таблица должна содержать не более одной строки.

3. Подзапрос - это запрос, который может входить в предикат условия выборки оператора SQL. В SQL/89 к подзапросам применяется то ограничение, что результирующая таблица должна содержать в точности один столбец.

Табличное выражение.

Стандарт SQL/89 рекомендует рассматривать вычисление табличного выражения как последовательное применение разделов FROM, WHERE, GROUP BY и HAVING к таблицам, заданным в списке FROM. Результатом выполнения раздела FROM является расширенное декартово произведение таблиц, заданных списком таблиц раздела FROM. Раздел WHERE задает условия выборки, которые могут использовать: предикат сравнения, предикат between, предикат in, предикат like, предикат null, предикат с квантором и предикат exists. Условие поиска раздела HAVING строится по тем же синтаксическим правилам, что и условие поиска раздела WHERE, и может включать те же самые предикаты. Однако имеются специальные синтаксические ограничения по части использования в условии поиска спецификаций столбцов таблиц из раздела FROM данного табличного выражения. Эти ограничения следуют из того, что условие поиска раздела HAVING задает условие на целую группу, а не на индивидуальные строки.

Агрегатные функции и результаты запросов.

В стандарте SQL/89 определено 5 стандартных агрегатных функций: COUNT - число строк или значений, MAX - максимальное значение, MIN - минимальное значение, SUM - суммарное значение и AVG - среднее значение.

Агрегатные функции предназначены для того, чтобы вычислять некоторое значение для заданного множества строк. Таким множеством строк может быть группа строк, если агрегатная функция применяется к сгруппированной таблице, или вся таблица. Для всех агрегатных функций порядок вычислений следующий: на основании параметров агрегатной функции из заданного множества строк производится список значений. Затем по этому списку значений производится вычисление функции. Если список оказался пустым, то значение функции COUNT для него есть 0, а значение всех остальных функций - null.

Агрегатные функции можно использовать в спецификации курсора, операторе выборки и подзапросе после ключевого слова SELECT и в условии выборки раздела HAVING.

Язык модулей.

В стандарте SQL/89 определены 2 способа взаимодействия с БД из прикладной программы, написанной на традиционном языке программирования: 1) операторы SQL, с которыми может работать данная прикладная программа, собраны в один модуль и оформлены как процедуры этого модуля. Для этого SQL/89 содержит специальный подъязык - язык модулей. При использовании такого способа взаимодействия с БД прикладная программа содержит вызовы процедур модуля SQL с передачей им фактических параметров и получением ответных параметров; 2) использование встроенного SQL, когда в программу на традиционном языке программирования встраиваются операторы SQL. Во встроенных операторах SQL могут использоваться имена переменных основной программы, и за счет этого обеспечивается связь между прикладной программой и СУБД.

В случае использования модуля SQL компиляция операторов SQL производится один раз, и затем соответствующие процедуры сколько угодно раз могут вызываться из прикладной программы. Для операторов SQL, встроенных в прикладную программу, компиляция этих операторов обычно производится каждый раз при их использовании.

1) "+": текст прикладной программы имеет меньший размер. Взаимодействие с СУБД локализовано за счет явных параметров вызовов процедур. "-": для понимания смысла прикл.программы требуется чтение 2-х текстов.

2) "+": прикладные программы более "самосодержащиеся". Простоту переноса такой программы в среду другой СУБД, поскольку стандарт встраивания более или менее соблюдается.

"-":PL-подобный вид таких программ, независимо от выбранного основного языка.

Каждый модуль SQL ориентирован на использование в программах, написанных на конкретном языке программирования. Если в модуле присутствуют процедуры работы с курсорами, то все курсоры должны быть специфицированы в начале модуля. Имена всех процедур в одном модуле должны быть различны. Любое имя параметра, содержащегося в операторе SQL процедуры, должно быть специфицировано в разделе объявления параметров. Список формальных параметров каждой процедуры должен содержать ровно один параметр SQLCODE (код ответа процедуры; возможные значения кодов ответа стандартизованы, но некоторые из них определяются в реализации).

Встроенный SQL.

Встраиваемые операторы SQL, включая объявления курсора, а также разделы объявления исключительных ситуаций и переменных основной программы, должны быть окружены скобками EXEC SQL и END EXEC. Объявление курсора должно встречаться раньше любого оператора, ссылающегося на этот курсор. Все переменные основной программы, используемые во встроенных операторах SQL, должны быть объявлены в предшествующем этому оператору разделе объявления переменных основной программы. При этом синтаксис объявления переменной соответствует синтаксису основного языка программирования, но имени переменной предшествует ":".

Набор операторов манипулирования данными.

Операторы SQL делятся на:

операторы определения данных (Data Definition Language, DDL)

CREATE создает объект БД (саму базу, таблицу, представление, пользователя и т. д.)

ALTER изменяет объект

DROP удаляет объект

операторы манипуляции данными (Data Manipulation Language, DML)

SELECT считывает данные, удовлетворяющие заданным условиям

INSERT добавляет новые данные

UPDATE изменяет существующие данные

DELETE удаляет данные

операторы определения доступа к данным (Data Control Language, DCL)

GRANT предоставляет пользователю (группе) разрешения на определенные операции с объектом

REVOKE отзывает ранее выданные разрешения

DENY задает запрет, имеющий приоритет над разрешением

операторы управления транзакциями (Transaction Control Language, TCL)

COMMIT применяет транзакцию.

ROLLBACK откатывает все изменения, сделанные в контексте текущей транзакции.

SAVEPOINT делит транзакцию на более мелкие участки.

В стандарте SQL/89 определено 3 группы операторов манипулирования данными.

1. Операторы, связанные с курсором.

1) объявление курсора Declare; 2) открытие курсора OPEN. Ему должен предшествовать оператор объявления; 3) чтение курсора FETCH; 4) позиционное удаление Delete. Если указанный в операторе курсор открыт и установлен на некоторую строку, и курсор определяет изменяемую таблицу, то текущая строка курсора удаляется, а он позиционируется перед следующей строкой; 5) позиционная модификация UPDATE. Позиция курсора не изменяется; 6) закрытие курсора Close.

2. Одиночные операторы манипулирования данными.

1) Оператор выборки (Select); 2) Оператор удаления с условием (Delete); 3) Оператор модификации с условием (Update).

3. Операторы завершения транзакции.

1) COMMIT WORK - текущая транзакция может быть завершена успешно с фиксацией в БД произведенных изменений.

2) ROLLBACK WORK - аварийно завершает транзакцию с удалением из БД изменений, произведенных текущей транзакцией.

При выполнении любого из этих операторов производится принудительное закрытие всех курсоров.

Динамический SQL в Oracle V.6.

1) Оператор подготовки PREPARE имя выр-ния From строка. Во время выполнения оператора строка передается компилятору SQL, который обрабатывает ее почти таким же образом, как если бы получил в статике. Построенный при выполнении оператора PREPARE код остается действующим до конца транзакции или до повторного выполнения данного оператора PREPARE в пределах этой же транзакции.

2) Оператор получения описания подготовленного оператора. Оператор DESCRIBE предназначен для того, чтобы определить тип ранее подготовленного оператора, узнать количество и типы формальных параметров и кол-во и типы столбцов результирующей таблицы, если подготовленный оператор является оператором выборки (SELECT).

3) Оператор выполнения подготовленного оператора. Оператор EXECUTE служит для выполнения ранее подготовленного оператора SQL (не требующего применения курсора) или для совмещенной подготовки и выполнения такого оператора.

4) Работа с динамическими операторами SQL через курсоры (Prepare, declare,open,close и т.д.).

25. Архитектура "клиент-сервер": открытые системы, клиенты и серверы локальных сетей, системная архитектура "клиент-сервер", серверы баз данных.

Открытые системы.

Открытая система - это любая система (компьютер, вычислительная сеть, ОС, программный пакет и т.д.), которая построена в соответствии с открытыми спецификациями. Открытые спецификации - опубликованные, общедоступные описания систем, соответствующие стандартам. Основной подход открытых систем - упрощение комплексирования вычислительных систем за счет международной и национальной стандартизации аппаратных и программных интерфейсов. Главная причина развития открытых систем - повсеместный переход к локальным и глобальным сетям. Открытые системы позволяют быть независимыми от поставщиков и наращивать мощность системы, используя аппаратные и программные средства различных производителей, придерживающихся стандартов открытых систем.

Практической опорой системных и прикладных программных средств открытых систем является стандартизованная ОС. В настоящее время такой ОС является ОС Unix, открытость которой заключается в стандартизованном программном интерфейсе м/д ядром и приложениями, что позволяет переносить приложение из одной версии ОС в другую. Модель OSI (модель взаимодействия открытых систем) касается только открытости средств взаимодействия устройств, связанных в вычислительную сеть. Пример открытой системы - Internet (стандарты RFC).

Технологии и стандарты обеспечивают производство системных и программных средств со свойствами мобильности и интероперабельности. Мобильность - простота переноса программной системы в широком спектре аппаратно-программных средств, соответствующих стандартам. Интероперабельность - упрощение комплексирования программных систем на основе использования готовых компонентов со стандартными интерфейсами.

Клиенты и серверы локальных сетей.

В основе распространения локальных сетей лежит идея разделения ресурсов. Высокая пропускная способность локальных сетей обеспечивает эффективный доступ из одного узла локальной сети к ресурсам других узлов. Необходимо иметь не только доступ к ресурсами удаленного компьютера, но также получать от этого узла некоторый сервис, который специфичен для ресурсов данного рода. Следствие этого: рабочие станции и серверы.

Рабочая станция предназначена для непосредственной работы пользователя или категории пользователей и обладает ресурсами, соответствующими локальным потребностям данного пользователя. Специфические особенности рабочей станции: 1) объем ОЗУ; 2) наличие и объем дисковой памяти (можно использовать внешнюю память дискового сервера); 3) характеристики процессора и монитора. При необходимости можно использовать ресурсы и/или услуги, предоставляемые сервером.

Сервер локальной сети должен обладать ресурсами, соответствующими его функциональному назначению и потребностям сети. С точки зрения открытых систем, правильнее говорить о логических серверах (имея в виду набор ресурсов и программных средств, обеспечивающих услуги над этими ресурсами), которые располагаются не обязательно на разных компьютерах. Особенностью логического сервера в открытой системе является то, что если сервер целесообразно переместить на отдельный компьютер, то это можно проделать без переделки как его самого, так и использующих его прикладных программ.

Примеры серверов:

1) сервер телекоммуникаций, обеспечивающий услуги по связи данной локальной сети с внешним миром;

2) вычислительный сервер, производящий вычисления, которые невозможно выполнить на рабочих станциях;

3) дисковый сервер, обладающий расширенными ресурсами внешней памяти;

4) файловый сервер, поддерживающий общее хранилище файлов для всех рабочих станций;

5) сервер баз данных фактически обычная СУБД, принимающая запросы по локальной сети и возвращающая результаты.

Клиент локальной сети - компонент, запрашивающий услуги у некоторого сервера и сервером - компонент, оказывающий услуги некоторым клиентам.

Системная архитектура "клиент-сервер".

Чтобы прикладная программа, выполняющаяся на рабочей станции, могла запросить услугу у сервера, требуется некоторый интерфейсный программный слой, поддерживающий такое взаимодействие. Из этого вытекают основные принципы системной архитектуры "клиент-сервер".

Система разбивается на две части, которые могут выполняться в разных узлах сети, - клиентскую и серверную части. Прикладная программа или конечный пользователь взаимодействуют с клиентской частью системы, которая обеспечивает надсетевой интерфейс. Клиентская часть системы при потребности обращается по сети к серверной части. Интерфейс серверной части определен и фиксирован. Поэтому возможно создание новых клиентских частей существующей системы.

Основной проблемой систем, основанных на архитектуре "клиент-сервер", является то, что в соответствии с концепцией открытых систем от них требуется мобильность в как можно более широком классе аппаратно-программных решений открытых систем. Попытки создания систем, поддерживающих все возможные протоколы, приводит к их перегрузке сетевыми деталями в ущерб функциональности.

Еще 1 проблема связана с возможностью использования разных представлений данных в узлах неоднородной локальной сети. В разных компьютерах может существовать различная адресация, представление чисел, кодировка символов и т.д. Это особенно существенно для серверов высокого уровня: телекоммуникационных, вычислительных, БД.

Общим решением проблемы мобильности систем, основанных на архитектуре "клиент-сервер", являются программные пакеты, реализующие протоколы удаленного вызова процедур (RPC - Remote Procedure Call). При использовании таких средств обращение к сервису в удаленном узле выглядит как обычный вызов процедуры. Средства RPC, в которых содержится вся информация о специфике аппаратуры локальной сети и сетевых протоколов, переводит вызов в последовательность сетевых взаимодействий. Тем самым, специфика сетевой среды и протоколов скрыта от прикладного программиста.

При вызове удаленной процедуры программы RPC производят преобразование форматов данных клиента в промежуточные машинно-независимые форматы и затем преобразование в форматы данных сервера. При передаче ответных параметров производятся аналогичные преобразования. Если система реализована на основе стандартного пакета RPC, она может быть легко перенесена в любую открытую среду.

Серверы БД.

Сервер БД используют для обозначения всей СУБД, основанной на архитектуре "клиент-сервер", включая и серверную, и клиентскую части. Такие системы предназначены для хранения и обеспечения доступа к БД.

1) Принципы взаимодействия м/д клиентскими и серверными частями.

Доступ к БД от прикладной программы или пользователя производится путем обращения к клиентской части системы. В качестве основного интерфейса между клиентской и серверной частями выступает язык БД SQL. Он представляет собой текущий стандарт интерфейса СУБД в открытых системах.

Серверы БД, интерфейс которых основан исключительно на языке SQL, обладают своими "+" и "-". Очевидное "+" - стандартность интерфейса, а "-" - на стороне клиента работает мало программ СУБД. Это нормально, если на стороне клиента используется маломощная рабочая станция.

2) Преимущества протоколов удаленного вызова процедур.

Протоколы RPC важны в СУБД, основанных на архитектуре "клиент-сервер".

- механизм удаленных процедур позволяет перераспределять функции между клиентской и серверной частями системы, т.к. в тексте программы удаленный вызов процедуры ничем не отличается от локального вызова, и, следовательно, любой компонент системы может располагаться и на стороне сервера, и на стороне клиента.

- механизм удаленного вызова скрывает различия между взаимодействующими компьютерами. Физически неоднородная локальная сеть приводится к логически однородной сети взаимодействующих программных компонентов.

3) Разделение функций м/д клиентами и серверами.

На стороне клиента СУБД работает только такое ПО, которое не имеет непосредственного доступа к БД, а обращается для этого к серверу с использованием языка SQL. В некоторых случаях хотелось бы включить в состав клиентской части системы некоторые функции для работы с "локальным кэшем" БД, т.е. с той ее частью, которая интенсивно используется клиентской прикладной программой. В современной технологии это можно сделать только путем формального создания на стороне клиента локальной копии сервера БД и рассмотрения всей системы как набора взаимодействующих серверов.

Требования к аппаратуре и ПО клиентских и серверных компьютеров различаются в зависимости от вида использования системы.

26. Распределенные БД: разновидности распределенных систем, распределенная СУБД System R, интегрированные или федеративные системы и мультибазы данных.

Основная задача распределенных СУБД (РСУБД) состоит в обеспечении средства интеграции локальных БД, располагающихся в узлах вычислительной сети, чтобы пользователь имел доступ ко всем частям БД, как к единой БД. РСУБД обеспечивают 1) простоту использования системы; 2) возможности автономного функционирования при нарушениях связности сети или при административных потребностях; 3) высокую степень эффективности.

Разновидности распределенных систем.

Бывают однородные и неоднородные распределенные БД (РБД). В однородном случае каждая локальная БД управляется одной и той же СУБД. В неоднородной системе локальные БД могут относиться к разным моделям данных. Сетевая интеграция неоднородных БД - это актуальная, но очень сложная проблема. Многие решения известны на теоретическом уровне. Есть практическое решение - интеграция неоднородных SQL-ориентированных систем (из-за стандартизации языка SQL). Пример однородной РСУБД - System R* (далее SR*).

Распределенная СУБД System R*.

1. Простота использования: пользователи остаются в среде SQL. Возможность использования SQL основывается на обеспечении SR* прозрачности местоположения данных: сама система обнаруживает место, указанное в запросе объектов данных; одна и та же прикладная программа может быть выполнена в разных узлах, при этом в каждом узле при компиляции запроса строится свой оптимальный план.

2. Автономное функционирование: позволяет локальные БД администрировать независимо от других (автономное подключение новых пользователей, смена версии автономной части системы и т.д.). В ней нет централизованной службы именования объектов. В узлах не требуется знания об операциях, выполняющихся в других узлах сети; работа с доступными БД может продолжаться при выходе из строя отдельных узлов сети или линий связи.

3. Эффективность достигается 2-мя путями: 1) Как и в System R, в System R* выполнению запроса предшествует его компиляция. В ходе этого процесса производится поиск употребляемых в запросе имен объектов БД в распределенном каталоге и замена имен на внутренние идентификаторы; проверка прав доступа пользователя, от имени которого производится компиляция, и выбор наиболее оптимального глобального плана выполнения запроса, который затем подвергается декомпозиции и по частям рассылается в соответствующие узлы сети, где производится выбор оптимальных локальных планов выполнения компонентов запроса и происходит генерация модулей доступа в машинных кодах. В результате много действий производится на стадии компиляции до реального выполнения запроса. Обработанная посредством прекомпилятора SR* прикладная программа, включающая предложения SQL, может в далее выполняться много раз без дополнительных накладных расходов. 2) Возможность перемещения удаленных отношений в локальную БД. Диалект SQL, используемый в SR*, включает предложение MIGRATE TABLE, позволяющее выполнить перемещение. Оно обеспечивает более эффективную реализацию транзакций.

Средства, предложенные на начальной стадии проекта:

1. Средства горизонтального и вертикального разделения отношений РБД. Средства горизонтального разделения выполняют разбиение отношения на ряд подотношений, содержащих кортежи, удовлетворяющие условию и каждое подотношение рассылается в указ. узел для хранения в указ. сегменте. Средства вертикального разбиения образуют набор подотношений с помощью проекции зад. отношения на атрибуты из зад. списка. Затем аналогично рассылаются.

2. Средства дублирования отношений в нескольких узлах с поддержкой согласованности копий, которое производит рассылку копий указанного отношения для хранения в именованных сегментах указанных узлов сети. Система должна автоматически поддерживать согласованность копий.

3. Средства поддержания мгновенных снимков состояния БД в соответствии с заданным запросом. Их можно рассматривать как материализованные представления базы данных. Имя мгновенного снимка можно было бы использовать прямо в запросе на выборку там, где можно использовать имена базовых отношений или представлений. Большие проблемы связаны с обновлением отношений через их мгновенные снимки, поскольку в момент обновления содержимое мгновенного снимка может расходиться с текущим содержимым базового отношения.

Аспекты проекта SR*, которые реализованы:

1. Именование объектов и организация распределенного каталога.

В БД System R полное имя отношения: имя пользователя и имя отношения. В запросах можно указывать только имя отношения. В БД SR* системное имя отношения включает: идентификатор пользователя-создателя отношения; идентификатор узла сети, в котором выполнялась операция создания отношения; локальное имя отношения, присвоенное ему при создании; идентификатор узла, в котором отношение располагалось непосредственно после своего создания.

В запросах можно использовать как системное имя, так и локальное. 2 интерпретации локальных имен: часть системного имени и синоним системного имени, созданный оператором SQL и сохраненный в лок.каталоге.

Концепция распределенного каталога SR* основана на наличии у каждого объекта РБД уникального системного имени. Принято следующее соглашение: информация о размещении любого объекта БД сохраняется в локальном каталоге того узла, в котором объект располагался непосредственно после создания. Для получения полной информации об отношении необходимо сначала воспользоваться локальным каталогом узла, в котором происходит компиляция, затем обратиться к удаленному каталогу родового узла данного отношения и в заключение воспользоваться каталогом текущего узла.

2. Распределенная компиляция запросов.

Главный узел - узел сети, в котором инициирован процесс компиляции предложения SQL, и дополнительные узлы - те узлы, которые вовлекаются в этот процесс в ходе его выполнения.

Этапы компиляции:

1) В главном узле производится грамматический разбор предложения SQL с построением внутреннего представления запроса в виде дерева.

2) В главном узле генерируется глобальный план выполнения запроса, в котором учитывается лишь порядок взаимодействий узлов при реальном выполнении запроса.

3) Если в глобальном плане выполнения запроса участвуют дополнительные узлы, производится его декомпозиция на части, каждую из которых можно выполнить в одном узле. Соответствующие части запроса (во внутреннем представлении) рассылаются в дополнительные узлы.

4) Эта стадия включает 2 последние фазы процесса компиляции запроса в System R: оптимизацию и генерацию машинных кодов. Производится проверка прав пользователя; происходит обработка представлений базы; осуществляется локальная оптимизация обрабатываемой части запроса; генерация кода.

3. Управление транзакциями и синхронизация.

Выполнение транзакции в SR* является распределенным. Выполнение одной транзакции, инициированной в некотором узле сети, влечет инициирование транзакций в дополнительных узлах. Основной проблемой является проблема согласованного завершения распределенной транзакции, чтобы результаты ее выполнения во всех затронутых ею узлах были либо отображены в состояние локальных БД, либо полностью отсутствовали. Для её решения используется протокол: есть ряд независимых транзакций-участников распределенной транзакции, выполняющихся под управлением транзакции-координатора. Решение об окончании распределенной транзакции принимается координатором. 1) координатор передает каждому из участников сообщение "подготовиться к завершению". Получив такое сообщение, каждый участник переходит в состояние готовности как к немедленному завершению транзакции, так и к ее откату. После этого каждый участник, успешно выполнивший подготовительные действия, посылает координатору сообщение "готов к завершению". 2) Если координатор получает такие сообщения ото всех участников, то он рассылает всем участникам сообщение "завершить транзакцию", и это считается завершением распределенной транзакции. Если не все участники успешно выполнили первую фазу, то координатор рассылает всем участникам сообщение "откатить транзакцию".

Основной проблемой является проблема возможных распределенных тупиков, которые могут возникнуть между несколькими распределенными транзакциями, выполняющимися параллельно. (Тупики между транзакциями - участниками одной распределенной транзакции невозможны, т.к. все участники получают один общий идентификатор транзакции и не конфликтуют по синхронизации). Для обнаружения распределенных синхронизационных тупиков в SR* применяется распределенный алгоритм, не нарушающий требования автономности узлов сети, минимизирующий число передаваемых по сети сообщений и выполняющий необходимую процессорную обработку.

Интегрированные или федеративные системы и мультибазы данных.

Направление интегрированных или федеративных систем неоднородных БД и мульти-БД появилось в связи с необходимостью комплексирования систем БД, основанных на разных моделях данных и управляемых разными СУБД. Основная задача интеграции неоднородных БД - предоставление пользователям интегрированной системы глобальной схемы БД, представленной в некоторой модели данных, и автоматическое преобразование операторов манипулирования БД глобального уровня в операторы, понятные соответствующим локальным СУБД.

При строгой интеграции неоднородных БД локальные системы БД утрачивают свою автономность. После включения локальной БД в федеративную систему все дальнейшие действия с ней, включая администрирование, должны вестись на глобальном уровне. Т.к. пользователи часто не соглашаются утрачивать локальную автономность, но при этом хотят работать со всеми локальными СУБД на одном языке и формулировать запросы с одновременным указанием разных локальных БД, развивается направление мульти-БД. В системах мульти-БД не поддерживается глобальная схема интегрированной БД и применяются специальные способы именования для доступа к объектам локальных БД. Как правило, в таких системах на глобальном уровне допускается только выборка данных. Это позволяет сохранить автономность локальных БД.

Часто интегрировать приходится неоднородные БД, распределенные в вычислительной сети. Это в значительной степени усложняет реализацию. Дополнительные проблемы: управление глобальными транзакциями, сетевая оптимизация запросов и т.д. Очень трудно добиться эффективности. Для внешнего представления интегрированных и мульти-БД используется реляционная модель данных. В последнее время все чаще предлагается использовать объектно-ориентированные модели, но на практике пока основой является реляционная модель. Поэтому включение в интегрированную систему локальной реляционной СУБД существенно проще и эффективнее, чем включение СУБД, основанной на другой модели данных.

27. Объектно-ориентированные СУБД: связь объектно-ориентированных СУБД с общими понятиями объектно-ориентированного подхода, объектно-ориентированные модели данных, языки программирования объектно-ориентированных баз данных, языки запросов объектно-ориентированных баз данных, примеры объектно-ориентированных СУБД.

Связь объектно-ориентированных СУБД с общими понятиями объектно-ориентированного подхода.

Основные концепции объектно-ориент.подхода: 1) понятие объекта и идентификатора объектов; 2) атрибуты и методы объектов; 3) понятие класса; 4) наследование, инкапсуляция и полиморфизм.

ООБД расширяют набор этих концепций, добавляя 3 аспекта: 1) потребность в средствах спецификации знаний при определении класса (ограничений целостности, правил дедукции и т.п.); 2) потребность в механизме определения разного рода семантических связей между объектами разных классов; 3) в контексте ООБД оказывается более удобным рассматривать класс как множество объектов данного типа, т.е. одновременно поддерживать понятия и типа и класса объектов.

Объектно-ориентированные модели данных.

У объектно-ориент.модели данных нет строгого математического аппарата.

Рассмотрим модель данных реально применяемую в ООСУБД О2.

В O2 поддерживаются объекты и значения. Объект - это пара (идентификатор, значение), причем объекты инкапсулированы, т.е. их значения доступны только через методы. Значения могут быть атомарными или структурными. Структурные значения строятся из значений или объектов, представленных своими идентификаторами, с помощью конструкторов множеств, кортежей и списков. Элементы структурных значений доступны с помощью предопределенных операций (примитивов).

Разделяется понятие типа и класса. Каждому классу сопоставляется тип, описывающий структуру экземпляров класса. Типы определяются рекурсивно на основе атомарных типов и ранее определенных типов и классов с применением конструкторов.

Объекты и значения могут быть именованными. С именованием объекта или значения связана долговременность его хранения: любые именованные объекты или значения долговременны; любые объект или значение, входящие как часть в другой именованный объект или значение, долговременны.

Метод - программный код, привязанный к конкретному классу и применимый к объектам этого класса. Определение метода в O2 производится в два этапа. 1) объявляется сигнатура метода, т.е. его имя, класс, типы или классы аргументов и тип или класс результата. Методы могут быть публичными или приватными; 2) определяется реализация класса на одном из языков программирования O2.

В модели O2 поддерживается множественное наследование классов на основе отношения супертип/подтип. В подклассе допускается добавление и/или переопределение атрибутов и методов. Объект подкласса является объектом каждого суперкласса, на основе которого порожден данный подкласс.

Языки программирования ООБД.

ООСУБД - объединение системы программирования и СУБД.

ООБД - это объектно-ориентированная система программирования, включающая средства работы с долговременными объектами. "Естественность" включения средств работы с БД в язык программирования означает, что работа с долговременными (хранимыми во внешней БД) объектами должна происходить на основе тех же синтаксических конструкций (и с той же семантикой), что и работа с временными, существующими только во время работы программы объектами.

Языки программирования ООБД и БД различаются только терминологически; существенным отличием является поддержание в языках первого класса подхода к наследованию классов. Языки второго класса более развиты как в отношении системы типов, так и в отношении управляющих конструкций.

Есть потребность в языках запросов, которые можно было бы использовать в интерактивном режиме. Если доступ к объектам внешней БД в языках программирования ООБД носит в основном навигационный характер, то для языков запросов удобен декларативный стиль. Декларативные языки запросов к ООБД менее развиты, чем языки программирования ООБД, и при их реализации возникают существенные проблемы.

Полностью разработанного языка прогр-ия для ООБД нет. Используются уже существующие объектно-ориент.языки. Язык Smalltalk80 оказал влияние на разработку первых ООСУБД.

Близость объектно-ориент.языков и функционального подхода позволила использовать функциональные языки (Лисп - основа проекта Orion).

Также были разработаны различные модификации языка Си, например, СО2. Язык СО2 не является полностью самостоятельным.

Этот язык входит в многоязыковую среду O2 и предназначен для программирования методов ранее определенных классов. Определение классов, сигнатур методов и имен, постоянно хранимых значений и объектов производится с использованием отдельного языка определения схемы БД.

Поддерживается операция порождения нового объекта указанного класса. В отличие от языка Си в CO2 невозможно совместить создание нового объекта с его инициализаций (понятие метода-конструктора не поддерживается). Для инициализации необходимо явно обратиться к соответствующему методу класса с указанием вновь созданного объекта.

CO2 включает средства конструирования значений-кортежей, множеств и списков. Понятие значения-кортежа фактически эквивалентно понятию значения-структуры обычного языка Си (но элементами кортежа могут являться объекты, множества и списки). Для значений-множеств и списков поддерживаются операции добавления и изъятия элементов, а также набор теоретико-множественных операций (конкатенация).

Основой манипулирования объектами, хранимыми в БД, является средство итерации. Итератор применим к значениям-множествам или спискам. Итератор языка CO2 обеспечивает явную навигацию в классах объектов.

Языки запросов объектно-ориентированных баз данных.

Существует 3 подхода к организации языков запросов ООБД: 1) языки, являющиеся объектно-ориентированными расширениями языков запросов реляционных систем. Наиболее распространены языки с синтаксисом, близким к известному языку SQL; 2) построение полного логического объектно-ориентированного исчисления. По поводу построения такого исчисления имеются теоретические работы, но законченный и практически реализованный язык запросов нам неизвестен; 3) применение дедуктивного подхода.

Основой для формулирования запроса должен служить класс, представляющий в ООБД множество однотипных объектов, тогда результатом запроса является некоторое подмножество объектов-экземпляров класса. Это довольно ограничительный подход, поскольку автоматически исключает возможность наличия в языке запросов средств, аналогичных реляционному оператору соединения.

Примеры декларативных языков запросов:

1. В языке запросов ООСУБД ORION полностью поддерживается принцип инкапсуляции объектов. Запросы могут основываться только на одном классе. Синтаксис языка ориентирован на SQL. Очень развит набор допустимых предикатов селекции. В частности, для атрибута, доменом которого является суперкласс, можно указать имя интересующего пользователя подкласса.

2. Язык запросов системы Iris находится под влиянием реляционной парадигмы. Даже название этого языка OSQL отражает его связь с реляционным языком SQL. По сути дела, OSQL - это реляционный язык, рассчитанный на работу с ненормализованными отношениями. Естественно, при таком подходе в OSQL нарушается инкапсуляция объектов.

3. Декларативный язык запросов системы O2 RELOOP. В общих словах, это язык запросов с SQL-ориентированным синтаксисом, основанный на специально разработанной для модели O2 алгебре объектов и значений. Запрос задается на значении-множестве или списке. Долговременному классу в O2 соответствует одноименное значение-множество, то тем самым можно определить запрос на любом хранимом классе. Результатом запроса может являться объект, значение-множество или значение-список. При этом элементами значений-множеств могут являться объекты, либо значения-кортежи с элементами-объектами разных классов. В совокупности эти особенности языка позволяют формулировать запросы над несколькими классами, а также употреблять вложенные подзапросы.

Основная цель оптимизации запроса в системе ООБД - создание оптимального плана выполнения запроса с использованием примитивов доступа к внешней памяти ООБД.

Основная сложность оптимизации запросов к ООБД следует из того, что в этом случае условия выборки формулируются в терминах "внешних" атрибутов объектов (методов), а для реальной оптимизации требуются условия, определенные на "внутренних" атрибутах (переменных состояния). Также проблемы возникают из-за того, что методы программ-ся на процедурном языке и точная реализация метода и структуры объекта могут быть неизвестны при компиляции (позднее связывание). Для решения части проблем предлагается открыть видимость некоторых внутренних атрибутов объектов.

Примеры объектно-ориентированных СУБД.

1. Проект ORION (с 1985 по 1989 г. фирмой MCC). ORION-1 - однопользовательская система; ORION-1SX, предназначенная для использования в качестве сервера в локальной сети рабочих станций; ORION-2 - полностью распределенная ООСУБД. Реализация всех систем производилась с использованием языка Common Lisp на рабочих станциях (и их локальных сетях) Symbolics 3600 с ОС Genera 7.0 и SUN-3 в среде ОС UNIX.

В ORION-1 все компоненты располагаются на одной рабочей станции; в ORION-1SX - разнесены между разными рабочими станциями (в частности, управление объектами производится на рабочей станции-клиенте). Применение в ORION-1SX для взаимодействия клиент-сервер механизма удаленного вызова процедур позволило использовать в этой системе практически без переделки многие модули ORION-1.

3 компонента этой ООСУБД: 1) функции подсистемы управления памятью: распределение внешней памяти, перемещение страниц из буферов ОЗУ во внешнюю память и наоборот, поиск и размещение объектов в буферах ОЗУ. Она ответственна за поддержание вспомогательных индексных структур, предназначенных для ускорения выполнения запросов; 2) подсистема управления объектами включает подкомпоненты обработки запросов, управления схемой и версиями объектов. При обработке запросов используется техника оптимизации, аналогичная применяемой в реляционных системах (т.е. формируется набор возможных планов выполнения запроса, оценивается стоимость каждого из них и выбирается для выполнения наиболее дешевый); 3) Подсистема управления транзакциями обеспечивает сериализуемость транзакций, а также поддерживает средства журнализации изменений и восстановления БД после сбоев. Журнал изменений обеспечивает откаты индивидуальных транзакций и восстановление БД после мягких сбоев.

2. Проект О2 (компания Altair, образованной специально для целей проектирования и реализации ООСУБД. Проект начался с 1986 г., и он был рассчитан на пять лет. После успешного завершения проекта для сопровождения системы и ее дальнейшего развития была организована новая коммерческая компания O2).

Прототип системы функционировал в режиме клиент/сервер в локальной сети рабочих станций SUN c соответствующим разделением функций между сервером и клиентами.

Основными компонентами системы являются интерпретатор запросов и подсистемы управления схемой, объектами и дисками.

Функции системы управления объектами:

- создание и уничтожение объектов, выборку объектов по именам, поддержку предопределенных методов, поддержку объектов со внутренней структурой-множеством, списком и кортежем;

- управление передачей сообщений между объектами;

- управление транзакциями;

- управление коммуникационной средой (на базе транспортных протоколов TCP/IP в локальной сети Ethernet);

- отслеживание долговременно хранимых объектов;

- управление буферами ОЗУ;

- управление кластеризацией объектов во внешней памяти;

- управление индексами.

Различаются режимы, когда допускается параллельное выполнение транзакций, изменяющих схему БД, и когда параллельно выполняются только транзакции, изменяющие внутренность БД. Первый режим обычно используется на стадии разработки БД, второй - на стадии выполнения приложений. Средства восстановления БД после сбоев и откатов транзакций также могут включаться и выключаться.

Компонент управления схемой БД реализован над подсистемой управления объектами: в системе поддерживаются несколько невидимых для программистов классов и в том числе классы "Class" и "Method", экземплярами которых являются, соответственно, объекты, определяющие классы, и объекты, определяющие методы. Удаление класса, который не является листом иерархии классов или используется в другом классе или сигнатуре какого-либо метода, запрещено.

Вывод: "+" ООСУБД - возможность отображать информацию о сложных взаимосвязях объектов. "-" ООСУБД - высокая понятийная сложность, неудобства обработки данных, низкая скорость выполнения запросов.

Раздел 6. Сети ЭВМ и телекоммуникации

28. Передача дискретных данных: линии связи, методы передачи дискретных данных на физическом уровне, методы передачи данных канального уровня, методы коммутации.

Линия связи (канал связи) - физическая среда (кабель, атмосфера, космическое пространство), по которой передаются информационные сигналы, аппаратура передачи данных и промежуточная аппаратура. Линии связи: проводные (воздушные) - провода без изолирующих или экранирующих оплеток; кабельные (медные и волоконно-оптические) - проводник, заключенный в несколько слоев изоляции; радиоканалы наземной и спутниковой связи - передатчик и приемник радиоволн. Аппаратура передачи данных (модемы, терминальные адаптеры сетей ISDN, устройства подключения к цифровым каналам)- связывает компьютеры или локальные сети с линией связи. Работает на физическом уровне, отвечая за передачу и прием сигнала нужной формы и мощности в физическую среду. Аппаратура, вырабатывающая данные для передачи по линии связи и подключаемая к аппаратуре передачи данных - оконечное оборудование данных (маршрутизаторы, компьютеры). Промежуточная аппаратура используется на линиях связи большой протяженности (глобальные сети), решает две основные задачи: улучшение качества сигнала; создание постоянного составного канала связи между двумя абонентами сети. В зависимости от типа промежуточной аппаратуры линии связи делятся на аналоговые и цифровые. В аналоговых линиях - сигналы имеют непрерывный диапазон значений. В цифровых линиях - сигналы имеют конечное число состояний. Характеристики линий связи. Спектральный анализ сигналов на линиях связи. Любой периодический процесс можно представить в виде суммы синусоидальных колебаний различных частот и различных амплитуд. Непериодические сигналы представляют в виде интеграла синусоидальных сигналов с непрерывным спектром частот. Искажение передающим каналом синусоиды какой-либо частоты приводит к искажению передаваемого сигнала любой формы. Степень искажения синусоидальных сигналов линиями связи оценивается с помощью амплитудно-частотной характеристики, полосы пропускания и затухания на определенной частоте. Амплитудно-частотная характеристика показывает, как затухает амплитуда (мощность сигнала) синусоиды на выходе линии связи по сравнению с амплитудой (мощность) на ее входе для всех возможных частот передаваемого сигнала. Полоса пропускания - непрерывный диапазон частот, для которого отношение амплитуды выходного сигнала ко входному превышает некоторый заранее заданный предел, обычно 0,5. То есть полоса пропускания определяет диапазон частот синусоидального сигнала, при которых этот сигнал передается по линии связи без значительных искажений. Ширина полосы пропускания влияет на максимальную скорость передачи информации. Затухание - относительное уменьшение амплитуды (мощности сигнала) при передаче по линии сигнала определенной частоты. Измеряется в децибелах, вычисляется A = 10 log10 Pвых / Рвх, где Pвых - мощность сигнала на выходе линии, Рвх - на входе. Затухание всегда является отрицательной величиной. Абсолютный уровень мощности в децибелах. Базовое значение мощности 1 мВт. Уровень мощности - p = 10 log10P / 1 мВт [дБм - децибел на 1 мВт], где Р - мощность сигнала в милливаттах. Пропускная способность линии характеризует максимально возможную скорость передачи данных по линии связи (в бит/с). Зависит от амплитудно-частотной характеристики, спектра передаваемых сигналов, от способа кодирования сигналов. Если значимые гармоники сигнала попадают в полосу пропускания, то сигнал передается без искажений. Количество изменений информационного параметра сигнала в секунду измеряется в бодах. Связь между пропускной способностью и полосой пропускания: С=F log2 (1+Pc / Pш) (Клод Шеннон), где С - максимальная пропускная способность в битах в секунду, F - ширина полосы пропускания в герцах, Pc - мощность сигнала, Pш - мощность шума. Близкое к данной формуле соотношение (Найквист): C=2F log2M, где М - количество различимых состояний информационного параметра. Помехоустойчивость - способность уменьшать уровень помех, создаваемых во внешней среде, на внутренних проводниках. Зависит от типа используемой физической среды, от экранирующих параметров линии. Перекрестные наводки на ближнем конце - помехоустойчивость ко внутренним источникам помех, когда электромагнитное поле сигнала, передаваемого выходом передатчика по одной паре проводов, наводит на другую пару проводников сигнал помехи. Достоверность передачи данных (интенсивность битовых ошибок) - вероятность искажения для каждого передаваемого бита данных. Методы передачи дискретных данных на физическом уровне. При передаче по физическим каналам применяются два типа кодирования: на основе синусоидального несущего сигнала (аналоговая модуляция) и на основе последовательности прямоугольных импульсов (цифровое кодирование). Аналоговая модуляция применяется для передачи дискретных данных по каналам с узкой полосой пропускания (телефон). Информация кодируется изменением амплитуды, частоты или фазы синусоидального сигнала несущей частоты. При амплитудной модуляции для логической единицы выбирается один уровень амплитуды, для нуля - другой. При частотной модуляции значения 1 и 0 даются синусоидами с различной частотой - f0 и f1. При фазовой модуляции 0 и 1 соответствуют сигналы одинаковой частоты, но с разной фазой. В скоростных модемах используются комбинированные методы модуляции. При цифровом кодировании дискретной информации применяют потенциальные и импульсные коды. В потенциальных кодах для представления логических 1 и 0 используется только значение потенциала сигнала, a его перепады во внимание не принимаются. Импульсные коды позволяют представить двоичные данные либо импульсами определенной полярности, либо частью импульса - перепадом потенциала определенного направления. Методы передачи данных канального уровня. Канальный уровень обеспечивает передачу пакетов данных, поступающих от протоколов верхних уровней. Протоколы канального уровня оформляют переданные им пакеты в кадры собственного формата. Протокол канального уровня имеет локальный смысл, он предназначен для доставки кадров данных в пределах сетей с простой топологией. Другой областью действия протоколов канального уровня являются связи типа "точка-точка" глобальных сетей, когда протокол канального уровня ответственен за доставку кадра непосредственному соседу. Характеристики протоколов канального уровня: 1) асинхронный/синхронный; 2) символьно-ориентированный /бит-ориентированный; 3) с предварительным установлением соединения/дейтаграммный; 4) с обнаружением искаженных данных/без обнаружения; 5)с обнаружением потерянных данных/без обнаружения; 6) с восстановлением искаженных и потерянных данных/без восстановления; 7) с поддержкой динамической компрессий данных/без поддержки. Асинхронные протоколы оперируют отдельными символами, которые представлены байтами со старт-стоповыми символами. Используются наборы символов ASCII или EBCDIC. Пользовательские данные могут оформляться в кадры, но байты в кадрах всегда отделяются друг от друга стартовыми и стоповыми сигналами. В синхронных протоколах все обмены данными осуществляются кадрами, которые имеют заголовок, поле данных и концевик, все биты кадра передаются непрерывным синхронным потоком. Синхронные протоколы бывают символьно-ориентированные (для передачи блоков отображаемых символов) и бит-ориентированные (передача двоичных и символьных данных). Синхронизация в символьно-ориентированных протоколах за счет добавления управляющих символов, в бит-ориентированных за счет добавления стартового и стопового флагов. В дейтаграммных протоколах отсутствует процедура предварительного установления соединения, и за счет этого срочные данные отправляются в сеть без задержек. Протоколы с установлением соединения часто обладают способностью восстановления искаженных и потерянных кадров. Методы обнаружения ошибок - контрольные суммы: контроль по паритету (суммирование по модулю 2 всех бит контролируемой информации); вертикальный и горизонтальный контроль по паритету (исходные данные в виде матрицы, контрольный разряд подсчитывается для каждой строки и столбца); циклический избыточный контроль (исходные данные в виде одного многоразрядного двоичного числа. В качестве контрольной информации остаток от деления этого числа на известный делитель R). Для восстановления информации используется метод повторной передачи на основе квитанций (метод с простоями - источник кадра ожидает прихода квитанции от приемника, метод "скользящего окна" - передается некоторое количество кадров в непрерывном режиме). Для повышения полезной скорости передачи в сетях применяется динамическая компрессия данных. Методы коммутации. Коммутация обеспечивает доступность физических каналов одновременно для нескольких сеансов связи между абонентами. В сетях с коммутацией каналов абонентов соединяет составной канал, образуемый коммутаторами сети по запросу одного из абонентов. Для совместного разделения каналов между коммутаторами сети с несколькими абонентскими каналами используются две технологии: частотного мультиплексирования и мультиплексирования с разделением времени. Для разделения абонентских каналов характерна техника модуляции высокочастотного несущего синусоидального сигнала низкочастотным речевым сигналом. В результате спектр модулированного сигнала переносится в другой диапазон, который симметрично располагается относительно несущей частоты и имеет ширину, приблизительно совпадающую с шириной модулирующего сигнала. Временное разделение ориентировано на дискретный характер передаваемых данных. Аппаратура сетей с временным разделением - мультиплексоры, коммутаторы, демультиплексоры. Мультиплексор принимает от каждого канала байт данных, составляет из принятых байт уплотненный кадр - обойму, передает кадр. Демультиплексор принимает кадр, разбирает обойму и передает байты на свои выходы в соответствии с их порядковым номером. Способы передачи данных по линиям связи делятся на симплексный, полудуплексный, дуплексный. Коммутация пакетов. Все данные разбиваются на исходном узле на части - пакеты (произвольной длины). Пакет имеет заголовок и порядковый номер (для сбора). Пакеты передаются по сети как независимые блоки. Коммутаторы принимают пакеты (имеются специальные буферы для хранения пакетов) и передают их узлу назначения. Режим работы дейтаграммный. Передача пакетов по виртуальному каналу (динамические или постоянные) - перед началом передачи устанавливается виртуальный канал, который представляет единственный маршрут, который соединяет конечные узлы. При коммутации сообщений сообщение передается через несколько транзитных компьютеров, где оно целиком буферизуется на диске. 29. Локальные сети: протоколы и стандарты локальных сетей, протокол LLC уровня управления логическим каналом (802.2), технология Ethernet (802.3), технология Token Ring (802.5), технология FDDI, Fast Ethernet и lOOVG-AnyLAN как развитие технологии Ethernet, высокоскоростная технология Gigabit Ethernet. Организация взаимодействия в локальных сетях основана на использовании разделяемых сред. В разделяемом сегменте всегда работают в полудуплексном режиме. Идет тенденция на отказ от разделяемых сред: соединение узлов индивидуальными связями, использование коммутируемых связей и микросегментации. Появился полнодуплексный режим работы для всех технологий локальных сетей. В 1980 г. в IEEE был организован комитет 802 по стандартизации ЛВС, принявший стандарты IEEE 802.х, содержащие рекомендации по проектированию нижних уровней ЛВС (физического и канального). Канальный уровень в ЛВС делится на два подуровня: 1) логической передачи данных (LLC) - передача кадров между узлами, интерфейс с сетевым уровнем; 2) управления доступом к среде (MAC) - предоставляет общую среду в распоряжение той или иной станции сети. Определяет специфику технологий Ethernet, Token Ring, FDDI и т.д. Протоколы LLC и MAC взаимно независимы. У каждой технологии единственному протоколу MAC соответствует несколько протоколов физического уровня. Протокол LLC обеспечивает услуги транспорта, передавая кадры либо дейтаграммным методом, либо с помощью процедур с установлением соединения и восстановления кадров. Промежуточное место между протоколами сетевого уровня и MAC. LLC предоставляет три типа процедур: LLC1 - без установления соединения и подтверждения, LLC2 - с установлением соединения и подтверждением, LLC3 - без установления соединения, с подтверждением. Кадры уровня LLC: 1) информационные - для передачи информации в LLC2; 2) управляющие - для передачи команд и ответов в LLC2; 3) ненумерованные - для передачи ненумерованных команд и ответов, выполняющих в процедурах без установления соединения передачу информации, идентификацию и тестирование LLC-уровня, а в LLC2 - установление и разъединение логического соединения и информирование об ошибках. Формат кадров LLC: Адресные поля DSAP и SSAP показывают службу верхнего уровня пересылающую данные. Data - пакет протоколов вышележащих уровней. В режиме LLC1 используются только ненумерованные кадры (Control 1 байт). В LLC2 - все три типа кадров. Ethernet - самый распространенный стандарт ЛВС. Используется коллективный метод доступа к среде передачи данных с опознаванием несущей и обнаружением коллизий. Он применяется в сетях с общей шиной. Все передаваемые данные помещаются в кадры определенной структуры и снабжаются уникальным адресом станции назначения. Для передачи кадра, проверяется свободность разделяемой среды - прослушиванием несущей частоты. Все станции могут распознавать факт передачи кадра и та станция, которая узнает свой адрес в заголовке кадра, записывает его содержимое в буфер, обрабатывает их, посылает кадр-ответ. Возможна ситуация, когда две станции решают передать кадр - коллизия. Чтобы корректно обработать коллизию все станции наблюдают за возникающими в кабеле сигналами. Если передаваемые и наблюдаемые сигналы отличаются - фиксируется обнаружение коллизии. После этого обнаружившая коллизию передающая станция обязана прекратить передачу и сделать паузу в течение короткого случайного интервала времени. Затем она снова может предпринять попытку захвата среды и передачи кадра. Случайная пауза выбирается по алгоритму: Пауза = L* (интервал отсрочки), где интервал отсрочки равен 512 битовым интервалам (временем между появлением двух последовательных бит данных на кабеле), L - целое число, выбранное с равной вероятностью из интервала [0,2N], где N - номер повторной попытки передачи данного кадра: 1..10. Если после 16 последовательных попыток передачи кадра вызывают коллизию, то передатчик должен прекратить попытки и отбросить этот кадр. Четкое распознавание коллизий всеми станциями сети является необходимым условием корректной работы в сети Ethernet. Если передающая станция не распознает коллизию и решит, что кадр данных ею передан верно, то данный кадр будет утерян. Для надежного распознавания коллизий должно выполняться следующее соотношение Tmin >= PDV, где Tmin - время передачи кадра минимальной длины, а PDV (время двойного оборота) - время, за которое сигнал коллизии успевает распространиться до самого дальнего узла сети. Максимально возможная пропускная способность сегмента Ethernet для кадров максимальной длины составляет 813 кадр/с. Полезная пропускная способность - скорость передачи пользовательских данных, которые переносятся полем данных кадра. Для кадров минимальной длины полезная пропускная способность равна 5,48 Мбит/с. Для кадров максимальной длины - 9,76 Мбит/с. В сетях Ethernet используются кадры 4-х различных типов: 1) кадр 802.3/LLC - кадр МАС подуровня, в его поле данных вкладывается кадр подуровня LLC с удаленными флагами начала и конца кадра; 2) кадр Raw 802.3 - кадр подуровня МАС, но без вложенного кадра подуровня LLC$ 3) кадр Ethernet DIX 4) кадр Ethernet SNAP - для устранения разнобоя в кодировках протоколов. Физические спецификации технологии Ethernet включают следующие среды передачи данных: 1) 10Base-5 - толстый коаксиал 2) 10Base-2 - тонкий коаксиал 3) 10Base - T - неэкранированная витая пара 4) 10Base-F - волоконно-оптический кабель. Для смешанной сети, состоящей из физических сегментов различного типа полезно проводить расчет общей длины сети и допустимого количества повторителей. Технология Token Ring. Разделяемая среда передачи данных, состоящая из отрезков кабеля, соединяющих все станции в кольцо. Используется детерминированный алгоритм, основанный на передаче станциям права на использование кольца в определенном порядке. Это право передается с помощью кадра специального формата - маркера. Для контроля сети одна из станций выполняет роль активного монитора. Он выбирается во время инициализации кольца как станция с максимальным значением МАС-адреса. В сети Token Ring любая станция всегда получает данные только от одной станции, которая является предыдущей в кольце - ближайший активный сосед, расположенный выше по потоку. Получив маркер, станция анализирует его и при отсутствии у нее данных для передачи обеспечивает его продвижение к следующей станции. Станция, которая имеет данные для передачи, при получении маркера изымает его из кольца, что дает ей право доступа к физической среде для передачи своих данных. Затем эта станция выдает в кольцо кадр данных установленного формата последовательно по битам. Переданные данные проходят по кольцу всегда в одном направлении от одной станции к другой. Кадр снабжен адресом назначения и адресом источника. Все станции кольца ретранслируют кадр побитно, как повторители. Если кадр проходит через станцию назначения, то, распознав свой адрес, эта станция копирует кадр в свой внутренний буфер и вставляет в кадр признак подтверждения приема. В TR существуют три различных формата кадров: маркер; кадр данных - может переносить служебные данные для управления кольцом (МАС-уровня), либо пользовательские данные(LLC-уровня); прерывающая последовательность - сигнализирует о том, что текущая передача кадра или маркера отменяется. Технология FDDI (оптоволоконный интерфейс распределенных данных) - это первая технология локальных сетей, в которой средой передачи данных является волоконно-оптический кабель. Основные характеристики технологии: Технология FDDI во многом основывается на технологии Token Ring, развивая и совершенствуя ее основные идеи. Разработчики технологии FDDI ставили перед собой в качестве наиболее приоритетных следующие цели: повысить битовую скорость передачи данных до 100 Мбит/с; повысить отказоустойчивость сети за счет стандартных процедур восстановления ее после отказов различного рода - повреждения кабеля, некорректной работы узла, концентратора, возникновения высокого уровня помех на линии и т. п.; максимально эффективно использовать потенциальную пропускную способность сети как для асинхронного, так и для синхронного трафиков. Сеть FDDI строится на основе двух оптоволоконных колец, которые образуют основной и резервный пути передачи данных между узлами сети. Наличие двух колец - это основной способ повышения отказоустойчивости в сети FDDI, и узлы, которые хотят воспользоваться этим повышенным потенциалом надежности, должны быть подключены к обоим кольцам. В нормальном режиме работы сети данные проходят через все узлы и все участки кабеля только первичного кольца, вторичное кольцо в этом режиме не используется. В случае какого-либо вида отказа, когда часть первичного кольца не может передавать данные (например, обрыв кабеля или отказ узла), первичное кольцо объединяется со вторичным, вновь образуя единое кольцо. Этот режим работы сети называется "свертывание" колец. Все отличия технологии Fast Ethernet от Ethernet сосредоточены на физическом уровне. Уровни MAC и LLC (пользовательские данные) в Fast Ethernet остались абсолютно теми же. Более сложная структура физического уровня технологии Fast Ethernet вызвана тем, что в ней используются три варианта кабельных систем: волоконно-оптический многомодовый кабель, используются два волокна; витая пара категории 5, используются две пары; витая пара категории 3, используются четыре пары. Физический уровень включает три элемента: уровень согласования; независимый от среды интерфейс; устройство физического уровня. Основная идея разработчиков стандарта Gigabit Ethernet состоит в максимальном сохранении идей классической технологии Ethernet при достижении битовой скорости в 1000 Мбит/с. 30. Построение локальных сетей по стандартам физического и канального уровней: структурированная кабельная система, концентраторы и сетевые адаптеры, логическая структуризация сети с помощью мостов и коммутаторов, техническая реализация и дополнительные функции коммутаторов. Структурированная кабельная система - набор коммутационных элементов (кабелей, разъемов, коннекторов, кроссовых панелей и шкафов), а также методика их совместного использования, которая позволяет создавать регулярные легко расширяемые структуры связей в вычислительных сетях. Хорошая структурированная кабельная система строится избыточной. Структурированная кабельная система планируется и строится иерархически, с главной магистралью и многочисленными ответвлениями от нее. Типичная иерархическая структура структурированной кабельной системы включает: горизонтальные подсистемы (в пределах этажа); вертикальные подсистемы (внутри здания); подсистему кампуса (в пределах одной территории с несколькими зданиями). Горизонтальная подсистема соединяет кроссовый шкаф этажа с розетками пользователей. Подсистемы этого типа соответствуют этажам здания. Вертикальная подсистема соединяет кроссовые шкафы каждого этажа с центральной аппаратной здания. Подсистема кампуса соединяет несколько зданий с главной аппаратной всего кампуса. Эта часть кабельной системы обычно называется магистралью. Использование структурированной кабельной системы дает предприятию много преимуществ: 1.Универсальность. 2.Увеличение срока службы. 3.Уменьшение стоимости добавления новых пользователей и изменения их мест размещения. 4.Возможность легкого расширения сети. 5.Более эффективное обслуживание. 6. Надежность. Выбор типа кабеля для горизонтальных подсистем: Можно выбирать между экранированной витой парой, неэкранированной витой парой, коаксиальным кабелем и волоконно-оптическим кабелем. Возможно использование и беспроводных линий связи. Горизонтальная подсистема характеризуется очень большим количеством ответвлений кабеля, поэтому к кабелю, используемому в горизонтальной проводке, предъявляются повышенные требования к удобству выполнения ответвлений, а также удобству его прокладки в помещениях. Медный провод, в частности неэкранированная витая пара, является предпочтительной средой для горизонтальной кабельной подсистемы, хотя, если пользователям нужна очень высокая пропускная способность или кабельная система прокладывается в агрессивной среде, для нее подойдет и волоконно-оптический кабель. Применение коаксиального кабеля в локальной сети - это устаревшая технология. При выборе кабеля принимаются во внимание следующие характеристики: полоса пропускания, расстояние, физическая защищенность, электромагнитная помехозащищенность, стоимость. Выбор типа кабеля для вертикальных подсистем: Кабель должен передавать данные на большие расстояния и с большей скоростью по сравнению с кабелем горизонтальной подсистемы. В прошлом основным видом кабеля для вертикальных подсистем был коаксиал. Теперь для этой цели все чаще используется оптоволоконный кабель. Выбор типа кабеля для подсистемы кампуса: Как и для вертикальных подсистем, оптоволоконный кабель является наилучшим выбором для подсистем нескольких зданий, расположенных в радиусе нескольких километров. Для этих подсистем также подходит толстый коаксиальный кабель. Сетевые адаптеры и концентраторы. Концентраторы и сетевые адаптеры позволяют строить небольшие базовые фрагменты сетей, которые затем должны объединяться друг с другом с помощью мостов, коммутаторов и маршрутизаторов. Сетевой адаптер вместе со своим драйвером реализует второй, канальный уровень модели открытых систем в конечном узле сети - компьютере. В сетевой операционной системе пара адаптер и драйвер выполняет только функции физического и МАС-уровней, в то время как LLC-уровень обычно реализуется модулем ОС, единым для всех драйверов и сетевых адаптеров. Сетевой адаптер совместно с драйвером выполняют две операции: передачу и прием кадра. Обычно сетевые адаптеры делятся на адаптеры для клиентских компьютеров и адаптеры для серверов.В адаптерах для клиентских компьютеров значительная часть работы перекладывается на драйвер, тем самым адаптер оказывается проще и дешевле. Недостатком такого подхода является высокая степень загрузки центрального процессора компьютера рутинными работами по передаче кадров из оперативной памяти компьютера в сеть. Центральный процессор вынужден заниматься этой работой вместо выполнения прикладных задач пользователя. Адаптеры, предназначенные для серверов, обычно снабжаются собственными процессорами, которые самостоятельно выполняют большую часть работы по передаче кадров из оперативной памяти в сеть и в обратном направлении. В зависимости от того, какой протокол реализует адаптер, адаптеры делятся на Ethernet-адаптеры, Token Ring-адаптеры, FDDI-адаптеры и т. д. Классификация сетевых адаптеров: Адаптеры первого поколения были выполнены на дискретных логических микросхемах, в результате чего обладали низкой надежностью. Они имели буферную память только на один кадр, что приводило к низкой производительности адаптера, так как все кадры передавались из компьютера в сеть или из сети в компьютер последовательно. Для каждого типа адаптеров использовался свой драйвер. В сетевых адаптерах второго поколения для повышения производительности стали применять метод многокадровой буферизации. При этом следующий кадр загружается из памяти компьютера в буфер адаптера одновременно с передачей предыдущего кадра в сеть. Драйверы этих адаптеров основаны на стандартных спецификациях. В сетевых адаптерах третьего поколения реализована конвейерная схема обработки кадров. Она заключается в том, что процессы приема кадра из оперативной памяти компьютера и передачи его в сеть совмещаются во времени. Таким образом, после приема нескольких первых байтов кадра начинается их передача. Основная функция концентратора (хаб, повторитель) - повторение кадра либо на всех портах, либо только на некоторых портах. Концентратор обычно имеет несколько портов, к которым с помощью отдельных физических сегментов кабеля подключаются конечные узлы сети - компьютеры. Концентратор объединяет отдельные физические сегменты сети в единую разделяемую среду, доступ к которой осуществляется в соответствии с протоколом локальных сетей. Концентраторы выполняют дополнительные функции. Автосегментация - концентратор отключает порт при обнаружении проблем. Защита сети от несанкционированного доступа, запрещающая подключение к концентратору компов с неизвестными МАС-адресами, заполняющая нолями поля данных кадров, поступающих не к станции назначения. Виды концентраторов: 1) с фиксированным количеством портов; 2) модульный- отдельные модули с фиксированным количеством портов, устанавливаемых на общее шасси; 3) стековый; 4) модульно-стековый - модульные концентраторы, объединенные специальными связями в стек. Логическая структуризация сети - разбиение общей разделяемой среды на логические сегменты, которые представляют собой самостоятельные разделяемые среды с меньшим количеством узлов. Сеть, разделенная на логические сегменты, обладает более высокой производительностью и надежностью. Взаимодействие между логическими сегментами организуется с помощью мостов и коммутаторов.Крупные сети, насчитывающие сотни и тысячи узлов, не могут быть построены на основе одной разделяемой среды. Все технологии ограничивают количество узлов в разделяемой среде. Причина заключается в случайном характере метода доступа к среде, используемом во всех технологиях локальных сетей. В Сеть средних размеров трудно построить на одном разделяемом сегменте так, чтобы она работала эффективно при изменении интенсивности генерируемого станциями трафика. При использовании разделяемой среды проектировщик сети сталкивается с жесткими ограничениями максимальной длины сети, которые для всех технологий лежат в пределах нескольких километров. Деление сети на логические сегменты повышает производительность сети (за счет разгрузки сегментов), гибкость построения сети, увеличивая степень защиты дынных, облегчает управление сетью. Мосты и коммутаторы используют алгоритмы: 1) прозрачного моста - строит таблицу на основании пассивного наблюдения за трафиком, циркулирующим в подключенном к его портам сегментах или 2) моста с маршрутизацией от источника - станция отправитель помещает в кадр всю адресную информацию. Мост (один процессор для обработки потока данных) обрабатывает кадры последовательно, а коммутатор (мультипроцессорный мост, способный параллельно продвигать кадры сразу между всеми парами своих портов) - параллельно. В мостах нет защиты от широковещательного шторма. Топология структурированной сети ограничена древовидной структурой. Применение коммутаторов позволяет сетевым адаптерам использовать полнодуплексный режим работы протоколов локальны сетей. В этом режиме отсутствует этап доступа к разделяемой среде, а общая скорость передачи данных удваивается. Коммутаторы используют в качестве базовой одну из трех схем, на которой строится такой узел обмена: 1) коммутационная матрица; 2) разделяемая многовходовая память; 3)общая шина. Часто эти три схемы взаимодействия комбинируются в одном коммутаторе. Коммутационная матрица - входные блоки процессоров портов на основании просмотра адресной таблицы коммутатора определяют по адресу назначения номер выходного порта. Эту информацию они добавляют к байтам исходного кадра в виде специального ярлыка - тега (tag). Матрица состоит из трех уровней двоичных переключателей, которые соединяют свой вход с одним из двух выходов в зависимости от значения бита тега. Переключатели первого уровня управляются первым битом тега, второго - вторым, а третьего - третьим. Недостаток: отсутствие буферизации данных внутри коммутационной матрицы. Достоинства - высокая скорость коммутации и регулярная структура, которую удобно реализовывать в интегральных микросхемах. Недостаток - сложность наращивания числа коммутируемых портов. В коммутаторах с общей шиной процессоры портов связывают высокоскоростной шиной, используемой в режиме разделения времени. Чтобы шина не блокировала работу коммутатора, ее производительность должна равняться, по крайней мере, сумме производительности всех портов коммутатора. Кадр должен передаваться по шине небольшими частями, по несколько байтов, чтобы передача кадров между портами происходила в псевдопараллельном режиме, не внося задержек в передачу кадра в целом. Двухвходовая разделяемая память. Входные блоки процессоров портов соединяются с переключаемым входом разделяемой памяти, а выходные блоки этих же процессоров соединяются с переключаемым выходом этой памяти. Переключением входа и выхода разделяемой памяти управляет менеджер очередей выходных портов. В разделяемой памяти менеджер организует несколько очередей данных, по одной для каждого выходного порта. Входные блоки процессоров передают менеджеру портов запросы на запись данных в очередь того порта, который соответствует адресу назначения пакета. Менеджер по очереди подключает вход памяти к одному из входных блоков процессоров и тот переписывает часть данных кадра в очередь определенного выходного порта. По мере заполнения очередей менеджер производит также поочередное подключение выхода разделяемой памяти к выходным блокам процессоров портов, и данные из очереди переписываются в выходной буфер процессора. Память должна быть достаточно быстродействующей для поддержания скорости переписи данных между N портами коммутатора. Применение общей буферной памяти, гибко распределяемой менеджером между отдельными портами, снижает требования к размеру буферной памяти процессора порта. У каждой из описанных архитектур есть свои преимущества и недостатки, поэтому часто в сложных коммутаторах эти архитектуры применяются в комбинации друг с другом. В конструктивном отношении коммутаторы могут быть автономными (предназначен для организации небольших рабочих групп), стековыми (выполнены в отдельном корпусе, имеют специальные интерфейсы, которые позволяют их объединять в общую систему, работающую как единый коммутатор; говорят, что отдельные коммутаторы образуют стек) и выполненными на основе шасси (предназначены для применения на магистрали сети; выполняются на основе какой-либо комбинированной схемы, в которой взаимодействие модулей организуется по быстродействующей шине или же на основе быстрой разделяемой памяти большого объема). Основные показатели коммутаторов, характеризующие его производительность: 1) скорость фильтрации кадров - скорость с которой коммутатор выполняет прием кадра в буфер, просмотр адресной таблицы с целью нахождения порта для адреса назначения, уничтожение кадра, так как источник и приемник принадлежат одному порту; 2) скорость продвижения кадров - скорость с которой коммутатор выполняет прием кадра в буфер, просмотр адресной таблицы с целью нахождения порта для адреса назначения, передача кадра; 3) пропускная способность - количество пользовательских данных (в мегабит / с) переданных в единицу времени через его порты; 4) задержка передачи кадра - время, с момента прихода первого байта кадра на входной порт коммутатора до момента его появления на выходном порту. На характеристики производительности коммутатора влияют: тип коммутации - "на лету" или с полной буферизацией; размер буфера кадров, производительность внутренней шины, производительность процессора; размер внутренней адресной таблицы. Для автоматического поддержания резервных связей в сложных сетях в коммутаторах реализуется алгоритм покрывающего дерева - позволяет автоматически определять древовидную конфигурацию связей. Коммутаторы находят покрывающее дерево адаптивно, с помощью обмена служебными пакетами. Коммутаторы могут выполнять трансляцию одного протокола в другой. При согласовании протоколов локальных сетей коммутаторы не строят таблиц соответствия адресов узлов, а переносят адреса назначения и источника из кадра одного протокола в кадр другого. Коммутатор позволяет локализовывать потоки информации в сети, контролировать их и управлять ими, опираясь на механизм пользовательских фильтров. Технология виртуальных локальных сетей позволяет в сети, построенной на коммутаторах, создавать изолированные группы узлов, между которыми не передается любой тип трафика, в том числе широковещательный. Сейчас происходит вытеснение коммутаторами концентраторов с нижних уровней крупных сетей. Существуют две основные схемы применения коммутаторов: 1) со стянутой в точку магистралью; 2) распределенной магистралью. В больших сетях эти схемы применяют комбинировано. 31. Построение больших сетей: принципы объединения сетей на основе протоколов сетевого уровня, адресация в IP-сетях, протокол IP, протоколы маршрутизации в IP-сетях, средства построения составных сетей стека Novell, основные характеристики маршрутизаторов и концентраторов. Составная сеть - совокупность нескольких сетей (подсетей), которые соединяются между собой маршрутизаторами. Организация совместной транспортной службы в составной сети называется межсетевым взаимодействием. В функции сетевого уровня входят: передача пакетов между конечными узлами в составных сетях, выбор маршрута, согласование локальных технологий отдельных подсетей. Сетевой уровень - координатор, организующий работу всех подсетей, лежащих на пути продвижения пакета по составной сети. Сетевой адрес - нумерация всех подсетей составной сети и нумерация всех узлов в пределах каждой подсети. В сложных составных сетях существует несколько альтернативных маршрутов для передачи пакетов между двумя конечными узлами. Маршрут - это последовательность маршрутизаторов, которые должен пройти пакет от отправителя до получателя. Задачу выбора маршрута из нескольких возможных решают маршрутизаторы, а также конечные узлы. Маршрут выбирается на основании имеющейся у этих устройств информации о текущей конфигурации сети, а также на основании указанного критерия выбора маршрута: задержка прохождения маршрута отдельным пакетом, средняя пропускная способность маршрута для последовательности пакетов, количество пройденных в маршруте промежуточных маршрутизаторов (хопов). Для выбора рационального маршрута дальнейшего следования пакета, каждый конечный узел и маршрутизатор анализируют таблицу маршрутизации. Маршрутизатор по умолчанию - маршрутизатор, через который пролегает путь ко всем этим сетям. Для автоматического построения таблиц маршрутизации маршрутизаторы обмениваются информацией о топологии составной сети в соответствии со протоколом маршрутизации - собирают и передают по сети служебную информацию. Алгоритмы маршрутизации: 1) одношаговые: фиксированной маршрутизации, простой маршрутизации, адаптивной маршрутизации; 2) маршрутизация от источника. Маршрутизатор представляет собой сложное многофункциональное устройство, в задачи которого входит: построение таблицы маршрутизации, определение на ее основе маршрута, буферизация, фрагментация и фильтрация поступающих пакетов, поддержка сетевых интерфейсов. Функции маршрутизаторов могут выполнять как специализированные устройства, так и универсальные компьютеры с соответствующим программным обеспечением. Адресация в IP-сетях: классы, особые адреса, маски, порядок распределения. В стеке TCP/IP используются три типа адресов: 1) локальные (аппаратные )- для адресации узлов в пределах подсети; 2) сетевые(IP-адреса)- для однозначной идентификации узлов в пределах всей составной сети; 3)доменные имена - символьные идентификаторы узлов, к которым часто обращаются пользователи. IP-адрес имеет длину 4 байта (32 бита) и состоит из двух логических частей - номера сети и номера узла в сети. Наиболее употребляемой формой представления IP-адреса является запись в виде четырех чисел, представляющих значения каждого байта в десятичной форме и разделенных точками. Для определения границы, отделяющей номер сети от номера узла, реализуются два подхода. Первый основан на понятии класса адреса, второй - на использовании масок. Классы IP-адресов: Класс определяется значениями нескольких первых битов адреса. Принадлежность IP-адреса к классу определяется значениями первых битов адреса. 1) Первый бит 0 - Класс А, номер сети (1-126) - один байт, остальные три байта - номер узла в сети. Сетей класса А немного, зато количество узлов в них может достигать 224. 2) Первые два бита 10 - класс В, номер сети (128.0 - 191.255) и под номер узла по два байта. Максимальное количество узлов в них составляет 216 . 3) 110 - класс С, номер сети 24 бита, номер узла - 8 бит. Сети Число узлов в них 28. 4) 1110, адрес класса D, обозначает особый, групповой адрес (multicast). Групповой адрес идентифицирует группу узлов (сетевых интерфейсов), которые в общем случае могут принадлежать разным сетям. Если при отправке пакета в качестве адреса назначения указан адрес класса D, то такой пакет должен быть доставлен всем узлам, которые входят в группу. 5) 11110, класс Е. Адреса этого класса зарезервированы для будущих применений. В протоколе IP существует несколько соглашений об особой интерпретации IP-адресов: 1) IP-адрес состоит только из двоичных нулей, то он обозначает адрес узла, который сгенерировал этот пакет; 2)В поле номера сети стоят только нули, то считается, что узел назначения принадлежит той сети, что и узел, отправивший пакет. 3) Все двоичные разряды IP-адреса равны 1, то пакет с таким адресом назначения должен рассылаться всем узлам, находящимся в той же сети, что и источник этого пакета. Такая рассылка называется ограниченным широковещательным сообщением. 4)В поле номера узла назначения стоят только единицы, пакет, рассылается всем узлам сети с заданным номером сети. Такая рассылка называется широковещательным сообщением (broadcast). Специальные адреса, состоящие из последовательностей нулей, могут быть использованы только в качестве адреса отправителя, а адреса, состоящие из последовательностей единиц, - только в качестве адреса получателя. Маска - число, которое используется в паре с IP-адресом; двоичная запись маски содержит последовательность единиц в тех разрядах, которые должны в IP-адресе интерпретироваться как номер сети. Снабжая каждый IP-адрес маской, можно отказаться от понятий классов адресов и сделать систему адресации более гибкой. Номера сетей назначаются либо централизовано, если сеть является частью Internet, либо произвольно, если сеть работает автономно. Назначение IP-адресов узлам сети может происходить вручную - администратор сам ведет списки свободных и занятых адресов и конфигурирует сетевой интерфейс, либо автоматически - с использованием протокола DHCP. В этом случае администратор заранее определяет для сервера DHCP диапазон свободных для распределения адресов, из которого последний автоматически выделяет адреса узлам в ответ на поступившие от них запросы. IP - протокол межсетевого взаимодействия обеспечивает передачу дейтаграмм от отправителя получателям через объединенную систему компьютерных сетей. IP протокол без установления соединения. Протокол IP обрабатывает каждый IP-пакет как независимую единицу, не имеющую связи ни с какими другими IP-пакетами. Все вопросы обеспечения надежности доставки данных в составной сети в стеке TCP/IP решает протокол TCP, основанный на установлении логических соединений между взаимодействующими процессами. IP-пакет состоит из заголовка и поля данных. Заголовок, как правило, имеющий длину 20 байт, имеет следующую структуру. Тип сервиса позволяет приложениям влиять на качество обслуживания, задавая приоритетность пакета и критерий выбора маршрута. Первые три бита этого поля образуют подполе приоритета пакета (0-7). Содержит три бита, определяющие критерий выбора маршрута. Поле Флаги содержит признаки, связанные с фрагментацией. Т о. IP-пакет состоит из заголовка и поля данных. Максимальная длина пакета - 65 535 байт. Заголовок обычно имеет длину 20 байт и содержит информацию о сетевых адресах отправителя и получателя, о параметрах фрагментации, о времени жизни пакета, о контрольной сумме и некоторых других. В поле данных IP-пакета находятся сообщения более высокого уровня, например TCP или UDP. IP позволяет выполнять динамическую фрагментацию пакетов, поступающих на входные порты маршрутизаторов при передаче их между сетями с различными MTU (максимальный размер поля данных). Программные модули протокола IP устанавливаются на всех конечных станциях и маршрутизаторах сети. Для продвижения пакетов они используют таблицы маршрутизации. Вид таблицы IP маршрутизации зависит от конкретной реализации стека TCP/IP. Вид таблицы также зависит от конкретной реализации маршрутизатора. Большинство современных протоколов маршрутизации происходят от Internet (или ARPANET). Крупные сети разбиваются на автономные системы, в которых проводится общая политика маршрутизации IP-пакетов. Протоколы маршрутизации делятся на внешние и внутренние. Внешние переносят маршрутную информацию между автономными системами, а внутренние применяются в пределах определенной автономной системы. Протокол RIP дистанционно-векторного типа является наиболее распространенным протоколом маршрутизации сетей TCP/IP. RIP-маршрутизаторы при выборе маршрута обычно используют количество промежуточных маршрутизаторов между сетями. Версия RIPv1 не распространяет маски подсетей - администратор использует маски фиксированной длины во всей составной сети. В RIPv2 ограничение снято. Процесс создания таблицы маршрутизации с помощью RIP: 1) создание минимальных таблиц - учитываются только непосредственно присоединенные сети; 2) рассылка минимальных таблиц соседям; 3) получение RIP-сообщений от соседей и обработка полученной информации; 4) рассылка новой таблицы соседям; 5) получение и обработка RIP-сообщений от соседей. В сетях с петлевидными маршрутами, использующими RIP могут наблюдаться длительные периоды зацикливания пакетов. Для борьбы используются: 1) метод расщепления горизонта - информация о сети в таблице маршрутизации не передается маршрутизатору, от которого она получена; 2) триггерные обновления - маршрутизатор передает данные об изменившемся маршруте сразу; 3) замораживание изменений. Протокол OSPF - открытый протокол: 1) построение графа связей сети (вершины - маршрутизаторы и IP-сети, ребра - интерфейсы маршрутизаторов); 2) нахождение оптимальных маршрутов с помощью полученного графа. При выборе маршрута OSPF-маршрутизаторы используют метрику, учитывающую пропускную способность составных сетей. Протокол IPX - протокол сетевого уровня стека Novell. Поддерживает дейтаграммный способ обмена сообщениями. Осуществляет быструю передачу данных при экономном использовании памяти. Надежную передачу пакетов может осуществлять транспортный протокол SPX, который работает с установлением соединения и восстанавливает пакеты при их потере или повреждении. Прикладной уровень стека IPX/SPX составляют: 1) NCP - поддерживает основные службы ОС - печати, файловую и т.д. 2) SAP - вспомогательная роль. Протокол IPX создавался для локальных сетей. Сетевые адреса IPX: номер сети (4 байта), номер узла (6 б) - МАС-адрес, номер сокета (2 б). Использование аппаратных адресов ускоряет работу протокола, упрощается конфигурирование компов сети. Поля IPX: контрольная сумма, длина, управление транспортом, тип пакета, адрес назначения, адрес отправителя, поле данных. Каждый IPX-маршрутизатор поддерживает таблицу маршрутизации, на основании которой принимается решение о продвижении пакета. Поддерживается только одношаговая маршрутизация. IPX-маршрутизаторы используют протоколы динамической маршрутизации RIP IPX и NLSP, который во многом похож на OSPF. Основные характеристики маршрутизаторов и концентраторов. Основная задача маршрутизатора - выбор наилучшего маршрута в сети. Другие задачи: буферизация, фильтрация и фрагментация перемещаемых пакетов. Важна производительность, с которой выполняются эти задачи. Маршрутизатор - специализированный компьютер, имеющий скоростную внутреннюю шину или шины, часто использующий симметричное или асимметричное мультипроцессирование и работающий под управлением специализированной ОС, относящейся к классу систем реального времени. Маршр-ры могут поддерживать один протокол сетевого уровня или множество (многопротокольные маршрутизаторы). Классификация маршр-ров по областям применения: 1) магистральные маршр-ры для построения центральной сети корпорации. Мощные устройства, способны обрабатывать несколько миллионов пакетов в секунду, имеющие большое количество интерфейсов локальных и глобальных сетей; 2)маршр-ры региональных отделений соединяют региональные отделения между собой и с центральной сетью. Упрощенная версия магистрального маршр-ра; 3) маршр-ры удаленных офисов соединяют локальную сеть удаленного офиса с центральной сетью или сетью регионального отделения по глобальной связи; 4) маршр-ры локальных сетей (коммутаторы 3-го уровня) предназначены для разделения крупных локальных сетей на подсети. Высокая скорость маршрутизации. Характеристики маршр-ра: 1) перечень поддерживаемых сетевых протоколов. 2) перечень поддерживаемых интерфейсов локальных и глобальных сетей. 3) общая производительность маршр-ра. Доп функции маршр-ров: 1) поддержка одновременно нескольких протоколов маршрутизации. 2) приоритеты сетевых протоколов. 3) поддержка политики маршрутных объявлений. 4) защита от широковещательных штормов (broadcast storm). 5) поддержка немаршрутизируемых протоколов. 6) разделение функций построения и использования таблицы маршрутизации. В настоящее время наблюдается тенденция по совмещению в одном устройстве функций коммутатора и маршрутизатора. Отказ от маршрутизации. Применять маршрутизацию как можно реже, только там, где от нее никак нельзя отказаться. Например, на границе между локальной и глобальной сетью. Отказ от маршр-ров означает переход к так называемой плоской сети, то есть сети, построенной только на коммутаторах, а значит, и отказ от всех интеллектуальных возможностей обработки трафика, присущих маршр-рам. Такой подход повышает производительность, но приводит к потере всех преимуществ. Второе направление - повышение производительности маршр-ров. Коммутаторы 3-го уровня с классической маршрутизацией - коммутаторы различного типа, в которые встроены функции маршрутизации пакетов. Функции коммутации и маршрутизации могут быть совмещены двумя способами: 1) классическим, когда маршрутизация выполняется по каждому пакету, требующему передачи из сети в сеть, а коммутация выполняется для пакетов, принадлежащих одной сети. 2) нестандартным способом ускоренной маршрутизации, когда маршрутизируется несколько первых пакетов устойчивого потока, а все остальные пакеты этого потока коммутируются. 32. Глобальные сети: основные понятия и определения, глобальные связи на основе выделенных линий, глобальные связи на основе сетей с коммутацией каналов, компьютерные глобальные сети с коммутацией пакетов, удаленный доступ. Глобальные сети (территориальные компьютерные сети) служат для предоставления своих сервисов большому количеству конечных абонентов, в пределах области, региона, страны, континента или всего земного шара. Абоненты глобальной сети - локальные сети предприятий, расположенные в разных городах и странах, и отдельные компьютеры. Оператор сети - это та компания, которая поддерживает нормальную работу сети. Поставщик услуг (провайдер) - компания, которая оказывает платные услуги абонентам сети. Транспортные функции глобальной сети. Глобальная вычислительная сеть должна передавать данные абонентов любых типов, которые есть на предприятии и нуждаются в удаленном обмене информацией. Для этого глобальная сеть должна предоставлять комплекс услуг: передачу пакетов локальных сетей мини-компьютеров и мейнфреймов, обмен факсами, передачу трафика офисных АТС, выход в телефонные сети, обмен видеоизображениями, передачу трафика кассовых аппаратов, банкоматов и т. д. и т. п. Сеть строится на основе некоммутируемых (выделенных) каналов связи, которые соединяют коммутаторы глобальной сети между собой. Абоненты сети подключаются к коммутаторам с помощью выделенных каналов связи. Для подключения конечных пользователей допускается использование коммутируемых каналов, то есть каналов телефонных сетей, хотя в таком случае качество транспортных услуг обычно ухудшается. Конечные узлы глобальной сети более разнообразны, чем конечные узлы локальной сети: отдельные компьютеры, локальные сети, маршрутизаторы и мультиплексоры, которые используются для одновременной передачи по компьютерной сети данных и голоса (или изображения). Все эти устройства вырабатывают данные для передачи в глобальной сети, поэтому являются для нее устройствами типа DTE. Так как конечные узлы глобальной сети должны передавать данные по каналу связи определенного стандарта, то каждое устройство типа DTE требуется оснастить устройством типа DCE, которое обеспечивает необходимый протокол физического уровня данного канала. В зависимости от типа канала для связи с каналами глобальных сетей используются DCE трех основных типов: модемы для работы по выделенным и коммутируемым аналоговым каналам, устройства DSU/CSU для работы по цифровым выделенным каналам сетей технологии TDM и терминальные адаптеры (ТА) для работы по цифровым каналам сетей ISDN. Устройства DTE и DCE обобщенно называют оборудованием, размещаемым на территории абонента глобальной сети - Customer Premises Equipment, CPE. В глобальной сети обычно строго описан и стандартизован интерфейс "пользователь-сеть" (User-to-Network Interface, UNI). Это необходимо для того, чтобы пользователи могли без проблем подключаться к сети с помощью коммуникационного оборудования любого производителя, который соблюдает стандарт UNI данной технологии. Протоколы взаимодействия коммутаторов внутри глобальной сети, называемые интерфейсом "сеть-сеть", стандартизуются не всегда. В зависимости от того, какие компоненты приходится брать в аренду, принято различать корпоративные сети, построенные с использованием: 1) выделенных каналов; 2) коммутации каналов; 3) коммутации пакетов. Выделенные каналы можно получить у телекоммуникационных компаний, которые владеют каналами дальней связи, или от телефонных компаний. Используются выделенные линии двумя способами: 1) построение с их помощью территориальной сети определенной технологи, в которой арендуемые выделенные линии служат для соединения промежуточных, территориально распределенных коммутаторов пакетов; 2) соединение выделенными линиями только объединяемых локальных сетей или конечных абонентов другого типа без установки транзитных коммутаторов пакетов, работающих по технологии глобальной сети. По глобальным каналам передаются те же пакеты сетевого или канального уровня, что и в локальных сетях. Сегодня для построения глобальных связей в корпоративной сети доступны сети с коммутацией каналов двух типов - традиционные аналоговые телефонные сети и цифровые сети с интеграцией услуг ISDN. Достоинством сетей с коммутацией каналов является их распространенность, что характерно особенно для аналоговых телефонных сетей. На телефонные коммутаторы сильно воздействуют внешние помехи, которые трудно отличить от полезного сигнала. Телефонные сети, полностью построенные на цифровых коммутаторах, и сети ISDN свободны от многих недостатков традиционных аналоговых телефонных сетей. Они предоставляют пользователям высококачественные линии связи, а время установления соединения в сетях ISDN существенно сокращено. Глобальные сети с коммутацией пакетов: 1) X.25 - большая избыточность протоколов, хорошо работают на каналах низкого качества; 2) Frame Relay - хорошо передают пульсации трафика, поддерживают службу постоянных виртуальных каналов; 3) SMDS - трафик компьютерный, голос, графика, видео; 4) ATM - трафик компьютерный, голос, графика, видео (сегодня используется для передачи компьютерного трафика), эксплуатация с 1996; 5) TCP/IP - широко распространен. Территориальные сети, используемые для построения корпоративной сети: 1) магистральные сети - для образования одноранговых связей между крупными локальными сетями, принадлежащими большим подразделениям предприятия; 2) сети доступа - территориальные сети, необходимые для связи небольших локальных сетей и отдельных удаленных компьютеров с центральной локальной сетью предприятия. Магистральные сети должны обеспечивать высокую пропускную способность, так как на магистрали объединяются потоки большого количества подсетей, должны быть постоянно доступны. В качестве магистральных сетей используются цифровые выделенные каналы. Сети доступа используются для сотрудников, работающих на дому, организации работы банкоматов или кассовых аппаратов. В качестве сетей доступа применяются телефонные аналоговые сети, сети ISDN,сети frame relay. Программные и аппаратные средства, которые обеспечивают подключение компьютеров или локальных сетей удаленных пользователей к корпоративной сети, называются средствами удаленного доступа. Обычно на клиентской сторонe эти средства представлены модемом и соответствующим ПО. Организацию массового удаленного доступа со стороны центральной локальной сети обеспечивает сервер удаленного доступа (Remote Access Server, RAS). Сервер удаленного доступа представляет собой программно-аппаратный комплекс, который совмещает функции маршрутизатора, моста и шлюза. Сервер выполняет ту или иную функцию в зависимости от типа протокола, по которому работает удаленный пользователь или удаленная сеть. Организация глобальных связей на основе выделенных каналов: аналоговые линии связи. Выделенный канал - канал с фиксированной полосой пропускания или фиксированной пропускной способностью, постоянно соединяющий двух абонентов. Выделенные каналы делятся на аналоговые и цифровые в зависимости от того, какого типа коммутационная аппаратура применена для постоянной коммутации абонентов. На аналоговых выделенных линиях для аппаратуры передачи данных физический и канальный протоколы жестко не определены. Выделенные аналоговые каналы предоставляются пользователю с 4-проводным или 2-проводным окончанием. На каналах с 4-проводным окончанием организация полнодуплексной связи, естественно, выполняется более простыми способами. Выделенные линии могут быть разделены на две группы по наличию промежуточной аппаратуры коммутации и усиления или ее отсутствию. Модемы для работы на выделенных каналах, работают на основе методов аналоговой модуляции сигнала. Стандарты модемов делятся на три группы: 1) определяющие скорость передачи данных и метод кодирования; 2) исправления ошибок; 3) сжатия данных. В отношении режима работы модемы делятся на три группы: 1) поддерживающие только асинхронный режим работы; поддерживают низкую скорость передачи данных - до 1200 бит/с. Наиболее дешевый вид модемов, не требуются высокоточные схемы синхронизации сигналов на кварцевых генераторах. Неприхотливы к качеству линии. 2) поддерживающие асинхронный и синхронный режимы работы; наиболее универсальные устройства. Могут работать как по выделенным, так и по коммутируемым каналам, обеспечивая дуплексный режим работы. На выделенных каналах они поддерживают в основном 2-проводное окончание и гораздо реже - 4-проводное. 3) поддерживающие только синхронный режим работы; могут подключаться только к 4-проводному окончанию. Используют для выделения сигнала высокоточные схемы синхронизации, дороже асинхронных модемов. Высокие требования к качеству линии. Цифровые выделенные линии образуются путем постоянной коммутации в первичных сетях, построенных на базе коммутационной аппаратуры, работающей на принципах разделения канала во времени. Существуют два поколения технологий цифровых первичных сетей: 1) технология плезиохронной (почти синхронной) цифровой иерархии (PDH); 2) синхронная цифровая иерархия (SDH). Технология плезиохронной цифровой иерархии PDH разрабатывалась как асинхронная, поэтому кадры различных скоростей разделяются специальными битами. Недостатки: 1) сложность операций мультиплексирования и демультиплексирования пользовательских данных. Для преодоления этого недостатка в сетях PDH реализуют некоторые дополнительные приемы, уменьшающие количество операций демультиплексирования при извлечения пользовательских данных из высокоскоростных каналов. Например, одним из таких приемов является "обратная доставка" (back hauling). 2)Отсутствие развитых встроенных процедур контроля и управления сетью. 3)Слишком низкие по современным понятиям скоростях иерархии PDH. Все эти недостатки устранены в новой технологии первичных цифровых сетей, получившей название синхронной цифровой иерархии SDH. Технология синхронной цифровой иерархии SONET/SDH ориентируется на использование волоконно-оптических кабелей. Продолжает иерархию скоростей каналов PDH до 10 Гбит/с. Основана на полной синхронизации между каналами и устройствами сети которая обеспечивается наличием центрального пункта распределения синхронизирующих импульсов для всей сети. Каналы иерархии PDH являются входными каналами для сетей технологии SONET/SDH, которая переносит ее по своим магистральным каналам. Отказоустойчивость сети SONET/SDH встроена в ее основные протоколы. Этот механизм называется автоматическим защитным переключением - Automatic Protection Switching, APS. Для передачи компьютерных данных по выделенным каналам применяется несколько протоколов канального уровня: SLIP, HDLC, PPP. Протокол PPP в наибольшей степени подходит для современных выделенных каналов, аппаратура которых самостоятельно решает задачу надежной передачи данных. Глобальные сети с коммутацией каналов создавались для предоставления общедоступных телефонных услуг населению городов, сел и стран. Телефонные сети работают на основе техники коммутации каналов, при этом каждая пара разговаривающих абонентов предварительно устанавливает через тел-ную сеть соединение, образуя в ней дуплексный канал. Первые телефонные сети были аналоговыми, так как тел-ный аппарат преобразовывал звуковые колебания в колебания электрического тока. Коммутаторы телефонной сети тоже передавали польз-скую инф-цию в аналоговой форме, возможно только перенося эти сигналы в др область частотного спектра с помощью методов частотного уплотнения. Сегодня в таких сетях все чаще между тел-ными комм-рами применяется передача голоса в цифровой форме путем мультиплексирования польз-ских каналов по времени. Однако абонентские окончания остаются аналоговыми, что позволяет пользоваться теми же сравнительно простыми и недорогими аналоговыми телефонными аппаратами, что и раньше. ISDN относятся к сетям, в которых основным режимом коммутации является режим коммутации каналов, а данные обрабатываются в цифровой форме. Архитектура сети ISDN предусматривает несколько видов служб: 1) некоммутируемые средства (выделенные цифровые каналы); 2) коммутируемая телефонная сеть общего пользования; 3) сеть передачи данных с коммутацией каналов; 4) сеть передачи данных с коммутацией пакетов; 5) сеть передачи данных с трансляцией кадров (frame relay); 6) средства контроля и управления работой сети. Глобальные сети с коммутацией пакетов: Х.25, frame relay или АТМ. Для них характерна техника маршрутизации пакетов, основанная на понятии "виртуальный канал". Прежде чем пакет будет передан через сеть, необходимо установить виртуальное соединение (коммутируемый виртуальный канал или постоянный виртуальный канал) между абонентами сети. Сети Х.25 наиболее распространены среди сетей с коммутацией пакетов. В структуре сети: PAD-устройство для выполнения сборки нескольких низкоскоростных потоков байт в пакеты; трехуровневый стек протоколов с использованием на канальном и сетевом уровнях протоколов с установлением соединения, управляющих потоками данных и исправляющих ошибки; ориентация на однородные стеки транспортных протоколов во всех узлах сети. Состоит из коммутаторов - центров коммутации пакетов, соединенных высокоскоростными выделенными каналами аналоговыми или цифровыми. Сети Frame Relay лучше подходят для передачи пульсирующего трафика локальных сетей. Низкая протокольная избыточность и дейтаграммный режим работы, что обеспечивает высокую пропускную способность и небольшие задержки кадров. Гарантированная поддержка средней скорости передачи данных по виртуальному каналу или при допустимых пульсациях трафика. Технология АТМ разработана как единый универсальный транспорт для нового поколения сетей с интеграцией услуг, которые называются широкополосными сетями ISDN. Возможности: передача в рамках одной транспортной системы компьютерного и мультимедийного трафика; иерархию скоростей передачи данных; общие транспортные протоколы для локальных и глобальных сетей; сохранение имеющейся инфраструктуры физических каналов или физических протоколов; взаимодействие с унаследованными протоколами локальных и глобальных сетей. Удаленный доступ - различные типы и варианты взаимодействия компов, сетей и приложений. Типы взаимодействующих систем: 1) терминал-комп; 2) комп-комп; 3) комп-сеть; 4) сеть-сеть. Способ, при котором пользователь получает возможность удаленно работать с компьютером таким же способом, как если бы он управлял им с помощью локально подключенного терминала: терминальный доступ и удаленное управление. Схема организации удаленного доступа определяется теми глобальными транспортными службами, которые доступны в точках нахождения многочисленных клиентов удаленного доступа. С учетом двух обстоятельств (степень распространенности и стоимость глобальной службы) наиболее часто для организации удаленного доступа используются услуги телефонных сетей общего пользования - аналоговых и, если это возможно, ISDN. В связи с широким распространением на предприятиях локальных сетей наиболее часто встречающийся вид удаленного доступа - это доступ не к отдельному компьютеру, а к сети в целом. Для этой цели в центральной сети предприятия устанавливается специальная система - RAS. Одним из вариантов удаленного доступа типа компьютер-сеть является режим удаленного узла. ПО удаленного узла на клиентской машине позволяет последовательному порту стать медленным узлом удаленной локальной сети, взаимодействующим обычным способом с сетевыми операционными системами при разделении их ресурсов. В локальной сети должен быть установлен сервер удаленного доступа, поддерживающий режим удаленного узла и протоколы РРР и SLIP. Почта является еще одним видом удаленного доступа на прикладном уровне. Почтовые шлюзы, доступные по коммутируемым телефонным линиям, и клиентское почтовое обеспечение удаленного доступа могут быть достаточными для удовлетворения потребностей многих обычных пользователей. Сейчас стала возможной двухступенчатая связь удаленного пользователя со своей корпоративной сетью - сначала выполняется доступ по городской телефонной сети к местному поставщику услуг Интернета, а затем через Интернет пользователь соединяется со своей корпоративной сетью. Такой вариант может значительно удешевить доступ по сравнению с непосредственным подключением через междугородные АТС. 33. Средства анализа и управления сетями: функции и архитектура систем управления сетями, стандарты систем управления, мониторинг и анализ локальных сетей. Функции системы управления: 1) управление конфигурацией сети и именованием - конфигурирование параметров как элементов сети, так и сети в целом. Для сети в целом управление конфигурацией обычно начинается с построения карты сети (т. е. отображении реальных связей между элементами сети и изменении связей между элементами сети). Управление конфигурацией может выполняться в автоматическом, ручном или полуавтоматическом режимах. 2) обработка ошибок - выявление, определение и устранение последствий сбоев и отказов в работе сети. Регистрация сообщений об ошибках, фильтрация, маршрутизация и анализ на основе некоторой корреляционной модели. Фильтрация позволяет выделить потока сообщений об ошибках, только важные сообщения, маршрутизация обеспечивает их доставку нужному элементу системы управления, а корреляционный анализ позволяет найти причину, породившую поток взаимосвязанных сообщений. 3) анализ производительности и надежности, связаны с оценкой на основе накопленной статистической информации времени реакции системы, пропускной способности реального или виртуального канала связи между двумя конечными абонентами сети, интенсивности трафика в отдельных сегментах и каналах сети, вероятности искажения данных при их передаче через сеть, коэффициента готовности сети или ее определенной транспортной службы. 4) управление безопасностью - контроль доступа к ресурсам сети и сохранение целостности данных при их хранении и передаче через сеть. Процедуры аутентификации пользователей, назначение и проверка прав доступа к ресурсам сети, распределение и поддержка ключей шифрования, управления полномочиями и т. п. 5) учет работы сети - регистрация времени использования различных ресурсов сети. Системы управления компьютерами называют системами управления системой. Они выполняет следующие функции: 1) Учет используемых аппаратных и программных средств. 2) Распределение и установка программного обеспечения. 3) Удаленный анализ производительности и возникающих проблем. Для построения интегрированной системы управления разнородными элементами сети естественно применить многоуровневый иерархический подход. Наиболее эффективным для создания многоуровневой иерархической системы является стандарт Telecommunication Management Network. Нижний уровень - элементы сети состоит из отдельных устройств сети: каналов, усилителей, оконечной аппаратуры, мультиплексоров, коммутаторов и т. п. Управление элементами сети представляет собой элементарные системы управления. Элементарные системы управления автономно управляют отдельными элементами сети - контролируют канал связи SDH, управляют коммутатором или мультиплексором. Управление сетью координирует работу элементарных систем управления, позволяя контролировать конфигурацию составных каналов, согласовывать работу транспортных подсетей разных технологий и т. п. С помощью этого уровня сеть начинает работать как единое целое, передавая данные между своими абонентами. Управление услугами занимается контролем и управлением за транспортными и информационными услугами, которые предоставляются конечным пользователям сети. В задачу этого уровня входит подготовка сети к предоставлению определенной услуги, ее активизация, обработка вызовов клиентов, выдача уровню управления сетью задания на конфигурирование виртуального или физического канала связи для поддержания услуги. После формирования услуги данный уровень занимается контролем за качеством ее реализации. Бизнес-управление занимается вопросами долговременного планирования сети с учетом финансовых аспектов деятельности организации, владеющей сетью. На этом уровне помесячно и поквартально подсчитываются доходы от эксплуатации сети и ее отдельных составляющих, учитываются расходы на эксплуатацию и модернизацию сети, принимаются решения о развитии сети с учетом финансовых возможностей. Архитектуры систем управления сетями. В основе любой системы управления сетью лежит элементарная схема взаимодействия агента с менеджером. Агент является посредником между управляемым ресурсом и основной управляющей программой-менеджером. Чтобы один и тот же менеджер мог управлять различными реальными ресурсами, создается некоторая модель управляемого ресурса, которая отражает только те характеристики ресурса, которые нужны для его контроля. Менеджер получает от агента только те данные, которые описываются моделью ресурса. Агент поставляет менеджеру обработанную и представленную в нормализованном виде информацию. На основе этой информации менеджер принимает решения по управлению, а также выполняет дальнейшее обобщение данных о состоянии управляемого ресурса. Схема "менеджер-агент" позволяет строить достаточно сложные в структурном отношении распределенные системы управления. Обычно распределенная система управления включает большое количество связок менеджер-агент, дополненных рабочими станциями операторов сети, с помощью которых они получают доступ к менеджерам. Чаще всего используются два подхода к их соединению - одноранговый и иерархический. В случае одноранговых связей каждый менеджер управляет своей частью сети на основе информации, получаемой от нижележащих агентов. Центральный менеджер отсутствует. Координация работы менеджеров достигается за счет обмена информацией между базами данных каждого менеджера. Иерархическое построение связей между менеджерами более гибкое. Каждый менеджер нижнего уровня выполняет также функции агента для менеджера верхнего уровня. Такой агент работает уже с гораздо более укрупненной моделью (MIB) своей части сети, в которой собирается именно та информация, которая нужна менеджеру верхнего уровня для управления сетью в целом. Платформенный подход. При построении систем управления крупными локальными и корпоративными сетями обычно используется платформенный подход, когда индивидуальные программы управления разрабатываются не "с нуля", а задействуют службы и примитивы, предоставляемые специально разработанным для этих целей программным продуктом - платформой. Платформы создают общую операционную среду для приложений системы управления. Набор интерфейсных функций платформы образует интерфейс прикладного программирования (API) системы управления. Платформа управления поставляется с каким-либо универсальным менеджером, который может выполнять некоторые базовые функции управления без программирования. Стандарты систем управления. При формализации схемы "менеджер-агент" могут быть стандартизованы следующие аспекты ее функционирования: 1) протокол взаимодействия агента и менеджера; 2) интерфейс "агент-управляемый ресурс"; 3) интерфейс "агент-модель управляемого ресурса"; 4) интерфейс "менеджер-модель управляемого ресурса"; 5) справочная система о наличии и местоположении агентов и менеджеров, упрощающая построение распределенной системы управления; 6) язык описания моделей управляемых ресурсов, то есть язык описания MIB; 7) схема наследования классов моделей объектов (дерево наследования), которая позволяет строить модели новых объектов на основе моделей более общих объектов, например, модели маршрутизаторов на основе модели обобщенного коммуникационного устройства; 8) схема иерархических отношений моделей управляемых объектов (дерево включения), которая позволяет отразить взаимоотношения между отдельными элементами реальной системы, например, принадлежность модулей коммутации определенному коммутатору или отдельных коммутаторов и концентраторов определенной подсети. Применяются два семейства стандартов управления сетями - стандарты Интернета, построенные на основе протокола SNMP, и международные стандарты ISO/ITU-T, использующие в качестве протокола взаимодействия агентов и менеджеров протокол CMIP. Стандарты систем управления на основе протокола SNMP В системах управления, построенных на основе протокола SNMP, стандартизуются следующие элементы: 1) протокол взаимодействия агента и менеджера; 2) язык описания моделей MIB и сообщений SNMP; 3) несколько конкретных моделей MIB, имена объектов которых регистрируются в дереве стандартов ISO. Основные операции по управлению вынесены в менеджер, а агент SNMP выполняет чаще всего пассивную роль, передавая в менеджер по его запросу значения накопленных статистических переменных. Форматы и имена объектов SNMP MIB Для именования переменных базы MIB и однозначного определения их форматов используется дополнительная спецификация, называемая SMI. При описании переменных MIB и форматов протокола SNMP спецификация SMI опирается на формальный язык ASN.1. Нотация ASN.1 поддерживает базовый набор различных типов данных, таких как целое число, строка и т. п., а также позволяет конструировать из этих базовых типов составные данные - массивы, перечисления, структуры. Разработчики зарегистрировали объекты баз MIB SNMP во всемирном дереве регистрации стандартов ISO. От корня этого дерева отходят три ветви, соответствующие стандартам, контролируемым ISO, ITU и совместно ISO-ITU. Формат сообщений SNMP. Протокол SNMP обслуживает передачу данных между агентами и станцией, управляющей сетью. SNMP использует дейтаграммный транспортный протокол UDP. Сообщение SNMP состоит из произвольного количества полей, и каждое поле предваряется описателем его типа и размера. Любое сообщение SNMP состоит из трех основных частей: версии протокола (version), идентификатора общности (community), используемого для группирования устройств, управляемых определенным менеджером, и области данных, в которой собственно и содержатся описанные выше команды протокола, имена объектов и их значения. Область данных делится на блоки данных протокола (Protocol Data Unit, PDU). Недостатки протокола SNMP Протокол SNMP служит основой многих систем управления, хотя имеет несколько недостатков: 1) Отсутствие средств взаимной аутентификации агентов и менеджеров. 2) Работа через ненадежный протокол приводит к потерям аварийных сообщений от агентов к менеджерам, что может привести к некачественному управлению. Мониторинг и анализ локальных сетей Процесс контроля работы сети обычно делят на два этапа - мониторинг и анализ. На этапе мониторинга выполняется более простая процедура - процедура сбора первичных данных о работе сети: статистики о количестве циркулирующих в сети кадров и пакетов различных протоколов, состоянии портов концентраторов, коммутаторов и маршрутизаторов и т. п. Далее выполняется этап анализа, под которым понимается более сложный и интеллектуальный процесс осмысления собранной на этапе мониторинга информации, сопоставления ее с данными, полученными ранее, и выработки предположений о возможных причинах замедленной или ненадежной работы сети. Все средства, применяемые для анализа и диагностики вычислительных сетей, можно разделить на классы: 1) Агенты систем управления, поддерживающие функции одной из стандартных баз MIB и поставляющие информацию по протоколу SNMP или CMIP. 2) Встроенные системы диагностики и управления. 3) Анализаторы протоколов. 4) Экспертные системы. 5) Оборудование для диагностики и сертификации кабельных систем. Условно это оборудование можно поделить на четыре основные группы: 1.Сетевые мониторы предназначены для тестирования кабелей различных категорий. Сетевые мониторы собирают также данные о статистических показателях. 2.Устройства для сертификации кабельных систем выполняют сертификацию в соответствии с требованиями одного из международных стандартов на кабельные системы. 3. Кабельные сканеры используются для диагностики медных кабельных систем. 4. Тестеры предназначены для проверки кабелей на отсутствие физического разрыва. 5. Многофункциональные портативные устройства анализа и диагностики. Анализатор протоколов либо специализированное устройство, либо персональный компьютер, оснащенный специальной сетевой картой и соответствующим ПО. Анализатор подключается к сети точно так же, как и обычный узел. Отличие состоит в том, что анализатор может принимать все пакеты данных, передаваемые по сети, в то время как обычная станция - только адресованные ей. Анализаторы протоколов имеют некоторые общие свойства: 1) Возможность измерения среднестатистических показателей трафика в сегменте локальной сети, в котором установлен сетевой адаптер анализатора. 2) Возможность работы с несколькими агентами, поставляющими захваченные пакеты из разных сегментов локальной сети. 3) Наличие развитого графического интерфейса, позволяющего представить результаты декодирования пакетов с разной степенью детализации. 4) Фильтрация захватываемых и отображаемых пакетов. 5) Использование триггеров. Триггеры - это задаваемые администратором некоторые условия начала и прекращения процесса захвата данных из сети. 6) Многоканальность. Некоторые анализаторы протоколов позволяют проводить одновременную запись пакетов от нескольких сетевых адаптеров. Сетевые анализаторы Сетевые анализаторы представляют собой эталонные измерительные приборы для диагностики и сертификации кабелей и кабельных систем. Они могут с высокой точностью измерить все электрические параметры кабельных систем, а также работают на более высоких уровнях стека протоколов. Кабельные сканеры и тестеры Основное назначение кабельных сканеров - измерение электрических и механических параметров кабелей: длины кабеля, параметра NEXT, затухания, импеданса, схемы разводки пар проводников, уровня электрических шумов в кабеле. Точность измерений, произведенных этими устройствами, ниже, чем у сетевых анализаторов, но вполне достаточна для оценки соответствия кабеля стандарту. Для определения местоположения неисправности кабельной системы используется метод "отраженного импульса" (TDR). Суть этого метода состоит в том, что сканер излучает в кабель короткий электрический импульс и измеряет время задержки до прихода отраженного сигнала. По полярности отраженного импульса определяется характер повреждения кабеля. Кабельные тестеры позволяют определить непрерывность кабеля, однако в отличие от кабельных сканеров не дают ответа на вопрос о том, в каком месте произошел сбой. Многофункциональные портативные приборы мониторинга объединяют в себе возможности кабельных сканеров, анализаторов протоколов и даже некоторые функции систем управления, сохраняя в то же время такое важное свойство, как портативность. Многофункциональные приборы мониторинга (МПМ) имеют специализированный физический интерфейс, позволяющий выявлять проблемы и тестировать кабели на физическом уровне, который дополняется микропроцессором с программным обеспечением для выполнения высокоуровневых функций. Типичный набор функций и свойств такого прибора: 1) прибор обычно предоставляет пользователю удобный и интуитивно понятный интерфейс, основанный на системе меню. 2)функция сканирования позволяет измерять длину кабеля, расстояние до самого серьезного дефекта и распределение импеданса по длине кабеля. 3) функция определения карты кабелей используется для составления карты основных кабелей и кабелей, ответвляющихся от центрального помещения. 4) функции сбора статистики позволяют в реальном масштабе времени проследить за изменением наиболее важных параметров, характеризующих "здоровье" сегментов сети. 5) в группе сетевой статистики собраны наиболее важные статистические показатели - коэффициент использования сегмента, уровень коллизий, уровень ошибок и уровень широковещательного трафика. 6) статистика ошибочных кадров позволяет отслеживать все типы ошибочных кадров для определенной технологии. Считается, что в нормально работающей сети процент ошибочных кадров не должен превышать 0,01 %, то есть не более одного ошибочного кадра из 10 000. 7) статистика по коллизиям дает информацию о количестве и видах коллизий, отмеченных на сегменте сети, позволяя определить сам факт коллизии и найти источник проблемы. Средняя интенсивность коллизий в нормально работающей сети должна быть меньше 5 %. Большие всплески (более 20 %) могут быть индикатором кабельных проблем и др. Раздел 7. Методы и средства защиты компьютерной информации 34. Криптографические методы защиты информации: типовые модели криптографической защиты информации, симметричное шифрование, криптографически стойкие контрольные суммы и генераторы псевдослучайных чисел (ГПСЧ), асимметричное шифрование и электронная цифровая подпись (ЭЦП). Модель Биба (1977 год). Согласно ей все субъекты и объекты предварительно разделяются по нескольким уровням доступа, а затем на их взаимодействия накладываются следующие ограничения: 1) субъект не может вызывать на исполнение субъекты с более низким уровнем доступа; 2) субъект не может модифицировать объекты с более высоким уровнем доступа. Модель Гогена-Мезигера(1982) основана на теории автоматов. Согласно ей система может при каждом действии переходить из одного разрешенного состояния только в несколько других. Субъекты и объекты в данной модели защиты разбиваются на группы - домены, и переход системы из одного состояния в другое выполняется только в соответствии с так называемой таблицей разрешений, в которой указано какие операции может выполнять субъект, скажем, из домена C над объектом из домена D. В данной модели при переходе системы из одного разрешенного состояния в другое используются транзакции, что обеспечивает общую целостность системы. Сазерлендская(1986) модель защиты делает акцент на взаимодействии субъектов и потоков информации. Так же как и в предыдущей модели, здесь используется машина состояний со множеством разрешенных комбинаций состояний и некоторым набором начальных позиций. В данной модели исследуется поведение множественных композиций функций перехода из одного состояния в другое. Модель защиты Кларка-Вильсона (1989) основана на повсеместном использовании транзакций и тщательном оформлении прав доступа субъектов к объектам. Впервые исследована защищенность третьей стороны в данной проблеме - стороны, поддерживающей всю систему безопасности. Эту роль в информационных системах обычно играет программа-супервизор. Кроме того, в модели Кларка-Вильсона транзакции впервые были построены по методу верификации, то есть идентификация субъекта производилась не только перед выполнением команды от него, но и повторно после выполнения. Это позволило снять проблему подмены автора в момент между его идентификацией и собственно командой. Модель Кларка-Вильсона считается одной из самых совершенных в отношении поддержания целостности информационных систем. Криптография совместно с криптоанализом (целью которого является противостояние методам криптографии) составляют комплексную науку - криптологию. При симметричном шифровании для зашифровки и расшифровки исп-ся один и тот же блок инф-ии (ключ). Скремблерами называются программные или аппаратные реализации алгоритма, позволяющего шифровать побитно непрерывные потоки информации. Сам скремблер представляет из себя набор бит, изменяющихся на каждом шаге по определенному алгоритму. После выполнения каждого очередного шага на его выходе появляется шифрующий бит - либо 0, либо 1, который накладывается на текущий бит информационного потока операцией XOR. Блочные криптоалгоритмы (Сеть Фейштеля, ГОСТ 28147-89, Rijndael) в ходе своей работы производят преобразование блока входной информации фиксированной длины и получают результирующий блок того же объема, но недоступный для прочтения сторонним лицам, не владеющим ключом. Схему работы блочного шифра можно описать функциями Z=EnCrypt(X,Key) и X=DeCrypt(Z,Key). Условия EnCrypt: 1) Функция EnCrypt должна быть обратимой; 2) Не должно существовать иных методов прочтения сообщения X по известному блоку Z, кроме как полным перебором ключей Key; 3) Не должно существовать иных методов определения каким ключом Key было произведено преобразование известного сообщения X в сообщение Z, кроме как полным перебором ключей. Все действия, производимые над данными блочным криптоалгоритмом, основаны на том факте, что преобразуемый блок может быть представлен в виде целого неотрицательного числа из диапазона, соответствующего его разрядности. Так, например, 32-битный блок данных можно интерпретировать как число из диапазона 0..4'294'967'295. Кроме того, блок, разрядность которого обычно является "степенью двойки", можно трактовать как несколько независимых неотрицательных чисел из меньшего диапазона (рассмотренный выше 32-битный блок можно также представить в виде 2 независимых чисел из диапазона 0..65535 или в виде 4 нез-мых чисел из диапазона 0..255). Самая большая проблема всех методов рандомизации сообщений - это порождение действительно случайной последовательности бит. Генераторы случайных последовательностей, используемые для общих целей, например, в языках программирования, являются на самом деле псевдослучайными генераторами. Дело в том, что в принципе существует конечное, а не бесконечное множество состояний ЭВМ, и, как бы сложно не формировалось в алгоритме число, оно все равно имеет относительно немного бит информационной насыщенности. Наиболее часто в прикладных задачах результат формируют из счетчика тиков - системных часов. Источниками по-настоящему случайных величин могут быть только внешние объекты, например, человек. Два наиболее часто применяемых метода создания случайных последовательностей с помощью человека основаны на вводе с клавиатуры. В обоих случаях пользователя просят, не задумываясь, понабирать на клавиатуре бессмысленные сочетания букв. В мощных криптосистемах военного применения используются действительно случайные генераторы чисел, основанные на физических процессах. Они представляют собой платы, либо внешние устройства, подключаемые к ЭВМ через порт ввода-вывода. Два основных источника белого Гауссовского шума - высокоточное измерение тепловых флуктуаций и запись радиоэфира на частоте, свободной от радиовещания. Ассиметричный криптоалгоритм таков, что для зашифровки сообщения используется один ("открытый") ключ, известный всем желающим, а для расшифровки - другой ("закрытый"), существующий только у получателя. Ассиметричное шифрование также используется для проверки подлинности автора сообщений. При этом используется контрольная хеш-сумма и виртуальная подпись. Вместе с текстом получателю передается криптоскойкая хеш-сумма, по которой он проверяет неизменность переданного текста. Представим готовую к передаче хеш-сумму в виде нескольких k-битных блоков hi, где k - это размер сообщений по алгоритму RSA в предыдущем параграфе. Вычислим над каждым блоком значение si=((hi)d)mod n, где d - это тот самый закрытый ключ отправителя. Таким образом, манипуляции с хеш-суммой текста представляют из себя "асимметричное шифрование наоборот" : при отправке используется закрытый ключ отправителя, а для проверки сообщения - открытый ключ отправителя. Подобная технология получила название "электронная подпись". Информацией, которая уникально идентифицирует отправителя (его виртуальной подписью), является закрытый ключ d. Ни один человек, не владеющий этой информацией, не может создать такую пару (текст,si), что описанный выше алгоритм проверки дал бы положительный результат. Подобный обмен местами открытого и закрытого ключей для создания из процедуры асимметричного шифрования алгоритма электронной подписи возможен только в тех системах, где выполняется свойство коммутативности ключей. Для других асимметричных систем алгоритм электронной подписи либо значительно отличается от базового, либо вообще не реализуем. 35. Безопасность компьютерных сетей: протоколы сетевой безопасности, программно-аппаратные комплексы защиты сетей. Первая задача протоколов безопасности - аутентификация удаленного объекта или субъекта (пользователя системы или процесса). Практически все протоколы несут в себе аутентификацию, как одну из функций, но есть ряд протоколов предназначенных специально для аутентификации (PAP, CHAP и их подвиды: RADIUS, TACACS, Kerberos, S/Key). Следующая задача протоколов - обеспечить защиту информации при прохождении по каналам связи, т.е. согласовать ключи шифрования, зашифровать данные в точке отправления, расшифровать в точке получения. Говоря о подобных протоколах, следует понимать область их приложения, относительно модели OSI или TCP/IP. Это важно учитывать при выборе конкретной модели безопасности, так как необходимо знать, какая часть информации остается видимой после криптографической обработки (адрес отправителя и получателя, другая служебная информация). Например, протоколы прикладного уровня оставляют в открытом, нешифрованном виде всю информацию, которая необходима для работы нижних уровней. Протоколы транспортного уровня (SSL, Secure Shell, SOCKS) скрывают картину работы отдельных приложений, но оставляют информацию для сетевого уровня. Многие протоколы сетевого и подсетевого уровня (IPSec, L2F, PPTP, L2TP) могут скрывать: либо данные, пришедшие от протокола верхнего уровня (транспортного), оставляя видимыми адреса отправителя и получателя; либо полностью инкапсулировать все данные сетевого уровня, выставляя новые заголовки и окончания пакетов, такой режим работы часто называют туннелированием и именно он участвует в построении виртуальных частных сетей (VPN). Некоторые протоколы известны задачами, которые они решают. SSL - это де-факто сложившийся стандарт защиты Интернет-соединений. Сервер протокола SOCKS, обеспечивающий защиту данных между отправителем и получателем, выступает как шлюз-посредник приложений. Kerberos популярен как система, позволяющая пользователю аутентифицировать себя лишь однажды, при входе в систему, а далее получать прозрачный доступ (в рамках своих прав) ко всем ресурсам сети. X.509 - протокол цифровых сертификатов, указывающий, каким образом субъекты, использующие в открытой сети механизмы асимметрической криптографии, должны распространять свои открытые ключи через центры сертификации (CA). LDAP - протокол, регулирующий доступ к данным об объектах и субъектах данной зоны управления (домена, службы каталогов). Существуют различные классы МСЭ. Пакетный фильтр в чистом виде - это устройство, которое фильтрует сетевые пакеты на основе предопределенных данных о сетевых (IP) адресах источника и получателя. Однако в виде независимых программно-аппаратных комплексов МСЭ этого типа уже давно не встречаются в основном по причине недостаточной функциональности. В настоящее время пакетным фильтром можно назвать маршрутизатор с функциями МСЭ этого уровня. При этом, сам маршрутизатор может выполнять более сложные функции - анализ пакетов на транспортном уровне с учетом портов обращений, сокрытие внутренних адресов сети, на границе которой он находится, сокрытие портов обращений, формирование групп доступа по сетевым адресам с более сложным разграничением доступа, расширенные возможности аутентификации (поддержка протоколов RADIUS, TACACS), дифференцирование сетевых интерфейсов и т.п. МСЭ с контролем соединения производят более тонкий анализ проходящего трафика: рассматривают каждый пакет в принадлежности его к конкретному соединению, в том числе с учетом того, кем, когда и как было инициировано соединение и какая активность в рамках данного соединения была перед получением данного пакета. Технология посредника приложения заключается в том, что хосты во внутренней сети и хосты во внешней сети устанавливают соединения между собой не напрямую, а через виртуального "посредника" - отдельный сервис или демон в МСЭ, который общается с клиентом от имени сервера, а с сервером от имени клиента. Т.о. МСЭ выступает как часть соединения и, соответственно, может анализировать все происходящие при соединении события, обнаруживая в том числе и возможные атаки. Общемировым стандартом подобного "универсального" прокси-сервера стал протокол SOCKS. Технология персонального МСЭ заключается в том, что вся функциональность фильтрации соединений выполняется модулем, расположенным непосредственно на персональном компьютере. Для доступа внешних пользователей к ряду хостов (Веб-сервер, FTP-сервер, почтовый сервер) логично создать отдельную подсеть, свободную от элементов внутренней и внешней сети. Данная технология получила название демилитаризованной зоны. Технология трансляции сетевых адресов (NAT) заключается в том, что на МСЭ, который в данном случае играет роль шлюза, при выходе во внешнюю сеть во всех сетевых пакетах производится подмена внутреннего адреса на предопределенный внешний адрес. При этом шлюз ведет таблицу соответствия отправленных пакетов таким образом, что для входящих пакетов из внешней сети производится обратная замена внешнего адреса на внутренний. Различают статический NAT, когда за одним адресом внутренней сети жестко закреплен один внешний адрес, и более часто используемый динамический NAT, когда за множеством внутренних адресов закреплен некоторый, обычно небольшой, диапазон внешних адресов (а, возможно, и всего один IP-адрес). 36. Безопасность современных ОС и программных комплексов, вредоносные программы, системы обнаружения вторжений, комплексный подход к проектированию и анализу защищенных ИС. Среди наиболее уязвимых мест в Windows можно выделить следующие. Уязвимость Unicode в Microsoft Internet Information Server. Если клиент направляет IIS специально сформированный URL с нештатными Unicode-символами, он может перемещаться по директориям сервера за пределами разрешенной для него области и выполнять определенные скрипты. Переполнение буфера в расширении ISAPI. Вместе с установкой на сервер ПО IIS автоматически устанавливаются прикладные программные интерфейсы ISAPI, обеспечивающие разработчикам возможность расширения функциональности Веб-сервера с помощью DLL. Некоторые стандартные библиотеки, такие как idq.dll содержат ошибки, например, отсутствие контроля длины входящей строки данных. Специфика работы протокола SMB или CIFS, обеспечивающего пользовательское разделение файлов по NetBIOS, позволяет злоумышленнику получить доступ не только к ресурсам, определенным пользователем при разделении файлов, но и к другой информации, такой, как данные по бюджетам пользователей, ключам реестра и т.д. Слабое хеширование в базе данных SAM. Для обеспечения обратной совместимости с предыдущими версиями Windows ОС сохраняет пароли в базе данных SAM в устаревшем и уязвимом формате LM. Под компьютерным вирусом (или просто вирусом) понимается автономно функционирующая программа, обладающая способностью к самостоятельному внедрению в тела других программ и последующему самовоспроизведению и самораспространению в информационно-вычислительных сетях и отдельных ЭВМ. Предшественниками вирусов принято считать так называемые троянские программы, тела которых содержат скрытые последовательности команд (модули), выполняющие действия, наносящие вред пользователям. Следует отметить, что троянские программы не являются саморазмножающимися. Принципиальное отличие вируса от троянской программы состоит в том, что вирус после его активизации существует самостоятельно (автономно) и в процессе своего функционирования заражает (инфицирует) программы путем включения (имплантации) в них своего текста. Таким образом, компьютерный вирус можно рассматривать как своеобразный "генератор троянских программ". Программы, зараженные вирусом, называются вирусоносителями. "Первичное" заражение происходит в процессе поступления инфицированных программ из памяти одной машины в память другой, причем в качестве средства перемещения этих программ могут использоваться как магнитные носители (дискеты), так и каналы вычислительных сетей. Вирусы, использующие для размножения сетевые средства, принято называть сетевыми. Цикл жизни вируса обычно включает следующие периоды: внедрение, инкубационный, репликации (саморазмножения) и проявления. В течение инкубационного периода вирус пассивен, что усложняет задачу его поиска и нейтрализации. На этапе проявления вирус выполняет свойственные ему целевые функции, например необратимую коррекцию информации в компьютере или на магнитных носителях. Физическая структура компьютерного вируса достаточно проста. Он состоит из головы и, возможно, хвоста. Под головой вируса понимается его компонента, получающая управление первой. Хвост - это часть вируса, расположенная в тексте зараженной программы отдельно от головы. Вирусы, состоящие из одной головы, называют несегментированными, тогда как вирусы, содержащие голову и хвост - сегментированными.По режиму функционирования вирусы делятся на: резидентные вирусы - вирусы, которые после активизации постоянно находятся в оперативной памяти компьютера и контролируют доступ к его ресурсам; транзитные вирусы - вирусы, которые выполняются только в момент запуска зараженной программы. По объекту внедрения: файловые вирусы - вирусы, заражающие файлы с программами; загрузочные (бутовые) вирусы - вирусы, заражающие программы, хранящиеся в системных областях дисков. Принцип работы систем обнаружения атак (СОА) заключается в постоянном анализе (в режиме реального времени) активности, происходящей в информационной системе, и при обнаружении подозрительного информационного потока предпринимать действия по его предотвращению и информированию уполномоченных субъектов системы. СОА используют различные механизмы в своей работе. Технология сравнения с образцами подразумевает анализ наличия в пакете некоторой фиксированной последовательности байтов - шаблона или сигнатуры. Обычно производится анализ пакетов, предназначенных определенному сервису (порту), таким образом, снижается количество пакетов и шаблонов для анализа. Соответственно, пакеты, предназначенные нестандартным портам или пакеты непредопределенных протоколов могут не подлежать анализу и пропускаться. Технология соответствия состояния работает с потоком данных. Производится проверка ряда пакетов из каждого текущего соединения, прежде чем принимается решение о наличии или отсутствии атаки. Анализ с расшифровкой протокола предполагает анализ атак применительно к отдельным протоколам с учетом их специфики. После того, как ил протокола определен, применяются правила существующих стандартов для протокола с учетом обнаружения несоответствия этим правилам, таких, например, как значений специфических полей протокола, длины полей, числа аргументов и т.п. Статистический анализ использует алгоритмизированную логику для определения атаки. Применяются статистические данные для оценки трафика. Анализ на основе аномалий предназначен не для четкого выявления атак, а для определения подозрительной активности, отличающейся от нормальной. Необходимо определить критерий нормальной активности и также установить допустимые отклонения от нормального трафика, которые еще не будут считаться атакой. По топологии размещения в защищаемой сети СОА обычно разделяются на два вида: СОА на хосте (СОАХ) и СОА на сети (СОАС). В СОАХ агент размещается прямо на защищаемом хосте, его не интересуют другие хосты сети. В данном случае агент занят работой с сетевой и локальной активностью, специфической именно для данного хоста - сетевые атаки на данную ОС, подозрительные попытки работы с консоли хоста. В СОАС агент будет размещаться в некотором сегменте сети, подлежащем защите, на отдельном сетевом устройстве или на рабочей станции пользователя. Агент перехватывает и анализирует все кадры, поступающие на сетевой интерфейс устройства, на котором он установлен. В этом случае агент нацелен на работу с информацией, специфичной для сетевых протоколов. Контроль жизненного цикла программного обеспечения необходим для того, чтобы обеспечить уверенность в том, что информационная система на основе данного ПО функционирует точно так, как предполагалось в ТЗ и не имеет недокум-ых возм-тей. Возникает термин инф-ой без-ти, как программная закладка. Для избежания этих закладок примен-ся принципы безоп-ти минимальных привилегий и разделения обязанности при разработке ПО. В орг-ях создаются отделбные службы: разработки -(исх текст ПО)->хранения эталонных копий-(скомпилир модули)-> внедрения и поддержки (проверка рабочих копий системы на целостность). Раздел 8. Системное программирование 37. Взаимодействие операционной системы и BIOS с периферийными устройствами: уровни взаимодействия с периферийными устройствами, работа на уровне портов ввода-вывода, работа на уровне BIOS, работа на уровне ОС; функционирование резидентных программ. Файл IO.SYS содержит расширение базовой системы ввода/вывода и является интерфейсом между операционной системой и BIOS. Расширение используется операционной системой для взаимодействия с аппаратурой компьютера и BIOS. Система связи с драйверами устройства скрыта от прикладных программ - программы не могут обращаться непосредственно к драйверам устройств ввода/вывода. Программа вызывает DOS, а DOS обращается при необходимости к драйверам. Возможно, что запрет на непосредственный вызов драйверов введен для обеспечения совместимости с будущими версиями операционной системы, в которых механизм вызова драйверов может измениться. Однако, используя сведения, приведенные в этой книге, вы сможете обойти этот запрет и обратиться непосредственно к драйверу. При этом вам придется использовать некоторые недокументированные прерывания DOS, что само по себе нежелательно из-за возможной потери совместимости с другими версиями операционной системы. Для управления состоянием устройства ввода/вывода или состоянием драйвера используется специальная функция 44h прерывания DOS 21h. Эта функция предназначена для обмена управляющей информацией между прикладной программой и драйвером. В разных типах компьютеров и для разных типов операционных систем существуют различные способы устранения зависимости программного обеспечения от аппаратуры. По-видимому, одним из наиболее неудачных следует считать способ, примененный в операционной системе ОС ЕС для ЭВМ ряда ЕС. Для ЭВМ ряда ЕС любое периферийное устройство имеет одинаковый и достаточно сложный аппаратный интерфейс с каналами ЭВМ (канал - это устройство, обеспечивающее ввод/вывод информации в ЭВМ ряда ЕС). Для каждого типа устройства составляются канальные программы (программы, которые будут выполняться каналом). Прикладное программное обеспечение может пользоваться либо вводом/выводом на этом, крайне низком, канальном уровне, либо осуществлять ввод/вывод на уровне так называемых методов доступа. Библиотеки программ методов доступа содержат программы, работающие на канальном уровне. Для любого, даже очень простого нового устройства в этой системе необходим сложный аппаратный интерфейс с каналом. Составление программ своего метода доступа - крайне сложная задача, доступная лишь профессионалам высокого класса. О внесении изменений в существующие программы методов доступа говорить вообще вряд ли стоит, так как они очень сложны, а исходные тексты этих программ, как правило, отсутствуют. В операционных системах Unix для каждого устройства составляется своя программа обслуживания - драйвер. Эта программа выполняет все операции со своим устройством. Сама операционная система имеет дело только с драйвером, а прикладное программное обеспечение для выполнения ввода/вывода вызывает соответствующие модули операционной системы. Такая программная "буферизация" устраняет, с одной стороны, зависимость операционной системы от аппаратуры, с другой - зависимость прикладной программы от операционной системы и от аппаратуры. Операционная система MS-DOS, работающая на компьютерах фирмы IBM или совместимых с ними, тоже использует механизм драйверов. Однако драйверы MS-DOS не всегда обращаются напрямую к аппаратуре. Обычно они вызывают функции BIOS, и уже BIOS выполняет все действия по вводу/выводу. Конечно, BIOS содержит программы обслуживания только стандартных устройств ввода/вывода, нестандартные устройства обслуживаются драйверами напрямую. производители совместимых компьютеров учитывают в программах BIOS все аппаратные особенности, и DOS "не видит" отличий. А прикладная программа - тем более. Таким образом, независимость аппаратного и программного обеспечения в DOS обеспечивается, с одной стороны, BIOS для стандартных устройств, с другой стороны - драйверами. При загрузке драйвера в память заголовок драйвера тоже помещается в оперативную память, и в нем операционная система производит некоторые изменения. в начале загрузочного модуля драйвера имеется управляющий блок. Только этот управляющий блок в отличие от заголовка EXE-файла является принадлежностью самой программы и загружается вместе с ней в память. Заголовок EXE-программы используется при загрузке EXE-программы, но после загрузки операционная система убирает его из памяти. Как уже было сказано, все драйверы связаны в цепочку. Самый первый драйвер находится сразу за векторной таблицей связи. Поле next заголовка драйвера указывает на следующий драйвер (на его заголовок). Это поле имеет формат DWORD-указателя и состоит из компоненты адреса сегмента и смещения. Признаком того, что данный драйвер последний в цепочке, служит значение 0FFFFh в компоненте смещения поля next. Все драйверы можно разделить на две группы - драйверы символьных устройств и драйверы блочных устройств. Первые обслуживают устройства посимвольного ввода/вывода, такие как принтеры, клавиатура, контроллеры последовательной передачи данных RS232C и т.д., вторые ориентированы на ввод/вывод блоками - это диски. Для обращения к драйверу DOS формирует в своей области данных запрос, состоящий из заголовка стандартного формата и переменной части запроса, длина и формат которой зависят от типа запроса. Когда операционная система загружает драйвер, она создает заголовок запроса и помещает в него команду инициализации. Затем вызывается программа стратегии драйвера, которой передается адрес подготовленного заголовка запроса. После этого вызывается программа прерывания драйвера. Эта программа просматривает заголовок запроса, определяет, что пришла команда инициализации, и начинает ее обрабатывать. Обычно после завершения очередной выполняющейся программы DOS освобождает место в памяти, которое занимала программа, чтобы загрузить на это место новую. Однако есть способ оставить программу в памяти и после ее завершения. Следующая запускаемая программа при этом разместится в памяти после оставленной. Остающиеся в памяти после завершения своей работы программы называются резидентными или TSR (Terminate and Stay Resident). TSR-программы имеют некоторые особенности, отличающие их от "нормальных" программ. Им не разрешается использовать DOS-прерывания, когда вздумается. Это связано с тем, что DOS проектировалась как однозадачная операционная система, поэтому модули DOS не обладают свойством реентерабельности (повторной входимости). Существует несколько приложений, для которых подходят TSR-программы. Чаще всего TSR-программы используются для русификации импортных персональных компьютеров. Написано множество программ для загрузки русских шрифтов в память видеоадаптеров, для печати русских букв на принтере в графическом режиме, для русификации клавиатуры и т.п. Для всех этих программ характерно то, что они запускаются один раз при загрузке компьютера - их имена обычно включают в AUTOEXEC.BAT. Эти программы могут переключать на себя обработку прерываний, связанных с выводом на печать или с обращением к клавиатуре и/или выполнять разовые инициализирующие действия, такие как загрузка русских шрифтов в память видеоадаптера. 38. Организация ячеек памяти, регистры, форматы команд. Процессор - основная микросхема компьютера, в которой и производятся все вычисления. Конструктивно процессор состоит из ячеек, похожих на ячейки оперативной памяти, но в этих ячейках данные могут не только храниться, но и изменяться. Регистр процессора - блок ячеек памяти, образующий сверхбыструю оперативную память (СОЗУ) внутри процессора; используется самим процессором и большой частью недоступен программисту: например, при выборке из памяти очередной команды она помещается в регистр команд (англ.), к которому программист обратиться не может. Важно также отметить, что данные, попавшие в некоторые регистры, рассматриваются не как данные, а как команды, управляющие обработкой данных в других регистрах. Среди регистров процессора есть и такие, которые в зависимости от своего содержания способны модифицировать исполнение команд. Таким образом, управляя засылкой данных в разные регистры процессора, можно управлять обработкой данных. На этом и основано исполнение программ. -Регистры общего назначения: AX аккумулятор BX база CX счетчик DX данные SI индекс источника DI индекс приемника BP указатель базы SP указатель стека -Сегментные регистры CS сегмент команд DS сегмент данных SS сегмент стека ES дополнит. сегмент -Указатель команд -Регистр флагов С остальными устройствами компьютера, и в первую очередь с оперативной памятью, процессор связан несколькими группами проводников, называемых шинами. Основных шин три: шина данных, адресная шина и командная шина. Адресная шина. У процессоров Intel Pentium (а именно они наиболее распространены в персональных компьютерах) адресная шина 32-разрядная, то есть состоит из 32 параллельных линий. В зависимости от того, есть напряжение на какой-то из линий или нет, говорят, что на этой линии выставлена единица или ноль. Комбинация из 32 нулей и единиц образует 32-разрядный адрес, указывающий на одну из ячеек оперативной памяти. К ней и подключается процессор для копирования данных из ячейки в один из своих регистров. Шина данных. По этой шине происходит копирование данных из оперативной памяти в регистры процессора и обратно. В компьютерах, собранных на базе процессоров Intel Pentium, шина данных 64-разрядная, то есть состоит из 64 линий, по которым за один раз на обработку поступают сразу 8 байтов. Шина команд. Для того чтобы процессор мог обрабатывать данные, ему нужны команды. Он должен знать, что следует сделать с теми байтами, которые хранятся в его регистрах. Эти команды поступают в процессор тоже из оперативной памяти, но не из тех областей, где хранятся массивы данных, а оттуда, где хранятся программы. Команды тоже представлены в виде байтов. Самые простые команды укладываются в один байт, однако есть и такие, для которых нужно два, три и более байтов. В большинстве современных процессоров шина команд 32-разрядная (например, в процессоре Intel Pentium), хотя существуют 64-разрядные процессоры и даже 128-разрядные. 39. Ассемблер: основные понятия, директивы, команды. Условный и безусловный переходы. Циклы. Массивы. Процедуры. Упакованные данные. Структуры. Директивы представляют собой команды транслятору языка ассемблера. Эти команды, в основном, определяют параметры трансляции программы. По функциональному назначению, директивы можно разделить на следующие группы: 1. директивы управления размещением данных; 2. директивы связи модулей программы; 3. директивы создания элементов программы; 4. директивы условной компиляции; 5. прочие директивы. Директивы управления размещением данных позволяют определить ячейки памяти программы, их тип, количество и задать начальные значения. Директивы связи модулей программы предназначены для управления связыванием различных модулей в одну программу. Используются, в основном, при написании больших программ или библиотек. Директивы создания элементов программы позволяют создавать такие элементы программы, как программные сегменты, структуры, процедуры и макросы. Эти директивы используются в любой программе написанной на языке ассемблера. Директивы условной компиляции предназначены для обозначения фрагментов программы, обрабатываемых транслятором в зависимости от определенных условий. Все директивы ассемблера записываются в виде символьных операторов. Некоторые директивы могут располагаться в любом месте программы, другие - только в определенных местах или между определенными директивами. Директива не преобразуется в машинную команду процессора, а лишь влияет на трансляцию программы и определяет параметры трансляции. Рассмотрим расположение кодов и данных в пределах одного программного сегмента. Особенностью МП 8086 является то, что и коды команд и данные хранятся в одной области памяти размером 1 Мб. Не существует способа определить, является ли какая-либо последовательность байт командой процессора или данными программы. Если в программном сегменте среди команд располагаются и данные, то процессор при выполнении команд может дойти до данных и попытаться "выполнить" эти данные, так как интерпретирует их как команды. Поэтому при размещении данных в одном сегменте с командами следует избегать передачи управления процессора с команд на данные. Это можно выполнить несколькими способами: 1. перед данными поставить команду безусловного перехода так, чтобы управление передавалось на следующую после данных команду - таким образом, процессор как бы "обходит" данные и приступает к выполнению следующей команды; 2. разместить данные в конце программного сегмента, а перед ними поставить вызов какой-либо функции DOS, завершающей выполнение программы. 40. Защищенный режим процессора Intel 80386: страничная адресация, переключение контекста, использование возможностей защищенного режима различными ОС. С помощью введенных 4-х уровней привилегий (0,1,2,3) в 386+ введен принцип мандатного ограничения доступа. При исполнении процесса ему присваивается текущий уровень привилегии (изначально предполагается, что ядро ОС - 0 уровень, пользовательское приложение - 3 уровень, 1 и 2 уровни на усмотрения ОС). При вызове процедур или при переходе между сегментами разрешается использовать код, имеющий более высокий уровень привилегии, при этом уровень привилегии текущего процесса не изменяется. Если необходимо изменение (повышение обычно уровня привилегии), то используются шлюзы переходов. При вызове подобного прерывания меняется уровень привилегии процесса, процесс переходит на другой сегмент, стек. Контекст задачи - структура данных, описывающая текущее содержимое регистров, селекторов сегментов, флагов, текущих значений привилегий и др. информация, используемая для аппаратного переключения между процессами. В процессорах 80386 преодолено жесткое ограничение на длину непрерывно сегмента памяти и составляет 64Кбайта. В защищенном режиме 32 разрядных процессоров оно отодвинулось до 4Гбайт. Процессоры могут работать в 2 режимах: Real address mode - режим реальной адресации, полностью совместим с 8086(этом режиме возможна адресация до 1мб); Protected Virtual Address mode - защищенный режим (в этом режиме возможна адресация до 4гб физической памяти). Страница в 80386 имеет длину 4к байт. Этот размер находится в согласии с промышленной тенденцией к увеличению длины страниц и ведет к увеличению производительности по двум направлениям. Во-первых, он обеспечивает хорошее отношение показаний страниц в кэш при данном объеме кэш-памяти. Во-вторых, 4кбайтов являются эффективным размером блока для дисковых передач. 80386 включает страничный механизм, устанавливая бит PG в управляющем регистре 0 при помощи привилегированной команды. Когда страничный механизм включен, процессор транслирует линейный адрес в физический адрес, используя страничные таблицы. Страничные таблицы являются частью таблиц дескрипторов сегментов. Так же как таблицы дескрипторов сегментов задачи определяют ее логическое адресное пространство, страничные таблицы задачи определяют ее линейное адресное пространство. Аналогично супер-мини-эвм и большим эвм страничные таблицы 80386 организованы по принципу двухуровневой иерархии. Каждая задача может иметь справочник системных таблиц. Системный регистр CR3 процессора 80386 (база справочника системных таблиц) указывает на справочник страничных таблиц работающей задачи. Процессор обновляет регистр CR3 при каждом переключении задачи, получая новый адрес задачи из TSS(сегмент состояния задачи) новой задачи. Справочник страничных таблиц имеет длину, равную одной странице и содержит элементы страничной таблицы описывают 1024 страницы. Таким образом, каждая страничная таблица описывает 4м байта, а оглавление может описать до 4г байт - максимальное адресное пространство. Windows графическая 32 разрядная многозадачная ОС. Windows 1) основана на защищенном 386+; 2) динамически загружаемые библиотеки DLL. Блок программного кода, который по требованию может быть загружен в ОЗУ, используется несколькими программами одновременно и может быть выгружен в тот момент когда надобность в нем отпадает. (exe ->dll->dll). Основные DLL это Kernel, работа с файлами, потоками, процессами, событиями, сообщениями, системными часами, управление памятью, загрузка библиотек, запуск и остановка процесса. Advapi32 - системный log файл. Gdi32 - графический интерфейс. User32 - клавиатура, мышь, сообщения пользователю и высоко уровненная работа с графическим интерфейсом. II. СПЕЦИАЛЬНЫЕ ДИСЦИПЛИНЫ Раздел 9. Структуры и алгоритмы обработки данных 41. Абстрактный тип данных. Линейные и нелинейные структуры данных. Стек, очередь, списки, деревья, графы. Абстрактный тип данных - математическая модель плюс различные операторы, определенные в рамках этой модели. Для представления АТД используются структуры данных, которые представляют собой набор переменных, возможно, различных типов данных, объединенных определенным образом. Очередью FIFO (First - In - First- Out - "первым пришел - первым исключается"). называется такой последовательный список с переменной длиной, в котором включение элементов выполняется только с одной стороны списка (эту сторону часто называют концом или хвостом очереди), а исключение - с другой стороны (называемой началом или головой очереди). Стек - это специальный тип списка, в котором все вставки и удаления и выполняются только на одном конце, называемом вершиной (top). Дек - особый вид очереди. Дек (от англ. deq - double ended queue,т.е очередь с двумя концами) - это такой последовательный список, в котором как включение, так и исключение элементов может осуществляться с любого из двух концов списка. Частный случай дека - дек с ограниченным входом и дек с ограниченным выходом. Логическая и физическая структуры дека аналогичны логической и физической структуре кольцевой FIFO-очереди. Списком называется упорядоченное множество, состоящее из переменного числа элементов, к которым применимы операции включения, исключения. Граф - это сложная нелинейная многосвязная динамическая структура, отображающая свойства и связи сложного объекта. Многосвязная структура обладает следующими свойствами: • 1) на каждый элемент (узел, вершину) может быть произвольное количество ссылок; • 2) каждый элемент может иметь связь с любым количеством других элементов; • 3) каждая связка (ребро, дуга) может иметь направление и вес. Дерево - это граф, который характеризуется следующими свойствами: • 1. Cуществует единственный элемент (узел или вершина), на который не ссылается никакой другой элемент - и который называется КОРНЕМ (рис. 6.8, 6.9 - A,G,M - корни). • 2. Начиная с корня и следуя по определенной цепочке указателей, содержащихся в элементах, можно осуществить доступ к любому элементу структуры. • 3. На каждый элемент, кроме корня, имеется единственная ссылка, т.е. каждый элемент адресуется единственным указателем. 42. Графы: ориентированные и неориентированные графы, представление графов в ЭВМ, алгоритмы поиска минимального остовного дерева; компоненты связности; сильная связность; алгоритмы поиска кратчайших путей в графе. Орграф - G=(V,E) состоит из множества вершин V и множества дуг Е. Вершины так же называются узлами, а дуги - ориентированными ребрами. Дуга представима в виде упорядоченной пары вершин (v, w), где вершина v называется началом, а w - концом дуги. Дугу (v,w) записывают как v->w. Путь называется простым, если все вершины на нем, за исключением, может быть, первой и последней, различны. Цикл - простой путь длины не менее 1, который начинается и заканчивается в одной и той же вершине. Для представления орграфов можно использовать различные структуры данных. Одним из наиболее общих представлений орграфа является матрица смежности. Пример, А[i,j] = true если существует путь из i в j. Время поиска большое - О(n2), поэтому вместо матриц смежности использует список смежности. Таким образом, орграф G можно представить посредством массива HEAD, чей элемент HEAD[i] является указателем на список смежности вершины i. Кратчайший путь в орграфе. (Дейкстры) Алгоритм строит множество S вершин, для которых кратчайшие пути от источника уже известны. На каждом шаге к множеству S добавляется та из оставшихся вершин, расстояние до которой от источника меньше чем для других оставшихся вершин. С - массив стоимостей, V - множество вершин Procedure dijkstra; Begin S:={1}; For i:=2 to n do D[i]:=C[1,i]; For i:=1 to n-1 do Выбор из множества V/S такой вершины w что значение d[w] минимально; добавить w к множеству S For каждая вершина v из множества V\S do D[v] := min(d[v], d[w]+c[w,v]) End; Обход орграфа. Поиск в глубину. Сначала все вершины помечаются как "не посещались", а после посещения метка ставится "посещались". В процессе обхода орграфа методом поиска в глубину только определенные дуги ведут к вершинам, которые ранее не посещались. Такие дуги, ведущие к новым вершинам, называются дугами дерева или и формируют для данного графа остовный лес. Обратные дуги - дуги, которые идут от потомков к предкам. Прямые дуги - дуги, идущие от предкам к истинным потомкам. Сильно связной компонентной орграфа называется максимальное множество вершин, в котором существуют пути из любой вершины в любую другую вершину. Точная формулировка: G = (V,E) - орграф. Множество вершин разбивается на классы эквивалентности Vi, 1j путем i->k->j. Такая замена выполняется систематически в процессе выполнения данного алгоритма. Шаг 0. Определяем начальную матрицу расстояния A0 и матрицу последовательности вершин S0. Каждый диагональный элемент обеих матриц равен 0, таким образом, показывая, что эти элементы в вычислениях не участвуют. Полагаем k = 1. Основной шаг k. Задаем строку k и столбец k как ведущую строку и ведущий столбец. Рассматриваем возможность применения замены описанной выше, ко всем элементам A[i,j] матрицы Ak-1. Если выполняется неравенство a[i,k]+a[k,j]. Более точно, функционал может оперировать функциями в качестве аргументов или результатов. Функционалы - это функции, которые используют в качестве аргументов или результатов другие функции. При построении функционалов переменные могут играть роль имен функций, определения которых находятся во внешних формулах, использующих функционалы. Параметром функционала может быть любая вспомогательная функция. Вызовы функционалов можно объединять в более сложные структуры таким же образом, как и вызовы обычных функций, а их композиции можно использовать в определениях новых функций. Композиции функционалов позволяют создавать и более мощные построения, достаточно ясные, но требующие некоторого внимания. Согласно стандарту, в реализацию языка Clisp обычно включены функционалы: map, mapcar,maplist, mapcan, mapcon, mapc, mapl [6, 7]. Каждый из них покомпонентно обработает любой набор списков. Отличаются они схемами выбора аргументов для отображающей функции, характером воздействия на исходные данные и оформлением результатов, передаваемых объемлющим формулам. Map ( map result-type function sequences ... ) Функция function вызывается на всех первых элементах последовательностей, затем на всех вторых и т.д. Из полученных результатов function формируется результирующая последовательность, строение которой задается параметром result-type с допустимыми значениями cons, list, array, string, NIL. Mapcar ( mapcar function list ... ) Функция function применяется к первым элементам списков, затем ко вторым и т.д. Другими словами, function применяется к методично сокращающихся списков, и результаты применения собираются в результирующий список. Maplist ( maplist function list ... ) Функционал аналогичен mapcar, но function применяется к > списков list, начиная с полного списка. Mapc и Mapl Оба функционала работают как mapcar и maplist, соответственно, за исключением того, что они в качестве формального результата выдают первый список (своеобразная аналогия с формальными аргументами). Mapcan и Mapcon И эти два функционала аналогичны mapcar и maplist, но формирование результатов происходит не с помощью операции cons, которая строит данные в новых блоках памяти, а с помощью деструктивной функции nconc, которая при построении новых данных использует память исходных данных, из-за чего исходные данные могут быть искажены. Показанные построения достаточно разнообразны, чтобы можно было сформулировать, в чем преимущества применения техники функционального программирования: • отображающие функционалы позволяют строить программы из крупных действий; • функционалы обеспечивают гибкость отображений; • определение функции может совсем не зависеть от конкретных имен; • с помощью функционалов можно управлять выбором формы результатов; • параметром функционала может быть любая функция, преобразующая элементы структуры; • функционалы позволяют формировать серии функций от общих данных; • встроенные в Clisp функционалы приспособлены к покомпонентной обработке произвольного числа параметров; • любую систему взаимосвязанных функций можно преобразовать к одной функции, используя вызовы безымянных функций. Применение функций высших порядков естественным образом завершает освоение функционального программирования как логической системы, допускающей конструирование функциональных объектов при решении задач регулярной обработки формализованной информации. Подобные задачи возникают при реализации и настройке сложных информационных систем, таких как операционные системы, системы программирования, текстовые и графические процессоры, системы управления базами данных, поддержки проектов и т.п. Функции высших порядков используют другие функции в качестве аргументов или вырабатывают их как результат. (defun mul-N (N) #'(lambda (x) (* x N))) ; конструктор семейства функций, множащих ; аргумент на N (funcall (mul-N 25) 7) ; применение частной функции, умножающей на 25 Правильность выражений с такими функциями требует корректной подстановки параметров и учета ранга функции, определяющего возможность манипулирования функциональными значениями. Функции можно ранжировать на основе так называемых типовых выражений, представляющих области определения и значения функций. Например, x+1 : Number -> Number x+y : (Number Number) -> Number Суперпозицию функций можно характеризовать следующими типовыми выражениями: S(h,g) = { при h: X -> Y, g: Y -> Z строит f=g(h) - суперпозиция } : (X->Y Y->Z) -> (X->Z) (defun super (f g) #'(lambda (x) (funcall f (funcall g x)) )) ; конструктор суперпозиции функций (funcall (super #'car #'cdr) '(1 2 3)) ; применение суперпозиции CAR и CDR Двойное применение функции можно определить независимо или через суперпозицию - типовое выражение от этого не зависит, но оно представляет собой параметризованное выражение. 47. Принципы логического программирования: понятие логической программы, основные конструкции, факты, правила, вопросы, логические переменные, подстановки, абстрактный интерпретатор, значение логической программы, вычислительная модель логических программ, ПРОЛОГ как система, реализующая логический вывод в исчислении предикатов первого порядка. Задана некая формальная система F, если определены: алфавит системы - счетное множество символов; формулы системы - некоторое подмножество всех слов, которые можно образовать из символов, входящих в алфавит (обычно задается процедура, позволяющая составлять формулы из символов алфавита системы); аксиомы системы - выделенное множество формул системы; правила вывода системы - конечное множество отношений между формулами системы. Зададим логику первого порядка (или логику предикатов), на которой основывается Пролог. Язык логики предикатов - один из формальных языков, наиболее приближенных к человеческому языку. Алфавит логики первого порядка составляют следующие символы: переменные (будем обозначать их последними буквами английского алфавита u, v, x, y, z); константы (будем обозначать их первыми буквами английского алфавита a, b, c, d); функциональные символы (используем для их обозначения ближние буквы f и g); предикатные символы (обозначим их дальними буквами p, q и r); пропозициональные константы истина и ложь (true и false); логические связки (отрицание), (конъюнкция), (дизъюнкция), (импликация); кванторы: (существования), (всеобщности); вспомогательные символы (, ), ,. Всякий предикатный и функциональный символ имеет определенное число аргументов. Если предикатный (функциональный) символ имеет n аргументов, он называется n-местным предикатным (функциональным) символом. Термом будем называть выражение, образованное из переменных и констант, возможно, с применением функций, а точнее: всякая переменная или константа есть терм; если t1,...,tn - термы, а f - n-местный функциональный символ,то f(t1,...,tn) - терм; других термов нет. Формулы логики первого порядка получаются следующим образом: всякая атомная формула есть формула; если A и B - формулы, а x - переменная, то выражения A (читается "не A" или "отрицание A"), A B (читается "A и B"), A B (читается "A или B"), A B (читается "A влечет B"), хA (читается "для некоторого x" или "существует x") и xA (читается "для любого x" или "для всякого x")- формулы; других формул нет. Факт констатирует, что между объектами выполнено некоторое отношение. Он состоит только из заголовка. Можно считать, что факт - это предложение, у которого тело пустое. Правило - это предложение, истинность которого зависит от истинности одного или нескольких предложений. Обычно правило содержит несколько хвостовых целей, которые должны быть истинными для того, чтобы правило было истинным. Свободная переменная - это переменная, которая еще не получила значения. Она не равняется ни нулю, ни пробелу; у нее вообще нет никакого значения. Такие переменные еще называют неконкретизированными. Переменная, которая получила какое-то значение и оказалась связанной с определенным объектом, называется связанной. Если переменная была конкретизирована каким-то значением и ей сопоставлен некоторый объект, то эта переменная уже не может быть изменена. Вопросы используют для выяснения выполнимости некоторого отношения между описанными в программе объектами. Система рассматривает вопрос как цель, к которой надо стремиться. Ответ на вопрос может оказаться положительным или отрицательным, в зависимости от того, может ли быть достигнута соответствующая цель. Одним из отличий вычислительной модели логического программирования от моделей обычного программирования является недетерминизм. Недетерминизм - это техническое понятие, используемое для сжатого определения абстрактных моделей вычислений. Однако недетерминизм не только мощная теоретическая идея, но и полезное средство описания и реализации алгоритмов. Интуитивно ясно, что недетерминированная машина, перед которой возникло несколько альтернативных путей решения, осуществляет корректный выбор очередного действия. Подлинно недетерминированную машину реализовать нельзя, однако ее можно моделировать или аппроксимировать. В частности, Пролог-интерпритатор аппроксимирует недетерминированное поведение интерпретатора абстрактных логических программ с применением механизма последовательного поиска и возвратов. Однако тот факт, что детерминизм только "моделируется", но "реально не присутствует", для недетерминированного мышления во многих случаях не существенен, точно также как несущественны для символьного мышления детали обработки указателей в процессе унификации. Выполнение программ на Прологе заключается в работе абстрактного интерпретатора, при которой вместо произвольной цели выбирается самая лева цель, а недетерминированный выбор предложения заменяется последовательным поиском унифицируемого правила и механизма возврата. Пролог (Prolog) - это программирование на языке логики. Этот язык используется для задач, которые сводятся к объектам и отношениям между ними. Пролог является реляционным языком. Пользоваиель должен установить какие формальные отношения и объекты существуют в решаемой задаче и установить какие отношения справедливы для поиска решения. Пролог - это декларативный язык. Он отличается от процедурных (императивных) языков: • императивный - как делать • декларативный - что делать Порядок выполнения Пролог программы определяется: • семантикой языка • новыми фактами, которые Пролог выводит из имеющихся • отчасти той управляющей информацией, которую задает программист Пролог - это логический язык, в котором реализована логика предикатов 1-го порядка. В самом языке предусмотрены элементы интеллектуальности: • сопоставление с образцом • поиск с возвратом • недетерменизм 48. Согласование целевых утверждений: диаграмма успешного доказательства целевых утверждений, доказательство целевых утверждений при использовании механизма возврата, правила установления соответствия, недетерминизм, понятие "связанной" переменной, операционная модель вычисления ПРОЛОГ-программ, ПРОЛОГ и математическая логика. Вопрос к системе - это всегда последовательность, состоящая из одной или нескольких целей. Для того, чтобы ответить на вопрос, система пытается достичь всех целей. Достичь цели - это значит показать, что утверждения, содержащиеся в вопросе, истинны в предположении, что все отношения программы истинны. Другими словами, достичь цели - это значит показать, что она логически следует из фактов и правил программы. Если вопрос содержит переменные, система должна к тому же найти конкретные объекты, которые (будучи подставленными вместо переменных) обеспечивают достижение цели. Найденные конкретизации сообщаются пользователю. Если для некоторой конкретизации система не в состоянии вывести цель из остальных предложений программы, то ее ответом на вопрос будет "нет". Таким образом, подходящей интерпретацией пролог-программы в математических терминах будет следующая: пролог-система рассматривает факты и правила в качестве множества аксиом, а вопрос пользователя - как теорему; затем она пытается доказать эту теорему, т.е. показать, что ее можно логически вывести из аксиом. Проиллюстрируем этот подход на примере программы о родственных отношениях. Пусть имеются следующие аксиомы и факты: родитель(пам,боб). % Пам-родитель Боба родитель(том,боб). родитель(том,лиз). родитель(бoб,энн). родитель(боб,пат). родитель(пат,джим). предок(X,Z):- % Правило пр1: X-предок Z родитель(X,Z). предок(X,Z):- % Правило пр2: X-предок Z родитель(X,Y), предок(Y,Z). ?-предок(том,пат) Цепочка доказательства Пролог-системой показана на рис. 47а. Рис. 47а. Все шаги достижения цели предок(том, пат). Правая ветвь демонстрирует, что цель достижима. Графическое представление шагов вычисления на рис. 47а имеет форму дерева. Вершины дерева соответствуют целям или спискам целей, которые требуется достичь. Дуги между вершинами соответствуют применению (альтернативных) предложений программы, которые преобразуют цель, соответствующую одной вершине, в цель, соответствующую другой вершине. Корневая (верхняя) цель достигается тогда, когда находится путь от корня дерева (верхней вершины) к его листу, помеченному меткой "да". Лист помечается меткой "да", если он представляет собой простой факт. Выполнение пролог-программы состоит в поиске таких путей. В процессе такого поиска система может входить и в ветви, приводящие к неуспеху. В тот момент, когда она обнаруживает, что ветвь не приводит к успеху, происходит автоматический возврат к предыдущей вершине, и далее следует попытка применить к ней альтернативное предложение. Наиболее важной операцией над термами является сопоставление. Сопоставление само по себе может производить содержательные вычисления. Пусть даны два терма. Будем говорить, что они сопоставимы, если: (1) они идентичны или (2) переменным в обоих термах можно приписать в качестве значений объекты (т.е. конкретизировать их) таким образом, чтобы после подстановки этих объектов в термы вместо переменных, последние стали идентичными. Например, термы дата(Д, М, 1983) и дата(Д1, май, Y1) сопоставимы. Одной из конкретизации, которая делает эти термы идентичными, является следующая: • Д заменяется на Д1 • М заменяется на май • Y1 заменяется на 1983 С другой стороны, дата(Д, М, 1983) и дата(Д1, Ml, 1944) не сопоставимы, как и термы дата(X, Y, Z) и точка(X, Y, Z). Сопоставление - это процесс, на вход которого подаются два терма, а он проверяет, соответствуют ли эти термы друг другу. Если термы не сопоставимы, будем говорить, что этот процесс терпит неуспех. Если же они сопоставимы, тогда процесс находит конкретизацию переменных, делающую эти термы тождественными, и завершается успешно. Сопоставление в Прологе всегда дает наиболее общую конкретизацию. Таковой является конкретизация, которая ограничивает переменные в наименьшей степени, оставляя им, тем самым, наибольшую свободу для дальнейших конкретизаций, если потребуются новые сопоставления. Общие правила выяснения, сопоставимы ли два терма S и Т, таковы: (1) Если S и Т - константы, то S и Т сопоставимы, только если они являются одним и тем же объектом. (2) Если S - переменная, а Т - произвольный объект, то они сопоставимы, и S приписывается значение Т. Наоборот, если Т - переменная, а S - произвольный объект, то Т приписывается значение S. (3) Если S и Т - структуры, то они сопоставимы, только если (а) S и Т имеют одинаковый главный функтор и (б) все их соответствующие компоненты сопоставимы. Результирующая конкретизация определяется сопоставлением компонент. Недетерминизм - это явление в поведении программы с точки зрения внешнего к программе наблюдателя. Нечто, называемое "наблюдатель", "видит" запрос процесса программы, ответ среды и реакцию программы на этот ответ. Если на один и тот же запрос могут следовать разные ответы, реакция программы на каждый из которых различна, то мы говорим, что программа ведет себя недетерминировано. Такой недетерминизм будем называть внешним. Мы также говорим, что программа ведет себя недетерминировано, когда на один и тоже ответ среды реакция программы различна. Причем, эту реакцию наблюдатель заранее предсказать не может. В этом случае мы будем говорить о внутреннем недетерминизме. Итак, выделяется два вида недетерминизма: внутренний и внешний. Источником внешнего недетерминизма процесса является недетерминизм ответов среды на его запросы. Этот недетерминизм обуславливают разные причины. Например, техническая производительность физической среды, алгоритмы арбитража конфликтов в логической среде, использование недетерминированных операторов типа SELECT в языке ADA. Как следствие, в средах с разными техническими производительностями, разными алгоритмами арбитража у одной и той же программы последовательности обращений к логическим ресурсам при одинаковых исходных данных могут быть разными. Недетерминизм этого типа может возникать из-за различий в алгоритмах распределения ресурсов. Так, например, если процесс запросил сообщение и в логической среде для него есть несколько сообщений, то дальнейшее поведение процесса может зависеть от того, какое сообщение от среды он получит первым. А это может зависеть, например, от алгоритма буферизации сообщений, используемого в логической среде, от структуры и технической производительности среды связи. Источником внутреннего недетерминизма являются данные, которые процесс получает в форме сообщений. Естественно, что поведение процесса самым непосредственным образом зависит от данных. Однако, два сообщения, которые наблюдатель считает одинаковыми, процесс может рассматривать как разные. Процедурная семантика определяет, как пролог-система отвечает на вопросы. Ответить на вопрос - это значит удовлетворить список целей. Этого можно добиться, приписав встречающимся переменным значения таким образом, чтобы цели логически следовали из программы. Можно сказать, что процедурная семантика Пролога - это процедура вычисления списка целей с учетом заданной программы. "Вычислить цели" это значит попытаться достичь их (см. рис. 47б). Рис. 47б. Входы и выходы процедуры вычисления списка целей. Всякий раз, как рекурсивный вызов процедуры вычислить приводят к неуспеху, процесс вычислений возвращается к просмотру и продолжается с того предложения, которое использовалось последним. Поскольку применение предложения не привело к успешному завершению, пролог-система должна для продолжения вычислений попробовать альтернативное предложение. В действительности система аннулирует результаты части вычислений, приведших к неуспеху, и осуществляет возврат в ту точку, в которой эта неуспешная ветвь начиналась. Когда процедура осуществляет возврат в некоторую точку, все конкретизации переменных, сделанные после этой точки, аннулируются. Такой порядок обеспечивает систематическую проверку пролог-системой всех возможных альтернативных путей вычисления до тех пор, пока не будет найден путь, ведущий к успеху, или же до тех пор, пока не окажется, что все пути приводят к неуспеху. Конечно, в настоящих реализациях Пролога в процедуру вычислить добавлены и еще некоторые усовершенствования. Одно из них - сокращение работы по просмотрам программы с целью повышения эффективности. Поэтому на практике пролог-система не просматривает все предложения программы, а вместо этого рассматривает только те из них, которые касаются текущего целевого утверждения. Пролог восходит к математической логике, поэтому его синтаксис и семантику можно наиболее точно описать при помощи логики. Синтаксис Пролога - это синтаксис предложений логики предикатов первого порядка, записанных в так называемой форме предложений (форме, при которой кванторы не выписываются явно), а точнее, в виде частного случая таких предложений - в виде формул Хорна (предложений, имеющих самое большее один положительный литерал). Процедурный смысл Пролога основывается на принципе резолюций, применяющемся для автоматического доказательства теорем, который был предложен Робинсоном в его классической статье (1965 г.). В Прологе используется особая стратегия доказательства теоремы методом резолюций, носящая название SLD. Сопоставление в Прологе соответствует некоторому действию в логике, называемому унификацией. 49. Рекурсивное представление данных и программ: построение рекурсивных программ, граничные условия и способы использования рекурсии, структуры и деревья, список как частный вид структуры, формы записи списков, работа со списками, примеры программ с рекурсивными определениями. Одна из причин того, что рекурсия так естественна для определения отношений на Прологе, состоит в том, что объекты данных часто сами имеют рекурсивную структуру. К таким объектам относятся списки и деревья. Список либо пуст (граничный случай), либо имеет голову и хвост, который сам является списком (общий случай). Двоичное дерево либо пусто (граничный случай), либо у него есть корень и два поддерева, которые сами являются двоичными деревьями (общий случай). Поэтому для обработки всего непустого дерева необходимо сначала что-то сделать с его корнем, а затем обработать поддеревья. Рекурсивные отношения логически совершенно корректны и понятны. На самом деле, рекурсия - один из фундаментальных приемов программирования на Прологе. Без рекурсии с его помощью невозможно решать задачи сколько-нибудь ощутимой сложности. Декларативная семантика Пролога определяет, является ли целевое утверждение истинным, исходя из данной программы, и если оно истинно, то для какой конкретизации переменных. Запятая между целями означает их конъюнкцию. Точка с запятой между целями означает их дизъюнкцию. Процедурная семантика Пролога - это процедура достижения списка целей в контексте данной программы. Процедура выдает истинность или ложность списка целей и соответствующую конкретизацию переменных. Процедура осуществляет автоматический возврат для перебора различных вариантов. Декларативный смысл программ на "чистом Прологе" не зависит от порядка предложений и от порядка целей в предложениях. Процедурный смысл существенно зависит от порядка целей и предложений. Поэтому порядок может повлиять на эффективность программы; неудачный порядок может даже привести к бесконечным рекурсивным вызовам. Имея декларативно правильную программу, можно улучшить ее эффективность путем изменения порядка предложений и целей при сохранении ее декларативной правильности. Переупорядочивание - один из методов предотвращения зацикливания. Кроме переупорядочивания существуют и другие, более общие методы предотвращения зацикливания, способствующие получению процедурно правильных программ. Структурные объекты (или просто структуры) - это объекты, которые состоят из нескольких компонент. Эти компоненты, в свою очередь, могут быть структурами. Все структурные объекты можно изображать в виде деревьев. Корнем дерева служит функтор, ветвями, выходящими из него, - компоненты. Если некоторая компонента тоже является структурой, тогда ей соответствует поддерево в дереве, изображающем весь структурный объект. Если одно и то же имя появляется в программе в двух различных смыслах, как в вышеупомянутом примере с точкой, то пролог-система будет различать их по числу аргументов и интерпретировать это имя как два функтора: один - двухаргументный; второй - трех. Это возможно потому, что каждый функтор определяется двумя параметрами: (1) именем, синтаксис которого совпадает с синтаксисом атомов; (2) арностью - т. е. числом аргументов. Как уже объяснялось, все структурные объекты в Прологе - это деревья, представленные в программе термами. Список - это структура данных, которая либо пуста, либо состоит из двух частей: головы и хвоста. Хвост в свою очередь сам является списком. Список рассматривается в Прологе как специальный частный случай двоичного дерева. Для повышения наглядности программ в Прологе предусматриваются специальные средства для списковой нотации, позволяющие представлять списки в виде [Элемент1,Элемент2,...] или [Голова|Хвост] или [Элемент1,Элемент2,...|Остальные]. Примером программы с рекурсивными определениями может быть программа с использованием повторения (repeat). Repeat - цель, которая всегда успешна. Ее особое свойство состоит в том, что она недетерминирована, поэтому всякий раз, как до нее доходит перебор, она порождает новую ветвь вычислений. Цель repeat ведет себя так, как если бы она была определена следующим образом: repeat. repeat :- repeat. Стандартный способ применения repeat показан в процедуре квадраты, которая читает последовательность чисел и выдает их квадраты. Последовательность чисел заканчивается атомом стоп, который служит для процедуры сигналом окончания работы. квадраты :- repeat, read(X), (X = стоп, !; Y is X*X, write(Y), fail ). 50. Встроенные предикаты: добавление и исключение утверждений, классификация термов, изменение и анализ утверждений, работа со структурами произвольного вида, воздействие на процесс возврата, реализация сложных способов выражения целевых утверждений, объявление операторов, обработка файлов, наблюдение за выполнением программы на ПРОЛОГе. Встроенные предикаты - предикаты исходно определенные в прологе, для которых не существует процедур в базе данных. Когда интерпретатор встречает цель, которая сравнивается с встроенным предикатом, он вызывает встроенную процедуру. Встроенные предикаты обычно выполняют функции не связанные с логическим выводом. При сопоставлении строенные предикаты обычно дают побочный эффект,который не устраняется при бэктрекинге. Простые встроенные предикаты ввода-вывода. Встроенные предикаты обеспечивают возможности ввода-вывода информации: write/1 - этот предикат всегда успешен. Когда вызывается, то побочным эффектом будет вывод значения аргумента на экран. При бэктрекинге предикат дает неудачу. Бэктрекинг не сбрасывает побочный эффект. nl/0 - этот предикат всегда успешен. Когда вызывается, то побочным эффектом будет перевод на следующую строку. При бэктрекинге предикат дает неудачу. Бэктрекинг не сбрасывает побочный эффект. tab/1 - этот предикат всегда успешен. Когда вызывается, то побочным эффектом будет печать коли- чество пробелов заданное аргументом. Аргумент должен быть целым. При бэктрекинге предикат дает неудачу. Бэктрекинг не сбрасывает побочный эффект. read/1 - этот предикат читает терм , который вводится с клавиатуры и заканчивается точкой. Этот терм сопоста- вляется с аргументом. При бэктрекинге предикат дает неудачу. Бэктрекинг не сбрасывает побочный эффект. Реляционная модель предполагает, что база данных - это описание некоторого множества отношений. Пролог-программу можно рассматривать как именно такую базу данных: описание отношений частично присутствует в ней в явном виде (факты), а частично - в неявном (правила). Более того, встроенные предикаты дают возможность корректировать эту базу данных в процессе выполнения программ. Это делается добавлением к программе (в процессе вычисления) новых предложений или же вычеркиванием из нее уже существующих. Предикаты, используемые для этой цели, таковы: assert (добавить), asserta (добавить в начало), assertz (добавить в конец) и retract (удалить). Цель assert(С) всегда успешна, а в качестве своего побочного эффекта вызывает "констатацию" предложения С, т. е. добавление его к базе данных, аналогично и retract(С). Предложения, добавленные к программе таким способом, ведут себя точно так же, как и те, что были в "оригинале" программы. При добавлении нового предложения может возникнуть желание указать, на какое место в базе данных его следует поместить. Такую возможность обеспечивают предикаты asserta и assertz. Предикат asserta(C) добавляет предложение C в начало базы данных, а предикат assertz(C) - в конец. Терм - выражение формального языка (системы), является формальным именем объекта или именем формы. Термы бывают разных типов: переменные, целые числа, атомы и т.д. Если терм - переменная, то в некоторый момент выполнения программы он может оказаться конкретизированным или не конкретизированным. Далее, если он конкретизирован, то его значение может быть атомом, структурой и т. п. Встроенные предикаты этого типа таковы: var (переменная), nonvar (непеременная), atom (атом), integer (целое), atomic (атомарный). Они имеют следующий смысл: var(X) - не конкретизированная переменная; nonvar(X) - терм, отличный от переменной, или уже конкретизированная переменная; atom(X) - атом; integer(X) - целое; atomic(X) - целое или атом. В процессе достижения цели пролог-система осуществляет автоматический перебор вариантов, делая возврат при неуспехе какого-либо из них. Такой перебор - полезный программный механизм, поскольку он освобождает пользователя от необходимости программировать его самому. С другой стороны, ничем не ограниченный перебор может стать источником неэффективности программы. Поэтому иногда требуется его ограничить или исключить вовсе. Для этого в Прологе предусмотрена конструкция "отсечение" (!). Отсечение подавляет перебор. Его применяют как для повышения эффективности программ, так и для повышения выразительности языка. Эффективность повышается путем прямого указания (при помощи отсечения) пролог - системе не проверять альтернативы, про которые нам заранее известно, что они должны потерпеть неудачу. Отсечение дает возможность сформулировать взаимно исключающие утверждения при помощи правил вида: если Условие то Утверждение1 иначе Утверждение2. Отсечение дает возможность ввести отрицание как неуспех: not(Цель) определяется через неуспех цели Цель. Иногда бывают полезными две особые цели true и fail. true - всегда успешна, а fail - всегда терпит неудачу. Ввод и вывод (отличный от связанного с вопросами к программе) осуществляется посредством встроенных процедур. Файлы являются последовательными. Существуют текущие входной и выходной потоки. Пользовательский терминал рассматривается как файл с именем user. Переключение между потоками осуществляется с помощью процедур: sее(Файл) Файл становится текущим входным потоком tell(Файл) Файл становится текущим выходным потоком seen закрывается текущий входной поток told закрывается текущий выходной поток Файлы читаются и записываются двумя способами: • как последовательности символов • как последовательности термов Встроенные процедуры для чтения и записи символов и термов таковы: rеad(Терм) вводит следующий терм write(Терм) выводит Терм put(КодСимвола) выводит символ с заданным ASCII - кодом get0(КодСимвола) вводит следующий символ gеt(КодСимвола) вводит ближайший следующий "печатаемый" символ Две процедуры облегчают форматирование: nl начинает новую строку tab(N) выводит N пробелов Основным средством отладки является трассировка (tracing). "Трассировать цель" означает: предоставить пользователю информацию, относящуюся к достижению этой цели в процессе ее обработки пролог-системой. Такая детальная трассировка может оказаться непрактичной из-за непомерно большого количества трассировочной информации. Поэтому пользователь может применить "селективную" трассировку. Существуют два механизма селекции: первый подавляет выдачу информации о целях, расположенных ниже некоторого уровня; второй трассирует не все предикаты, а только некоторые, указанные пользователем. предикатов. Обычно используется следующий стандартный набор таких предикатов: trace запускает полную трассировку всех целей, следующих за trace notrace прекращает дальнейшее трассирование spy(P) устанавливает режим трассировки предиката Р. nospy( Р) прекращает "слежку" за Р. Трассировка ниже определенной глубины может быть подавлена во время выполнения программы при помощи специальных команд. Существуют и другие команды отладки, такие как возврат к предыдущей точке процесса вычислений. После такого возврата можно, например, повторить вычисления с большей степенью детализации трассировки. Раздел 11. Объектно-ориентированное программирование 51. Основные идеи и сущность ООП: использование объекта в качестве основной компоненты программы и децентрализация управления, реализуемая представлением программы совокупностью взаимодействующих объектов, моделирование поведения объектов реального мира, наглядное представление объектов, создание и использование АТД, производные АТД. Объектно-ориентированное программирование (ООП) - основная методология программирования 90-х годов. Она является результатом тридцатилетнего опыта и практики, которые берут начало в языке Simula 67 и продолжаются в языках Smalltalk, LISP, Clu и в более поздних - Actor, Eiffel, Objective С, Java и C++. ООП - это стиль программирования, который фиксирует поведение реального мира так, что детали разработки скрыты, а это позволяет тому, кто решает задачу, мыслить в терминах, присущих этой задаче, а не программированию. Объектно-ориентированное программирование - это программирование, сфокусированное на данных, причем данные и поведение неразрывно связаны. Вместе данные и поведение представляют собой класс, а объекты являются экземплярами класса. ООП рассматривает вычисления как моделирование поведения. То, что моделируется, является объектами, представленными вычислительной абстракцией. Абстрактный тип данных, АТД (abstract data type, ADT) - определяемые пользователем расширения исходных типов языка. АТД состоит из набора значений и операций, которые могут влиять на эти значения. Например, в С нет типа данных для комплексных чисел, а C++ позволяет добавить такой тип и интегрировать его с существующими. ООП - это не просто набор некоторых свойств, добавленных в уже существующие языки. Это новый шаг в осмыслении задач и разработки ПО. Программы - это совокупность взаимодействующих объектов. Каждый объект отвечает за конкретную задачу. Вычисление осуществляется посредством взаимодействия объектов. Объект получается в результате инкапсуляции состояния (данных) и поведения (операций), во многом аналогично абстрактному типу данных - АТД. Поведение объекта диктуется классом. Данные и поведение представлены в виде классов, экземпляры которых - объекты. Все экземпляры одного класса будут вести себя одинаковым образом в ответ на одинаковые запросы. Объект проявляет свое поведение путем вызова метода в ответ на сообщение. Интерпретация сообщения зависит от объекта и может быть различной для различных классов объектов. Для удобства создания нового типа из уже существующих типов, определенных пользователем используется механизм наследования. Классы могут быть организованы в виде иерархического дерева наследования. С помощью уменьшения взаимозависимости ООП позволяет разрабатывать системы, пригодные для многократного использования. ООП - это взгляд на программирование, сосредоточенный на данных; в котором данные и поведение жестко связаны. Для этого необходимо, чтобы объекты определялись вместе с сообщениями, на которые они могут реагировать. Принципы Объектно-ориентированного подхода: 1. Действие в объектно-ориентированном программировании инициируется посредством передачи сообщений объекту. Сообщение содержит запрос на осуществление действия. В качестве реакции на сообщение получатель запустит некоторый метод, чтобы удовлетворить принятый запрос. 2. Все объекты являются экземплярами, классов. Все объекты одного класса используют одни и те же методы в ответ на одинаковые сообщения. 3. Принцип наследования. Классы могут быть организованы в иерархическую структуру с наследованием свойств. Дочерний класс наследует атрибуты родительского класса. 4. Принцип полиморфизма. Объекты реагируют на одно и тоже сообщение строго специфичным для них образом. Центральным элементом ООП является инкапсуляция совокупности данных и соответствующих им операций. Понятие класса с его функциями-членами и членами данных предоставляет программисту подходящий для реализации инкапсуляции инструмент. Переменные класса являются объектами, которыми можно управлять. Кроме того, классы обеспечивают сокрытие данных. Права доступа могут устанавливаться или ограничиваться для любой группы функций, которым необходим доступ к деталям реализации. Тем самым обеспечивается модульность и надежность. Еще одной важной концепцией ООП является поощрение повторного использования кода с помощью механизма наследования. Суть этого механизма - получение нового производного класса из существующего, называемого базовым. При создания производного класса базовый класс может быть дополнен или изменен. Таким путем могут создаваться иерархии родственных типов данных, которые используют общий код. Объектно-ориентированное программирование зачастую более сложно, чем обычное процедурное программирование, как оно выглядит на С. Существует по крайней мере один дополнительный шаг на этапе проектирования, перед алгоритмизацией и кодированием. Он состоит в разработке таких типов данных, которые соответствовали бы поставленной проблеме. Зачастую проблема решается "обобщеннее", чем это действительно необходимо. Есть уверенность, что использование ООП принесет дивиденды в нескольких отношениях. Решение будет более модульным, следовательно, более понятным и простым для модификации и обслуживания. Кроме того, такое решение будет более пригодно для повторного использования. Например, если в программе нужен стек, то он легко заимствуется из существующего кода. В обычном процедурном языке программирования такие структуры данных часто "вмонтированы" в алгоритм и не могут экспортироваться. 52. Основные концепции ООП: инкапсуляция и расширяемость типов, семантика объекта - данные как отражение состояния объекта и методы как средства обеспечения взаимодействия объектов; представление данных, классификация методов - конструкторы, деструкторы, селекторы, модификаторы; классы и абстрактные типы данных, наглядное представление классов, объекты как экземпляры классов, основные действия с объектами - создание, инициализация, обработка, разрушение. Объектно-ориентированная парадигма предлагает новый подход к разработке программного обеспечения. Фундаментальная концепция объектно-ориентированной парадигмы состоит в передаче сообщений объектам. В объектно-ориентированном программировании существует три основных принципа построения классов: 1. Инкапсуляция - это свойство, позволяющее объединить в классе и данные, и методы, работающие с ними и скрыть детали реализации от пользователя. 2. Наследование - это свойство, позволяющее создать новый класс-потомок на основе уже существующего, при этом все характеристики класса родителя присваиваются классу-потомку. 3.Полиморфизм - свойство классов, позволяющее использовать объекты классов с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. ООП - это сбалансированный подход к написанию программного обеспечения. Данные и поведение упакованы вместе. Такая инкапсуляция создает определяемые пользователем типы данных, расширяющие собственные типы языка и взаимодействующие с ними. Расширяемость типов - это возможность добавлять к языку определяемые пользователем типы данных, которые так же легко использовать, как и собственные типы. Абстрактный тип данных, например строка, является описанием идеального, всем известного поведения типа. Пользователь строки знает, что операции, такие как конкатенация или печать, имеют определенное поведение. Операции конкатенации и печати называются методами. Конкретная реализация АТД может иметь ограничения; например, строки могут быть ограничены по длине. Эти ограничения влияют на открытое всем поведение. В то же время, внутренние или закрытые детали реализации не влияют прямо на то, как пользователь видит объект. Например строка часто реализуется как массив; при этом внутренний базовый адрес элементов этого массива и его имя не существенны для пользователя. На терминологию ООП сильно повлиял язык Smalltalk. Создатели Smalltalk хотели, чтобы программисты порвали со своими старыми привычками и приняли новую методологию программирования. Они изобрели термины, такие как сообщение и метод, взамен традиционных понятий вызов функции и функция-член. Инкапсуляция - это способность скрывать внутренние детали при предоставлении открытого интерфейса к определяемому пользователем типу. В C++ для обеспечения инкапсуляции используются объявления класса и структуры (class и struct) в сочетании с ключевыми словами доступа private (закрытый), protected (защищенный) и public (открытый). Ключевое слово public показывает, что доступ к членам, которые стоят за ним, является открытым безо всяких ограничений. Без этого ключевого слова члены класса по умолчанию закрыты. Закрытые члены доступны только функциям-членам своего класса. Открытые члены доступны любой функции внутри области видимости объявления класса. Закрытость позволяет спрятать часть реализации класса, предотвращая тем самым непредвиденные изменения структуры данных. Ограничение доступа или сокрытие данных является особенностью объектно-ориентированного программирования. В терминологии ООП переменная называется объектом. Функция-член, единственная работа которой заключается в инициализации объекта класса, называется конструктором (constructor). Во многих случаях инициализация предполагает динамическое распределение памяти. Конструкторы вызываются всякий раз, когда создается объект данного класса. Конструктор с одним аргументом может производить преобразование типов, если только при объявлении такого конструктора не используется ключевое слово explicit (явный). Деструктор (destructor) - это функция-член, задача которой состоит в том, чтобы завершить существование переменной класса. Этот процесс часто предполагает динамическое освобождение памяти. Деструктор вызывается неявно, когда автоматический объект выходит за пределы своей области видимости. Конструкторы часто перегружают, задавая несколько функций-конструкторов, чтобы предоставить несколько способов инициализации объекта. Перегруженный конструктор выбирается в зависимости от формы каждого из объявлений. Структуры наследования образуют каркас для построения достаточно общих систем. Например, база данных, содержащая информацию обо всех людях в университете, может быть унаследована от базового класса person (человек). Базовый класс student можно использовать для создания производного класса студентов-юристов, как следующей значимой категории объектов. 53. Классы: компонентные данные, компонентные функции, способы задания доступа, синтаксическая структура определения класса, объявление, определение и инициализация объектов, объекты объявленные как константы, область видимости класса, указатель this, компонентные функции типа static и const (статические и постоянные компонентные функции), тестирование класса. В объектно-ориентированном программировании существует три основных принципа построения классов: 1. Инкапсуляция - это свойство, позволяющее объединить в классе и данные, и методы, работающие с ними и скрыть детали реализации от пользователя. 2. Наследование - это свойство, позволяющее создать новый класс-потомок на основе уже существующего, при этом все характеристики класса родителя присваиваются классу-потомку. 3.Полиморфизм - свойство классов, позволяющее использовать объекты классов с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. // объявление классов в С++ class /*имя класса*/ { private: /* список свойств и методов для использования внутри класса */ public: /* список методов доступных другим функциям и объектам программы */ protected: /*список средств, доступных при наследовании*/ }; Всем не статическим методам скрытно передается указатель на сам объект, доступ к которому осуществляется через ключевое слово this. 54. Создание и уничтожение объектов: конструкторы - назначение; наличие нескольких конструкторов у одного класса - причины, разделение функций; способы задания конструктора - по умолчанию или явное; вызов конструктора - назначение, способы реализации, задание аргументов; явный и автоматический вызовы - ситуации использования, рекомендации по применению; деструкторы - назначение, основные свойства; способы задания - по умолчанию или явное; вызов деструктора - назначение, способы реализации; явный и автоматический вызовы - ситуации использования, рекомендации по применению; отладка и тестирование системы конструкторов и деструкторов. Конструктор - функция-член, имя которой совпадает с именем класса. Он создает объекты типа класса. Это включает инициализацию членов-данных, и, часто, распределение свободной памяти, использующее new. Классы, имеющие конструктор с пустым списком параметров, как конструктор, все параметры которого имеют значение по умолчанию, могут быть базовыми типами для объявления массивов,если инициализация неявная. Такой конструктор называется конструктором по умолчанию. foo::foo() {...} //конструктор по умолчанию hoo::hoo(int i=0) {...} //конструктор по умолчанию Деструктор - функция-член с именем, таким же, как и имя класса, которому предшествует символ ~ (тильда). Обычная его цель состоит в том, чтобы удалять значения типа класса. Это обычно выполняется путем применения delete. Конструктор в форме тип::тип (const тип & x) используется для выполнения копирования значения одного типа в другой, когда - Переменная типа инициализируется значением типа. - Значение типа передано как аргумент в функцию. - Значение типа возвращается из функции. Это называется конструктором копии и, если он не указан явно, то генерируется компилятором. По умолчанию происходит почленная инициализация значений. Классы с конструкторами по умолчанию могут иметь порожденный тип массива. Например, vect a[5]; является объявлением, которое использует конструктор с пустым списком параметров для того, чтобы создать массив a из пяти объектов, каждый из которых - типа vect размером 10. Класс, имеющий члены, тип которых требует конструктора, может определять их после списка параметров для его собственного конструктора. Конструктор имеет список обращений к конструкторам,указываемых через запятую, следующих после двоеточия. Конструктор вызывается с использованием имени члена, сопровождаемого параметризованным списком параметров. Конструкторы не могут быть виртуальными, а деструкторы - могут. Конструкторы и деструкторы не наследуются. Вызов конструкторов Ранние версии C++ оставили неопределенным порядок выполнения для инициализации конструкторов базового класса и конструкторов класса-члена. Большую часть времени эти конструкции не зависели друг от друга, и результаты не могли зависеть от порядка выполнения. Однако, с добавлением множественного наследования, стало не- желательно и опасно продолжать эту небрежность. Поэтому принят следующий порядок: 1. Явная ссылка на конструкторы базового класса в том порядке, в котором они перечислены после двоеточия. 2. Неупомянутые базовые классы в порядке, в котором они объявлены. 3. Явная ссылка на конструкторы класса-члена в порядке, в котором они перечислены после двоеточия. Виртуальные базовые классы имеют специальный приоритет и создаются перед любым из своих порожденных классов. Они создаются перед любыми невиртуальными базовыми классами. Порядок создания зависит от их DAG. Этот порядок такой - снизу вверх, справа налево. Деструкторы вызываются в порядке, обратном конструкторам. Проиллюстрируем это разработкой предыдущего примера. class tools { public: tools(char*); ~tools(); }; class parts { public: parts(char*); ~parts(); } class labor { public: labor(int); ~labor(); } class plans : public tools, public parts, public labor { special a; //класс-член с конструктором public: plans(int m) : labor(m), tools("lathe"), a(m), parts("widget") {...} ~plans(); }; В этом случае конструктор члена a(m) появляется прежде, чем конструктор основного класса parts("widget"), но, по правилам, вызывается последним. Так как его конструктор был последним, его деструктор вызывается первым, а затем ~parts, ~tools, ~labor и ~plans. 55. Специальный полиморфизм: перегрузка функций, алгоритм выбора перегруженной функции, дружественные функции, перегрузка операторов - синтаксис, семантика, приоритет и порядок выполнения, доступные и недоступные для перегрузки операторы, перегружаемые как обычные функции, только как компонентные функции. Перегрузка и выбор функций Перегруженные функции являются важным дополнением C++. Конкретная функция яыбирается в зависимости от соответствия списка аргументов при вызове функции списку параметров в объявлении функции. Когда вызывается перегруженная функ-тия, компилятор должен иметь алгоритм для выбора надлежащей функции. Алгоритм, который выполняет этот выбор, зависит от того, преобразования какого типа присутствуют. Наилучшее соответствие должно быть уникальным. Оно должно быть лучшим по крайней мере для одного аргумента и так же хорошо, как остальные соответствия, для всех других аргументов. Дружественные функции Ключевое слово friend (друг) служит спецификатором, уточняющим свойства функции. Оно дает функции-не-члену доступ к скрытым членам класса и предоставляет способ для обхода ограничений сокрытия данных в C++. Однако должна быть веская причина для обхода этих ограничений, поскольку они важны для надежного программирования. Одна из причин использования дружественных функции состоит в том, что некоторые функции нуждаются в привилегированном доступе к более чем одному классу. Вторая причина в том, что дружественные функции передают все свои аргументы, список аргументов. Дружественная функция должна быть объявлена внутри объявления класса, по отношению к которому она является дружественной (с которым она дружит), Функция предваряется ключевым словом friend и может встречаться в любой части класса; это не влияет на ее смысл. Мы предпочитаем размещать объявление f riend в открытой части класса. Функция-член одного класса может быть дружественной другому классу. В этом случае для указания ее имени в дружественном классе используется оператор разрешения области видимости. То, что все функции-члены одного класса являются дружественными функциями другого класса, может быть указано как friend class имя_класса. class tweedledee { //дружественная функция //функция-член class tweedledum { friend int tweedledee::Cheshire(); friend void alice( int Cheshire); class tweedledumber { friend class tweedledee; //все функции-члены из tweedledee получают доступ Перегрузка операторов Ключевое слово operator используется для того, чтобы определить функцию-член, осуществляющую преобразование типа. Оно также используется для перегрузки встроенных операторов C++. Также как имени функции, такому как print, можно придать множество различных смыслов, зависящих от аргументов, так и оператору, например, +, можно приписать дополнительные значения. Перегруженные операторы можно использовать для привычной записи выражений как для встроенных типов, так и для АТД. Это очень удобный способ записи, во многих случаях он делает программы короче и читабельнее. Унарные и бинарные операторы могут быть перегружены как нестатические функции-члены. Они неявно действуют на объект класса. Большинство унарных операторов можно перегружать как обычные функции, принимающие единственный аргумент класса или ссылку на тип класса. Большинство бинарных операторов можно перегружать как обычные функции, принимающие один или оба аргумента класса или ссылку на тип класса. Операторы =, (), [ ] и -> должны быть перегружены нестатическими функциями-членами. Доступные для перегрузки операторы включают все арифметические и логические операторы, операторы сравнения, равенства, присваивания и битовые операторы. Более того, операторы автоинкремента и автодекремента ( + + и -) могут иметь различные префиксные и постфиксные значения. Операторы индексации массива [] и вызова функции () также можно перегружать. Это возможно и для операторов доступа к члену через указатель на объект - >, и обращения к члену через указатель на член ->*. Можно перегружать new и delete. Операторы присваивания, вызова функции, индексирования и оператор доступа к члену через указатель на объект -> можно перегружать только нестатическими функциями-членами. 56. Параметрический полиморфизм: шаблонные классы и шаблонные функции - назначение, параметризованные типы данных, синтаксис и семантика. Параметрический полиморфизм В случае параметрического полиморфизма функция реализована для всех классов одинаково, и, таким образом, реализована вообще для произвольного типа данных. Например, функция сортировки одинакова для данных любого типа, если функция сравнения данных задана отдельно. В С++ ключевое слово template используется для обеспечения параметрического полиморфизма (parametric polymorphism). Он позволяет применять один и тот же код к разным типам, причем тип является параметром тела кода. Параметрический полиморфизм - форма обобщенного программирования. Многие из наших классов использовались для хранения данных конкретного типа. Данные обрабатывались одним и тем же способом независимо от типа. Определения шаблонных классов и шаблонных функций делают возможным повторное использование кода простым, безопасным с точки зрения типов образом, что позволяет компилятору автоматизировать процесс инстанцирования (instantiation) типа. Оно выполняется, когда фактический тип заменяет тип-параметр, присутствующий в коде шаблона. Полиморфизм: способность принимать различные формы Синтаксис объявления класса предваряется конструкцией: template 57. Наследование и иерархия классов: реализация механизма повторного использования кода, полиморфная обработка родственных объектов - чистый полиморфизм, отношения наследования, построение производного класса специализацией базового, построение базового класса обобщением производного, иерархия классов, наследование интерфейса, наследование реализации, виртуальные функции, абстрактные базовые классы, множественное наследование, тестирование системы классов, связанных отношением наследования. Наследование (inheritance) - это механизм получения нового класса из существующего. Существующий класс может быть дополнен или изменен для создания производного класса. Наследование - это мощный механизм повторного использования кода. С помощью наследования может быть создана иерархия родственных типов, которые совместно используют код и интерфейсы. Производный класс наследует описание базового класса; затем он может быть изменен добавлением новых членов, изменением существующих функций-членов и изменением прав доступа. C++ поддерживает виртуальные функции-члены (virtual member function). Это функции, объявленные в базовом классе и переопределенные в производных классах. Иерархия классов, которая определена открытым наследованием, создает родственный набор пользовательских типов, на все объекты которых может указывать указатель базового класса. Получая доступ к виртуальной функции с помощью этого указателя, C++ выбирает надлежащее определение функции на этапе выполнения. Объект, на который направлен указатель, должен нести в себе информацию о типе, так чтобы его можно было распознать динамически; в этом заключается характерная особенность кода на C++. Каждый объект "знает", как на него можно воздействовать. Такая форма полиморфизма называется чистым полиморфизмом (pure polymorphism). Производный класс Класс можно сделать производным от существующего с использованием следующей формы: class имя_класса : (public I protected I private) имя__базового_класса {объявления членов}; Производный класс является модификацией базового класса; он наследует защищенные и открытые члены базового класса. Не могут наследоваться только конструкторы, деструктор базового класса и любые функции-члены operator= (). Виртуальные функции Перегруженная функция-член вызывается с учетом алгоритма соответствия типов, в который входит правило соответствия неявного аргумента объекту данного типа класса. Все это известно на этапе компиляции и позволяет компилятору напрямую выбирать надлежащий член. Ключевое слово virtual служит спецификатором функции, и как раз и предоставляет подобный механизм, но оно может применяться для изменения объявлений только функций-членов. Сочетание виртуальных функций и открытого наследования станет для нас наиболее обобщенным и гибким способом построения программного обеспечения. Это - форма чистого полиморфизма. Обычная виртуальная функция должна представлять собой исполняемый код. При вызове семантика ее точно такая же, как и у остальных функций. В производном типе она может замещаться (переписываться, переопределяться), и прототип производной функции должен иметь сигнатуру и возвращаемый тип, совпадающие с базовой. Абстрактные базовые классы Иерархия типов обычно имеет корневой класс, содержащий некоторое число виртуальных функций. Виртуальные функции обеспечивают динамическую типизацию. Виртуальные функции корневого класса часто являются фиктивными функциями. Они имеют пустое тело в корневом классе, но в производных классах им будет придан конкретный смысл. В C++ для этих целей введена чисто виртуальная функция (pure virtual function). Чисто виртуальная функция - это виртуальная функция, тело которой не определено. Она объявляется внутри класса следующим образом: virtual прототип_функции = 0; Чисто виртуальная функция используется для того, чтобы отложить выбор реализации функции. В терминологии ООП это называется отложенным методом (deferred method). Класс, имеющий хотя бы одну чисто виртуальную функцию, называется абстрактным классом (abstract class). Множественное наследование До сих пор примеры в тексте требовали лишь одиночного наследования (single inheritance): класс производится от единственного базового класса. Это может привести к цепочке наследований, когда класс В производится от класса А, класс С - от класса В..... а класс N - от класса М. В результате N завершает цепь, имея в основе А, В,..., М. Однако эта цепочка не должна быть замкнутой - класс не может быть предком самого себя. 58. Разработка объектно-ориентированных программ: конструирование иерархий классов - принципы построения, рекомендации, примеры; создание и использование объектов во время исполнения программы, организация массивов объектов; использование конструкторов, вызывающих другие конструкторы, методика тестирования объектно-ориентированных программ. Иерархия классов. Часто подразумевают гомоморфную иерархию- иерархия классов с одинаковым открытым интерфейсом, унаследованным от общего базового класса. Во главе гомоморфной иерархии классов всегда стоит абстрактный базовый класс, который определяет открытый интерфейс своих предков. Как правило, он является чисто абстрактным классом - то есть он не содержит ни одной переменной, а все его функции являются виртуальными. Итеративный подход к классификации накладывает соответствующий отпечаток и на процедуру конструирования иерархии классов и объектов при разработке сложного программного обеспечения. На практике обычно за основу берется какая-то определенная структура классов, которую постепенно совершенствуют. Можно создать новый подкласс из уже существующих (вывод), или разделить большой класс на много маленьких (факторизация), или, наконец, слить несколько существующих в один (композиция). Возможно, в процессе разработки будут найдены новые общие свойства, ранее не замеченные, и можно будет определить новые классы (абстракция). Требуется несколько проходов вверх и вниз по иерархии, чтобы создать программный проект". Трудно сразу расположить классы и объекты на правильных уровнях абстракции. Иногда, найдя важный класс, мы можем передвинуть его вверх в иерархии классов, тем самым увеличивая степень повторности использования кода. Это называется продвижением класса. Аналогично, можем прийти к выводу, что класс слишком обобщен, и это затрудняет наследование: происходит семантический разрыв или конфликт зернистости. В обоих случаях мы пытаемся выявить зацепление или недостаточную связность абстракций и смягчить конфликт. Программисты часто легкомысленно относятся к правильному наименованию классов и объектов, но на самом деле очень важно отразить в обозначении классов и объектов сущность описываемых ими предметов. Программы необходимо писать тщательно, как художественную литературу, думая и о читателях, и о компьютере. При идентификации одного только объекта вам нужно придумать имена: для него, для его класса и для модуля, в котором класс объявлен. Умножьте на тысячу объектов и сотни классов, и вы поймете, как остра проблема. Рекомендации: • Объекты следует называть существительными: theSensor или shape. • Классы следует называть обобщенными существительными: Sensors, Shapes. • Операции-модификаторы следует называть активными глаголами: Draw, moveLeft. • У операций-селекторов в имя должен включаться запрос или форма глагола "to be": extentOf, isOpen. • Подчеркивание и использование заглавных букв - на ваше усмотрение, постарайтесь лишь не противоречить сами себе. Любому объекту требуется память и некоторое начальное значение. В С++ это обеспечивается с помощью объявлений, являющихся одновременно определениями. Массивы объектов Объекты - это переменные, и они имеют те же возможности и признаки, что и переменные любых других типов. Поэтому вполне допустимо упаковывать объекты в массив. Синтаксис объявления массива объектов совершенно аналогичен тому, который используется для объявления массива переменных любого другого типа. Более того, доступ к массивам объектов совершенно аналогичен доступу к массивам переменных любого другого типа языка C. Пример: // Начало определения класса class myclass { // Определение закрытых переменных и функций private: int iVal; // Определение открытых переменных и функций public: void set_val(int val); int get_val(); }; void myclass::set_val(int val) { iVal=val; } int myclass::get_val() { return iVal; } // Подключаем библиотеку стандартного ввода/вывода #include using namespace std; // Начало программы int main() { // Определяем переменные (объекты) myclass o[4]; int i; // Устанавливаем значения внутренних переменных для каждого // объекта for(i=0;i using namespace std; // Начало программы int main() { // Определяем переменные (объекты) myclass o[]={-2,1,3,5,-4}; int i; // Выводим значения значения хранимые объектами for(i=0;i using namespace std; // Начало программы int main() { // Определяем переменные (объекты) myclass o[3][2]= { { -2, 4}, { 1, 7}, { 3, -4} } int i,j; // Выводим значения значения хранимые объектами for(i=0;i. Адресная арифметика, используемая при работе с объектами аналогична адресной арифметики для любого типа данных языков C/C++. Пример: // Начало определения класса class myclass { // Определение закрытых переменных и функций private: int iVal; // Определение открытых переменных и функций public: myclass(int val); void set_val(int val); int get_val(); }; void myclass::myclass(int val) { iVal=val; } void myclass::set_val(int val) { iVal=val; } int myclass::get_val() { return iVal; } // Подключаем библиотеку стандартного ввода/вывода #include using namespace std; // Начало программы int main() { // Определяем переменные (объекты) myclass o[]={-2,1,3,5,-4}; myclass *p; int i; // Выводим значения значения хранимые объектами p=&o; for(i=0;iget_val(); p++; cout P (P за x) - описывает объект, который в начале участвует в событии x, a затем ведет себя в точности как P. а (х->Р)= аР, при условии х э аР - описание процесса с использованием префикса. Используется для описания процесса который рано или поздно останавливается. 2) Рекурсия: Часы=(тик->Часы) - метод рекурсивного описания процесса. Будет правильно работать, если в правой части уравнения рекурсивному вхождению процесса предшествует хотя бы одно событие; 3) Выбор: x->P|y->Q - описывает объект, который в начале участвует в одном из событий x или y. Дальнейшее поведение объекта описывается процессом P, если первым произошло событие x, и Q - если первым произошло событие y. Св-ва процессов: 1) Параллелизм. Любой процесс определяеться полным описанием его потенциального поведения, включая его поведение. Поэтому процесс и его окружение взаимодействуют по мере их параллельного исполнения. аP=аQ - если алфавит Р совпадает с алфавитом Q, то P||Q - процесс ведущий себя как система составленная из процессов Р и Q, взаимодействие между которыми пошагово синхронизировано. Законы: 1) Симметричность P||Q = Q||P; 2) Ассоциативность P||(Q||R) = (P||Q)||R; 3) Деблок (тупик всей системы процессов) P||СТОП а p = СТОП а p; 4) Пара процессов либо одновременно выполняют одно и тоже действие, либо попадает в состояние дедлока, если начальные состояния процессов не совпадают: (c->P||c->Q)->(c->(P||Q)) (c->P||d->Q)->СТОП (c!=d) 2) Синхронность. аP!=аQ - когда такие процессы объединены для совместного исполнения, то события, содержащиеся в обоих алфавитах требуют одновременного участия P и Q. Множество всех логически возможных для данной системы событий есть объединение алфавитов, составляющих её процессы: A(P||Q)=аP u aQ 3) Недетерминизм. Когда процесс обладает некоторым спектром поведения, а его окружение не имеет возможности влиять на выбор, то выбор осуществляется произвольным (недетерминированным) образом. Одна из главных причин введения недетерминизма - абсрагироваться от некоторых деталей реализации. P П Q - недетерминированные процессы P и Q Законы: 1) Идемпотентность Р П Р = Р 2) Симметричность P П Q = Q П Р; 3) Ассоциативность P П (Q П R) = (P П Q) П R; 4) Дистрибутивность x-> P П Q = (x->P) П (x->Q) Алгебра над процессами Протоколом поведение процесса называется конечная последовательность символов, фиксирующая события, в которых процесс участвовал до некоторого момента времени. - в протокол для событий x,y Свойства протоколов и операции над ними: 1) Конкатенация - строит новый протокол из пары операндов, соединяя их в указанном порядке. ^= 2) Сужение -протокол t суженный на множество символов A. Он строится из t отбрасыванием всех символов, не принадлежащих A (операция строго дистрибутивна). 3) S0 - голова; S| - хвост; 0 = x; | = 4) Итерация А* - набор всех конечных протоколов, включая <>, составленных из элементов множества А. 5) Длина протокола #S (примеры: #<>=0, #=3) 6) Число вхождений символа x в протокол S S[стрелка вниз]x Автомат - математическая модель процесса. V={v1,v2..vk}- конечное множество входных символов (входной алфавит); W= {W1,w2..wm} - выходной алфавит; Q={q1,q2..qn} состояния автомата. При рассмотрении автомата рассматривается отображение множества входных сигналов на множество выходных Если Q конечно, то автомат называется конечным (с конечной памятью). Автомат с 1м состоянием - тривиальный. Лямбда(q,v)- функция перехода; Мю(q,v)- функция выхода. Автоматы: 1) синхронные и асинхронные 2) конечные и бесконечные 3) детерминированные и недетерминированные Автомат Мили: Омега(t)=мю[q(t),v(t)] - определение входного сигнала с привязкой по времени. Поведение автомата в любой момент времени зависит от q и v. Можно устранить время и выразить выходную формулу так:омега(t)=мю(q,v) Общая запись авт. Мили: А=, где V, W ,Q - алфавит входных и выходных символов состояний; лямбдаб мю - функции переходов и выходов; q0 - начальное состояние. Можно вычислить реакцию автомата в виде последовательности выходных символов. Автомат Мура: омега(t)=мю(q)Частный случай автомата Миле. омега=мю(q,v)=мю~(q~)- Функция выхода (тильда у симолов сверху) q~(t+1)=лямбда(q~,v~)- Функция переходов 61. Основы специальной теории сетей: синтаксис и семантика сетей Петри, модельная и предметная интерпретация, определение, способы задания сетей Петри, понятие выполнения сети, основные соглашения выполнения сети, пространство состояний, множество и граф достижимости, динамические свойства сетей, анализ сетей; сетевая объектная модель процессов, ее особенности и отличие от автоматной модели. Сети Петри - инструмент исследования систем. В настоящее время сети Петри применяются в основном в моделировании. Во многих областях исследований явление изучается не непосредственно, а косвенно, через модель. Модель - это представление, как правило, в математических терминах того, что считается наиболее характерным в изучаемом объекте или системе. Манипулируя моделью системы, можно получить новые знания о ней, избегая опасности, дороговизну или неудобства анализа самой реальной системы. Обычно модели имеют математическую основу. Развитие теории сетей Петри проводилось по двум направлениям. Формальная теория сетей Петри занимается разработкой основных средств, методов и понятий, необходимых для применения сетей Петри. Прикладная теория сетей Петри связана главным образом с применением сетей Петри к моделированию систем, их анализу и получающимся в результате этого глубоким проникновением в моделируемые системы. Сети Петри позволяют строить программное обеспечение согласно международному стандарту Взаимодействия Открытых Систем. При этом для описания многопроцессной программы, необходимо будет описание не только взаимодействия процессов, но также описание управления этими процессами. Первое описание задает логику работы самих процессов: последовательность вызова функций, преобразование данных, сложные математические вычисления и т.п. Второе описание необходимо для реализации обратной связи с другими уровнями ПО и спецификации правил исполнения процесса: когда процесс должен запустить, когда остановиться и т.п. Существует несколько формальных определений сети Петри, отличающихся способами задания элементов и связей в сети. Под сетью будем понимать тройку (P, T, F), где P - непустое множество элементов сети, называемых местами; T - непустое множество элементов сети, называемых переходами; F - функция инцидентности, задающая связи между элементами множеств P и T, и для (P, T, F) выполнены следующие условия: PхТ=пустое множество(множества мест и переходов не пересекаются); любой элемент сети инцидентен хотя бы одному элементу другого типа. Сеть Петри - это набор PN = (P, T, F, M0), где (P, T, F) - конечная сеть (множества P и T конечны), а I0 - функция начальной разметка сети, которая сопоставляет любому месту pi I P некоторое число M0(p)=n. Функционирование сети Петри описывается формально с помощью множества последовательностей срабатываний и множества достижимых в сети разметок. Эти понятия определяются через правила срабатывания переходов сети. Сеть Петри определяется как двудольный граф. Т.е. все вершины графа относятся к одному из двух классов - позициям и переходам. Позиции изображаются окружностями, переходы - отрезками прямой. Дуги в сетях Петри - направленные. Причем каждая дуга связывает вершины только разных классов. Сеть Петри выполняется посредством запусков переходов. Переход запускается удалением фишек из его входной позиции и образованием новых фишек в его выходных позициях. Переход запускается если он разрешен (т.е. если каждая из его позиций имеет число фишек по крайне мере равное числу дуг из позиции в переход). Свойства и анализ, динамические свойства сетей: 1) Безопасность - число фишек в сети не превышает 1; 2) К-безопасность - число фишек в сети не превышает к; 3) Сохраняемость - используется при моделировании распределении ресурсов в системе, фишки не исчезают и не создаются; 4) Активность - используется при моделировании распределении ресурсов, когда возможна тупиковая ситуация Количество фишек в позициях сети Петри в момент времени t - есть пространство состояний в сети. 62. Элементы теории вычислимости: вычислимость и разрешимость, интуитивное и точное понятие алгоритма, вычислимые функции, машина Тьюринга, массовые алгоритмические проблемы. Вычислимость, разрешимость Чтобы решить проблему автоматизации любой сферы человеческой деятельности, необходимо выделить ее основные компоненты, понять ее структуру и фундаментальные законы, необходима теория, моделирующая объекты, явления, процессы этой деятельности. Теоретическое программирование - это математическая дисциплина, изучающая синт. и семантические свойства программ, их структуру, преобразования и процесс их составления и исполнения. Исследования в области теоретического программирования: 1) теоретические основы программирования; 2) теория схем программ (предполагает изучение структурных свойств и преобразование программ). Схема программы - математическая модель программы, в которой с той или иной степенью детализации отражено строение программы и взаимодействие ее компонентов; 3) семантическая теория программ (изучает методы формального описания семантики); 4) теория вычисления процессов и структур, которые главным образом направлены на методы и средства программирования; 5) прикладные задачи теоретического программирования (разработка и обоснование алгоритмов трансляции и алгоритмов автоматизации организации программ). Вычислимые функции и алгоритмы Все объекты строятся из символов, целых неотрицательных чисел, теоретико-множественных понятий {x|P(x)} x - переменная, значениями которой являются некоторые объекты; P - свойства этих значений х, которыми являются элементами данного множества. {(x,y)|x,y - числа, x y=y' {x|(x,y) э F} {y|(x,y) э F} Если функция F определена на всем множестве X, она считается всюду определенной, иначе частично F:x->M Суперпозицией 2х функций F1:X->Y, F2 : Y->Z - F3: X->Z, (x,z)эF3 если x э X, z э Z и существует y эY. Предикат - функция, областью значений которой служит множество символов, цифр 0,1. {0,1} P: X->{0,1} P(x)=1, x э X P(x)=0, x эX Слово в алфавите - конечный объект, получаемый выписыванием оного за другим символов из V (V-алфавит). Определение не дает информации о том, как получается аргумент ф-qq/ Необходимо переформулировать определение так, чтобы оно содержало алгоритм нахождения функции. Идея Тьюринга: заключается в том, чтобы с помощью абстрактной теоретической машины вычислить значение функции по ее аргументам. Конкретная машина Т. дает конкретную вычислимую функцию. Гипотеза Тьюринга: каждая функция, для которой существует алгоритм нахождения ее значений, представимо некоторой машиной (Тьюринга), т.е. является вычислимой. T=(V,Q,q0, #,I), где V - алфавит; Q - конкретное непустое множество символов, называемых состоянием машины; q0 - элемент множества Q, обозначающий начальное состояние; # - специальный символ (пустой); I - программа машины. 1) Считывается символ напротив головки; 2) в списке команд ищется команда, в которой q - текущее состояние управления, a - текущий символ; 3) выполняется найденная команда: • управление переходов в q' • в обозреваемую ячейку вместо а записывается а' • головка перемещается {r,l,p}=d 4) машина останавливается, если нет команд, результат - заключит слово на ленте Машина Тьюринга перерабатывающая начальные слова в заключительные, заданную словарную функцию, для которой начинаются слова - это значения аргумента. Заключительные слова - значения функции. Если маншина не остан-ся, то ф-я, задаваемая машиной считается неопредел-ой для этого слова. Ф-я F - вычислима (частично вычислима), если сущ-ет Маш. Т., так. что Ft=F. Маш.Т. обл. св-ми: 1) конструктивность (предст. соб кон. объект, кот. стр-ся из баз-х объектов) 2) конечность (пр-с нах-я зн-й ф-й сост. из кон. числа шагов) 3) однозначность (рез-т работы ед-ым образом опр. нач. словом) 4) массовость (машина раб. с люб. нач. словом на ленте, состоящим из символов ее алф-та) Массовые алгоритмические проблемы заключ. в: н. указ. алг-м, кот. бы определял, обладает ли предъявлен. объект из некот класса объектов некоторым интересующим нас св-ом. Если сущ-ет так. частичн. алг-м, то говорят, что мн-во перечислимо, а представленная алгоритмическ. проблема частична разрешима. Если эт. алг-м определен всюду, тогда мн-во М разрешимо. Разрешимость мн-ва М - сущ-ет всегда останавливающаяся машина Т., кот. для люб. слова из V через конечное число шагов уст-ет, принадлежит ли рассматриваемое слово рассматриваумому мн-ву М. Перечислимость мн-ва озн., что сущ. Маш. Т., кот ост. т. в том случ., если предъявленное слово принадл. мн-ву М. Проблемы: пуст. ленты, остановки Маш. Т., зацикливания Маш. Т. Функцион-е Маш.Т. м. опис. с пом. протокола работы над заданным нач. словом. #a1a2...ak...an# - слово так. вида наз. конфигурацией Маш. Т. Посл-ть конфигураций, выпис. в том пор-ке, в кот. они след. в процессе раб. машин, наз. протоколом. 63. Математическая модель программы - схема программы, как основной инструмент исследования свойств и преобразований программ..Стандартные схемы программ, понятие стандартной схемы, стандартные схемы в линейной и графовой формах, интерпретация схем, понятие программы, основные свойства стандартных схем. Разрешимые подклассы стандартных схем программ. Схема программы - математическая модель программы, описывающая строение программы, или точнее строение множества программ, где конкретные операции и функции заменены абстрактными функционалами и предикатными символами. Классы схемы программ Стандартные Рекурсивные Обогащенные Структурированные Стадартные схемы программ - характеризуются базисом и структурой Базис стандартный схем Переменные - X = {x,x1...,y,y1,...,z,z1} Функциональные символы F={f(0), f(1), f(2),... g(0), g(1),g(2)... h(0), h(1)..} Предикатные символы P={p(0), p(1)..., q(0), q(1)...} Спец. символы {start, stop} Термами (функциональными выражениями) называются слова, построенные из переменных, функциональных и специальных символов по следующим правилам: 1. односимвольные слова, состоящие из переменных или констант, являются термами; 2. слово тета вида f(n)( тета 1, тета 2, ..., тета n), где тета 1, тета 2, ..., тета n - термы, является термом; 3. те и только те слова, о которых говорится в п.п. 1,2, являются термами. Примеры термов: х, f(0), а, f(1)(х), g(2)(x, h(3)(y, a)). Тестами (логическими выражениями) называются логические константы и слова вида р(n)( тета1, тета2,..., тетаn). Примеры: p(0), p(0)(х), g(3)(x, y, z), p(2)(f(2)(x, y)). Допускается в функциональных и логических выражениях опускать индексы местности, если это не приводит к двусмысленности или противоречию. Множество операторов включает пять типов: 1. начальный оператор - слово вида start(х1, х2...хк), где k >=0, а х1, х2...хк - переменные, называемые результатом этого оператора; 2. заключительный оператор - слово вида stop(тета1, тета 2,..., тета n), где n >= 0, а тета 1, тета 2,..., тета n - термы; вхождения переменных в термы тета называются аргументами этого оператора; 3. оператор присваивания - слово вида х := тета, где х - переменная (результат оператора), а тета - терм; вхождения переменных в термы называются аргументами этого оператора; 4. условный оператор (тест) - логическое выражение; вхождения переменных в логическое выражение называются аргументами этого оператора; 5. оператор петли - односимвольное слово loop. Среди операторов присваивания выделим случаи: когда тета - переменная, то оператор называется пересылкой (х:=у) и когда тета - константа, то оператор называется засылкой (х:=а). Подклассы используют ограниченные базисы. Так, например, подкласс V1 имеет базис: {х1, х2}, {а, f(1)}, {p(1)}, {start, stop, (,),:=, ,} и множество операторов {start(х1, х2); х1:=f(x1), x2:=f(x2), x1:=а, х2:= а, р(х1), р(х2), stop(х1, х2)}, т. е. схемы из этого подкласса используют две переменные, константу а, один одноместный функциональный символ, один предикатный символ и операторы указанного вида. Графовая форма стандартной схемы Представим стандартную схему программ как размеченный граф, вершинам которого приписаны операторы из некоторого базиса В. Стандартной схемой в базисе В называется конечный (размеченный ориентированный) граф без свободных дуг и с вершинами следующих пяти видов: 1. Начальная вершина (ровно одна) помечена начальным оператором. Из нее выходит ровно одна дуга. Нет дуг, ведущих к начальной вершине. 2. Заключительная вершина (может быть несколько). Помечена заключительным оператором. Из нее не выходит ни одной дуги. 3. Вершина-преобразователь. Помечена оператором присваивания. Из нее выходит ровно одна дуга. 4. Вершина-распознаватель. Помечена условным оператором (называемым условием данной вершины). Из нее выходит ровно две дуги, помеченные 1 (левая) и 0 (правая). 5. Вершина-петля. Помечена оператором петли. Из нее не выходит ни одной дуги. Конечное множество переменных схемы S составляют ее память ХS. Из определения следует, что один и тот же оператор может помечать несколько вершин схемы. Вершины именуются (метки вершины) целым неотрицательным числом (0, 1, 2,...). Начальная вершина всегда помечается меткой 0. Схема S называется правильной, если на каждой дуге заданы все переменные. Вершины изображены прямоугольниками, а вершина-распознаватель - овалом. Операторы записаны внутри вершины. Линейная форма стандартной схемы Для использования линейной формы СПП множество специальных символов расширим дополнительными символами {:, goto, if, then, else}. СПП в линейной форме представляет собой последовательность инструкций, которая строится следующим образом: 1. если выходная дуга начальной вершины с оператором start(х1,..., хn) ведет к вершине с меткой L, то начальной вершине соответствует инструкция: 0: start(х1,..., хn) goto L; 2. если вершина схемы S с меткой L - преобразователь с оператором присваивания х:=тета, выходная дуга которого ведет к вершине с меткой L1, то этому преобразователю соответствует инструкция: L: x:= тета goto L1; 3. если вершина с меткой L - заключительная вершина с оператором stop(тета1,...тетаm), то ей соответствует инструкция: L: stop(тета 1,..., тета m); 4. если вершина с меткой L - распознаватель с условием р(тета1,...тетаk), причем 1-дуга ведет к вершине с меткой L1, а 0-дуга - к вершине с меткой L0, то этому распознавателю соответствует инструкция: L: if р(тета1,...тетаk) then L1 else L0; 5. если вершина с меткой L - петля, то ей соответствует инструкция: L: loop. Интерпретация стандартных схем программ ССП не является записью алгоритма, поэтому позволяет исследовать только структурные свойства программ, но не семантику вычислений. При построении "семантической" теории схем программ вводится понятие интерпретация ССП. Определим это понятие. Пусть в некотором базисе В определен класс ССП. Интерпретацией базиса В в области интерпретации D называется функция I, которая сопоставляет: 1. каждой переменной х из базиса В - некоторый элемент d = I(x) из области интерпретации D; 2. каждой константе а из базиса В - некоторый элемент d = I(а) из области интерпретации D; 3. каждому функциональному символу f (n) - всюду определенную функцию F(n) = I(f (n)); 4. каждой логической константе р(0) - один символ множества {0,1}; 5. каждому предикатному символу р(n) - всюду определенный предикат P (n) = I(p(n)). Пара (S,I) называется интерпретированной стандартной схемой (ИСС), или стандартной программой (СП). Определим понятие выполнения программы. Состоянием памяти программы (S,I) называют функцию W: XS D, которая каждой переменной x из памяти схемы S сопоставляет элемент W(x) из области интерпретации D. Значение терма тета при интерпретации I и состоянии памяти W (обозначим тетаI(W)) определяется следующим образом: 1) если тета = х, x - переменная, то тетаI(W) = W(x); 2) если тета = a, a - константа, то тетаI(W) = I(a); 3) если тета = f(n)(тета1, тета2..., тетаn), то тетаI(W) = I(f (n))(тета1I(W), тета2I(W),..., тетаnI(W)). Аналогично определяется значение теста p при интерпретации I и состоянии памяти W или pI(W): если p = р(n)( тета 1, тета 2,..., тета n), то pI(W) = I(p(n))( тета 1I(W), тета2I(W),... тетаnI(W)), n >= 0. Конфигурацией программы называют пару U = (L,W), где L - метка вершины схемы S, а W - состояние ее памяти. Выполнение программы описывается конечной или бесконечной последовательностей конфигураций, которую называют протоколом выполнения программы (ПВП). Протокол (U0, U1,..., Ui, Ui+1,...) выполнения программы (S,I) определяем следующим образом (ниже ki означает метку вершины, а Wi - состояние памяти в i-й конфигурации протокола, Ui = (ki,Wi)): U0 = (0, W0), W0 - начальное состояние памяти схемы S при интерпретации I. Пусть Ui = (ki, Wi) - i-я конфигурация ПВП, а О - оператор схемы S в вершине с меткой ki. Если О - заключительный оператор stop(тета1, тета2... тетаn), то Ui - последняя конфигурация, так что протокол конечен. В этом случае считают, что, программа (S,I) останавливается, а последовательность значений тета1I(W), тета2I(W),..., тетаnI(W) объявляют результатом val(S,I) выполнения программы (S,I). В противном случае, т. е. когда О - не заключительный оператор, в протоколе имеется следующая, (i+1)-я конфигурация Ui+1 = (ki+1, Wi+1), причем а) если О - начальный оператор, а выходящая из него дуга ведет к вершине с меткой L, то ki+1 = L и Wi+1 = Wi; б) если О - оператор присваивания х:= тета, а выходящая из него дуга ведет к вершине с меткой L, то ki+1 = L, Wi+1 = Wi, Wi+1(х) = тета1(Wi); в) если О - условный оператор p и pI(Wi) = ДЕЛЬТА, где ДЕЛЬТА {0,1}, а выходящая из него дуга ведет к вершине с меткой L, то ki+1 = L и Wi+1 = Wi; г) если О - оператор петли, то ki+1 = L и Wi+1 = Wi, так что протокол бесконечен. Таким образом, программа останавливается тогда и только тогда, когда протокол ее выполнения конечен. В противном случае программа зацикливается и результат ее выполнения не определен. Рассмотрим интерпретацию СПП S1 Интерпретация (S1, I1) задана так: 1. область интерпретации D1 Nat - подмножество множества Nat целых неотрицательных чисел; 2. I1(x)=4; I1(y)=0; I1(a)=1; 3. I1(g)=G, где G - функция умножения чисел, т. е. G(d1,d2)= d1*d2; 4. I1(h)=H, где H - функция вычитания единицы, т. е. H(d)= d - 1; 5. I1(p)=P1, где P1 - предикат "равно 0", т.е. P1(d)=1, если d=0. 64. Взаимодействие процессов: взаимодействие процессов через разделяемые ресурсы и общие данные, принципы организации взаимодействия процессов, классические задачи взаимодействия асинхронных процессов, динамика взаимодействия процессов и проблема тупиков, спецификация дисциплин взаимодействия процессов в терминах сетей Петри. Разделяемые ресурсы Обозначение (m: //S) мы использовали для именованного подчиненного процесса (m: R), единственной обязанностью которого является удовлетворение потребностей главного процесса S. Предположим теперь, что S состоит из двух параллельных процессов (P || Q) и они оба нуждаются в услугах одного и того же подчиненного процесса (m: R). К сожалению, P и Q не могут взаимодействовать с R по одним и тем же каналам, потому что тогда эти каналы должны содержаться в алфавитах обоих процессов, и, значит, согласно определению оператора ||, взаимодействия с (m: R) могут происходить, только когда P и Q одновременно посылают одно и то же сообщение, что далеко не соответствует желаемому результату. Нам же требуется своего рода чередование взаимодействий между P и (m: R) с взаимодействиями между Q и (m: R). В этом случае (m: R) служит как ресурс, разделяемый P и Q; каждый из них использует его независимо, и их взаимодействия с ним чередуются. Когда все процессы-пользователи известны заранее, можно организовать работу так, чтобы каждый процесс-пользователь имел свой набор каналов для взаимодействий с совместно используемым ресурсом. Эта техника применялась в задаче об обедающих философах: каждая вилка совместно использовалась всеми пятью. Общий метод разделения ресурсов дает множественная пометка, которая является эффективным средством создания достаточного числа каналов для независимого взаимодействия с каждым процессом-пользователем. Отдельные взаимодействия по этим каналам произвольно чередуются. Однако при таком методе необходимо знать заранее имена всех процессов-пользователей, и поэтому он не подходит для подчиненного процесса, предназначенного для обслуживания главного процесса, который разбивается на произвольное число параллельных подпроцессов. Общая память: Поведение систем параллельных процессов без труда реализуется на обыкновенной ЭВМ с хранимой программой с помощью режима разделения времени, при котором единственный процессор поочередно выполняет каждый из процессов, причем смена выполняемого процесса происходит по прерыванию, исходящему от некоторого внешнего или синхронизирующего устройства. При такой реализации легко позволить параллельным процессам совместно использовать общую память, выборка и загрузка которой осуществляется каждым процессом. Ячейка общей памяти - это разделяемая переменная Произвольное чередование присваиваний в ячейку общей памяти различными процессами является следствием многочисленных опасностей. Наиболее полно эти опасности иллюстрирует следующий пример. Возникающие проблемы использования на рисунке 63. Более приемлемое решение было предложено Э. Дейкстрой, которому принадлежит идея использования двоичных семафоров. Семафор - это процесс, поочередно выполняющий действия с именами Ри V: СЕМ = (Р -> V -> СЕМ). Он описывается как совместно используемый ресурс (взаискл: СЕМ // ...). При условии, что все процессы подчиняются этой дисциплине, каждый из двух процессов не сможет влиять на изменение счетчика - произвести действие взаискл.V. Таким образом, критический участок, на котором происходит увеличение счетчика, должен иметь вид: взаискл. Р -> счет.прав?х -> счет.лев!(х + 1) -> взаискл.V -> .... При условии, что все процессы подчиняются этой дисциплине, каждый из двух процессов не сможет влиять на изменение счетчика своим партнером. Но если какой-нибудь процесс пропустит Р или Vили выполнит их в обратном порядке, результат будет непредсказуемым и может привести к катастрофической или (что, возможно, еще хуже) неуловимой ошибке. Взаимодействие процессов Взаимодействие процессов осуществляется по данным по управлению. В первом случае под термином взаимодействие понимается наличие механизмов, позволяющих асинхронным кавзипараллельным процессам обмениваться данными не нарушая их целостности. Последнее означает, что в результате любых обменов данные не должны быть потеряны или искажены. Ясно, что проблема обмена данными между параллельными процессами гораздо сложнее, чем проблема обмена данными между последоватедьными процесссами. Поскольку параллельные процессы развиваются асинхронно, то возможность возникновения различного рода критичных ситуаций гораздо более велика. Представьте себе, что вам нужно передать документы из одного движущегося автомобиля в другой при условии, что они начали движенияе в разных частях города и вас возникнет масса ассоциаций стимулирующих понимание трудности этой задачи. Взаимодействие процессов по управлению подразумевает наличие совокупности механизмов, позволяющих одному процессу влиять на изменение состояния другого процесса. По поводу ассоциации с автомобилями, взаимодействие процессов по управлению адекватно необходимости водителей вести свои машины так, чтобы встретиться в условленном месте (синхронизация при помощи wait), не столкнуться при этом на перекрестке( semaphore), не застрять в пробке(dead-lock), ну , и конечно, доехать когда-нибудь до конечного пункта. Любой, кто водил машину в большом городе знает, какой это дурдом, когда все эти задачи одновременно выполняют тысячи машин. Механихмы синхронизации процессов ОС UNIX имеет развитые средства межпроцессной синхронизации по данным и управлению. Для этих целей в ОС существуют следующие механизмы. -сигналы, -семафоры, -программные каналы, -именованные программные каналы, -очереди сообщений, -сегменты разделяемой памяти, -специальные команды (write? cu? mail), -Средства межмашинного взаимодействия (uucp,tcp/ip,nfs,rfs). События и сигналы Для синхронизации процессов на низком уровне используется достаточно простой механизм событий или сигналов.(В дальнейшем мы будем употреблять термин сигнал - наиболее часто встречающийся в современных операционных системах). Под сигналом понимается именованная структура данных состоящая из флага, принимающего значения (0,1), счетчика и очереди дескрипторов процессов, ожидающих установления флага в состояние 1. !!!проблема тупиков Условия возникновения тупиков Условия возникновения тупиков были сформулированы Коффманом, Элфиком и Шошани в 1970 г. 1. Условие взаимоисключения (Mutual exclusion). Одновременно использовать ресурс может только один процесс. 2. Условие ожидания ресурсов (Hold and wait). Процессы удерживают ресурсы, уже выделенные им, и могут запрашивать другие ресурсы. 3. Условие неперераспределяемости (No preemtion). Ресурс, выделенный ранее, не может быть принудительно забран у процесса. Освобождены они могут быть только процессом, который их удерживает. 4. Условие кругового ожидания (Circular wait). Существует кольцевая цепь процессов, в которой каждый процесс ждет доступа к ресурсу, удерживаемому другим процессом цепи. Для образования тупика необходимым и достаточным является выполнение всех четырех условий. Обычно тупик моделируется циклом в графе, состоящем из узлов двух видов: прямоугольников - процессов и эллипсов - ресурсов, наподобие того, что изображен на рис. 7.1. Стрелки, направленные от ресурса к процессу, показывают, что ресурс выделен данному процессу. Стрелки, направленные от процесса к ресурсу, означают, что процесс запрашивает данный ресурс. !!! борьба с ними Основные направления борьбы с тупиками Проблема тупиков инициировала много интересных исследований в области информатики. Очевидно, что условие циклического ожидания отличается от остальных. Первые три условия формируют правила, существующие в системе, тогда как четвертое условие описывает ситуацию, которая может сложиться при определенной неблагоприятной последовательности событий. Поэтому методы предотвращения взаимоблокировок ориентированы главным образом на нарушение первых трех условий путем введения ряда ограничений на поведение процессов и способы распределения ресурсов. Методы обнаружения и устранения менее консервативны и сводятся к поиску и разрыву цикла ожидания ресурсов. Итак, основные направления борьбы с тупиками: * Игнорирование проблемы в целом * Предотвращение тупиков * Обнаружение тупиков * Восстановление после тупиков Одно из главных свойств сетей Петри - ограниченность. Задача о производителе/потребителе. Безопасность - это частный случай более общего свойства ограниченности. Некоторые соображения относительно реального ограничения на аппаратную реализацию позиций позволяют прийти к заключению, что безопасность - необязательное требование. Безопасность позволяет реализовать позицию триггером, но в более общем случае можно использовать счетчик. Однако любой аппаратно-реализованный счетчик ограничен по максимальному числу, которое он может представить. Позиция является k-безопасной или k-ограниченной, если количество фишек в ней не может превышать целое число k. Определение 4.2. Позиция рi P сети Петри С= (Р, Т, I, О) с начальной маркировкой мю является k-безопасной, если мю'(рi) к для всех мю' R(C, мю). 1-безопасная позиция называется просто безопасной. Заметим, что граница k' по числу фишек, которые могут находиться в позиции, может быть функцией от позиции (например, позиция р1 может быть 3-безопасной, тогда как позиция р2 - 8-безопасной). Однако, если позиция pi k-безопасна, то она также и k'-безопасна Для всех k' k. Поскольку число позиций конечно, можно выбрать ft, равное максимуму из границ каждой позиции, и определить сеть Петри k-безопасной, если каждая позиция сети k-безопасна. Иногда нас будет интересовать только то, является число фишек в позиции ограниченным или нет, а не конкретное значение границы. Позиция называется ограниченной, если она k-безопасна для некоторого k; сеть Петри ограниченна, если все ее позиции ограниченны. Ограниченную сеть Петри можно реализовать аппаратно, тогда как сеть Петри с неограниченными позициями в общем случае реализовать аппаратно нельзя. (Вспомним, что эти определения не зависят от интерпретации. В реализации позиция может представлять некоторый объект, являющийся ограниченным, хотя сама структура сети не отражает этот факт.) В задаче о производителе/потребителе также присутствует совместно используемый объект, но в этом случае разделяемый объект точно определен и является буфером. Процесс-производитель создает объекты, которые помещаются в буфер. Потребитель ждет, пока объект не будет помещен в буфер, удаляет его оттуда и использует. Такая ситуация может быть промоделирована сетью Петри так, как показано на рис. 3.29. Позиция В представляет собой буфер, каждая фишка соответствует элементу данных, который произведен, но еще не использован. Одни из вариантов этой задачи - это задача о нескольких производителях/нескольких потребителях. В этом случае несколько производителей порождают элементы данных, помещаемые в общий буфер, для нескольких потребителей. На рис. 3.30 представлено решение этой задачи в виде сети Петри. Эта сеть совпадает с сетью на рис.3.29, за исключением того, что для представления s производителей и t потребителей мы начали выполнение сети с s фишками в начальной позиции процесса-производителя и t фишками в начальной позиции процесса-потребителя. !! РИСУНОК Таким образом мы представляем s производителей и t потребителей, реализуемых реентерабельными совместно используемыми программами. Альтернативой было бы дублирование программного кода для процессов производителя и потребителя, однако результатом этого при том же самом поведении была бы гораздо большая сеть. В другом варианте задачи о производителе/потребителе используется буфер ограниченного размера. При такой постановке задачи буфер между производителем и потребителем ограничен, т. е. имеет только n ячеек для элементов данных. Следовательно, производитель не может постоянно работать с той скоростью, которая ему нужна, а вынужден ждать, если потребитель работает медленно и буфер заполнен. На рис. 3.31 показано решение этой проблемы. Ограниченному буферу сопоставляются две позиции: В представляет количество элементов данных, которые произведены, но еще не использованы (число заполненных ячеек), В' - количество пустых ячеек в буфере. Первоначально В' имеет n фишек, а В фишек не имеет. Если буфер заполнен, то В' фишек не имеет, а В имеет n фишек. Если теперь производитель попытается поместить еще один элемент данных в буфер, то он будет остановлен, так как в В' нет фишки, делающей этот переход разрешенным. Раздел 13. Теория языков программирования и методы трансляции 65. Формальные языки и грамматики: универсальное множество цепочек над конечным алфавитом, формальный язык как множество цепочек, операции над языками, определение формального языка и формальной грамматики, теория формальных грамматик как математический аппарат для изучения синтаксиса языков программирования, классификация формальных языков и грамматик по порождающей способности. 61. Формальные языки и грамматики: универсальное множество цепочек над конечным алфавитом, формальный язык как множество цепочек, операции над языками, определение формального языка и формальной грамматики, классификация формальных языков и грамматик по порождающей способности. Алфавит - это конечное множество символов. Формальным языком L над алфавитом А называется множество цепочек этого алфавита. Цепочкой символов в алфавите А называется любая конечная последовательность символов этого алфавита. Строка над некоторым алфавитом - это конечная последова- тельность символов, взятых из алфавита. В теории языков термины "предложение" и "слово" часто используются как символы терми- на "строка". Длина строки s, обычно обозначаемая как |s|, равна количеству символов в строке. Например, длина строки banana рав- на шести. Пустая строка, обозначаемая как лямбда (или епсилан), представляет собой специальную строку нулевой длины. Язык обозначает произвольное множество строк над некоторым фиксированным алфавитом. Операции: L U M объединение Множество всех слов, принадлежащих хотя бы одному из языков L или M LM конкатенация (или сцепление) Множество слов из языка L и к нему присоединены некоторые слова из языка M L* замыкание Клини Обозначает 0 или более конкатенаций языка L L+ позитивное замыкание Обозначает 1 или более конкатенаций языка L Теория формальных языков и грамматик Является базой математической лингвистики. Изначально целью математического исследования структуры языка было стремление понять основные свойства естественного языка. Основными для математической лингвистики из представленных в вышеуказанной таблице моделей являются аналитические и порождающие. Можно сказать, что для порождающих моделей исходным пунктом является некоторая формальная грамматика, а объектом исследования является язык, порождаемый этой грамматикой. В аналитических моделях наоборот - исходным материалом является язык как совокупность предложений, а цель исследований в том, чтобы выявить структуру этих предложений, их составляющих элементов и отношения. Аналитические модели более приемлемы для изучения естественного языка, они не навязывают языку жестких правил, а изучает те законы языка, которые уже сложились, но аналитические модели отображают не весь язык, а лишь некоторые его подмножества, удовлетворяющие данной модели, так, например, существуют фонологическая и морфологическая аналитические модели. Порождающие модели используются в основном для создания искусственных языков, таких как языки программирования и алгоритмические языки. Для таких языков характерна жесткая структура, простые правила без исключений и, как следствие, ограничение выразительных возможностей. Многочисленные попытки создать таким образом простой язык (т.е. ограниченный язык) для межнационального общения заканчивался неудачей (эсперанто). В основе порождающей грамматики лежит идея о том, что важнейшие черты грамматики, в первую очередь синтаксис искусственного языка, порождаются формально и врожденно на базе некоторого генетически наследуемого знания. В конце 60х годов было обнаружено, что бесконтекстные языки на базе порождающих грамматик можно представить в виде специальных метаязыков, популярных в программировании, а именно в виде БНФ-нотаций (Бэкус-Науровы формы). Это позволило изучить языки программирования и описать их синтаксис как с практической, так и с теоретической точки зрения. Были введены различные виды грамматик, изучены их свойства и предложен класс специальных распознающих автоматов на базе теории автоматов, которые активно используются в информатике. Основные задачи: Использование математических средств в описании искусственных языков и их организации связано с двумя разными практическими задачами: • 1-я задача заключается в составлении некоторого количества формальных правил, используя которые можно построить любую правильную фразу или конструкцию данного языка, а точнее построить любую цепочку символов, входящих в изучаемый язык, представленного как множество таких цепочек. • 2-я задача в некотором смысле обратная первой, заключается в том, что следующая разработка правила позволяет установить, является ли произвольная цепочка правильной конструкцией или фразой этого языка. В случае утвердительного ответа, требуется указать имена этих отдельных конструкций или определенную синтаксическую структуру этой фразы. В случае отрицательного ответа необходимо определить или указать информацию, указывающую на ошибки при описании этой конструкции, как, например, это делается при отладке языков программирования. Эти задачи взаимосвязаны, но для их применения используются разные математические средства и метаязыки. Для задания правил создания правильных фраз используется аппарат порождающей грамматики, а для задания способов образования цепочек символов и распознавания правильных конструкций применяется аппарат распознающих автоматов. Порождающие грамматики являются частным классом исчисления математической логики, а теория автоматов является базовой в информатике и задает правила обработки машинных кодов (т.е. языков машины). Формальная порождающая грамматика G - это четверка (VT, VN, P, S), где VT - алфавит терминальных символов (терминалов), VN - алфавит нетерминальных символов (нетерминалов), не пересекающийся с VT, P - конечное подмножество множества (VT U VN)+ x (VT U VN)*; элемент (альфа, бета) множества P называется правилом вывода и записывается в виде альфа->бета, S - начальный символ (цель) грамматики, S прин. VN. Множество всех цепочек терминальных символов, выводимых из аксиом грамматики, называется языком, порождаемым этой грамматикой. Классификация грамматик: Тип 0: Грамматика G = (VT, VN, P, S) называется грамматикой типа 0, если на правила вывода не накладывается никаких ограничений (кроме тех, которые указаны в определении грамматики). Тип 1: Грамматика G = (VT, VN, P, S) называется неукорачивающей грамматикой, если каждое правило из P имеет вид альфа->бета, где альфа прин (VT U VN)+, бета прин. (VT U VN)+ . Грамматика G = (VT, VN, P, S) называется контекстно-зависимой (КЗ), если каждое правило из P имеет вид альф->бета, где альфа = епсилан1Aепсилан2; бета = епсилан1каммаЕпсилан2; A прин VN; камма прин (VT U VN)+; епсилан1,епсилан2 прин (VT U VN)*. Грамматику типа 1 можно определить как неукорачивающую либо как контекстно-зависимую. Выбор определения не влияет на множество языков, порождаемых грамматиками этого класса, поскольку доказано, что множество языков, порождаемых неукорачивающими грамматиками, совпадает с множеством языков, порождаемых КЗ-грамматиками. Тип 2: Грамматика G = (VT, VN, P, S) называется контекстно-свободной (КС), если каждое правило из Р имеет вид A -> бета, где A прин VN, бета прин (VT U VN)+. Грамматика G = (VT, VN, P, S) называется укорачивающей контекстно-свободной (УКС), если каждое правило из Р имеет вид A -> бета, где A прин VN, бета прин (VT U VN)*. Грамматику типа 2 можно определить как контекстно-свободную либо как укорачивающую контекстно-свободную. Возможность выбора обусловлена тем, что для каждой УКС-грамматики существует почти эквивалентная КС-грамматика. Тип 3: Грамматика G = (VT, VN, P, S) называется праволинейной, если каждое правило из Р имеет вид A -> tB либо A -> t, где A прин VN, B прин VN, t прин VT. Грамматика G = (VT, VN, P, S) называется леволинейной, если каждое правило из Р имеет вид A -> Bt либо A -> t, где A прин VN, B прин VN, t прин VT. Грамматику типа 3 (регулярную, Р-грамматику) можно определить как праволинейную либо как леволинейную. Выбор определения не влияет на множество языков, порождаемых грамматиками этого класса, поскольку доказано, что множество языков, порождаемых праволинейными грамматиками, совпадает с множеством языков, порождаемых леволинейными грамматиками. 66. Лексический анализ: роль лексического анализатора, взаимосвязь лексического и синтаксического анализаторов, принципы построения и функции лексического анализатора, связь лексического анализа, автоматных грамматик и конечных автоматов, конечные автоматы и распознаватели, недетерминированные и детерминированные конечные автоматы, преобразования конечных автоматов, цель этих преобразований. Лексический анализ: роль лексического анализатора, взаимосвязь лексического и синтаксического анализаторов, принципы построения и функции лексического анализатора, связь лексического анализа, автоматных грамматик и конечных автоматов, конечные автоматы и распознаватели, недетерминированные и детерминированные конечные автоматы, преобразования конечных автоматов, цель этих преобразований. Компиляция состоит из двух основных частей: анализа и синтеза. Анализ - это разбиение исходной программы на составные части и создание ее промежуточного представления. В процессе анализа определяются и записываются в иерархическую древовидную структуру операции, заданные исходной программой. Часто используется специальный вид дерева - синтаксическое дерево, в котором каждый узел представляет операцию, а его дочерние узлы - аргументы операции (операнды). Синтез - это конструирование требуемой целевой программы из промежуточного представления. Процесс трансляции разбивается на несколько этапов, за выполнение каждого из которых отвечает свой блок. 10 Основные фазы трансляции: лексический анализ, синтаксический анализ, семантический анализ, синтез объектной программы. Цели лексического анализа: 1) перевод исходной программы на внутренний язык компиля- тора, в котором ключевые слова, идентификаторы, метки и кон- станты приведены к одному формату и заменены условными кода- ми: числовыми или символьными, которые называются дескрипто- рами. Каждый дескриптор состоит из двух частей: класса-типа лек- семы и указателя на адрес в памяти, где хранится информация о конкретной лексеме. Эта информация организуется в виде таблиц; 2) лексический контроль - выявление в программе недопусти- мых слов. Цели синтаксического анализа: 1) перевод последовательности образов лексем в форму проме- жуточной программы; 2) синтаксический контроль - выявление синтаксических оши- бок в программе. Лексический анализ представляет собой первую фазу компиля- ции. Его основная задача состоит в чтении новых символов и выда- чи последовательности лексем, используемых синтаксическим ана- лизатором в своей работе. Лексической единицей языка является лексема. Лексема - это структурная единица языка, которая состоит из элементарных символов языка и не содержит в своем составе дру- гих структурных единиц языка. Лексемами языков естественного языка общения между людьми являются слова. Лексемами языков программирования являются идентификаторы, константы, ключевые слова языка, знаки опера- ций и т.п. Состав возможных лексем каждого конкретного языка программирования определяется синтаксисом этого языка. Каждый класс лексем описывается правилом, называемым шаб- лоном. Шаблон - правило, описывающее набор лексем, которые могут представлять определенную лексему в исходной программе. Лексический анализатор (или сканер) - это часть компилятора, которая читает исходную программу и выделяет в ее тексте лексе- мы входного языка. На вход лексического анализатора поступает текст исходной программы, а выходная информация передается для дальнейшей об- работки компилятором на этапе синтаксического анализа и разбора. С теоретической точки зрения лексический анализатор не явля- ется обязательной частью компилятора. Все его функции могут вы- полняться на этапе синтаксического разбора. Однако лексический анализ включают в состав практически всех компиляторов по сле- дующим причинам: - применение лексического анализатора упрощает работу с тек- стом исходной программы на этапе синтаксического разбора и со- кращает объем обрабатываемой информации; - для выделения в тексте и разбора лексем применяется простая и эффективная техника анализа, в то время как на этапе синтакси- ческого анализа конструкций исходного языка используются доста- точно сложные алгоритмы разбора; - при конструкции компилятора, когда лексический анализ реа- лизован отдельно от синтаксического, для перехода от одной вер- сии языка программирования к другой достаточно только пере- строить относительно простой лексический анализатор. Основные функции лексического анализатора: 1) исключение из текста исходной программы комментариев; 2) исключение из текста исходной программы незначащих про- белов, символов-табуляций и перевода строки; 3) выделение лексем следующих типов: идентификаторов, стро- ковых, символьных и числовых констант, ключевых (служебных) слов входного языка, знаков операций и разделителей. Общие принципы построения лексических анализаторов Лексический анализатор имеет дело с такими объектами, как различного рода константы и идентификаторы (к последним отно- сятся и ключевые слова). Язык констант и идентификаторов в большинстве случаев является регулярным, т. е. может быть описан с помощью регулярных грамматик. Распознавателями для регуляр- ных языков являются конечные автоматы. Существуют правила, с помощью которых для любой регулярной грамматики может быть построен недетерминированный конечный автомат, распознающий цепочки языка, заданного этой грамматикой. Конечный автомат для каждой входной цепочки языка дает ответ на вопрос о том, принад- лежит или нет цепочка языку, заданному автоматом. В общем случае задача сканера несколько шире, чем просто проверка цепочки символов лексемы на соответствие ее входному языку. Кроме того, сканер должен выполнить следующие действия: - четко определить границы лексемы, которые в исходном тек- сте явно не заданы; - выполнить действия для сохранения информации об обнару- женной лексеме (или выдать сообщение об ошибке, если лексема неверна). В качестве промежуточного шага при создании лексического анализатора можно рассматривать стилизованные блок-схемы, на- зываемые диаграммами переходов. Диаграмма переходов изобра- жает действия, выполняемые лексическим анализатором при вызо- ве его синтаксическим анализатором для получения очередной лек- семы. Позиции в диаграмме переходов изображаются кружками и называются состояниями. Состояния соединены стрелками, назы- ваемыми дугами. Выходящие из состояния s дуги имеют метки, указывающие входные символы, которые могут появиться во вход- ном потоке по достижении состояния s. Метка other означает появ- ление любого символа, не указанного другими исходящими дугами. Диаграммы переходов в данном случае детерминированные, т.е. ни один символ не может быть меткой двух исходящих из одного состояния дуг. Одно из состояний имеет метку start - это начальное состояние диаграммы переходов в момент начала распознавания лексемы. Некоторые состояния имеют действия, выполняемые при их достижении. При попадании в некоторое состояние считывается следующий входной символ. Если имеется исходящая дуга с мет- кой, соответствующей этому символу, перемещаемся по ней в сле- дующее состояние. Если такой дуги нет, то входящий символ не- корректен и произошла ошибка. Конечные автоматы Распознавателем языка называется программа, которая получа- ет на входе строку x и отвечает "да", если x - предложение языка, или в противном случае - "нет". Регулярное выражение компили- руется в распознаватель путем построения обобщенной диаграммы переходов, называемой конечным автоматом. Такой автомат мо- жет быть детерминированным или недетерминированным (неде- терминированный автомат может иметь более одного перехода из некоторого состояния при одном и том же входном символе). Как детерминированные, так и недетерминированные конечные автоматы способны к распознаванию точных регулярных мно- жеств. Таким образом, они могут распознавать все, что могут обо- значать регулярные выражения. Однако детерминированные ко- нечные автоматы, которые приводят к более быстрому распознава- нию, обычно больше по размеру, чем эквивалентные недетермини- рованные. Существуют методы преобразования регулярных выра- жений в оба типа конечных автоматов. Недетерминированные конечные автоматы Недетерминированный конечный автомат (НКА) A = (Q, V, ДЕЛЬТА, q0, F) представляет собой математическую модель, состоящую: - из множества состояний Q; - из множества входных символов V (символов входного алфа- вита); - из функции переходов , которая отображает пары символ - состояние на множество состояний; - из состояния q0, известного как стартовое (начальное); - из множества состояний F, известных как допускающие (ко- нечные). НКА может использоваться в виде помеченного ориентирован- ного графа, так называемого графа переходов, узлы которого пред- ставляют собой состояния, а помеченные дуги составляют функ- цию переходов. Такой граф похож на диаграмму переходов, однако один и тот же символ может помечать два и более переходов из од- ного состояния, а некоторые переходы могут быть помечены спе- циальным символом e, как обычным входным символом (e- переходы). Функция переходов НКА может быть реализована различными способами. Простейший из них - таблица переходов (табл. 6), в ко- торой строки представляют состояния, а столбцы - входные сим- волы. Запись в строке i для символа а является множеством состоя- ний, которые могут быть достигнуты переходом из состояния i при входном символе а. Детерминированный конечный автомат Детерминированный конечный автомат (ДКА) является специ- альным случаем недетерминированного конечного автомата, в ко- тором: - отсутствуют состояния, имеющие лябмда-переходы; - для каждого состояния s и входного символа а существует не более одной дуги, выходящей из s и помеченной как а. Для любого входного символа детерминированный конечный автомат имеет не более одного перехода из каждого состояния. Ес- ли для представления функции переходов ДКА используется таб- лица, то каждая запись в ней представляет собой единственное со- стояние. Следовательно, очень просто проверить, допускает ли данный ДКА некоторую строку, поскольку имеется не более одного пути от стартового состояния, помеченного этой строкой. Следую- щий алгоритм имитирует поведение ДКА при обработке входной строки. Преобразования НКА При построении лексического анализатора, над НКА необходи- мо выполнить ряд преобразований. Ситуации, в которых функция переходов многозначна, делают моделирование НКА с помощью компьютерной программы весьма сложной задачей. Оп- ределение допустимости утверждает только, что должен существо- вать некоторый путь, помеченный входной строкой и ведущий от начального состояния к заключительному. Однако когда имеется много путей для одной и той же входной строки, возможно, при- дется рассматривать их все, чтобы найти путь к заключительному состоянию или выяснить, что такого пути не существует. Алгоритм преобразования НКА в ДКА, распознающий тот же язык, что и НКА, является алгоритмом построения подмножеств и может использоваться при моделировании НКА компьютерной программой. 67. Синтаксический анализ: роль синтаксического анализатора, контекстно-свободные грамматики (КС-грамматики) как основной инструмент формального изучения синтаксиса языков программирования: определение КС-грамматики, дерево вывода в КС-грамматике, однозначность КС-грамматик и языков, связь между КС-языками и МП-автоматами, автоматы с магазинной памятью, описание, функционирование, способы задания МП-автомата, недетерминированные и детерминированные МП-автоматы. 66. Синтаксический анализ: роль синтаксического анализатора, контекстно-свободные грамматики (КС-грамматики) как основной инструмент формального изучения синтаксиса языков программирования: определение КС-грамматики, дерево вывода в КС-грамматике, однозначность КС-грамматик и языков, связь между КС-языками и МП-автоматами, автоматы с магазинной памятью, описание, функционирование, способы задания МП-автомата, недетерминированные и детерминированные МП-автоматы. Компиляция состоит из двух основных частей: анализа и синтеза. Анализ - это разбиение исходной программы на составные части и создание ее промежуточного представления. В процессе анализа определяются и записываются в иерархичес- кую древовидную структуру операции, заданные исходной про- граммой. Часто используется специальный вид дерева - синтакси- ческое дерево, в котором каждый узел представляет операцию, а его дочерние узлы - аргументы операции (операнды). Синтез - это конструирование требуемой целевой программы из промежуточного представления. Процесс трансляции разбивается на несколько этапов, за выпол- нение каждого из которых отвечает свой блок. 10 Основные фазы трансляции: лексический анализ, синтаксичес- кий анализ, семантический анализ, синтез объектной программы. Цели лексического анализа: 1) перевод исходной программы на внутренний язык компиля- тора, в котором ключевые слова, идентификаторы, метки и кон- станты приведены к одному формату и заменены условными кода- ми: числовыми или символьными, которые называются дескрипто- рами. Каждый дескриптор состоит из двух частей: класса-типа лек- семы и указателя на адрес в памяти, где хранится информация о конкретной лексеме. Эта информация организуется в виде таблиц; 2) лексический контроль - выявление в программе недопусти- мых слов. Цели синтаксического анализа: 1) перевод последовательности образов лексем в форму проме- жуточной программы; 2) синтаксический контроль - выявление синтаксических оши- бок в программе. Грамматика G = (VT, VN, P, S) называется контекстно-свободной (КС), если каждое правило из Р имеет вид A -> бета, где A прин VN, бета прин (VT U VN)+. Существует два способа определения языка грамматикой: 1. Последовательность правил вывода от стартового символа к предложению языка 2. Построение дерева разбора Вывод цепочки бета прин (VT)* из S прин VN в КС-грамматике G = (VT, VN, P, S), называется левым (левосторонним), если в этом выводе каждая очередная сентенциальная форма получается из предыдущей заменой самого левого нетерминала. Вывод цепочки бета прин (VT)* из S прин VN в КС-грамматике G = (VT, VN, P, S), называется правым (правосторонним), если в этом выводе каждая очередная сентенциальная форма получается из предыдущей заменой самого правого нетерминала. Для КС-грамматик можно ввести удобное графическое представление вывода, называемое деревом вывода, причем для всех эквивалентных выводов деревья вывода совпадают. Деревом вывода (или деревом разбора) называется конечный неориентированный граф, у которого: - одна вершина (корень дерева) соответствует стартовому символу грамматики; - каждый внутренний узел помечается нетерминалом А, дочерние узлы помечаются с лева-направо символами из правой части продукции, использованной в порождении для замены А; - листья дерева помечены нетерминалами или терминалами и, будучи прочитанными слева-направо, образуют сентенциальную форму. КС-грамматика G называется неоднозначной, если существует хотя бы одна цепочка альфа принадл L(G), для которой может быть построено два или более различных деревьев вывода. Язык, порождаемый грамматикой, называется неоднозначным, если он не может быть порожден никакой однозначной грамматикой. Проблема, порождает ли данная КС-грамматика однозначный язык (т.е. существует ли эквивалентная ей однозначная грамматика), является алгоритмически неразрешимой. Грамматика - средство описания синтаксиса языка. Она определяет структуру цепочек и позволяет строить цепочки определенного языка. Автомат - модель алгоритма распознавания предложений языка. Этот специальный алгоритм позволяет по заданной цепочке определяет принадлежит ли она языку. МП-автомат состоит из входной ленты, устройства управления и вспомогательной ленты, называемой магазином или стеком. Входная лента разделяется на клетки (позиции), в каждой из которых может быть записан символ входного алфавита. При этом предполагается, что в неиспользуемых клетках входной ленты расположены пустые символы епсилан. Вспомогательная лента также разделена на клетки, в которых могут располагаться символы магазинного алфавита. Начало вспомогательной ленты называется дном магазина. Связь устройства управления с лентами осуществляется двумя головками, которые могут перемещаться вдоль лент. Головка входной ленты может перемещаться только вправо или оставаться на месте. Она может выполнять только чтение. Головка вспомогательной ленты способна выполнять как чтение, так и запись: - при записи головка предварительно сдвигается на одну позицию вверх, а затем символ заносится на ленту, - при чтении символ, находящийся под головкой считывается с ленты, а затем головка сдвигается на одну позицию вниз, т.о. головка всегда установлена против последнего записанного символа. Позицию, находящуюся в рассматриваемый момент времени под головкой, называют вершиной магазина. Магазинный автомат М определяется следующей совокупностью семи объектов: M={A, Q, Г, дельта, q0, z0, F}, , где A - конечное множество входных символов, Q - внутренних состояний, Г- магазинных символов, q0 - начальное выделенное состояние, z0 - начальный символ стека, F - множество заключительных состояний, дельта: (А x Q x Г) -> (Q x Г)* Каждый такт работы включает операции: 1. Операции над магазином: ВТОЛКНУТЬ (в стек определенный символ), ВЫТОЛКНУТЬ (неопределено, x = епсилан или А, x = AY), ОСТАВИТЬ содержимое стека без изменений 2. Операции над состоянием: Перейти в заданное новое состояние СОСТОЯНИЕ (S), Остаться в прежнем ОСТАТЬСЯ 3. Операции над входом: СДВИГ (перейти к следующему входному символу и сделать его текущим), ДЕРЖАТЬ (оставить данных входной символ текущим до следующего такта). Конфигурация МП-автомата может быть записана в виде (состояние, входная последовательность, состояние стека) или в виде последовательности команд вида: (q, a, z) -> { (q1, y1), (q2, y2), ..., (qn, yn)}, где qi прин Q, z прин Г, yi прин Г*, a прин A Если среди команд нет двух одинаковых, автомат называется детерминированным. В противном случае - недетерминированным и выбор команд осуществляется случайным образом. Если нет команды, которую можно было бы применить, автомат останавливается. Недетерминированный конечный автомат (НКА) A = (Q, V, дельта, q0, F) представляет собой математическую модель, состоящую: - из множества состояний Q; - из множества входных символов V (символов входного алфа- вита); - из функции переходов дельта, которая отображает пары символ - состояние на множество состояний; - из состояния q0, известного как стартовое (начальное); - из множества состояний F, известных как допускающие (ко- нечные). НКА может использоваться в виде помеченного ориентирован- ного графа, так называемого графа переходов, узлы которого пред- ставляют собой состояния, а помеченные дуги составляют функ- цию переходов. Такой граф похож на диаграмму переходов, однако один и тот же символ может помечать два и более переходов из од- ного состояния, а некоторые переходы могут быть помечены спе- циальным символом e, как обычным входным символом (e- переходы). Детерминированный конечный автомат (ДКА) является специ- альным случаем недетерминированного конечного автомата, в ко- тором: - отсутствуют состояния, имеющие лямбда-переходы; - для каждого состояния s и входного символа а существует не более одной дуги, выходящей из s и помеченной как а. Для любого входного символа детерминированный конечный автомат имеет не более одного перехода из каждого состояния. Ес- ли для представления функции переходов ДКА используется таб- лица, то каждая запись в ней представляет собой единственное со- стояние. Следовательно, очень просто проверить, допускает ли данный ДКА некоторую строку, поскольку имеется не более одного пути от стартового состояния, помеченного этой строкой. Следую- щий алгоритм имитирует поведение ДКА при обработке входной строки. Ситуации, в которых функция переходов многозначна, делают моделирование НКА с помощью компьютерной программы весьма сложной задачей. Оп- ределение допустимости утверждает только, что должен существо- вать некоторый путь, помеченный входной строкой и ведущий от начального состояния к заключительному. Однако когда имеется много путей для одной и той же входной строки, возможно, при- дется рассматривать их все, чтобы найти путь к заключительному состоянию или выяснить, что такого пути не существует. Алгоритм преобразования НКА в ДКА, распознающий тот же язык, что и НКА, является алгоритмом построения подмножеств и может использоваться при моделировании НКА компьютерной программой. 68. Общие алгоритмы синтаксического анализа: методы восходящего синтаксического анализа, табличные методы синтаксического анализа, формальное определение алгоритма разбора типа "перенос-свертка", грамматики простого и операторного предшествования, понятие отношений ", • = " между символами грамматики, особенности построения таблиц разбора, сравнительный анализ класса грамматик предшествования с другими классами грамматик. Основной метод восходящего синтаксического анализа - син- таксический анализ типа "перенос/свертка" (ПС-анализ). В процес- се ПС-анализа дерево разбора для входной строки строится начи- ная с листа (снизу) и работает по направлению к корню дерева (вверх). Этот процесс можно рассматривать как свертку строки w к стартовому символу грамматики. На каждом шаге свертки некоторая подстрока, соответствующая правой части продукции, заменя- ется символом из левой части этой продукции, и если на каждом шаге подстроки выбираются корректно, то получается обращенное правое порождение. Понятие основы строки Основа строки - это подстрока, которая совпадает с правой ча- стью продукции и свертка которой в левую часть продукции пред- ставляет собой один шаг обращенного правого порождения. Во многих случаях крайняя слева подстрока бета, соответствующая правой части некоторой продукции A, не является основой, по- скольку свертка в соответствии с продукцией A -> бета приводит к строке, которая не может быть свернута к стартовому символу. Ес- ли в примере 18 заменить во второй строке aAbcde символ b нетер- миналом А, то получим строку aAAcde, которая не может быть свернута в S. Поэтому определение основы должно быть более точ- ное. Основа правосентенциальной формы y является продукцией A -> и позицией строки бета в y, такими, что бета может быть заменена нетерминалом А для получения предыдущей правосентенциальной формы в правом порождении y. Таким образом, если S=>альфаAw => альфабетаw, то A -> бета в позиции после а представляет собой основу строки aбетаw. Строка w справа от основы содержит только терминальные символы. Если грамматика однозначна, то каждая правосентенци- альная форма грамматики имеет ровно одну основу. Стековая реализация ПС-анализа Существует две проблемы при синтаксическом анализе методом ПС-анализа. Первая заключается в обнаружении подстроки для свертки в правосентенциальной форме, вторая - в определении, ка- кая именно продукция должна быть выбрана, если имеется не- сколько продукций с соответствующей подстрокой в правой части. Достаточно удобный путь реализации ПС-анализатора состоит в использовании стека для хранения символов грамматики и входно- 111 го буфера для хранения анализируемой строки. В качестве маркера дна стека используется $, и этот же символ является маркером пра- вого конца входной строки. Изначально стек пуст, а входной буфер содержит строку w$: Стек Вход $ w$ Синтаксический анализатор работает путем переноса нуля или нескольких символов в стек до тех пор, пока на вершине стека не окажется основа бета. Затем он свертывает бета левой части соответст- вующей продукции. Синтаксический анализатор повторяет этот цикл, пока не будет обнаружена ошибка или он не придет в конфи- гурацию, когда в стеке находится только стартовый символ, а вход- ной буфер пуст: Стек Вход $S $ Попав в эту конфигурацию, синтаксический анализатор прекра- щает работу и сообщает об успешном разборе входной строки. Основными операциями синтаксического анализатора являются перенос и свертка, но на самом деле ПС-анализатор может выпол- нять четыре действия: (1) перенос, (2) свертка, (3) допуск, (4) ошибка. 1. При переносе очередной входной символ переносится на вершину стека. 2. При свертке синтаксический анализатор распознает правый конец основы на вершине стека, после чего он должен найти левый конец основы и принять решение о том, каким нетерминалом заме- нить основу. 3. При допуске синтаксический анализатор сообщает об успеш- ном разборе входной строки. 4. При ошибке синтаксический анализатор обнаруживает ошиб- ку во входном потоке и вызывает программу восстановления после ошибок. З аме ч ание . Синтаксический анализатор для получения оче- редной основы переносит нуль или несколько символов в стек. Синтаксический анализатор никогда не заглядывает внутрь стека в поисках правого края основы. Все это делает стек особенно удоб- ным для использования в реализации ПС-анализатора. Синтаксический анализ приоритета операторов Принцип организации распознавателя входных цепочек языка, заданного грамматикой предшествования, основан на том, что для каждой упорядоченной пары символов в грамматике устанавлива- ется некоторое отношение, называемое отношением приоритетов. В процессе разбора входной строки расширенный МП-автомат сравнивает текущий символ входной цепочки с одним из символов, находящихся на вершине стека автомата. В процессе сравнения проверяется, какое из возможных отношений приоритетов сущест- вует между этими двумя символами. В зависимости от найденного отношения, выполняется либо перенос, либо свертка. При отсутст- вии отношения приоритетов между символами алгоритм сигнали- зирует об ошибке. Задача состоит в том, чтобы определить эти отношения предше- ствования между символами грамматики. При этом грамматика может быть отнесена к одному из классов грамматик предшество- вания (простого предшествования, расширенного предшествования, слабого предшествования и т.д.). Основное понятие, которое используется в грамматиках пред- шествования, - отношение предшествования. Пусть имеется КС-грамматика и на некотором шаге вывода по- лучена сентенциальная форма вида E* Ei Ej E*. Символы Ei Ej стоят рядом в сентенциальной форме. Соседство этих символов характе- ризуется одним из отношений специального вида - отношением предшествования. 1. Между символами Ei и Ej существует отношение Ei Ej, если в грамматике есть правило вида A > альфа Еi Еj бета, где альфа, бета принадлежат алфавиту V*. 2. Между символами Ei и Ej существует отношение Ei ? ?i В ? и вывод вида В > Ej Y, где ?, ?, ? принадлежат алфавиту V *. 3. Между символами Ei и Ej существует отношение Ei •> Ej, если в грамматике есть правило вида A > ? ВС ? и выводы вида В y1 Ej и С Ej y2 или правило вывода вида A > альфа В Ej бета и вывод В y Ei , где альфа, бета, y1, y2 , y принадлежат алфавиту V*. Тип отношения предшествования показывает, что если: Ei Ej, то оба символа принадлежат одной основе; Ei Ej, то Ei - самый правый символ некоторой основы. Если между символами Ei и Ej выполняется не более одного от- ношения предшествования, то можно выделить основу для выпол- нения свертки. Грамматики простого предшествования КС-грамматика является грамматикой простого предшествова- ния, если она однозначна, не содержит ?-продукций и для любой пары ее символов (терминальных и нетерминальных) выполняется не более одного отношения предшествования. Отношение предшествования единственно для каждой упорядо- ченной пары символов. При этом между какими-либо двумя симво- лами может и не быть отношения предшествования - это значит, что они не могут находиться рядом в одном элементе разбора син- таксически правильной цепочки. Отношения предшествования зависят от порядка, в котором сто- ят символы. 7.4.2. Грамматики операторного предшествования Грамматики, у которых нет продукций, правые части которых представляют собой или имеют два соседних нетерминала, назы- ваются операторными. Пр име р 23. Следующая грамматика для выражений E > ЕАЕ | (E) | -E | id А > + | - | * | / | ^ не является операторной, поскольку правая часть ЕАЕ имеет два (на самом деле - даже три) последовательных нетерминала. Однако если заменим А каж- дой из его альтернатив, то получим операторную грамматику E> E + E | E - E | E * E | E/E | E^E | (E) | - E| id При синтаксическом анализе приоритета операторов определя- ются три непересекающихся отношения приоритетов - - между терминалами. - правый, а находится внутри основы. Предположим, что есть правосентенциальная форма операторной грамматики. Из того, что у продукции не может быть двух смежных нетерминалов в правой части, следует, что и правосентенциальная форма не может иметь двух смежных нетерминалов. Таким образом, правосентенциаль- ную форму можно записать в виде ?0 a1 ?1...an ?n, где каждое ? явля- ется либо пустой строкой, либо одиночным нетерминалом, а каж- дое а представляет собой одиночный терминал. Предположим, что между аi и аi+1 выполняется ровно одно от- ношение - •>, , RTY, то СА замещает х на вершине стека на правую часть продукции. В случае правильного разбора на входе мы получим левое порождение входной цепочки. Нужно построить два множества: First и Follow. Построение множества First: 1. если х - терминал, First (х) = {х} 2. если имеется продукция Х -> епсилан, то епсилан добавляется к множеству First (Х) 3. если Х - нетерминал и имеется продукция Х -> Y1, Y2, Yk, то а прин First (Yi) и епсилан входит во все множества. Если епсилан имеется во всех множествах First (Y1)...First (Yk) то епсилан добавляется в First (Х). Построение множества Follow: 1. помещаем епсилан во множество, где S - стартовый символ грамматики 2. если есть продукция А -> альфаВбета, все элементы множества First (бета), кроме епсилан, помещаются в Follow (В) 3. если есть продукция А -> альфаВ или А -> альфаВебта, где First (бета) содержит епсилан, все элементы множества Follow (А) помещаются в множество Follow (В). Алгоритм заполнения таблицы: 1. для каждого терминала а из First (А) добавляем продукцию А -> альфа в ячейку M [A, a] 2. если в First (А) входит есилан, для терминала а из Follow (А) добавляем продукцию А -> альфа в ячейку M [A, a]; если епсилан входит в First (А), символ $ в Follow (А), добавляем продукцию А -> альфа в ячейку M [A, $] 3. каждая неопределенная ячейка - ошибка. 70. Общие алгоритмы синтаксического анализа: методы восходящего синтаксического анализа, табличные методы синтаксического анализа, формальное определение алгоритма разбора типа "перенос-свертка", определение LR(k)-грамматики, алгоритм разбора для LR(k)-грамматик, алгоритм построения управляющей таблицы, преимущества класса LR(k)-грамматик перед другими методами синтаксического анализа. Восходящий синтаксический анализ СА (свёртка) - дерево разбора строится от листьев к корню. SLR(1) и LALR(1) грамматики. В основе этих двух методов лежит одна и та же идея. В SLR(1) грамматиках (Simple LR(1) - простых LR(1)-грамматиках) для разрешения конфликтов используется множество FOLLOW(X)- множество терминалов, встречающихся после X. Если в состоянии имеется ситуация A:b_, свертка допускается, если только аванцепочка принадлежит FOLLOW(A). Грамматика является SLR(1)-грамматикой, если для двух любых LR(0) ситуаций из одного состояния A:a_b и B:c_d выполняется одно из следующих условий: - b!=e, d!=e (конфликта нет, требуется сдвиг); - b=d=e и FOLLOW(A) не пересекается с FOLLOW(B) (конфликт "свертка/свертка" может быть устранен с учетом аванцепочки); - b=e, d<>e и FOLLOW(A) не пересекается с EFF(tFOLLOW(B))(конфликт "сдвиг/свертка" может быть устранен с учетом аванцепочки). LALR(1)-метод (Look Ahead - заглядывание вперед) заключается в следущем. Введем на множестве LR(1)-ситуаций отношение эквивалентности: будем считать две ситуации эквивалентными, если они различаются только аванцепочками. Например, ситуации A:Aa_Ab|e и A:Aa_Ab|a эквивалентны. Построим каноническое множество LR(1)-состояний и объединим состояния, состоящие из множества эквивалентных ситуаций. Грамматика называется LR(k)-грамматикой, если она обладает свойством LR(k) для некоторого k>=0. КС-грамматика обладает свойством LR(k), k>=0, если на каждом шаге вывода для однозначного решения вопроса о выполняемом действии расширенному МП-автомату достаточно знать содержимое верхней части стека и рассмотреть первые k символов от текущего положения считывающей головки автомата во входной цепочке символов. Алгоритм функционирования распознавателя LR(k)-грамматики: 1) Прочитать с вершины стека строку управляющей таблицы. Выбрать из этой строки часть Action в соответствии с аванцепочкой. Перейти к шагу 2. 2) В соответствии с типом действия выполнить выбор: • сдвиг- если входная цепочка не прочитана до конца, прочитать и запомнить как "новый символ" очередной символ из входной цепочки, сдвинуть считывающую головку на одну позицию вправо, иначе прервать выполнение алгоритма и ошибка; • свертка - выбрать правило в соответствии с номером, удалить из стека цепочку символов, составляющую правую часть выбранного правила, взять символ из левой части правила и запомнить его как "новый символ"; • ошибка - прервать выполнение алгоритма; • успех - выполнить свертку к целевому символу S. Прервать выполнение алгоритма, сообщить о разборе, если входная цепочка прочитана до конца, иначе ошибка. Перейти к 3 шагу. 3) Прочитать с вершины стека строку управляющей таблицы. Выбрать из этой строки часть Goto в соответствии с символом, который был запомнен как "новый символ" на предыдущем шаге. Перейти к шагу 4. 4) Если часть Goto содержит ошибку, тогда прервать и ошибка, иначе положить в стек "новый символ" и строку управляющей таблицы с выбранным номером. Перейти к шагу 1. Алгоритм построения управляющей LR(1)-таблицы: Вход. Каноническая система C = {I0, I1, ..., In} множеств допустимых LR(1)-ситуаций для грамматики G. Выход. Функции Action и Goto, составляющие LR(1)-таблицу для грамматики G. Метод. Для каждого состояния i функции Action[i, a] и Goto[i, X] строятся по множеству ситуаций Ii: • Значения функции действия (Action) для состояния i определяются следующим образом: o если [A ->альфа.a бета , b] прин. Ii (a - терминал) и goto(Ii, a) = Ij, то полагаем Action[i, a] = shift j; o если [A альфа.,a] прин Ii, причем A не= S', то полагаем Action[i, a] = reduce A -> альфа ; o если [S' -> S., $] прин Ii, то полагаем Action[i, $] = accept. • Значения функции переходов для состояния i определяются следующим образом: если goto(Ii, A) = Ij, то Goto[i, A] = j (здесь A - нетерминал). • Все входы в Action и Goto, не определенные шагами 2 и 3, полагаем равными error. • Начальное состояние анализатора строится из множества, содержащего ситуацию [S' ->.S, $]. Пусть G = (N, T, P, S) - КС-грамматика. Пополненной грамматикой для данной грамматики G называется КС-грамматика G'=(N U {S'}, T, P u {S' -> S}, S'), т.е. эквивалентная грамматика, в которой введен новый начальный символ S' и новое правило вывода S'-> S (для того, чтобы определить, когда анализатор должен остановить разбор и зафиксировать допуск входа). Допуск тогда и только тогда, когда анализатор готов осуществить свертку по правилу S'->S. В процессе разбора снизу-вверх типа сдвиг-свертка (перенос-свертка) строится дерево разбора входной цепочки, начиная с листьев (снизу) к корню (вверх). Этот процесс можно рассматривать как "свертку" цепочки w к начальному символу грамматики. На каждом шаге свертки подцепочка, которую можно сопоставить правой части некоторого правила вывода, заменяется символом левой части этого правила вывода, и если на каждом шаге выбирается правильная подцепочка. Подцепочка сентенциальной формы, которая может быть сопоставлена правой части некоторого правила вывода, свертка по которому к левой части правила соответствует одному шагу в обращении правостороннего вывода, называется основой цепочки. Грамматика однозначна, если каждая правая сентенциальная форма грамматики имеет в точности одну основу. Замена основы в сентенциальной форме на нетерминал левой части называется отсечением основы. Грамматикой простого предшествования называют такую КС-грамматику G(VN,VT,P,S), V=VT U VN в которой: 1. Для каждой упорядоченной пары терминальных и нетерминальных символов выполняется не более чем одно из трех отношений предшествования: • Si = Sj (для всех Si,Sj прин. V), если и только если сущ. правило U->xSiSjy прин. P, где U прин. VN, x,y прин.V*; • Si xSiDy прин P и вывод D->*Sjz, где U,D прин. VN, x,y,z прин. V*; • Si > Sj (для всех Si,Sj прин. V) , если и только если сущ. правило U->xCSjy прин P и вывод C->*zSi или сущ правило U->xCDy прин. P и выводы C->*zSi и D->*Sjw, где U,C,D прин. VN, x,y,z,w прин. V*. 2. Различные порождающие правила имеют разные правые части. Отношения =, называют отношениями предшествования для символов. Отношение предшествования единственно для каждой упорядоченной пары символов. При этом между какими-либо двумя символами может и не быть отношения предшествования - это значит, что они не могут находиться рядом ни в одном элементе разбора синтаксически правильной цепочки. Отношения предшествования зависят от порядка, в котором стоят символы. Метод предшествования основан на том факте, что отношения предшествования между двумя соседними символами распознаваемой строки соответствуют трем следующим вариантам: • Si Si+1 , если символ Si - крайний правый символ некоторой основы; • Si = Si+1 , если символы Si и Si+1 принадлежат одной основе. Исходя из этих соотношений выполняется разбор строки для грамматики предшествования. На основании отношений предшествования строят матрицу предшествования грамматики. Строки матрицы предшествования помечаются первыми символами, столбцы - вторыми символами отношений предшествования, а в клетки матрицы на пересечении соответствующих столбца и строки помещаются знаки отношений. При этом пустые клетки матрицы говорят о том, что между данными символами нет ни одного отношения предшествования. Матрицу предшествования грамматики можно построить, опираясь непосредственно на определения отношений предшествования, но удобнее воспользоваться двумя дополнительными множествами - множеством крайних левых и множеством крайних правых символов относительно нетерминалов грамматики. Эти множества определяются следующим образом: • L(U) = {T | сущ U->*Tz}, U,T прин V, z прин V* - множество крайних левых символов относительно нетерминального символа U (цепочка z может быть и пустой цепочкой); • R(U) = {T | сущ U->*zT}, U,T прин V, z прин V* - множество крайних правых символов относительно нетерминального символа U. Тогда отношения предшествования можно определить так: • Si = Sj (для всех Si,Sj прин. V), если сущ правило U -> xSiSjy прин. P, где U прин. VN, x,y прин. V*; • Si xSiDy прин.P и Sj прин. L(D), где U,D прин. VN, x,y прин. V*; • Si > Sj (для всех Si,Sj прин V) , если сущ правило U->xCSjy прин.P и Si прин R(C) или сущ правило U->xCDy прин. P и Si прин R(C), Sj прин L(D), где U,C,D прин VN, x,y прин V*. Грамматикой операторного предшествования называется приведенная КС-грамматика без l-правил (e-правил), в которой правые части продукций не содержат смежных нетерминальных символов. Для грамматики операторного предшествования отношения предшествования можно задать на множестве терминальных символов (включая символы ^н и ^к). Отношения предшествования для грамматики операторного предшествования G(VN,VT,P,S) задаются следующим образом: •a = b, если и только если существует правило U->xaby прин P или правило U->xaCby, где a,b прин VT, U,C прин VN, x,y принV*; •a xaCy принP и вывод C->*bz или вывод C->*Dbz, где a,b прин VT, U,C,D прин VN, x,y,z прин V*; •a > b, если и только если существует правило U->xCby принP и вывод C->*za или вывод C->*zaD, где a,b принVT, U,C,D прин VN, x,y,z принV*. В грамматике операторного предшествования различные порождающие правила имеют разные правые части. Для грамматики операторного предшествования тоже строится матрица предшествования, но она содержит только терминальные символы грамматики. Для построения этой матрицы удобно ввести множества крайних левых и крайних правых терминальных символов относительно нетерминального символа U - Lt(U) или Rt(U): •Lt(U) = {t | сущ U->*tz или сущ U->*Ctz }, где t прин VT, U,C прин VN, z прин V*; •Rt(U) = {t | сущ U->*zt или сущ U->*ztC }, где t прин VT, U,C прин VN, z прин V*. Тогда определения отношений операторного предшествования будут выглядеть так: •a = b, если сущ правило U->xaby прин P или правило U->xaCby, где a,b прин VT, U,C прин VN, x,y прин V*; •a xaCy прин P и b прин Lt(C), где a,b прин VT, U,C прин VN, x,y прин V*; •a > b, если сущ правило U->xCby прин P и a прин Rt(C), где a,b прин VT, U,C прин VN, x,y прин V*. В данных определениях цепочки символов x,y,z могут быть и пустыми цепочками. 71. Общие принципы генерации кода: формальные методы описания перевода, внутренние формы программы: польская инверсная запись, представление основных конструкций языков программирования в польской инверсной записи, тетрады, триады, представление основных конструкций языков программирования с использованием тетрад и триад, косвенные триады, синтаксические деревья, ассемблерный код, особенности всех форм представления, их сравнительный анализ. Общие принципы генерации кода Генерация объектного кода - это перевод компилятором внут- реннего представления исходной программы в цепочку символов выходного языка. Генерация объектного кода порождает результи- рующую объектную программу на языке машинных команд. Внут- реннее представление программы может иметь любую структуру в зависимости от реализации компилятора, в то время как результи- рующая программа всегда представляет собой линейную последо- вательность команд. Поэтому генерация объектного кода (объект- ной программы) в любом случае должна выполнять действия, свя- занные с преобразованием сложных синтаксических структур в ли- нейные цепочки. Генерация объектного кода выполняется после того, как выпол- нен синтаксический анализ программы и все необходимые дейст- вия по подготовке к генерации кода: распределено адресное про- странство под функции и переменные, проверено соответствие имен и типов переменных, констант. В идеале компилятор должен выполнить синтаксический разбор всей входной программы, затем выполнить семантический анализ, после чего приступить к подготовке генерации и непосредственно к генерации кода. Однако такая схема работы компилятора практичес- ки почти никогда не применяется. В общем случае ни один семан- тический анализатор и ни один компилятор не способны проанали- зировать и оценить смысл всей входной программы в целом. Фор- мальные методы анализа семантики применимы только к очень не- значительной части возможных программ. Поэтому у компилятора нет практической возможности порождать эквивалентную выход- ную программу на основании всей входной программы. Как правило, компилятор выполняет генерацию результирую- щего кода поэтапно, на основе законченных синтаксических конст- рукций входной программы: 1) выделяет законченную синтаксическую конструкцию из тек- ста входной программы; 2) порождает для нее фрагмент результирующего кода и поме- щает его в текст выходной программы; 3) переходит к следующей синтаксической конструкции. Так продолжается до тех пор, пока не будет разобрана вся вход- ная программа. В качестве анализируемых законченных синтакси- ческих конструкций выступают операторы, блоки операторов, опи- сания процедур и функций. Их конкретный состав зависит от вход- ного языка и реализации компилятора. Смысл (семантику) каждой такой синтаксической конструкции входного языка можно определить, исходя из ее типа, а тип опреде- ляется синтаксическим анализатором на основании грамматики входного языка. Примерами типов синтаксических конструкций могут служить операторы цикла, условные операторы, операторы выбора и т.д. Одни и те же типы синтаксических конструкций ха- рактерны для различных языков программирования, при этом они различаются синтаксисом (который задается грамматикой языка), но имеют сложный смысл (который определяется семантикой). В зависимости от типа синтаксической конструкции выполняется ге- нерация кода результирующей программы, соответствующего дан- ной синтаксической конструкции. Для семантически схожих конст- рукций различных входных языков может порождаться типовой ре- зультирующий код. Внутреннее представление программы Результатом работы распознавателя КС-грамматики - входного языка является последовательность правил грамматики, применен- ных для построения входной цепочки. Зная тип распознавателя по найденной последовательности, можно построить цепочку вывода или дерево вывода. В этом случае дерево вывода выступает в каче- стве дерева синтаксического разбора и представляет собой резуль- тат работы синтаксического анализатора в компиляторе. 141 Однако ни цепочка вывода, ни дерево синтаксического разбора не являются целью работы компилятора. Дерево вывода содержит массу избыточной информации, которая для дальнейшей работы компилятора не требуется. Эта информация включает в себя все не- терминальные символы, содержащиеся в узлах дерева, - после того как дерево построено, они не несут никакой смысловой нагрузки и не представляют интереса для дальнейшей работы. Для полного представления о типе и структуре найденной и ра- зобранной синтаксической конструкции входного языка в принципе достаточно знать последовательность номеров правил грамматики, примененных для ее построения. Однако форма представления этой информации может быть различной в зависимости от реализации самого компилятора и от фазы компиляции. Эта форма называется внутренним представлением программы (иногда используются так- же термины "промежуточное представление" или "промежуточная программа"). Формы представления программы, используемые на этапе синтаксического анализа неудобны при генерации и оптимизации объектного кода, поэтому непосредственно перед этими этапами внутреннее представление может преобразовываться в одну или несколько (!!!) других форм записи(которые перечислены в формулировке вопроса). Существуют 3 формы записи выражений: префиксная, инфиксная и постфиксная. Инфиксная - общепринятая для арифметических выражений, префиксная - для математических функций и функций языков программирования, постфиксная - встречается редко (стековые калькуляторы и язык Forth). Обратная (инверсная) польская запись: (Я. Лукашевич - математик). Идея: знаки операций записываются непосредственно за операндами(т.е. постфиксная), операнды следуют в том же порядке, что и в инфиксной, а знаки операций- строго в порядке выполнения. Все операции выполняются в том порядке, в котором записаны -> удобно для реализации на ЭВМ. Нет скобок и не нужно вычислять приоритет операций. Очень эффективна при использовании стека. Главный недостаток: используется стек -> для работы доступна только верхушка стека -> почти не поддается оптимизации. Тетрады (многоадресный код с явно именуемым результатом): представляют собой запись из 4 составляющих - операция, 2 операнда и результат операции. Например, так: (, , ). При вычислении выражения, записанного в форме тетрад, команды вычисляются одна за другой (последовательно, линейно). Если операция унарная - то одного из операндов может не быть (в зависимости от принятой формы записи). Результат вычисления никогда опущен быть не может (иначе тетрада теряет смысл). Достоинства: линейное выполнение - простой алгоритм реализации (в отл. от синт. деревьев). Не зависят от арх-ры ЭВМ (в отл-е от ассемблера). Недостатки: требуют больше памяти (чем триады), явно не отображают связь между операциями, сложны для преобразования в машинный код (в совр. машинах редко встречаются 3-операндные команды). Пример: A:=B*C+D-B*10 1. *(B,C,T1) 2. +(T1,D,T2) 3. *(B.10,T3) 4. -(T2,T3,T4) 5. :=(T4,0,A) в 5-й тетраде в качестве второго операнда выступает незначащий операнд "0". Триады: вместо результата, в качестве операнда может использоваться ссылка на другую триаду (поэтому их обычно нумеруют). Последовательность - линейная. Результат триады сохраняется во временной памяти - для использования последующими триадами(косвенные триады). Достоинства: дост-ва тетрад + проще реализовать в машинный код (ближе к 2-адресным машинным командам). Требуют меньше памяти для хранения. Недостатки: нужен механизм, отвечающий за распределение памяти для временного хранения результатов. Пример: (см. выше) 1. *(B,C) 2. +(^1,D) 3. *(B,10) 4. -(^2,^3) 5. :=(A,^4) 72. Атрибутные транслирующие грамматики: синтаксически управляемые определения и схемы трансляции как способы записи семантических правил, связанных с продукциями грамматик, понятие атрибута, синтезируемые и наследуемые атрибуты, вычисление значений атрибутов, L-атрибутные и S-атрибутные транслирующие грамматики, реализация атрибутного перевода. СИНТАКСИЧЕСКИ УПРАВЛЯЕМАЯ ТРАНСЛЯЦИЯ Для трансляции конструкций языка программирования компи- лятору, помимо генерации кода, может потребоваться отследить множество различных параметров. Например, компилятору может понадобиться информация о типе конструкции, о расположении первой инструкции в целевом коде или количестве сгенерирован- ных инструкций. Таким образом, можно говорить о некоторых аб- страктных атрибутах, связанных с языковыми конструкциями: ти- пах, строках, адресах памяти. Значения атрибутов вычисляются согласно семантическим пра- вилам, связанным с продукциями грамматики. Существует два вида записи для связанных с продукциями се- мантических правил: 1) синтаксически управляемые определения - представляют со- бой высокоуровневые спецификации трансляции, скрывающие множество деталей реализации и освобождающие пользователя от явного указания порядка выполнения трансляции; 2) схемы трансляции - указывают порядок, в котором выполня- ются семантические правила; так что эти схемы показывают опре- деленную часть деталей реализации. Концептуально при обоих методах разбирается входной поток лексем, строится дерево разбора и обходится так, как необходимо для выполнения семантических правил в узлах дерева разбора (рис. 29). Выполнение семантических правил может генерировать код, сохранять информацию в таблице символов, выводить сооб- щения об ошибках или выполнять какие-либо другие действия. Ре- зультат трансляции потока лексем будет получен путем выполне- ния указанных семантических правил. Концепция синтаксически управляемой трансляции Входная строка -> Дерево разбора -> Граф зависимости -> Порядок выполнения семантических правил Реализация не всегда следует приведенной на рис. 29 схеме. Ча- стные случаи синтаксически управляемых определений могут быть реализованы за один проход выполнением семантических правил в процессе синтаксического анализа, без явного построения дерева разбора или графа, показывающего взаимосвязи между атрибутами. Например, подкласс СУ-определений, именуемый L-атрибутными определениями, включает практически все этапы трансляции, кото- рые могут выполняться без явного построения дерева разбора. Синтаксически управляемые определения Синтаксически управляемое определение представляет собой обобщение контекстно-свободной грамматики, в которой каждый грамматический символ имеет связанное множество атрибутов - синтезируемые и наследуемые атрибуты. Если рассматривать узел грамматического символа в дереве разбора как запись с полями для хранения информации, то атрибут соответствует имени поля. Атрибут может представлять собой все, что угодно: строку, чис- ло, тип, адрес памяти и т.д. Значение атрибута в узле дерева разбо- ра определяется семантическими правилами, связанными с исполь- зуемой в данном узле продукцией. Значение синтезируемого атрибута в узле вычисляется по зна- чениям атрибутов в дочерних по отношению к данному узлах. Значения наследуемых атрибутов определяются значениями ат- рибутов соседних (т.е. узлов, дочерних по отношению к родитель- скому узлу данного) и родительского узлов. Семантические правила определяют зависимости между атрибу- тами, которые представляются графом. Граф зависимости опреде- ляет порядок выполнения семантических правил, что, в свою оче- редь, дает значения атрибутов в узлах дерева разбора входной стро- ки. Семантические правила могут иметь и побочные действия, на- пример вывод значения или изменение глобальной переменной. Ес- тественно, при реализации не обязательно явным образом строить дерево разбора или граф зависимостей; главное, чтобы для каждой входной строки выполнялись верные действия в правильном по- рядке. Дерево разбора, показывающее значения атрибутов в каждом узле, называется аннотированным, а процесс вычисления значений атрибутов в узлах дерева - аннотированием дерева разбора. Вид синтаксически управляемого определения В синтаксически управляемом определении каждая продукция грамматики А -> альфа имеет связанное с ней множество семантичес- ких правил вида b: = f(с1, с2, ..., сk), где f - функция: с1, с2, ..., сk - атрибуты грамматических символов продукции; b - синтезируемый атрибут символа А или наследуе- мый атрибут одного из грамматических символов правой части продукции. В любом случае атрибут b зависит от атрибутов с1, с2, ..., сk. Атрибутная грамматика является синтаксически управляемым определением, в котором функции в семантических правилах не имеют побочных эффектов. Функции в семантических правилах зачастую записываются как выражения. Иногда единственная цель семантического правила в синтаксически управляемом определении состоит именно в созда- нии побочного эффекта. Такие семантические правила записывают- ся как вызовы процедур или фрагменты программ. Их можно рас- сматривать как правила, определяющие значения фиктивных син- тезируемых атрибутов нетерминала в левой части связанной про- дукции; фиктивный атрибут и знак присвоения ": =" при этом не указываются. Пр име р 30. В табл. 25 приведено синтаксически управляемое определе- ние программы настольного калькулятора. Это определение связывает с каж- дым из нетерминалов Е, T и F целочисленный синтезируемый атрибут vаl. Для каждой Е-, Т- и F-продукции семантическое правило вычисляет значение атрибута val нетерминала из левой части продукции по значениям атрибутов нетерминалов правой части. Синтезируемые атрибуты Синтезируемые атрибуты часто используются на практике. S-атрибутным определением называется синтаксически управ- ляемое определение, использующее только синтезируемые атрибуты. Дерево разбора для S-атрибутного определения всегда может быть аннотировано путем выполнения семантических правил для атрибутов в каждом узле снизу вверх, от листьев к корню. Наследуемые атрибуты Наследуемые атрибуты представляют собой атрибуты, значе- ния которых в узле дерева разбора определяются атрибутами роди- тельского и/или дочерних по отношению к родительскому узлов. Наследуемые атрибуты удобны для выражения зависимости конструкций языка программирования от контекста, в котором они появляются. Например, наследуемые атрибуты используются для отслеживания, появляется ли идентификатор слева или справа от знака присвоения, чтобы определить, потребуется ли адрес или значение данного идентификатора. Хотя всегда можно переписать синтаксически управляемое определение таким образом, чтобы ис- пользовать только синтезируемые атрибуты, зачастую более есте- ственно воспользоваться синтаксически управляемым определени- ем с наследуемыми атрибутами. Восходящее выполнение S-атрибутных определений Для определения трансляций можно использовать синтаксичес- ки управляемые определения. Рассмотрим реализацию таких трансляторов. Создание транслятора для произвольного синтакси- чески управляемого определения может оказаться сложной зада- чей; однако имеются большие классы полезных синтаксически управляемых определений, трансляторы для которых строятся достаточно просто. К таким классам относятся S-атрибутные опреде- ления, т.е. синтаксически управляемые определения, в которых применяются исключительно синтезируемые атрибуты. Синтезируемые атрибуты могут быть вычислены восходящим синтаксическим анализатором в процессе разбора входной строки. Синтаксический анализатор может хранить значения синтезируе- мых атрибутов, связанных с грамматическими символами, в своем стеке. При выполнении свертки по хранящимся в стеке атрибутам символов из правой части сворачиваемой продукции вычисляются значения новых синтезируемых атрибутов. Можно расширить стек синтаксического анализатора для хранения значений этих синтези- руемых атрибутов. Синтезируемые атрибуты в стеке синтаксического анализатора Восходящий синтаксический анализатор для хранения инфор- мации о разобранных поддеревьях использует стек. Можно исполь- зовать дополнительные поля в стеке синтаксического анализатора для хранения значений синтезируемых атрибутов. осходящее выполнение S-атрибутных определений Для определения трансляций можно использовать синтаксичес- ки управляемые определения. Рассмотрим реализацию таких трансляторов. Создание транслятора для произвольного синтакси- чески управляемого определения может оказаться сложной зада- чей; однако имеются большие классы полезных синтаксически управляемых определений, трансляторы для которых строятся дос- 170 таточно просто. К таким классам относятся S-атрибутные опреде- ления, т.е. синтаксически управляемые определения, в которых применяются исключительно синтезируемые атрибуты. Синтезируемые атрибуты могут быть вычислены восходящим синтаксическим анализатором в процессе разбора входной строки. Синтаксический анализатор может хранить значения синтезируе- мых атрибутов, связанных с грамматическими символами, в своем стеке. При выполнении свертки по хранящимся в стеке атрибутам символов из правой части сворачиваемой продукции вычисляются значения новых синтезируемых атрибутов. Можно расширить стек синтаксического анализатора для хранения значений этих синтези- руемых атрибутов. 9.7.1. Синтезируемые атрибуты в стеке синтаксического анализатора Восходящий синтаксический анализатор для хранения инфор- мации о разобранных поддеревьях использует стек. Можно исполь- зовать дополнительные поля в стеке синтаксического анализатора для хранения значений синтезируемых атрибутов. Раздел 14. Архитектура вычислительных систем 73. Иерархия уровней обработки информации в ВС: концептуальный уровень, уровень высокоуровневых языков, уровень машинных команд, уровень регистровых передач, уровень комбинационных схем, семантический разрыв между уровнями и способы его устранения. Цифровой компьютер - это машина, которая может решать задачи, выполняя данные ей команды. Последовательность команд, описывающих решение определенной задачи, называется программой. Электронные схемы каждого компьютера могут распознавать и выполнять ограниченный набор простых команд. Все программы перед выполнением должны быть превращены в последовательность таких команд, которые обычно не сложнее чем: • сложить 2 числа; • проверить, не является ли число нулем; • скопировать кусок данных из одной части памяти компьютера в другую. Эти примитивные команды в совокупности составляют язык, на котором люди могут общаться с компьютером. Такой язык называется машинным языком. Разработчик при создании нового компьютера должен решать, какие команды включить в машинный язык этого компьютера. Это зависит от назначения компьютера, от того, какие задачи он должен выполнять. Обычно стараются сделать машинные команды как можно проще, чтобы избежать сложностей при конструировании компьютера и снизить затраты на необходимую электронику. Так как большинство машинных языков очень примитивны, использовать их трудно и утомительно. Это простое наблюдение с течением времени привело к построению ряда уров- ней абстракций, каждая из которых надстраивается над абстракцией более низкого уровня. Именно таким образом можно преодолеть сложности при общении с компью- тером. Мы называем этот подход многоуровневой компьютерной организацией. Как мы уже сказали, существует огромная разница между тем, что удобно для лю- дей, и тем, что удобно для компьютеров. Люди хотят сделать X, но компьютеры могут сделать только Y. Из-за этого возникают проблемы. Цель Проблему можно решить двумя способами. Оба эти способа включают в себя разра- ботку новых команд, которые более удобны для человека, чем встроенные машин- ные команды. Способы: • Трансляция (замена каждой команды на эквивалентный набор машинных команд при выполнении программы на ЯВУ) • Создание интерпретатора, то есть программы, которая переводила бы код на ЯВУ в низкоуровнеый код , после чего программу можно запускать. РИСУНОК 1 Большинство современных компьютеров состоит из двух и более уровней. Существуют машины даже с шестью уровнями (рис. 1.2). Уровень 0 - аппаратное обеспечение машины. Его электронные схемы выполняют программы, написанные на языке уровня 1. Ради полноты нужно упомянуть о существовании еще одного уровня, расположенного ниже уровня 0. Этот уровень не показан на рис. 1.2, так как он попадает в сферу электронной техники и, следовательно, не рассматривается в этойкниге. Он называется уровнем физических устройств. На этом уровне находятся транзисторы, которые являются примитивами для разработчиков компьютеров. Объяснять, как работают транзисторы, - задача физики. На самом нижнем уровне, цифровом логическом уровне, объекты называются вентилями. Хотя вентили состоят из аналоговых компонентов, таких как транзисторы, они могут быть точно смоделированы как цифровые средства. У каждого вентиля есть одно или несколько цифровых входных данных (сигналов, представляющих 0 или 1). Вентиль вычисляет простые функции этих сигналов, такие как И или ИЛИ. Каждый вентиль формируется из нескольких транзисторов. Несколько вентилей формируют 1 бит памяти, который может содержать 0 или 1. Биты памяти, объединенные в группы, например, по 16,32 или 64, формируют регистры. Каждый регистр может содержать одно двоичное число до определенного предела. Следующий уровень - микроархитектурный уровень. На этом уровне можно видеть совокупности 8 или 32 регистров, которые формируют локальную память и схему, называемую АЛУ (арифметико-логическое устройство). АЛУ выполня- ет простые арифметические операции. Регистры вместе с АЛУ формируют тракт данных, по которому поступают данные. Основная операция тракта данных со- стоит в следующем. Выбирается один или два регистра, АЛУ производит над ними какую-либо операцию, например сложения, а результат помещается в один из этих регистров. Следующий уровень обычно гибридный. Большинство команд в его языке есть также и на уровне архитектуры системы команд (команды, имеющиеся на одном из уровней, вполне могут находиться на других уровнях). У этого уровня есть не- которые дополнительные особенности: набор новых команд, другая организация памяти, способность выполнять две и более программ одновременно и некоторые другие. При построении третьего уровня возможно больше вариантов, чем при построении первого и второго. Новые средства, появившиеся на третьем уровне, выполняются интерпретато- ром, который работает на втором уровне. Этот интерпретатор был когда-то назван операционной системой. Команды третьего уровня, идентичные командам второ- го уровня, выполняются микропрограммой или аппаратным обеспечением, но не операционной системой. Иными словами, одна часть команд третьего уровня ин- терпретируется операционной системой, а другая часть - микропрограммой. Вот почему этот уровень считается гибридным. Мы будем называть этот уровень уров- нем операционной системы. Между третьим и четвертым уровнями есть существенная разница. Нижние три уровня конструируются не для того, чтобы с ними работал обычный программист. Они изначально предназначены для работы интерпретаторов и трансляторов, под- держивающих более высокие уровни. Эти трансляторы и интерпретаторы составля- ются так называемыми системными программистами, которые специализируются на разработке и построении новых виртуальных машин. Уровни с четвертого и выше предназначены для прикладных программистов, решающих конкретные задачи. Еще одно изменение, появившееся на уровне 4, - способ, которым поддержи- ваются более высокие уровни. Уровни 2 и 3 обычно интерпретируются, а уровни 4, 5 и выше обычно, хотя и не всегда, поддерживаются транслятором. Другое различие между уровнями 1,2,3 и уровнями 4,5 и выше - особенность языка. Машинные языки уровней 1,2 и 3 - цифровые. Программы, написанные на этих языках, состоят из длинных рядов цифр, которые удобны для компьютеров, но совершенно неудобны для людей. Начиная с четвертого уровня, языки содер- жат слова и сокращения, понятные человеку. Четвертыйуровень представляет собой символическую форму одного из язы- ков более низкого уровня. На этом уровне можно писать программы в приемлемой для человека форме. Эти программы сначала транслируются на язык уровня 1, 2 или 3, а затем интерпретируются соответствующей виртуальной или фактически существующей машиной. Программа, которая выполняет трансляцию, называет- ся ассемблером. Пятый уровень обычно состоит из языков, разработанных для прикладных про- граммистов. Такие языки называются языками высокого уровня. Существуют сотни языков высокого уровня. Наиболее известные среди них - BASIC, С, C++, Java, LISP и Prolog. Программы, написанные на этих языках, обычно транслиру- ются на уровень 3 или 4. Трансляторы, которые обрабатывают эти программы, на- зываются компиляторами. Отметим, что иногда также используется метод интер- претации. Например, программы на языке Java обычно интерпретируются. В некоторых случаях пятый уровень состоит из интерпретатора для такой сферы приложения, как символическая математика. Он обеспечивает данные и операции для решения задач в этой сфере в терминах, понятных людям, сведущим в симво- лической математике. Вывод: компьютер проектируется как иерархическая структура уровней, каж- дый из которых надстраивается над предыдущим. Каждый уровень представляет собой определенную абстракцию с различными объектами и операциями. Рассмат- ривая компьютер подобным образом, мы можем не принимать во внимание не- нужные нам детали и свести сложный предмет к более простому для понимания. Набор типов данных, операций и особенностей каждого уровня называется ар- хитектурой. Архитектура связана с аспектами, которые видны программисту. На- пример, сведения о том, сколько памяти можно использовать при написании про- граммы, - часть архитектуры. А аспекты разработки (например, какая технология используется при создании памяти) не являются частью архитектуры. Изучение того, как разрабатываются те части компьютерной системы, которые видны програм- мистам, называется изучением компьютерной архитектуры. РИСУНОК 2 74. Высокопроизводительные вычислительные системы: определение понятия высокопроизводительной вычислительной системы (ВВС), основные цели создания ВВС, факторы, определяющие высокую стоимость ВВС, основные методы достижения высокого быстродействия. Понятие архитектуры высокопроизводительной системы является достаточно широким, поскольку под архитектурой можно понимать и способ параллельной обработки данных, используемый в системе, и организацию памяти, и топологию связи между процессорами, и способ исполнения системой арифметических операций. Попытки систематизировать все множество архитектур начались в конце 60-х годов и непрерывно продолжаются по сей день. Кратко, идея в следующем: в настоящее время быстродействие элементов, из которых состоят вычислительные устройства достигло своего пика. Быстрее они не могут работать по физическим причинам (время переключения электронных схем достигло долей наносекунды, а скорость распространения сигналов в линиях, связывающие элементы и узлы машины ограничена значением скорости света). Поэтому дальнейшее уменьшение времени переключения электронных схем не позволит существенно повысить производительность ЭВМ. В этих условиях требования практики по дальнейшему повышению быстродействия ЭВМ могут быть удовлетворены только путем распространения принципа параллелизма (и конвейеризации) на сами устройства обработки информации и создания многомашинных и многопроцессорных вычислительных систем. Далее, речь пойдет о многопроцессорных системах. Насчет многомашинных домыслите сами В настоящее время сфера применения многопроцессорных вычислительных систем (МВС) непрерывно расширяется, охватывая все новые области в самых различных отраслях науки, бизнеса и производства. Стремительное развитие кластерных систем создает условия для использования многопроцессорной вычислительной техники в реальном секторе экономики. Если традиционно МВС применялись в основном в научной сфере для решения вычислительных задач, требующих мощных вычислительных ресурсов, то сейчас, из-за бурного развития бизнеса резко возросло количество компаний, отводящих использованию компьютерных технологий и электронного документооборота главную роль. В связи с этим непрерывно растет потребность в построении централизованных вычислительных систем для критически важных приложений, связанных с обработкой транзакций, управлением базами данных и обслуживанием телекоммуникаций. Можно выделить две основные сферы применения описываемых систем: обработка транзакций в режиме реального времени (OLTP, on-line transaction processing) и создание хранилищ данных для организации систем поддержки принятия решений (Data Mining, Data Warehousing, Decision Support System). Система для глобальных корпоративных вычислений - это, прежде всего, централизованная система, с которой работают практически все пользователи в корпорации, и, соответственно, она должна все время находиться в рабочем состоянии. Как правило, решения подобного уровня устанавливают в компаниях и корпорациях, где любые, даже самые кратковременные, простои сети могут привести к громадным убыткам. Поэтому для организации такой системы не подойдет обыкновенный сервер со стандартной архитектурой, вполне пригодный там, где не стоит жестких требований к производительности и времени простоя. Высокопроизводительные системы для глобальных корпоративных вычислений должны отличаться такими характеристиками, как повышенная производительность, масштабируемость, минимально допустимое время простоя. Наряду с расширением области применения, по мере совершенствования МВС происходит усложнение и увеличение количества задач в областях, традиционно использующих высокопроизводительную вычислительную технику. В настоящее время выделен круг фундаментальных и прикладных проблем, объединенный понятием "Grand challenges", эффективное решение которых возможно только с использованием сверхмощной вычислительных ресурсов. Этот круг включает следующие задачи: - Предсказания погоды, климата и глобальных изменений в атмосфере - Науки о материалах - Построение полупроводниковых приборов - Сверхпроводимость - Структурная биология - Разработка фармацевтических препаратов - Генетика - Квантовая хромодинамика - Астрономия - Транспортные задачи - Гидро- и газодинамика - Управляемый термоядерный синтез - Эффективность систем сгорания топлива - Геоинформационные системы - Разведка недр - Наука о мировом океане - Распознавание и синтез речи - Распознавание изображений Многопроцессорные вычислительные системы могут существовать в различных конфигурациях. Наиболее распространенными типами МВС являются: системы высокой надежности; системы для высокопроизводительных вычислений; многопоточные системы. Отметим, что границы между этими типами МВС до некоторой степени размыты, и часто система может иметь такие свойства или функции, которые выходят за рамки перечисленных типов. Более того, при конфигурировании большой системы, используемой как система общего назначения, приходится выделять блоки, выполняющие все перечисленные функции. МВС являются идеальной схемой для повышения надежности информационно-вычислительной системы. Благодаря единому представлению, отдельные узлы или компоненты МВС могут незаметно для пользователя заменять неисправные элементы, обеспечивая непрерывность и безотказную работу даже таких сложных приложений как базы данных. Катастрофоустойчивые решения создаются на основе разнесения узлов многопроцессорной системы на сотни километров и обеспечения механизмов глобальной синхронизации данных между такими узлами. МВС для высокопроизводительных вычислений предназначены для параллельных расчетов. Имеется много примеров научных расчетов, выполненных на основе параллельной работы нескольких недорогих процессоров, обеспечивающих одновременное проведение большого числа операций. МВС для высокопроизводительных вычислений обычно собраны из многих компьютеров. Разработка таких систем - процесс сложный, требующий постоянного согласования таких вопросов как инсталляция, эксплуатация и одновременное управление большим числом компьютеров, технических требований параллельного и высокопроизводительного доступа к одному и тому же системному файлу (или файлам), межпроцессорной связи между узлами и координации работы в параллельном режиме. Эти проблемы проще всего решаются при обеспечении единого образа операционной системы для всего кластера. Однако реализовать подобную схему удается далеко не всегда, и обычно она применяется лишь для небольших систем. Многопоточные системы используются для обеспечения единого интерфейса к ряду ресурсов, которые могут со временем произвольно наращиваться (или сокращаться). Типичным примером может служить группа web-серверов. Главной отличительной особенностью многопроцессорной вычислительной системы является ее производительность, т.е. количество операций, производимых системой за единицу времени. Различают пиковую и реальную производительность. Под пиковой понимают величину, равную произведению пиковой производительности одного процессора на число таких процессоров в данной машине. При этом предполагается, что все устройства компьютера работают в максимально производительном режиме. Пиковая производительность компьютера вычисляется однозначно, и эта характеристика является базовой, по которой производят сравнение высокопроизводительных вычислительных систем. Чем больше пиковая производительность, тем (теоретически) быстрее пользователь сможет решить свою задачу. Пиковая производительность есть величина теоретическая и, вообще говоря, недостижимая при запуске конкретного приложения. Реальная же производительность, достигаемая на данном приложении, зависит от взаимодействия программной модели, в которой реализовано приложение, с архитектурными особенностями машины, на которой приложение запускается. Существует два способа оценки пиковой производительности компьютера. Один из них опирается на число команд, выполняемых компьютером за единицу времени. Единицей измерения, как правило, является MIPS (Million Instructions Per Second). Производительность, выраженная в MIPS, говорит о скорости выполнения компьютером своих же инструкций. Но, во-первых, заранее не ясно, в какое количество инструкций отобразится конкретная программа, а во-вторых, каждая программа обладает своей спецификой, и число команд от программы к программе может меняться очень сильно. В связи с этим данная характеристика дает лишь самое общее представление о производительности компьютера. Другой способ измерения производительности заключается в определении числа вещественных операций, выполняемых компьютером за единицу времени. Единицей измерения является Flops (Floating point operations per second) - число операций с плавающей точкой, производимых компьютером за одну секунду. Такой способ является более приемлемым для пользователя, поскольку ему известна вычислительная сложность программы, и, пользуясь этой характеристикой, пользователь может получить нижнюю оценку времени ее выполнения. Однако пиковая производительность получается только в идеальных условиях, т.е. при отсутствии конфликтов при обращении к памяти при равномерной загрузке всех устройств. В реальных условиях на выполнение конкретной программы влияют такие аппаратно-программные особенности данного компьютера как: особенности структуры процессора, системы команд, состав функциональных устройств, реализация ввода/вывода, эффективность работы компиляторов. Одним из определяющих факторов является время взаимодействия с памятью, которое определяется ее строением, объемом и архитектурой подсистем доступа в память. В большинстве современных компьютеров в качестве организации наиболее эффективного доступа к памяти используется так называемая многоуровневая иерархическая память. В качестве уровней используются регистры и регистровая память, основная оперативная память, кэш-память, виртуальные и жесткие диски, ленточные роботы. При этом выдерживается следующий принцип формирования иерархии: при повышении уровня памяти скорость обработки данных должна увеличиваться, а объем уровня памяти - уменьшаться. Эффективность использования такого рода иерархии достигается за счет хранения часто используемых данных в памяти верхнего уровня, время доступа к которой минимально. А поскольку такая память обходится достаточно дорого, ее объем не может быть большим. Иерархия памяти относится к тем особенностям архитектуры компьютеров, которые имеют огромное значение для повышения их производительности. 75. Организация параллельных вычислений: естественный параллелизм, параллелизм множества объектов, параллелизм независимых ветвей, параллелизм смежных операций, искусственный параллелизм, преобразование типов параллелизма. Способы организации. Во всем многообразии способов организации параллельной обработки можно выделить три основных направления: 1) совмещение во времени различных этапов разных задач; 2) одновременное решение различных задач пли частей одной задачи; 3) конвейерная обработка информации. Первый путь - совмещение во времени этапов решения разных задач - это мультипрограммная обработка информации. Мультипрограммная обработка возможна даже в однопроцессорной ЭВМ и широко используется в современных СОД. Второй путь - одновременное решение различных задач или частей одной задачи - возможен только при наличии нескольких обрабатывающих устройств. При этом используются те или иные особенности задач или потоков задач, что позволяет осуществить тот или иной параллелизм. Можно выделить несколько типов параллелизма, отражающих эти особенности. Естественный параллелизм независимых задач заключается в том, что в систему поступает непрерывный поток не связанных между собой задач, т. е. решение любой задачи не зависит от результатов решения других задач. В этом случае использование нескольких обрабатывающих устройств при любом способе комплексирования (косвенном или прямом) повышает производительность системы. Параллелизм независимых ветвей - один из наиболее распространенных типов параллелизма в обработке информации. Суть его заключается в том, что при решении большой задачи могут быть выделены отдельные независимые части - ветви программы, которые при наличии нескольких обрабатывающих устройств могут выполняться параллельно и независимо друг от друга. Двумя независимыми ветвями программы будем считать такие части задачи, при выполнении которых выполняются следующие условия: ни одна из входных для ветви программы величин не является выходной величиной другой программы (отсутствие функциональных связей); для обеих ветвей программы не должна производиться запись в одни и те же ячейки памяти (отсутствие связи по использованию одних и тех же полей оперативной памяти); условия выполнения одной ветви не зависят от результатов или признаков, полученных при выполнении другой ветви (независимость по управлению); обе ветви должны выполняться по разным блокам программы (программная независимость). Хорошее представление о параллелизме независимых ветвей дает ярусно-параллельная форма программы, пример которой приведен на рис. 2.1. Программа представлена в виде совокупности ветвей, расположенных в нескольких уровнях - ярусах. Кружками с цифрами внутри обозначены ветви. Длина ветви представляется цифрой, стоящей около кружка. Стрелками показаны входные данные и результаты обработки. Входные данные обозначаются символом х, выходные данные - символом у. Символы х имеют нижние цифровые индексы, означающие номера входных величин; символы у имеют цифровые индексы и внизу и вверху; цифра вверху соответствует номеру ветви, при выполнении которой получен данный результат, а цифра внизу означает порядковый номер результата, полученного при реализации данной ветви программы. РИСУНОК 1 - Ярусно-параллельная форма программы Изображенная на рисунке программа содержит 14 ветвей, расположенных на 5 ярусах. Ветви каждого яруса не связаны друг с другом, т. е. результаты решения какой-либо ветви данного яруса не являются входными данными для другой ветви этого же яруса. На этом же графе могут быть изображены и связи по управлению или памяти. В этом случае граф позволяет наглядно показать полностью независимые ветви. Для простоты изображения мы этого не делаем. На примере этой, в общем достаточно простой программы, можно выявить преимущества вычислительной системы, включающей несколько обрабатывающих устройств, и проблемы, которые при этом возникают. Для того чтобы с помощью нескольких обрабатывающих устройств решить задачу, имеющую независимые параллельные ветви, необходима соответствующая организация процесса, которая определяет пути решения задачи и вырабатывает необходимую информацию о готовности каждой ветви. Заметим, что все это относительно легко реализовать тогда, когда известна достаточно точно длительность выполнения каждой ветви, На практике это бывает крайне редко: в лучшем случае известна приближенная длина ветвей. Поэтому организация оптимального или близкого к оптимальному графика работы является достаточно сложной задачей. Заметим, что, как правило, трудно избежать некоторых простоев, которые возникают из-за отсутствия исходных данных для выполнения той или иной ветви. Все это приводит в конечном счете к тому, что выигрыш в производительности системы несколько снижается. Следует отметить также и определенные сложности, связанные с выделением независимых ветвей при разработке программ. Вместе с тем при решении многих сложных задач только программирование с выделением независимых ветвей позволяет существенно сократить время решения. В частности, хорошо поддаются параллельной обработке такого типа задачи матричной алгебры, линейного программирования, спектральной обработки сигналов, прямые и обратные преобразования Фурье и др. Параллелизм объектов или данных имеет место тогда, когда по одной и той же (или почти по одной и той же) программе должна обрабатываться некоторая совокупность данных, поступающих в систему одновременно. Это могут быть, например, задачи обработки сигналов от радиолокационной станции: все сигналы обрабатываются по одной и той же программе. Другой пример - обработка информации от датчиков, измеряющих одновременно один и тот же параметр и установленных на нескольких однотипных объектах. Программы обработки данных могут быть различного объема и сложности, начиная от очень простых, содержащих несколько операций, до больших программ в сотни и тысячи операций. Это могут быть и чисто математические задачи, например задачи векторной алгебры - операции над векторами и матрицами, характеризующиеся некоторой совокупностью чисел. Решение задачи при этом в значительной степени сводится к выполнению одинаковых операций над парами чисел двух аналогичных объектов. Так, например, сложение двух матриц размерностью заключается в сложении соответствующих элементов этих матриц. если в конвейере арифметических операций происходит параллельная обработка т пар операндов, то в конвейере команд происходит совмещение во время выполнения l операций (l - число этапов, на которое разбито выполнение команды), что позволяет существенно увеличить производительность такой конвейерной системы. К сожалению, выигрыш по производительности в l раз практически невозможен, так как может быть получен только при выполнении программы без условных переходов. Наличие условных переходов сразу нарушает работу конвейера и приводит к "холостым" пробегам конвейера, когда по выработанному в команде Ki признаку результата надо перейти к выполнению не Ki+1-й команды, а совершенно другой, что вызывает необходимость очистки всех блоков и загрузки их другой операцией. В реальных ЭВМ и системах применяются различные приемы, позволяющие определять признак перехода возможно раньше, однако совсем исключить влияние условных переходов не удается. Тем не менее для определенных задач, где имеют место цепочки команд без таких переходов, выигрыш в производительности конвейерного процессора команд получается значительным. Как и в конвейере арифметических операций, выигрыш в производительности получается тем больше, чем длиннее участки программы без условных переходов и чем больше предусматривается независимость этапов (и, следовательно, блоков устройства управления) при выполнении команды. Разумеется, в вычислительных системах можно одновременно использовать и конвейер команд, и конвейер арифметических операций, и даже несколько параллельно работающих конвейеров команд и арифметических операций. В последнем случае может быть получена очень высокая производительность системы. Именно по такому принципу построены самые быстродействующие вычислительные системы, 76. Архитектура вычислительных систем: многомашинные и многопроцессорные ВС, методы и средства организации многомашинных ВС, классификация многопроцессорных ВС, архитектура скалярных и векторных ВС, архитектуры параллельных ВС, матричные процессоры на основе систолических и волновых матриц. Чтобы дать более полное представление о многопроцессорных вычислительных системах, помимо высокой производительности необходимо назвать и другие отличительные особенности. Прежде всего это необычные архитектурные решения, направленные на повышение производительности (работа с векторными операциями, организация быстрого обмена сообщениями между процессорами или организация глобальной памяти в многопроцессорных системах и др.). Понятие архитектуры высокопроизводительной системы является достаточно широким, поскольку под архитектурой можно понимать и способ параллельной обработки данных, используемый в системе, и организацию памяти, и топологию связи между процессорами, и способ исполнения системой арифметических операций. Попытки систематизировать все множество архитектур начались в конце 60-х годов и непрерывно продолжаются по сей день. Классификация архитектур по параллельной обработке данных В 1966 году М.Флинном (Flynn) был предложен чрезвычайно удобный подход к классификации архитектур вычислительных систем. В основу было положено понятие потока, под которым понимается последовательность элементов, команд или данных, обрабатываемая процессором. Соответствующая система классификации основана на рассмотрении числа потоков инструкций и потоков данных и описывает четыре архитектурных класса: SISD = Single Instruction Single Data MISD = Multiple Instruction Single Data SIMD = Single Instruction Multiple Data MIMD = Multiple Instruction Multiple Data ) SISD (single instruction stream / single data stream) - одиночный поток команд и одиночный поток данных. К этому классу относятся последовательные компьютерные системы, которые имеют один центральный процессор, способный обрабатывать только один поток последовательно исполняемых инструкций. В настоящее время практически все высокопроизводительные системы имеют более одного центрального процессора, однако, каждый из них выполняют несвязанные потоки инструкций, что делает такие системы комплексами SIMD-систем, действующих на разных пространствах данных. Для увеличения скорости обработки команд и скорости выполнения арифметических операций может применяться конвейерная обработка. В случае векторных систем векторный поток данных следует рассматривать как поток из одиночных неделимых векторов. Примерами компьютеров с архитектурой SISD являются большинство рабочих станций Compaq, Hewlett-Packard и Sun Microsystems. MISD (multiple instruction stream / single data stream) - множественный поток команд и одиночный поток данных. Теоретически в этом типе машин множество инструкций должно выполнятся над единственным потоком данных. До сих пор ни одной реальной машины, попадающей в данный класс, не было создано. В качестве аналога работы такой системы, по-видимому, можно рассматривать работу банка. С любого терминала можно подать команду и что-то сделать с имеющимся банком данных. Поскольку база данных одна, а команд много, то мы имеем дело с множественным потоком команд и одиночным потоком данных. SIMD (single instruction stream / multiple data stream) - одиночный поток команд и множественный поток данных. Эти системы обычно имеют большое количество процессоров, в пределах от 1024 до 16384, которые могут выполнять одну и ту же инструкцию относительно разных данных в жесткой конфигурации. Единственная инструкция параллельно выполняется над многими элементами данных. Примерами SIMD машин являются системы CPP DAP, Gamma II и Quadrics Apemille. Другим подклассом SIMD-систем являются векторные компьютеры. Векторные компьютеры манипулируют массивами сходных данных подобно тому, как скалярные машины обрабатывают отдельные элементы таких массивов. Это делается за счет использования специально сконструированных векторных центральных процессоров. Когда данные обрабатываются посредством векторных модулей, результаты могут быть выданы на один, два или три такта частотогенератора (такт частотогенератора является основным временным параметром системы). При работе в векторном режиме векторные процессоры обрабатывают данные практически параллельно, что делает их в несколько раз более быстрыми, чем при работе в скалярном режиме. Примерами систем подобного типа является, например, компьютеры Hitachi S3600. MIMD (multiple instruction stream / multiple data stream) - множественный поток команд и множественный поток данных. Эти машины параллельно выполняют несколько потоков инструкций над различными потоками данных. В отличие от многопроцессорных SISD-машин, упомянутых выше, команды и данные связаны, потому что они представляют различные части одной и той же выполняемой задачи. Например, MIMD-системы могут параллельно выполнять множество подзадач, с целью сокращения времени выполнения основной задачи. Наличие большого разнообразия попадающих в данный класс систем, делает классификацию Флинна не полностью адекватной. Действительно и четырех-процессорный SX-5 компании NEC и тысяче-процессорный Cray T3E оба попадают в этот класс. Это заставляет использовать другой подход к классификации, иначе описывающий классы компьютерных систем. Основная идея такого подхода может состоять, например, в следующем. Считаем, что множественный поток команд может быть обработан двумя способами: либо одним конвейерным устройством обработки, работающем в режиме разделения времени для отдельных потоков, либо каждый поток обрабатывается своим собственным устройством. Первая возможность используется в MIMD компьютерах, которые обычно называют конвейерными или векторными, вторая - в параллельных компьютерах. В основе векторных компьютеров лежит концепция конвейеризации, т.е. явного сегментирования арифметического устройства на отдельные части, каждая из которых выполняет свою подзадачу для пары операндов. В основе параллельного компьютера лежит идея использования для решения одной задачи нескольких процессоров, работающих сообща, причем процессоры могут быть как скалярными, так и векторными. SMP архитектура SMP архитектура (symmetric multiprocessing) - cимметричная многопроцессорная архитектура. Главной особенностью систем с архитектурой SMP является наличие общей физической памяти, разделяемой всеми процессорами. Схематический вид SMP-архитектуры. Память является способом передачи сообщений между процессорами, при этом все вычислительные устройства при обращении к ней имеют равные права и одну и ту же адресацию для всех ячеек памяти. Поэтому SMP архитектура называется симметричной. Последнее обстоятельство позволяет очень эффективно обмениваться данными с другими вычислительными устройствами. SMP-система строится на основе высокоскоростной системной шины (SGI PowerPath, Sun Gigaplane, DEC TurboLaser), к слотам которой подключаются функциональные блоки трех типов: процессоры (ЦП), операционная система (ОП) и подсистема ввода/вывода (I/O). Для подсоединения к модулям I/O используются уже более медленные шины (PCI, VME64). Наиболее известными SMP-системами являются SMP-cервера и рабочие станции на базе процессоров Intel (IBM, HP, Compaq, Dell, ALR, Unisys, DG, Fujitsu и др.) Вся система работает под управлением единой ОС (обычно UNIX-подобной, но для Intel-платформ поддерживается Windows NT). ОС автоматически (в процессе работы) распределяет процессы по процессорам, но иногда возможна и явная привязка. Основные преимущества SMP-систем: • простота и универсальность для программирования. Архитектура SMP не накладывает ограничений на модель программирования, используемую при создании приложения: обычно используется модель параллельных ветвей, когда все процессоры работают абсолютно независимо друг от друга - однако, можно реализовать и модели, использующие межпроцессорный обмен. Использование общей памяти увеличивает скорость такого обмена, пользователь также имеет доступ сразу ко всему объему памяти. Для SMP-систем существуют сравнительно эффективные средства автоматического распараллеливания. • легкость в эксплуатации. Как правило, SMP-системы используют систему охлаждения, основанную на воздушном кондиционировании, что облегчает их техническое обслуживание. • относительно невысокая цена. Недостатки: • системы с общей памятью, построенные на системной шине, плохо масштабируемы Этот важный недостаток SMP-системы не позволяет считать их по-настоящему перспективными. Причины плохой масштабируемости состоят в том, что в данный момент шина способна обрабатывать только одну транзакцию, вследствие чего возникают проблемы разрешения конфликтов при одновременном обращении нескольких процессоров к одним и тем же областям общей физической памяти. Вычислительные элементы начинают друг другу мешать. Когда произойдет такой конфликт, зависит от скорости связи и от количества вычислительных элементов. В настоящее время конфликты могут происходить при наличии 8-24-х процессоров. Кроме того, системная шина имеет ограниченную (хоть и высокую) пропускную способность (ПС) и ограниченное число слотов. Все это с очевидностью препятствует увеличению производительности при увеличении числа процессоров и числа подключаемых пользователей. В реальных системах можно использовать не более 32 процессоров. Для построения масштабируемых систем на базе SMP используются кластерные или NUMA-архитектуры. При работе с SMP системами используют так называемую парадигму программирования с разделяемой памятью (shared memory paradigm). MPP архитектура MPP архитектура (massive parallel processing) - массивно-параллельная архитектура. Главная особенность такой архитектуры состоит в том, что память физически разделена. В этом случае система строится из отдельных модулей, содержащих процессор, локальный банк операционной памяти (ОП), два коммуникационных процессора (рутера) или сетевой адаптер, иногда - жесткие диски и/или другие устройства ввода/вывода. Один рутер используется для передачи команд, другой - для передачи данных. По сути, такие модули представляют собой полнофункциональные компьютеры (см. рис.). Доступ к банку ОП из данного модуля имеют только процессоры (ЦП) из этого же модуля. Модули соединяются специальными коммуникационными каналами. Пользователь может определить логический номер процессора, к которому он подключен, и организовать обмен сообщениями с другими процессорами. Используются два варианта работы операционной системы (ОС) на машинах MPP архитектуры. В одном полноценная операционная система (ОС) работает только на управляющей машине (front-end), на каждом отдельном модуле работает сильно урезанный вариант ОС, обеспечивающий работу только расположенной в нем ветви параллельного приложения. Во втором варианте на каждом модуле работает полноценная UNIX-подобная ОС, устанавливаемая отдельно на каждом модуле. Главное преимущество: Главным преимуществом систем с раздельной памятью является хорошая масштабируемость: в отличие от SMP-систем в машинах с раздельной памятью каждый процессор имеет доступ только к своей локальной памяти, в связи с чем не возникает необходимости в потактовой синхронизации процессоров. Практически все рекорды по производительности на сегодняшний день устанавливаются на машинах именно такой архитектуры, состоящих из нескольких тысяч процессоров (ASCI Red, ASCI Blue Pacific). Недостатки: • отсутствие общей памяти заметно снижает скорость межпроцессорного обмена, поскольку нет общей среды для хранения данных, предназначенных для обмена между процессорами. Требуется специальная техника программирования для реализации обмена сообщениями между процессорами. • каждый процессор может использовать только ограниченный объем локального банка памяти. • вследствие указанных архитектурных недостатков требуются значительные усилия для того, чтобы максимально использовать системные ресурсы. Именно этим определяется высокая цена программного обеспечения для массивно-параллельных систем с раздельной памятью. Системами с раздельной памятью являются суперкомпьютеры МВС-1000, IBM RS/6000 SP, SGI/CRAY T3E, системы ASCI, Hitachi SR8000, системы Parsytec. Машины последней серии CRAY T3E от SGI, основанные на базе процессоров Dec Alpha 21164 с пиковой производительностью 1200 Мфлопс/с (CRAY T3E-1200), способны масштабироваться до 2048 процессоров. При работе с MPP системами используют так называемую Massive Passing Programming Paradigm - парадигму программирования с передачей данных (MPI, PVM, BSPlib). Гибридная архитектура (NUMA) Организация когерентности многоуровневой иерархической памяти. Гибридная архитектура NUMA (nonuniform memory access). Главная особенность такой архитектуры - неоднородный доступ к памяти. Гибридная архитектура воплощает в себе удобства систем с общей памятью и относительную дешевизну систем с раздельной памятью. Суть этой архитектуры - в особой организации памяти, а именно: память является физически распределенной по различным частям системы, но логически разделяемой, так что пользователь видит единое адресное пространство. Система состоит из однородных базовых модулей (плат), состоящих из небольшого числа процессоров и блока памяти. Модули объединены с помощью высокоскоростного коммутатора. Поддерживается единое адресное пространство, аппаратно поддерживается доступ к удаленной памяти, т.е. к памяти других модулей. При этом доступ к локальной памяти осуществляется в несколько раз быстрее, чем к удаленной. По существу архитектура NUMA является MPP (массивно-параллельная архитектура) архитектурой, где в качестве отдельных вычислительных элементов берутся SMP (cимметричная многопроцессорная архитектура) узлы. Структурная схема компьютера с гибридной сетью: четыре процессора связываются между собой при помощи кроссбара в рамках одного SMP узла. Узлы связаны сетью типа "бабочка" РИСУНОК 075-1 Впервые идею гибридной архитектуры предложил Стив Воллох и воплотил в системах серии Exemplar. Вариант Воллоха - система, состоящая из 8-ми SMP узлов. Фирма HP купила идею и реализовала на суперкомпьютерах серии SPP. Идею подхватил Сеймур Крей (Seymour R.Cray) и добавил новый элемент - когерентный кэш, создав так называемую архитектуру cc-NUMA (Cache Coherent Non-Uniform Memory Access), которая расшифровывается как "неоднородный доступ к памяти с обеспечением когерентности кэшей". Он ее реализовал на системах типа Origin. PVP архитектура PVP (Parallel Vector Process) - параллельная архитектура с векторными процессорами. Основным признаком PVP-систем является наличие специальных векторно-конвейерных процессоров, в которых предусмотрены команды однотипной обработки векторов независимых данных, эффективно выполняющиеся на конвейерных функциональных устройствах. Как правило, несколько таких процессоров (1-16) работают одновременно с общей памятью (аналогично SMP) в рамках многопроцессорных конфигураций. Несколько таких узлов могут быть объединены с помощью коммутатора (аналогично MPP). Поскольку передача данных в векторном формате осуществляется намного быстрее, чем в скалярном (максимальная скорость может составлять 64 Гб/с, что на 2 порядка быстрее, чем в скалярных машинах), то проблема взаимодействия между потоками данных при распараллеливании становится несущественной. И то, что плохо распараллеливается на скалярных машинах, хорошо распараллеливается на векторных. Таким образом, системы PVP архитектуры могут являться машинами общего назначения (general purpose systems). Однако, поскольку векторные процессоры весьма дороги, эти машины не будут являться общедоступными. Кластерная архитектура Кластер представляет собой два или больше компьютеров (часто называемых узлами), объединяемых при помощи сетевых технологий на базе шинной архитектуры или коммутатора и предстающих перед пользователями в качестве единого информационно-вычислительного ресурса. В качестве узлов кластера могут быть выбраны серверы, рабочие станции и даже обычные персональные компьютеры. Преимущество кластеризации для повышения работоспособности становится очевидным в случае сбоя какого-либо узла: при этом другой узел кластера может взять на себя нагрузку неисправного узла, и пользователи не заметят прерывания в доступе. Возможности масштабируемости кластеров позволяют многократно увеличивать производительность приложений для большего числа пользователей. технологий (Fast/Gigabit Ethernet, Myrinet) на базе шинной архитектуры или коммутатора. Такие суперкомпьютерные системы являются самыми дешевыми, поскольку собираются на базе стандартных комплектующих элементов ("off the shelf"), процессоров, коммутаторов, дисков и внешних устройств. Кластеризация может быть осуществлена на разных уровнях компьютерной системы, включая аппаратное обеспечение, операционные системы, программы-утилиты, системы управления и приложения. Чем больше уровней системы объединены кластерной технологией, тем выше надежность, масштабируемость и управляемость кластера. Типы кластеров Условное деление на классы предложено Язеком Радаевским и Дугласом Эдлайном: Класс I. Класс машин строится целиком из стандартных деталей, которые продают многие продавцы компьютерных компонент (низкие цены, простое обслуживание, аппаратные компоненты доступны из различных источников). Класс II. Система имеет эксклюзивные или не широко распространенные детали. Этим можно достичь очень хорошей производительности, но при более высокой стоимости. Как уже указывалось выше, кластеры могут существовать в различных конфигурациях. Наиболее употребляемыми типами кластеров являются: • Системы высокой надежности. • Системы для высокопроизводительных вычислений. • Многопоточные системы. Отметим, что границы между этими типами кластеров до некоторой степени размыты, и часто существующий кластер может иметь такие свойства или функции, которые выходят за рамки перечисленных типов. Более того, при конфигурировании большого кластера, используемого как система общего назначения, приходится выделять блоки, выполняющие все перечисленные функции. Кластеры для высокопроизводительных вычислений предназначены для параллельных расчётов. Эти кластеры обычно собраны из большого числа компьютеров. Разработка таких кластеров является сложным процессом, требующим на каждом шаге аккуратных согласований таких вопросов как инсталляция, эксплуатация и одновременное управление большим числом компьютеров, технические требования параллельного и высокопроизводительного доступа к одному и тому же системному файлу (или файлам) и межпроцессорная связь между узлами и координация работы в параллельном режиме. Эти проблемы проще всего решаются при обеспечении единого образа операционной системы для всего кластера. Однако реализовать подобную схему удаётся далеко не всегда и обычно она обычно применяется лишь для не слишком больших систем. Многопоточные системы используются для обеспечения единого интерфейса к ряду ресурсов, которые могут со временем произвольно наращиваться (или сокращаться) в размере. Наиболее общий пример этого представляет собой группа Веб-серверов. В 1994 году Томас Стерлинг (Sterling) и Дон Беккер (Becker) создали 16-и узловой кластер из процессоров Intel DX4, соединенных сетью 10Мбит/с Ethernet с дублированием каналов. Они назвали его "Beowulf" по названию старинной эпической поэмы. Кластер возник в центре NASA Goddard Space Flight Center для поддержки необходимыми вычислительными ресурсами проекта Earth and Space Sciences. Проектно-конструкторские работы над кластером быстро превратились в то, что известно сейчас под названием проект Beowulf. Проект стал основой общего подхода к построению параллельных кластерных компьютеров и описывает многопроцессорную архитектуру, которая может с успехом использоваться для параллельных вычислений. Beowulf-кластер, как правило, является системой, состоящей из одного серверного узла (который обычно называется головным узлом), а также одного или нескольких подчинённых узлов (вычислительных узлов), соединённых посредством стандартной компьютерной сети. Система строится с использованием стандартных аппаратных компонент, таких как ПК, запускаемых под Linux, стандартных сетевых адаптеров (например, Ethernet) и коммутаторов. Нет особого программного пакета, называемого "Beowulf". Вместо этого имеется несколько кусков программного обеспечения, которые многие пользователи нашли пригодными для построения кластеров Beowulf. Beowulf использует такие программные продукты как операционную систему Linux, системы передачи сообщений PVM, MPI, системы управления очередями заданий и другие стандартные продукты. Серверный узел контролирует весь кластер и обслуживает файлы, направляемые к клиентским узлам. Проблемы выполнения сети связи процессоров в кластерной системе. Архитектура кластерной системы (способ соединения процессоров друг с другом) в большей степени определяет ее производительность, чем тип используемых в ней процессоров. Критическим параметром, влияющим на величину производительности такой системы, является расстояние между процессорами. Так, соединив вместе 10 персональных компьютеров, мы получим систему для проведения высокопроизводительных вычислений, проблема, однако, будет состоять в нахождении наиболее эффективного способа соединения стандартных средств друг с другом, поскольку при увеличении производительности каждого процессора в 10 раз производительность системы в целом в 10 раз не увеличится. Рассмотрим для примера задачу построения симметричной 16-ти процессорной системы, в которой все процессоры были бы равноправны. Наиболее естественным представляется соединение в виде плоской решетки, где внешние концы используются для подсоединения внешних устройств. При таком типе соединения максимальное расстояние между процессорами окажется равным 6 (количество связей между процессорами, отделяющих самый ближний процессор от самого дальнего). Теория же показывает, что если в системе максимальное расстояние между процессорами больше 4, то такая система не может работать эффективно. Поэтому, при соединении 16 процессоров друг с другом плоская схема является не эффективной. Для получения более компактной конфигурации необходимо решить задачу о нахождении фигуры, имеющей максимальный объем при минимальной площади поверхности. В трехмерном пространстве таким свойством обладает шар. Но поскольку нам необходимо построить узловую систему, то вместо шара приходится использовать куб (если число процессоров равно 8) или гиперкуб, если число процессоров больше 8. Размерность гиперкуба будет определяться в зависимости от числа процессоров, которые необходимо соединить. Так, для соединения 16 процессоров потребуется 4-х мерный гиперкуб. Для его построения следует взять обычный 3-х мерный куб, сдвинуть в еще одном направлении и, соединив вершины, получить гиперкуб размером 4. Архитектура гиперкуба является второй по эффективности, но самой наглядной. Используются и другие топологии сетей связи: трехмерный тор, "кольцо", "звезда" и другие Наиболее эффективной является архитектура с топологией "толстого дерева" (fat-tree). Архитектура "fat-tree" (hypertree) предложена Лейзерсоном (Charles E. Leiserson) в 1985 году. Процессоры локализованы в листьях дерева, в то время как внутренние узлы дерева скомпонованы во внутреннюю сеть. Поддеревья могут общаться между собой, не затрагивая более высоких уровней сети. Матричные процессоры Наиболее распространенными из систем класса один поток команд - множество потоков данных (SIMD) являются матричные системы, которые лучше всего приспособлены для решения задач, характеризующихся параллелизмом независимых объектов или данных. Организация систем подобного типа, на первый взгляд, достаточно проста. Они имеют общее управляющее устройство, генерирующее поток команд и большое число процессорных элементов, работающих параллельно и обрабатывающих каждая свой поток данных. Таким образом, производительность системы оказывается равной сумме производительностей всех процессорных элементов. Однако на практике чтобы обеспечить достаточную эффективность системы при решении широкого круга задач, необходимо организовать связи между процессорными элементами с тем, чтобы наиболее полно загрузить их работой. Именно характер связей между процессорными элементами и определяет разные свойства системы. Одним из первых матричных процессоров был SОLОМОN (60-е годы). Система SOLOMON содержит 1024 процессорных элемента, которые соединены в виде матрицы: 32х32. Каждый процессорный элемент матрицы включает в себя процессор, обеспечивающий выполнение последовательных поразрядных арифметических и логических операций, а также оперативное ЗУ емкостью 16 Кбайт. Длина слова - переменная от 1 до 128 разрядов. Разрядность слов устанавливается программно. По каналам связи от устройства управления передаются команды и общие константы. В процессорном элементе используется так называемая многомодальная логика, которая позволяет каждому процессорному элементу выполнять или не выполнять общую операцию в зависимости от значений обрабатываемых данных. В каждый момент все активные процессорные элементы выполняют одну и ту же операцию над данными, хранящимися в собственной памяти и имеющими один и тот же адрес. Идея многомодальности заключается в том, что в каждом процессорном элементе имеется специальный регистр на 4 состояния - регистр моды. Мода (модальность) заносится в этот регистр от устройства управления. При выполнении последовательности команд модальность передается в коде операции и сравнивается с содержимым регистра моды. Если есть совпадения, то операция выполняется. В других случаях процессорный элемент не выполняет операцию, но может, в зависимости от кода, пересылать свои операнды соседнему процессорному элементу. Такой механизм позволяет выделить строку или столбец процессорных элементов, что очень полезно при операциях над матрицами. Взаимодействуют процессорные элементы с периферийным оборудованием через внешний процессор. Дальнейшим развитием матричных процессоров стала система ILLIАS-4, разработанная фирмой BARROYS. Первоначально система должна была включать в себя 256 процессорных элементов, разбитых на группы, каждый из которых должен управляться специальным процессором. Однако по различным причинам была создана система, содержащая одну группу процессорных элементов и управляющий процессор. Если в начале предполагалось достичь быстродействия 1 млрд. операций в секунду, то реальная система работала с быстродействием 200 млн. операций в секунду. Эта система в течение ряда лет считалась одной из самых высокопроизводительных в мире. В начале 80-х годов в СССР была создана система ПС-2000, которая также является матричной. Основой этой системы является мультипроцессор ПС-2000, состоящий из решающего поля и устройства управления мультипроцессором. Решающее поле строится из одного, двух, четырех или восьми устройств обработки, в каждом из которых 8 процессорных элементов. Мультипроцессор из 64 процессорных элементов обеспечивает быстродействие 200 млн. операций в секунду на коротких операциях. Матричные процессоры наилучшим образом ориентированы на реализацию алгоритмов обработки упорядоченных (имеющих регулярную структуру) массивов входных данных. Они появились в середине 70-х годов в виде устройств с фиксированной программой, которые могли быть подключены к универсальным ЭВМ; но к настоящему времени в их программирования достигнута высокая степень гибкости. Зачастую матричные процессоры используются в качестве вспомогательных процессоров, подключенных к главной универсальной ЭВМ. В большинстве матричных процессоров осуществляется обработка 32-х разрядных чисел с плавающей запятой со скоростью от 5000000 до 50000000 флопс. Как правило они снабжены быстродействующими портами данных, что дает возможность для непосредственного ввода данных без вмешательства главного процессора. Диапазон вариантов построения матричных процессоров лежит от одноплатных блоков, которые вставляются в существующие ЭВМ, до устройств, конструктивно оформленных в виде нескольких стоек, которые по существу представляют собой конвейерные суперЭВМ. Типичными видами применения матричных процессоров является обработка сейсмической и акустической информации, распознавание речи; для этих видов обработки характерны такие операции, как быстрое преобразование Фурье, цифровая фильтрация и действия над матрицами. Для построения относительно небольших более экономичных в работе матричных процессоров используются разрядно-модульные секции АЛУ в сочетании с векторным процессором, основанном на основе биполярного СБИС-процессора с плавающей запятой. Вероятно, в будущем матричные процессоры будут представлять собой матрицы процессоров, служащие для увеличения производительности процессоров сверх пределов, установленных шинной архитектурой. Для реализации обработки сигналов матрицы МКМД могут быть организованы в виде систолических или волновых матриц. Систолическая матрица состоит из отдельных процессорных узлов, каждый из которых соединен с соседними посредством упорядоченной решетки. Большая часть процессорных элементов располагает одинаковыми наборами базовых операций, и задача обработки сигнала распределяется в матричном процессоре по конвейерному принципу. Процессоры работают синхронно, используя общий задающий генератор тактовых сигналов, поступающий на все элементы. В волновой матрице происходит распределение функций между процессорными элементами, как в систолической матрице, но в данном случае не имеет места общая синхронизация от задающего генератора. Управление каждым процессором организуется локально в соответствии с поступлением необходимых входных данных от соответствующих соседних процессоров. Результирующая обрабатывающая волна распространяется по матрице по мере того, как обрабатываются входные данные, и затем результаты этой обработки передаются другим процессорам в матрице. 77. Принципы организации памяти ВС: иерархическая организация памяти ВС, виртуальная память, защита памяти, назначение и принцип работы кэш памяти, кэш уровни L1 и L2, ассоциативный кэш, множественно ассоциативный кэш, кэш с прямым отображением, стратегии записи, буфер записи, стратегии замены строк, синхронизация КЭШей в мультипроцессорных системах. В основе иерархии памяти лежат два принципа: принцип локальности обращений и соотношение стоимость/производительность. Принцип локальности обращений говорит о том, что большинство программ не выполняют обращений ко всем своим командам и данным равновероятно, а оказывают предпочтение некоторой части своего адресного пространства. Иерархия памяти строится на нескольких уровнях, причем более высокий уровень меньше по объему, быстрее и имеет большую стоимость в пересчете на байт, чем более низкий уровень. Уровни иерархии взаимосвязаны: все данные на одном уровне могут быть также найдены на более низком уровне, и все данные на этом более низком уровне могут быть найдены на следующем нижележащем уровне и так далее, пока мы не достигнем основания иерархии. Иерархия памяти обычно состоит из многих уровней, но в каждый момент времени мы имеем дело только с двумя близлежащими уровнями. Минимальная единица информации, которая может либо присутствовать, либо отсутствовать в двухуровневой иерархии, называется блоком. Размер блока может быть либо фиксированным, либо переменным. Если этот размер зафиксирован, то объем памяти является кратным размеру блока. Успешное или неуспешное обращение к более высокому уровню называются соответственно попаданием (hit) или промахом (miss). Попадание - есть обращение к объекту в памяти, который найден на более высоком уровне, в то время как промах означает, что он не найден на этом уровне. Доля попаданий (hit rate) или коэффициент попаданий (hit ratio) есть доля обращений, найденных на более высоком уровне. Доля промахов (miss rate) есть доля обращений, которые не найдены на более высоком уровне. Время обращения при попадании (hit time) есть время обращения к более высокому уровню иерархии, которое включает в себя, в частности, и время, необходимое для определения того, является ли обращение попаданием или промахом. Потери на промах (miss penalty) есть время для замещения блока в более высоком уровне на блок из более низкого уровня плюс время для пересылки этого блока в требуемое устройство. Виртуальная память и организация защиты памяти Виртуальная память делит физическую память на блоки и распределяет их между различными задачами. При этом она предусматривает также некоторую схему защиты, которая ограничивает задачу теми блоками, которые ей принадлежат. Виртуальная память автоматически управляет двумя уровнями иерархии памяти: основной памятью и внешней (дисковой) памятью. Системы виртуальной памяти можно разделить на два класса: системы с фиксированным размером блоков, называемых страницами, и системы с переменным размером блоков, называемых сегментами. Страничная организация памяти В системах со страничной организацией основная и внешняя память (главным образом дисковое пространство) делятся на блоки или страницы фиксированной длины. Каждому пользователю предоставляется некоторая часть адресного пространства, которая может превышать основную память компьютера и которая ограничена только возможностями адресации, заложенными в системе команд. Эта часть адресного пространства называется виртуальной памятью пользователя. Каждое слово в виртуальной памяти пользователя определяется виртуальным адресом, состоящим из двух частей: старшие разряды адреса рассматриваются как номер страницы, а младшие - как номер слова (или байта) внутри страницы. Управление различными уровнями памяти осуществляется программами ядра операционной системы, которые следят за распределением страниц и оптимизируют обмены между этими уровнями. Для указания соответствия между виртуальными страницами и страницами основной памяти операционная система должна сформировать таблицу страниц для каждой программы и разместить ее в основной памяти машины. При этом каждой странице программы, независимо от того находится ли она в основной памяти или нет, ставится в соответствие некоторый элемент таблицы страниц. Каждый элемент таблицы страниц содержит номер физической страницы основной памяти и специальный индикатор. Единичное состояние этого индикатора свидетельствует о наличии этой страницы в основной памяти. Нулевое состояние индикатора означает отсутствие страницы в оперативной памяти. Поиск в таблицах страниц, расположенных в основной памяти может осуществляться либо программным способом, либо специальными аппаратными средствами. В последнем случае для того, чтобы предотвратить возможность обращения пользовательской программы к таблицам страниц, с которыми она не связана, предусмотрены специальные меры. С этой целью в процессоре предусматривается дополнительный регистр защиты, содержащий описатель (дескриптор) таблицы страниц или базово-граничную пару. База определяет адрес начала таблицы страниц в основной памяти, а граница - длину таблицы страниц соответствующей программы. Загрузка этого регистра защиты разрешена только в привилегированном режиме. Для каждой программы операционная система хранит дескриптор таблицы страниц и устанавливает его в регистр защиты процессора перед запуском соответствующей программы. Сегментная организация памяти Каждый сегмент представляет собой отдельную логическую единицу информации, содержащую совокупность данных или программ и расположенную в адресном пространстве пользователя. Сегменты создаются пользователями, которые могут обращаться к ним по символическому имени. В каждом сегменте устанавливается своя собственная нумерация слов, начиная с нуля. Cегменты являются отдельными логическими единицами информации, которые необходимо защищать, и именно на этом уровне вводятся различные режимы доступа к сегментам. Можно выделить два основных типа сегментов: программные сегменты и сегменты данных (сегменты стека являются частным случаем сегментов данных). Поскольку общие программы должны обладать свойством повторной входимости, то из программных сегментов допускается только выборка команд и чтение констант. Запись в программные сегменты может рассматриваться как незаконная и запрещаться системой. Выборка команд из сегментов данных также может считаться незаконной и любой сегмент данных может быть защищен от обращений по записи или по чтению. Для реализации сегментации было предложено несколько схем, которые отличаются деталями реализации, но основаны на одних и тех же принципах. В системах с сегментацией памяти каждое слово в адресном пространстве пользователя определяется виртуальным адресом, состоящим из двух частей: старшие разряды адреса рассматриваются как номер сегмента, а младшие - как номер слова внутри сегмента. Наряду с сегментацией может также использоваться страничная организация памяти. В этом случае виртуальный адрес слова состоит из трех частей: старшие разряды адреса определяют номер сегмента, средние - номер страницы внутри сегмента, а младшие - номер слова внутри страницы. Для преобразования виртуального адреса в реальный физический адрес основной памяти для каждого пользователя операционная система должна сформировать таблицу сегментов. Каждый элемент таблицы сегментов содержит описатель (дескриптор) сегмента (поля базы, границы и индикаторов режима доступа). При отсутствии страничной организации поле базы определяет адрес начала сегмента в основной памяти, а граница - длину сегмента. При наличии страничной организации поле базы определяет адрес начала таблицы страниц данного сегмента, а граница - число страниц в сегменте. Поле индикаторов режима доступа представляет собой некоторую комбинацию признаков блокировки чтения, записи и выполнения. Таблицы сегментов различных пользователей операционная система хранит в основной памяти. Для определения расположения таблицы сегментов выполняющейся программы используется специальный регистр защиты, который загружается операционной системой перед началом ее выполнения. Этот регистр содержит дескриптор таблицы сегментов (базу и границу), причем база содержит адрес начала таблицы сегментов выполняющейся программы, а граница - длину этой таблицы сегментов. Разряды номера сегмента виртуального адреса используются в качестве индекса для поиска в таблице сегментов. Таким образом, наличие базово-граничных пар в дескрипторе таблицы сегментов и элементах таблицы сегментов предотвращает возможность обращения программы пользователя к таблицам сегментов и страниц, с которыми она не связана. Наличие в элементах таблицы сегментов индикаторов режима доступа позволяет осуществить необходимый режим доступа к сегменту со стороны данной программы. Для повышения эффективности схемы используется ассоциативная кэш-память. Кеш память Кэш-память является результатом попыток соединить достоинства быстрых SRAM и дешевых DRAM для создания максимально эффективной системы памяти. Принцип кэширования поясняется на рисунке. Рис. Принцип кэширования. Между процессором и основной памятью DRAM предусматривается быстрый кэш SRAM. В нем хранятся часто требуемые данные, которые он способен передавать очень быстро. Процесс управляется кэш-контроллером, который может обеспечивать различные режимы записи - такие, как сквозная или отложенная запись. Кэш-блок располагается между CPU и основной памятью; он состоит из кэш-контроллера и кэш-памяти SRAM. Они могут быть встроены в кристалл процессора (кэш-память, встроенная в кристалл), а могут существовать и в виде отдельного элемента. Имеются также смешанные модели (например, 386SL), в которых кэш-контроллер встроен в кристалл процессора, а собственно кэш-память оформлена в виде внешних схем SRAM. Кэш-память, имеющая емкость в 128-512 килобайт, обычно бывает в десять-тысячу раз меньше, чем основная память. Поскольку последовательные операции доступа к памяти в основном обращаются к ограниченному пространству адресов, то имеет смысл разместить наиболее часто требуемые данные в небольшой быстродействующей памяти - кэш-памяти. Преимуществом такого подхода является существенное уменьшение времени доступа, которое при большом количестве операций доступа к памяти обеспечивает значительное повышение быстродействия. Данные и команды, которые в данный момент не требуются, могут храниться в более медленной основной памяти, что не приводит к заметному замедлению выполнения программы. Принцип кэширования, заключающийся в использовании небольшой SRAM и большой, но более медленной DRAM, сочетает в себе преимущества быстрых SRAM и более дешевых DRAM. Кеш уровни L1 и L2 Кэш-память, встроенная в кристалл процессора именуется кэш L1, очень небольшого объема. На первый взгляд это очень мало; однако такая небольшая кэш-память обеспечивает довольно значительное увеличение быстродействия, в особенности при выборке команд процессора. Помимо встроенной в кристалл кэш-памяти, может также использоваться и внешняя кэш-память. Стандартные материнские платы обычно имеют кэш-память емкостью 128-512 кбайт, называемую кэш-памятью второго уровня, или, короче, кэш-памятью L2. Если процессор не может найти нужные данные в своей встроенной кэш-памяти, он обращается на втором шаге к внешней кэш-памяти; это означает, что в случае кэш-промаха, перед тем, как передать запрос на чтение в основную память, кэш-контроллер L2 вначале просматривает кэш-память L2. Кэш-память второго уровня в принципе может быть увеличена до любого размера. Естественно, кэш-контроллер внешней кэш-памяти должен обладать возможностями управления такой кэш-памятью. Собственно основная память располагается при этом "позади" второй ступени кэш-памяти. Организация кэш-памяти Принципы размещения блоков в кэш-памяти определяют три основных типа их организации: Если каждый блок основной памяти имеет только одно фиксированное место, на котором он может появиться в кэш-памяти, то такая кэш-память называется кэшем с прямым отображением. Это наиболее простая организация кэш-памяти, при которой для отображение адресов блоков основной памяти на адреса кэш-памяти пр