Учебная работа. Реферат: Объектно-ориентированная СУБД прототип
Кафедра автоматизации и Интеллектуализации Действий Управления
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
К дипломной работе
На тему: «Разработка макета системы управления
объектно-ориентированной базой данных»
Студент
Управляющий дипломной работы:
Особая часть:
М О С К В А
1 9 9 9
Содержание
1. Введение………………………………………………………………………………………………………………………….. 3
1.1 Предпосылки возникновения объектно-ориентированных баз данных………………………………………….. 3
1.2 Подходы в разработке ООБД……………………………………………………………………………………………. 4
1.3 Лаконичный сравнительный анализ постреляционных и обычных баз данных…………….. 5
1.4 Основания дипломной работы………………………………………………………………………………………… 5
1.5 Анализ приобретенного результата……………………………………………………………………………………… 7
2. Уточнение способов решения задачки…………………………………………………………………… 8
2.1 Наследование………………………………………………………………………………………………………………….. 8
2.2 Инкапсуляция……………………………………………………………………………………………………………….. 10
2.3 Идентификатор объекта…………………………………………………………………………………………………. 11
2.4 Идентификатор поля агрегата……………………………………………………………………………………….. 13
2.5 Триггеры. Ограничение доступа…………………………………………………………………………………….. 13
2.6 действие (knowhow)………………………………………………………………………………………………………. 14
2.7 Объекты-поведения……………………………………………………………………………………………………….. 14
2.8 Принципы взаимодействия объектов…………………………………………………………………………….. 14
2.9 Транзакции и механизм согласованного управления…………………………………………………… 17
3. Разработка структуры СУ………………………………………………………………………………………… 18
3.1 Положение дел в области интероперабельности систем…………………………………………………. 18
3.2 Менеджер памяти…………………………………………………………………………………………………………… 20
3.3 Виртуальная память и каналы………………………………………………………………………………………. 20
3.4 Система управления кэшированием объектов………………………………………………………………. 21
3.5 Система управления журнализацией и восстановлением……………………………………………… 23
3.6 Принципы реализации механизма согласованного управления…………………………………… 24
4. системы……………………………………………………………………………………………… 28
4.2 Строение объекта…………………………………………………………………………………………………………… 28
4.3 Контекст транзакции……………………………………………………………………………………………………… 30
5. Описание операций над объектами в БД…………………………………………………………. 31
6. Требования к техническим и программным средствам……………………………. 33
7. Реализация макета……………………………………………………………………………………………. 34
7.1 Построитель…………………………………………………………………………………………………………………… 34
7.2 Заголовочный модуль для каналов……………………………………………………………………………….. 34
7.3 Менеджервиртуальной памяти……………………………………………………………………………………… 35
7.4 Система управления хранением объектов……………………………………………………………………… 38
7.5 Система управления каналами……………………………………………………………………………………… 39
7.6 Работа с базисными объектами……………………………………………………………………………………….. 40
7.7 Выполнение действий……………………………………………………………………………………………………. 42
7.8 кэширование объектов………………………………………………………………………………………………….. 42
8. Контрольный пример, демонстрирующий способности технологии.. 44
9. Оценка трудозатратности разработки ПО с внедрением обычного и предлагаемого подходов………………………………………………………………………………………….. 45
9.1 Табличные базы данных с низкоуровневыми операциями доступа……………………………….. 45
9.2 Реляционные базы данных…………………………………………………………………………………………….. 45
9.3 Объектно-ориентированные базы данных……………………………………………………………………… 46
9.4 Будущее внедрения разных баз данных…………………………………………………………………. 46
10. Литература………………………………………………………………………………………………………………….. 47
1. Введение
1.1 Предпосылки возникновения
объектно-ориентированных баз данных
Развитие вычислительной техники и повышение размеров хранимой инфы привело к необходимости выделения технологии баз данных в отдельную науку. Как правило, базы данных хранили огромное количество однотипных данных, предоставляя пользователю сервис доступа к подходящей ему инфы. На замену иерархическим и сетевым базам данных пришли реляционные базы данных. Фуррор реляционных баз данных обоснован их наиболее обычный архитектурой, наличием ненавигационного языка запросов и, основное, ясностью математики реляционной алгебры.
На шаге зарождения технологии баз данных при построении какой-нибудь базы данных строилась физическая модель. С накоплением опыта сделалось понятно, что нужен переход к даталогической модели, которая дозволяет абстрагироваться от определенной СУБД. Возникло понятие схемы базы данных, описывающей компанию данных в СУБД. Программки стали работать с базой данных не впрямую, а через схему БД. Таковой подход обеспечил возможность поменять структуру БД без необходимости изменять логику программ. Возникновение и стандартизация SQL предоставила единый интерфейс для работы с данными. Иерархическая и сетевая модели баз данных стали применяться очень изредка. Это было вызвано, до этого всего, трудностью модификации схем иерархических и сетевых баз данных и сильно зависящей от приложений навигацией в этих базах данных.
Дальше, развитие объектно-ориентированного анализа и объектно-ориентированного проектирования как эффективных подходов для формализации предметной оласти, привело к появлению инфологической модели предметной оласти. сейчас, при разработке базы данных составлялось три модели представления инфы предметной области: инфологическая, даталогическая и физическая, не считая локальных пользовательских представлений.
Рис 1:
Так как физическая модель добивалась вербования профессионала в области определенной СУБД для получения действенного размещения данных, физическая модель стала строиться самой СУБД из схемы БД, вводимой пользователем на базе даталогической модели предметной области. Потом возникли CASE-средства, дозволяющие создавать инфологическую модель предметной области и транслирующие ее в даталогическую модель.
Чудилось бы, что цель достигнута, – проектировщик работает только с инфологической моделью, но по сути, до того времени, пока работа происходит с реляционной базой данных, существует разрыв между языком программирования (логикой пользователя) и языком описания данных (представлением данных), который преодолевать должен программист. Сущность разрыва можно сконструировать так: возможности работы с данными программки и с данными СУБД должны быть одинаковы.
В конце 80-х – начале 90-х годов общее внедрение персональных компов привело к развитию мультимедиа-технологий и нанастольконых САПР, структуры данных в каких очень сложны для процедурного программирования либо же необыкновенны (например, звук). Это, также то, что объектно-ориентированное программирование позволяет существенно понизить сложность разработки и обеспечить адекватное представлению моделирование предметной области, привело к тому, что в области языков программирования вышло слияние стилей языков высокого уровня. Доминирующим подходом сделалось внедрение в их технологий объектно-ориентированного программирования. Не остались в стороне и языки, интегрированные в СУБД. В качестве примера вышеизложенного можно привести продукт Visual FoxPro компании Microsoft. Эта СУБД обладает объектно-ориентированным языком программирования, но, на самом деле, является реляционной СУБД, так как хранимые данные представлены в виде таблиц, а таблицы представляют собой множество кортежей, которые содержат атомарные значения. Такое несоответствие и привело к буму в области разработки постреляционных баз данных.
Сложившаяся ситуация хотя кое-чем и припоминает время перехода к реляционным базам данных, но почти во всем и отличается. До этого всего, отсутствует математическая модель, которая была бы совершенно точно признана всеми ведущими разработчиками постреляционных СУБД. Нет документа, который однозначно опреразделял бы требования к таковым СУБД. И, в конце концов, нет самой системы, которая числилась бы образцом для остальных систем, как это было с СУБД System-R компании IBM.
Одним из главных критериев выбора СУБД постоянно была производительность. Однако, невзирая на то, что объектно-ориентированные базы данных есть уже около 10 лет, обычных тестов на производительность пока нет. Тому есть несколько обстоятельств: отсутствие обычного языка запросов, канонических приложений, разница в архитектуре и т.д.
Что все-таки есть? Имеется бессчетный опыт разработок, например Jasmine, POSTGRES, и остальных. Три документа, содержащих пожелания относительно возможностей постреляционных СУБД : [3], [12] и [14].
1.2 Подходы в разработке ООБД
За время существования баз данных накоплено большущее количество информации. Создано большущее количество приложений для работы с базами данных. Это привело к возникновению 2-ух конкурирующих концепций архитектур постреляционных СУБД:
1. Объектно-реляционные базы данных
2. Объектно-ориентированные базы данных
Объектно-реляционные базы данных представляют собой реляционные базы данных, дополненные надстройкой, представляющей эти данные как объекты. Все как и раньше хранится в виде таблиц. Этот подход дозволяет плавненько перейти от технологии хранилища таблиц к технологии хранилища объектов. Остается возможность подборки данных при помощи SQL-запросов. Сам SQL расширен командами работы с объектами. Более известным продуктом, в каком реализован подобный подход является Oracle ver.8. Комитет ANSI X3H2, разработавший стандарт SQL–92, на данный момент работает над SQL3. Главными усовершенствованиями в SQL3 должны стать возможность процедурного доступа наравне с декларативным и поддержка объектов. Главным недостатком объектно-реляционных СУБД является необходимость разбирать объекты для размещения их в таблицах и собирать их для передачи пользователю из таблиц [2].
Объектно-ориентированные базы данных хранят объекты целиком. Для подборки объектов при помощи запросов разрабатывается язык OQL (Object Query Language), в который был включен эталон SQL’92. Единство описания структуры БД достигается применением языка определения объектов ODL (Object Definition Language), предложенного ODMG (Object Database Management Group), являющегося расширением языка IDL. Эти виды баз данных владеют высочайшей производительностью, нередко в несколько раз наиболее высочайшей, чем реляционные базы данных. Более известными ООСУБД являются Jasmine, ObjectStore и POET.
Из российских разработок в области постреляционных баз данных достоверно известно только о существовании ООСУБД ODB-Jupiter. Похоже, она была написана специально для сотворения продукта ODB-Text. По последней мере, ни о каких остальных приложениях написанных на ODB-Jupiter ничего не понятно. Также в Internet было найдено описание некоторой российскей объектно-ориентированной базы данных версии 1.2. Поточнее, это был модуль, предоставляющий функции объектно-ориентированной СУБД. Документ даже не имел наименования. В нем детально рассматривалась организация хранения данных и принцип работы. Похоже, разработка обосновывалась только на принципах, которым должна удовлетворять СУООБД. Более увлекательная мысль: предназначение строчкам неповторимых идентификаторов и удаление строк лишь при упаковке базы. Это дает значимый выигрыш в сопоставлении строк, потому что объекты-строки с схожим содержанием имеют однообразные идентификаторы.
1.3 Лаконичный сравнительный анализ постреляционных и обычных баз данных
Постреляционные базы данных вобрали в себя все наилучшие черты иерархических, сетевых и реляционных баз данных.
Хотя есть некие сходства, как, к примеру, использование указателей и вложенная структура записей в сетевой модели. Но нужно отметить, что СУООБД употребляют логические указатели для обеспечения целостности, также поддерживают иерархию классов, наследование и способы. Таковых средств нет в иерархических и сетевых моделях [4].
Реляционные СУБД, совершенно надлежащие собственному назначению в традиционных областях внедрения баз данных, — банковское дело, системы резервирования и т.д. — в этом случае оказываются неловкими и неэффективными по почти всем причинам. Основное требование реляционной модели — нормализация — в случае сложноструктурированных данных с бессчетными взаимосвязями приводит к сложным запросам с соединением таблиц. Другими словами к тому, к чему реляционные СУБД не приспособлены, так как не могут обеспечить высшую производительность, требуемую интерактивным системам.
Производительность реляционных СУБД в таковых вариантах может уступать СУООБД во много раз. Не считая того, приложения развиваются, и число таблиц возрастает. Маленькое изменение в организации данных может привести к необходимости поменять начальные тексты программы. При всем этом вносятся доп ошибки. Объектно-ориентированные языки БД разрешают достигнуть такого же результата локальными изменениями в свойствах и способах интересующих объектов. Не считая того, способы работы с объектами хранятся в базе вкупе с объектами.
1.4 Основания дипломной работы
В отношении избранных математических моделей
Значимая часть данной дипломной работы основывается на 2-ух математических моделях.
Модель одного представления данных поведений
и сообщений в объектно-ориентированной базе данных
Модель [17] замечательна тем, что не только лишь обрисовывает что представляют из себя объекты и как они ведут взаимодействие меж собой, да и является замкнутой, самодостачеткой. Она дозволяет обрисовать качественно новейший вид взаимодействия в объектно-ориентированной системе: алгебру объектов. Эта алгебра является по собственной сути и важности аналогом реляционной алгебры в теории реляционных баз данных. В данной алгебре объектов определяется что представляют из себя такие операции, как селекция, инфы: посылка сообщения объекту (что приемлимо для объектно-ориентированного программирования) и выполнение запроса над совокупой хранимых данных (что приемлимо для реляционных баз данных).
Модель согласованного управления в объектно-ориентированной базе данных
Эта модель [19] также оказала существенное воздействие на данную работу, так как дополнила собой модель представления данных. Ни одна современная система управления базой данных не может обойтись без подсистемы транзакций. Природа транзакций в таковых приложениях, как CAD, мультимедийные базы данных, является весьма различной. Эти приложения характеризуются вместе выполняемыми продолобитательными транзакциями с случайными операциями. У длительных полькличательских транзакций время выполнения быть может растянуто на часы, а то и деньки. Это условие приводит к тому, что отлично известный, и ставший уже традиционным для традиционных баз данных, критерий сериализуемости становится неприменим конкретно.
О самом аспекты сериализуемости и способах реализации механизма транзакций довольно тщательно изложено в [9] и [22].
Механизм согласованного управления дозволяет повысить производительность СУООБД за счет составления расписания выполнения транзакций, в том числе продолжительных, предоставляет транзакциям применять промежные результаты других транзакций, учитывает объектную ориентированность данных и допускает обобщение операций (не только лишь чтение и запись).
Остальные работы, также повлиявшие на компанию структуры системы управления
В статье [20] излагается достаточно увлекательная точка зрения на состояние объектно-ориентированного программирования, также рассказывается о применении несколько хорошего от традиций объектно-ориентированного программирования подхода. В частности, наследование реализуется при помощи устройств включения и делегирования. Это дозволяет решить делему множественного наследования. Вводится понятие фильтров, представляющих из себя продукции, которые могут обрабатывать входящие сообщения и даже перенаправлять их на остальные объекты, сохраняя в теле этих сообщений ссылку на первоначальный объект, к которому было послано сообщение. Причем, фильтры могут реагировать не только лишь на входящие, да и на исходящие от объекта сообщения.
Принципы журнализации взяты из системы POSTGRES [23] и [15].
Принципы кэширования взяты из [1].
В отношении языка реализации
Было принято решение реализовывать макет СУООБД на ДССП. ДССП – диалоговая система структурного программирования – была разработана в 1980 году Н.П.Брусенцовым в МГУ [5]. Система имеет под собой теоретическое обоснование. Принцип ДССП «Слово есть слово», т.е. одно слово программки соответствует одному слову кода. Принципы управляющих конструкций наследуются от троичной вычислительной машинки Сетунь-70, имевшей память на магнитных сердечниках. Словарь и обозначения – от языка Ч.Мура Forth. ДССП превосходит Forth по почти всем характеристикам. язык ДССП владеет значительно наиболее низкой, чем язык ассемблера трудозатратностью в программировании, не уступая ему в компактности кода и быстродействии, позволяет проверять работу подпрограмм в интерактивном режиме и имеет возможность модификации программ фактически без внесения изменений в остальные части кода.
Главные черты ДССП:
· Двухстековая архитектура
· Оборотная польская запись
· Словари
· Поддержка нисходящего программирования
· Интегрированный отладчик с рекомпиляцией
· Высокоуровневые структуры данных и операции
· Высокоуровневый механизм программных прерываний и исключительных ситуаций
· Малогабаритный код
· Упругость, мобильность, наращиваемость
· наличие сопрограммного механизма
К огорчению, при всех этих плюсах, ДССП на данный момент является лишь системой программирования. Она не предоставляет сервис СУБД и не взаимодействует ни с одной СУБД. Данная работа ориентирована на то, чтоб обеспечить ДССП возможность обрабатывать данные в качестве СУБД, создав тем дешевенький (Jasmine стоит порядка $15000), но действенный инструмент, способный работать даже в самых беспритязательных критериях, которые так нередко встречаются на данный момент в Рф. Разработка не ограничивается расширением ДССП и способна работать в качестве сервера ООБД на файл-сервере ЛВС.
1.5 анализ приобретенного результата
В итоге проделанной работы исследована литература по организации реляционных баз данных, подходы к организации объектно-ориентированных баз данных. Были отобраны математические модели, на основании которых была определена архитектура базы данных и принципы ее функционирования. Программно реализованы подсистемы управления виртуальной памятью и кэширования объектов. Сама работа носит исследовательский нрав, являясь шагом от незапятанной теории к идеям реализации ООБД. Обширность темы не дозволила проработать детально все вопросцы, касающиеся организации ООБД. А именно, весьма не много места уделено средствам увеличения производительности поиска в БД (индексирование). Тем не наименее, некие отысканные решений, на мой взор, являются очень многообещающими. Это касается организации виртуальной памяти, позволяющей организовать произвольную степень вложенности данных, и механизма кэширования, которые тщательно рассматриваются в работе.
В виде программного кода реализовано:
· Создание, открытие ООБД
· Менеджервиртуальной памяти
· Система управления каналами
· Система управления кэшированием объектов
· Создание главных объектов
· Клонирование объектов
· Переопределение поведений и действий
· Изменение данных в объектах
· Журнализация конфигураций в объектах
· Выполнение действий (knowhow)
2. Уточнение способов решения задачки
2.1 Наследование
Наследование является массивным средством моделирования (так как коротко и буквально обрисовывает мир) и помогает программеру разрабатывать новейшие версии классов и способов, не боясь разрушить работающую систему. Наследование содействует повторному использованию кода, поэтому что любая программка находится на том уровне, на котором ее может применять наибольшее число объектов.
Совокупы параметров объекта в объектно-ориентированной базе данных уделяется большее внимание, чем в почти всех объектно-ориентированных языках программирования, так как они являются также целью запросов. объект=состояние+поведение. Почаще всего существует лишь одна иерархия наследования. Этот подход перебежал и в C++. Но, может быть разделение иерархий наследования данных и наследования поведений. Не постоянно лучше иметь буквально такую же иерархию наследования поведения, как и иерархию наследования параметров. Разделение этих 2-ух иерархий увеличивает способности переиспользования (reuse) поведений.
Значение переиспользования поведений
Представим, мы имеем класс Студент и желаем сделать класс Аспирант. Чтоб стать аспирантом, человек должен поначалу получить высшее образование как студент. В общем случае экземпляры этих классов различны. Мы не можем наследовать Аспирант от Студент, т.к. аспирант не является студентом. В неприятном случае, мы имели бы право разглядывать аспиранта как экземпляр класса Аспирант и, с этим же правом, как экземпляр класса студент. Тем не наименее, оба класса владеют общими атрибутами, такими как: имя, адресок, номер_личной_карточки, также большинством общих поведений. Это событие вдохновляет сделать класс Аспирант, унаследовав характеристики и поведения Студента. Но, хотя экземпляры класса Аспирант будут подмножеством всех экземпляров класса Студент (т.к. все аспиранты были студентами, но не все студенты стали аспирантами), это
Рис. 2:
характеристики классов Студент и Аспирант наследуются от класса Учащийся.
способы из суперклассов. В приложении к наследованию поведений это значит, что класс-ученик (demandclass) состоит в отношении Переиспользовать-от (Reuse-Of) с остальным классом, именуемым классом-учителем (supplyclass), и класс-ученик должен наследовать все поведения от класса-учителя.
Образцы наследования: классы либо макеты?
В системе отсутствуют классы и типы. Роль класса может брать на себя хоть какой объект, именуемый объектом-образцом. Таковой вид наследования именуется наследованием на базе прототипов.
Как правило, системы с наследованием на базе прототипов философски наиболее ординарны по сопоставлению с системами на базе классов. Порождение экземпляра достигается копированием объекта-образца. Копия получает от системы неповторимый идентификатор, хороший от идентификатора хоть какого другого объекта в системе.
Независимо от модели наследования (классы либо макеты) существует две различные стратегии реализации механизма наследования: делегирование и конкатецивилизация.
метод наследования: делегирование либо конкатенация?
Делегирование представляет собой такую форму наследования, в какой объединение интерфейсов реализовано средством разделения родительских интерфейсов, т.е. с внедрением ссылок. Конкатенация добивается аналогичного эффекта средством копирования родительских интерфейсов в интерфейс порождаемого класса либо объекта, – как итог, приобретенный интерфейс является непрерывным. В любом случае дочерний объект способен отвечать как на сообщения, определенные в родительских интерфейсах, так и на сообщения, добавленные к интерфейсу объекта. При делегировании те сообщения, которые не могут быть обработаны объектом, должны быть ориентированы родителям. При конкатенации любой объект является самодостаточным, и необходимость перенаправления сообщений отсутствует. Введение идентификаторов полей дозволяет распространить подходы делегирования и конкатенации и на агрегатные объекты.
И конкатенация, и делегирование имеют свои плюсы и недочеты. Делегирование обеспечивает возможность гибкого распространения конфигураций: хоть какое изменение параметров родителя автоматом отражается на потомках. Подход, использующий конкатенацию, допускает изменение параметров родителей и потомков независимо друг от друга, что также быть может полезно в почти всех ситуациях. Делегирование обычно требует наименьших издержек по памяти, в то время как конкатенация является наиболее эффективной по времени. Simula и C++ являются примерами языков, которые реализуют наследование на базе классов с внедрением делегирования. В Smalltalk реализовано наследование на базе прототипов с внедрением делегирования.
Обоснование избранного механизма наследования
Было принято решение применять в дипломной работе механизм наследования на базе прототипов с внедрением конкатенации, как для состояний, так и для поведений, так как для СУБД критично конкретно время выполнения операций. Разделение наследований состояния и поведения дозволяет уменьшить размер хранимой в любом объекте инфы. В объект помещается ссылка на объект, хранящий его интерфейс (т.е. поведение). Таковым образом, интерфейсы почти всех объектов с схожим поведением могут быть сосредоточены в одном месте. Наследование на базе прототипов дозволяет управлять конфигурацией объектов-образцов и обеспечивает единство представления данных. Т.е. результатом запроса к базе данных быть может перечень применяемых методов, их аргументы и иная информация, которая в системе с наследованием на базе классов укрыта в классах. Создание экземпляра через копирование снимает необходимость введения конструктора по дефлоту, так как содержимое копируемого объекта и задает исходные значения.
Система поддерживает множественное наследование. Необходимость множественного наследования остается предметом жарких споров. Практика гласит о том, что «множественное наследование играет роль парашюта: в нем нет неизменной необходимости, но если он вдруг пригодился, то огромное счастье иметь его под рукою»[8].
Определение родства
Остается принципиальный вопросец: как найти, является ли объект потомком другого объекта? Разделение наследований состояния и поведения приводит к тому, что слово «потомок объекта» обретает двоякое значение. С одной стороны, это потомок по данным, с иной стороны, это потомок по поведению.
По сути, в незапятанной объектно-ориентированной системе данные объектов накрепко защищены от вмешательства юзера через механизм инкапсуляции. Доступ к данным делается через способы. Таковым образом, родство объектов следует определять только через их интерфейсы. В системе на базе классов обычно строится дерево наследования. В системе на базе прототипов с конкатенацией определение родства получается из-за операций пересечения интерфейсов. означает для определения родства нужно выполнить операцию пересечения множеств. Если получившийся в итоге пересечения интерфейс совпадает с интерфейсом 1-го из 2-ух сравниваемых объектов, то иной объект – его потомок. Практически, это метод определения общего предка 2-ух объектов. Внедрение множеств для хранения интерфейсов дозволяет посмотреть на операцию наследования конкатенацией как на операцию слияния множеств.
2.2 Инкапсуляция
Мысль инкапсуляции в языках программирования происходит от абстрактных типов данных. С данной точки зрения объект делится на интерфейсную часть и реализационную часть. Интерфейсная часть является спецификацией набора допустимых над объектом операций. Лишь эта часть объекта видима. Реализационная часть состоит из части данных (состояние объекта) и процедурной части (реализация операций).
Интерпретация этого принципа для баз данных заключается в том, что объект инкапсулирует и программку и данные.
Разглядим, к примеру, объект Служащий. В реляционной системе служащий представляется кортежем. запрос к нему осуществляется при помощи реляционного языка, а прикладной программер пишет программки для конфигурации данной записи, к примеру увеличение заработной платы служащего либо прием на работу. Такие программки обычно пишутся или на властном языке программирования с включением в него операторов языка манипулирования данными либо на языке 4-ого поколения и хранятся в обыкновенной файловой системе, а не в базе данных. Таковым образом, при таком подходе имеются катигоричные различия меж программкой и данными, также меж языком запросов (для незапланированных запросов) и языком программирования (для прикладных программ).
В объектно-ориентированной системе служащий определяется как объект, который состоит из части данных (весьма даже возможно, что эта часть фактически совпадает с записью, определенной для реляционной системы) и части операций (эта часть состоит из операций увеличения заработной платы и приема на работу и остальных операций для доступа к данным сотрудника). При хранении набора служащих, как данные, так и операции хранятся в базе данных. Таковым образом, имеется единая модель данных и операций, и информация быть может укрыта. Никакие другие операции, не считая указанных в интерфейсе, не производятся. Это ограничение справедливо как для операций конфигурации, так и для операций подборки.
Инкапсуляция обеспечивает что-то вроде “логической независимости данных”: мы можем поменять реализацию типа, не меняя каких-то программ, использующих этот тип. Таковым образом, прикладные программки защищены от реализационных конфигураций на нижних слоях системы.
Тут уместно вспомянуть о “дилемме 2000 года”, появившейся из-за того, что в СУБД отводилось всего два разряда на год даты. Чтоб поправить возникающую ошибку, необходимо пересмотреть поновой весь код приложения! В ООБД для решения аналогичной трудности требуется исправление маленького количества способов, работающих с данными даты.
2.3 Идентификатор объекта
Предназначение идентификатора
Объекты в БД владеют индивидуальностью. Даже при изменении структуры и поведения объекта, его особенность сохраняется. Два объекта в системе отличаются своими идентификаторами. Идентификатор является чертой индивидуальности. понятие особенности ново для реляционных баз данных. В чисто реляционной БД все кортежи в границах одной таблицы различаются меж собой. Черта различия – первичный ключ. Почти все современные реляционные базы данных допускают существование в границах одной таблицы схожих кортежей. И потребность в этом есть, по другому не было бы квалификатора DISTINCT в операторе SQL SELECT.
Идентификатор объекта в БД дозволяет различить меж собой два схожих по значению объекта. Практически, он играет роль дескриптора адреса объекта. Таковым образом, юзер работает с объектом не через его адресок, а через его идентификатор.
Строение идентификатора
В современных ООБД для убыстрения доступа к объектам идентификаторы наделяются составной структурой.
Имеются два главных подхода для идентификации объектов:
· Составной адресок (Structured address)
· Заменитель (Surrogate)
Составной адресок состоит из физической части (сектора и номера странички) и логической части (внутристраничный индекс), которые являются масками фиксированной длины и, соединяясь, дают идентификатор. Составные адреса наиболее популярны в современных ООБД как наиболее действенные: за один дисковый доступ можно получить адресок объекта. Внедрение составного адреса как идентификаторов приводит к зависимости от организации физического хранения. Это приводит к трудностям при перемещении данных для хранения на другое устройство.
Заменитель – чисто логический идентификатор, генерируемый по некому методу, который гарантирует неповторимость. В заменителях, индекс (также именуется директорией объекта), нередко употребляется для отображения идентификаторов в расположение объектов. Эффективность операций с базой данных почти во всем определяется скоростью доступа к одиночному объекту. Нередко объекты соединены меж собой и доступ к одному объекту происходит через доступ к другому. к примеру, через объект-список происходит доступ к его элементам. В почти всех вариантах создание объекта (к примеру, глубочайшим копированием) приводит к каскадному созданию остальных объектов, составляющих его содержимое. Внедрение кластеризации помогает организации резвого доступа к группе связанных объектов. Не считая того, размещение объектов в одной области дискового места также наращивает быстродействие.
В работе [16] описан подход к построению идентификаторов-заменителей. Идентификатор состоит из 2-ух частей: кода кластера и номера в последовательности. Таковой подход основывается на последующих 3-х принципах:
1) Идентификатор объекта должен содержать информацию о кластере, который группирует вместе применяемые объекты
2) Должны быть допустимы произвольные размеры кластеров
3) Идентификаторы объектов должны подчиняться довольно монотонному представлению, чтоб они могли выступать в качестве псевдоключей динамического хеширования.
Есть три признака, по которым СУБД могут принимать решение о месте размещения объектов:
1) Правила, данные в схеме БД
2) Указание юзера
3) Статистика доступа
В дипломной работе, невзирая на заманчивость идеи кластеризации, принят очевидный подход: идентификатор новейшего объекта – это один. Объекты также хранятся не в виде кластеров и не вкладываются друг в друга. Хотя система управления памятью дозволяет организовать и таковой метод хранения.
Идентичность и эквивалентность
В ООБД при сопоставлении 2-ух объектов меж собой различают идентичность и эквивалентность объектов.
Определение идентичности
Два объекта являются схожими, если их идентификаторы совпадают. Так как в системе не быть может 2-ух объектов с схожими идентификаторами, это значит, что это один и этот же объект, на который ссылаются с 2-ух различных мест. Идентичность обозначается так: o1
º o2
.
Определение
N-эквивалентности
Пусть 0-эквивалентность (обозначается »0
) то же самое, что проверка идентичности º. Тогда для всех 2-ух объектов o1
, o2
ÎO
, o1
и o2
n-эквивалентны (обозначается o1
»n
o2
) для n > 0, если:
Существует атомарный объект
, таковой, что
(o1
) =
(o2
) и их поведения схожи;
Существует объект-агрегат
, таковой, что FID всякого поля
находится в o1
и o2
, также правильно оборотное: FID всякого поля
1
(
2
) находится в
,
(
1
)=[A1
:
1
, …, Am
:
m
] и
(
2
)=[A1
:
1
, …, Am
:
m
], и при всем этом
i
»n-1
i
для 1£ i £ n; либо
Существует объект-условие
, таковой, что
(
1
) = <
1
,
2
,
3
> и
(
2
) = <
1
,
2
,
3
> и
i
»n-1
i
для 1£ i £ 3; либо
Существует объект-множество
, таковой, что
(
1
) = {
1
, …,
l
} и
(
2
)
= {
1
, …,
m
} и
=
и для всякого
i
(
j
) существует один
j
(
i
) :
i
»n-1
j
для 1£ i,j £
; либо
Существует объект-список
, таковой, что
(
1
) = (
1
, …,
l
) и
(
2
) = (
1
, …,
m
) и
=
и
i
»n-1
i
для 1£ i £
.
Два объекта именуются эквивалентными (o1
» o2
) и тогда лишь тогда, когда
o1
»n
o2
для некого n > 0.
2.4 Идентификатор поля агрегата
Введение идентификатора поля дозволяет преодолеть трудность определения размещения данных полей агрегатов. Сущность трудности состоит в том, что если мы наследуем классы B и C от класса A, а потом наследуем множественно класс D от классов B и C, то экземпляр класса D сразу является экземпляром классов A, B и C. При всем этом принципиально, чтоб «старенькый» класс (к примеру, A) умел работать с объектами класса D. Эта неувязка рассматривается в работе [10], в какой создатели вводят последующие ограничения целостности структуры объектов:
1. В БД не могут существовать отдельные собственные части подклассов
2. Каждой части сложного объекта обязана соответствовать лишь одна собственная часть.
В качестве решения они дают внедрение ссылок на классы и каждую свою часть класса хранить раздельно.
В дипломной работе предлагается заместо хранения ссылок на классы установить для всякого поля собственный идентификатор. При наследовании поле сохраняет собственный идентификатор. Таковым образом, переименование полей не нарушает связь наследования. Переименование быть может автоматическим, к примеру, из-за конфликтов имен полей при множественном наследовании. Аналогично поступает оператор SQL Select, когда в качестве результата запроса ему необходимо возвратить несколько столбцов, имеющих одинаковые имена.
Идентификаторы полей неповторимы в границах базы данных, т.е. при объявлении новейшего поля в классе, идентификатор поля в предстоящем возникает лишь в классах-наследниках и лишь через наследование.
Не считая того, программеры могут применять для имен полей обычный для их родной язык, иными словами: есть возможность создавать синонимы имен полей.
2.5 Триггеры. Ограничение доступа
В огромное количество поведений хоть какого объекта можно включить два перечня с предопределенными именами «PRE_TRIGGERS» и «POST_TRIGGERS». Перечень PRE_TRIGGERS содержит объекты, обрабатывающие входящее сообщение. Как правило, это объекты-условия. Таковой подход именуется фильтрацией [20]. Перечень POST_TRIGGERS содержит объекты, которые инспектируют итог действия и могут произвести откат. POST_TRIGGERS вызываются по окончании деяния транзакции при выполнении операции удаления транзакционных зависимостей.
Все триггеры множеств и последовательностей можно разбить на две систематизации: это триггеры, следящие за целостностью огромного количества (последовательности), сохраняя отношение порядка на последовательности, ограничение суммы чисел элементов огромного количества и др.; и следящие за целостностью 1-го элемента, что соответствует проверке значения на соответствие домену.
Перечень PRE_TRIGGERS дозволяет организовать ограничение доступа, фильтруя сообщения, посланные объектом, ктороый не имеет возможностей для выполнения команды, содержащейся в сообщении.
Перечень POST_TRIGGERS дозволяет исключить часть данных из результата выполненной объектом операции, создав тем локальное пользовательское к примеру, в [9] и [18].
2.6 действие (
knowhow)
Действие представляет собой объект типа “строчка”, хранящий текст ДССП-процедуры. ссылка на действие может хранится в поле OBJKH объекта, через который и происходит вызов деяния. метод выбора выполняемого деяния рассматривается ниже. В интерфейсах объектов указаны идентификаторы объектов, которые в поле OBJKH хранят идентификатор деяния. значения этих объектов являются именованием деяния. Более комфортно применять для данной цели строковые объекты. Использование поля OBJKH дозволяет делать одно и то же действие для разных способов разных объектов.
При вызове деяния с идентификатором OIDKH делается вызов слова с именованием kh$<OIDKH>. К примеру, для объекта с OIDKH=0x00000DFC это будет KH$00000DFC. Если возникает ситуация EXERR, означает слово в словаре отсутствует и подлежит компиляции. Для компиляции текст деяния дополняется префиксом “: KH$<oid> ” и суффиксом “ ;”, опосля что компилируется командой TEXEC и производится. Словарь действий именуется $KH_VOC.
При изменении текста способа нужно вполне очистить словарь ДССП $KH_VOC, хранящий откомпилированные деяния, так как эти деяния содержат в собственном коде абсолютные ссылки на прежнюю откомпилированную версию деяния. Вообщем, эта процедура чистки словаря производится только при переопределении текста деяния, что бывает довольно изредка.
2.7 Объекты-поведения
В отсутствии классов, хранить способы в любом объекте было бы очень затратно. Вынесение правил поведения в отдельный объект дозволяет уменьшить издержки на хранение объектов-данных. Математическая модель ООБД в [17], также делит данные и поведения, что добавочно дает возможность переиспользовать объект-поведение представляет собой огромное количество объектов-методов, которое и называется интерфейсом объекта.
При посылке на вход случайного объекта OID2
сообщения OID1
(которое тоже является объектом), поначалу проверяется, содержится ли OID1
в интерфейсе объекта OID2
(проверка идентичности). Если да, то производится действие объекта OID1
, по другому сравниваются значения OID1
и объектов интерфейса (проверка эквивалентности). Если соответствие найдено, производится действие, обозначенное в отысканном в интерфейсе объекте.
2.8 Принципы взаимодействия объектов
Есть два главных метода управления объектами:
· Посылка сообщений
· Алгебра объектов
·
определения операций Select и Pickup алгебры объектов можно отыскать в [17]. тут оно не рассматривается по той причине, что является надстройкой над управлением посылкой сообщений и описывается через механизм посылки сообщений. Другими словами операции алгебры объектов могут быть заданы через операции посылки сообщений, без исправления структуры СУБД. Полная алгебра объектов является замкнутой и состоит из последующих операций: Select s, Pickup d, Apply r, Expression Apply l, Project p, Combine c, Union È, Interselect Ç, Subtract -, Collapse v, Assimilate a. Объектная алгебра наиболее выразительна, чем реляционная, так как поддерживает полиморфность. Оператор Select, к примеру, может работать с хоть какими видами операндов, а не только лишь с огромными количествами.
Согласно [17], хоть какое сообщение в системе является объектом. Хоть какой объект может иметь связанное с ним действие (knowhow), либо не иметь его.
метод определения способа для выполнения
При посылке объекта проверяется, находится ли идентификатор объекта-сообщения в интерфейсе объекта-получателя. Если да, то производится knowhow, связанное с сиим идентификатором. Если нет – проверяется, совпадает ли действие. По другому ворачивается объект fail.
характеристики способов
Набор_параметров (Blackboard) представляет собой огромное количество меток, аргументных пар { (L1
, arg1
), … , (Ln
, argn
) }. Li
ÎA
, argi
ÎO
для 1 £ i £ n и «i, j Î 1,…,n : i ¹ j Þ Li
¹ Li
.
Вообщем, базисные способы также употребляют передачу характеристик через стек, как наиболее действенный метод программирования.
Синтаксис посылки сообщения
Действие(Набор_параметров) ~> Получатель. объект, именуемый Действие (Invoker), является сообщением (Message) и посылается к другому объекту, нареченному Получателем (Reciver), используя Набор_параметров, предоставляющий нужные аргументы. Если характеристики в Наборе_параметров отсутствуют, то можно записать короче: действие ~>Получатель. Посланное сообщение постоянно возвращает объект, именуемый Итог (Result).
Посылка обычного сообщения
Пусть B
– Набор_параметров и
и
– два объекта в O
.
Примитивные взаимодействия
(1)
(B
) ~>
º
;
(B
) ~>
º
;
(2)
(B
) ~>
º
;
(B
) ~>
º
;
(когда
)
(3)
(B
) ~>
º
;
(B
) ~>
º
;
(когда
и
)
При совпадении идентификатора
(4) Если существует способ
из
таковой, что
º
и sig(x) = (A1
,c1
) ´ …´ (An
,cn
)® cr
и {(A1
,a1
) ´ …´ (An
,an
)} ÍB
и FID всякого поля сi
находится в ai
(в определениях ОО-программирования: ci
является предком по значению для ai
), тогда
(B
) ~>
º
kh(x)(A1
: a1
, … , An
: an
)
по другому проверяется совпадение значения.
При совпадении значения
(5) Если существует способ
в
либо его объектах-учителях (объектов, от которых наследуется Message sending), владеет сложной структурой.
Всеохватывающие сообщения
Если действие является объектом-агрегатом
, то
(B
) ~>
º
, если s=[ ]
(B
) ~>
º [A1
:
1
(B
) ~>
1
, …, An
:
n
(B
) ~>
n
], если s=[A1
: s1
, …, An
: sn
]
где oj
» o, oj
не
º o) и orf(oi
) Ç orf(o) = Æдля j = 1,..,n и для хоть какого i, j Î [1,..,n], если i ¹ j тогда oj
не
º o и orf(oi
) Ç orf(oj
) = Æ (т.е. o1
,…,on
являются глубокими копиями объекта-получателя o).
Если действие является объектом-условием
, то
(B
) ~>
º
(B
) ~>
если
(B
) Ï {False
,
}
(B
) ~>
º
(B
) ~>
по другому
Где
обозначение if-части, then-части и else-части
соответственно.
Если действие является объектом-множеством
, то
(B
) ~>
º
, если s={ }
(B
) ~>
º
1
(B
) ~>
, если s={s1
}
(B
) ~>
º
(B
) ~>
,
=
{
} опосля
(B
) ~>
где
– произвольно избранный элемент из огромного количества
.
Если действие является объектом-списком
, то
(B
) ~>
º
, если s=( )
(B
) ~>
º
n
(B
) ~>(…~>(
2
(B
) ~>(
1
(B
) ~>
))…) где
= (s1
, s2
, …, sn
)
Семантика дробящейся посылки
Пусть B
– Набор_параметров и пусть
ÎO
. Тогда оператор дробящейся посылки, обозначаемый ~1
>определяется последующим образом:
Таблица 1:
Условие
(B
) ~1
>
º
(B
) ~>
не
º
(B
) ~>
AGG(o) & o = [A1
: o1
, …, An
: on
]
[A1
:
(B
) ~>
1
, …, An
:
(B
) ~>
n
]
BIO(
) &
не
º
(B
) ~>
BIO(
) &
º
(B
) ~>
SET(
) &
= {
1
n
}
{
(B
) ~>
1
, …,
(B
) ~>
n
}
SEQ(
) &
= (
1
n
)
(
(B
) ~>
1
, …,
(B
) ~>
n
)
По другому
2.9 Транзакции и механизм согласованного управления
Согласованное управление является принципиальным нюансом управления транзакциями в СУБД. В обыденных базах данных, транзакции являются независящими атомарными действиями, которые производятся изолированно, в том числе от результатов выполнения остальных транзакций. Но, для увеличения производительности, для некоторых транзакций составляется расписание выполнения. Механизм согласованного управления обеспечивает корректное выполнение этого огромного количества транзакций, в том числе длительных.
В отличие от обычных баз данных, исследования в области согласованного управления для объектно-ориентированных баз данных были ограничены. Это в значительной мере соединено с уникальностью требований к объектно-ориентированным базам данных. Природа транзакций в таковых приложениях, как CAD, мультимедийные базы данных, является очень различной. Эти приложения характеризуются вместе выполняемыми длительными транзакциями с обобщающими операциями. Так как итог выполнения транзакции быть может основан на промежных результатах остальных транзакций, аспект сериализуемости не быть может применим непосредственно в этом случае.
Сериализуемость заключается в том, что итог совместного выполнения транзакций эквивалентен результату их некого поочередного выполнения, называемого планом выполнения транзакций. Это обеспечивает настоящую независимость пользователей. Существует аксиома Эсварана о двухфазной блокировке: если все транзакции подчиняются протоколу двухфазной блокировки, то для всех вероятных имеющихся графиков пуска (порядков выполнения транзакций) существует возможность упорядочения. Данная тема отлично освещена в [9] и [22].
Зависимо от организации протокола совместного выполнения транзакций он является пессимистическим либо жизнеутверждающим.
Пессимистический способ нацелен на ситуации, когда конфликты появляются нередко. Конфликты распознаются и разрешаются немедля при их появилсяновении. Жизнеутверждающий способ основан на том, что результаты всех операций модификации базы данных сохраняются в рабочей памяти транзакций. Настоящая модификация базы данных делается лишь на стадии фиксации транзакции. Тогда же проверяется, не появляются ли конфликты с иными транзакциями.
протокол согласованного управления СУООБД обеспечивает:
· Управление вместе выполняющимися длительными транзакциями
· Увеличивает правильность аспекта другого, чем сериализуемость
· Учитывает объектную ориентированность данных
· Допускает обобщение операций (не только лишь чтение и запись)
Подробное описание и теоретическое обоснование протокола согласованного управления для ООБД содержится в [19].
3. Разработка структуры СУ
3.1 Положение дел в области интероперабельности систем
Рост мощности программных приложений привел к выделению новейшего строительного слоя – информационной архитектуры систем, определяющей способность совместного использования, совместной деятель (в предстоящем будет употребляться термин «интероперабельность») компонент (информационных ресурсов) для решения задач [21]. Этот слой размещен обычно над сетевой архитектурой, являющейся нужной предпосылкой таковой совместной деятель компонент, обеспечивающей их связь.
деятельность по созданию технологии интероперабельных систем обхватывает весь мир. Более значимый вклад в принимаемые идейные, строительные и технологические решения интероперабельных систем заносит Object Management Group (OMG) (HTTP://www.omg.org) — наикрупнейший в мире консорциум разработки программого обеспечения, включающий выше 600 членов — компаний — производителей программного продукта, разрабов прикладных систем и конечных юзеров. Целью OMG является создание согласованной информационной архитектуры, опирающейся на теорию и практику объектных технологий и общедоступные для интероперабельности спецификации интерфейсов информационных ресурсов. Эта архитектура обязана обеспечивать повторное внедрение компонент, их интероперабельность и мобильность, делая упор на коммерческие продукты.
Остальные организации, которые работают в кооперации с OMG, к примеру, с целью доведения результатов OMG до официальных эталонов в разных качествах, включают: ANSI, ISO, CCITT, ANSA, X/Open Company, Object Database Management Group (ODMG).
Развитие способностей информационных систем и Internet и желание обеспечить их взаимодействие меж собой, привело к необходимости разработки одного протокола взаимодействия. Для этого была сотворена OMG, которая и занялась сиим вопросцем. В итоге была разработана эталонная модель, которая описывает концептуальную схему для поддержки технологии, удовлетворяющей техническим требованиям OMG. Она идентифицирует и охарактеризовывает составляющие, интерфейсы и протоколы, составляющие Архитектуру Управления Объектами OMG (Object Management Architecture (OMA)), не определяя, вообщем, их детально.
Согласованная с OMA прикладная система состоит из совокупы классов и экземпляров, взаимодействующих с помощью Брокера Объектных Заявок (Object Request Broker (ORB)). Объектные Службы (Object Services) представляют собой коллекцию служб, снабженных объектными интерфейсами и обеспечивающих поддержку базовых функций объектов. Общие средства (Common Facilities) образуют набор классов и объектов, поддерживающих полезные в почти всех прикладных системах функции. Прикладные объекты представляют прикладные системы конечных юзеров и обеспечивают функции, неповторимые для данной прикладной системы.
CORBA (Common Object Request Broker Architecture) описывает среду для разных реализаций ORB (Object Request Broker), поддерживающих общие сервисы и интерфейсы. Это обеспечивает переносимость клиентов и реализаций объектов меж разными ORB.
Брокер Объектных Заявок
обеспечивает механизмы, дозволяющие объектам посылать либо принимать заявки, отвечать на их и получать результаты, не заботясь о положении в распределенной среде и методе реализации взаимодействующих с ними объектов.
Объектные Службы
:
· Служба Извещения Объектов о Событии (Event Notification Service).
· Служба Актуального Цикла Объектов (Object Lifecycle Service).
· Служба Именования Объектов (Name Service).
· Служба Длительного Хранения Объектов (Persistent Object Service).
· Служба Управления Конкурентым Доступом (Concurrency Control Service).
· Служба Наружного Представления Объектов (Externalization Service).
· Служба Объектных Связей (Relationships Service).
· Служба Транзакций (Transaction Service).
· Служба конфигурации Объектов (Change Management Service).
· Служба Лицензирования (Licensing Service)/
· Служба Объектных Параметров (Properties Service).
· Служба Объектных Запросов (Object Query Service).
· Служба Сохранности Объектов (Object Security Service).
· Служба Объектного времени (Time Service).
Общие Средства заполняют концептуальное место меж ORB и объектными службами с одной стороны, и прикладными объектами с иной. Таковым образом, ORB обеспечивает базисную инфраструктуру, Объектные Службы – фундаментальные объектные интерфейсы, а задачка Общих Средств – поддержка интерфейсов сервисов высочайшего уровня. Общие средства разделяются на две группы: «горизонтальные» и «вертикальные» наборы средств. «Горизонтальный» набор средств описывает операции, применяемые в почти всех системах, и не зависящие от определенных прикладных систем. «Вертикальный» набор средств представляет технологию поддержки определенной прикладной системы (вертикального сектора рынка), такового, как здравоохранение, производство, управление денежной Деятельностью, САПР и т.д.
· Средства поддержки пользовательского интерфейса (User Interface Common Facilities)
· Средства управления информацией (Information Management Common Facilities)
· средства управления системой (System Management Common Facilities)
· средства управления задачками (Task Management Common Facilities)
· Вертикальные общие средства (Vertical Common Facilities)
· Вертикальные общие средства предусмотрены для использования в качестве обычных для обеспечения интероперабельности в специфичных прикладных областях.
· Поддержка интероперабельности брокеров в эталоне CORBA 2.0
О роли СУООБД в архитектуре OMG можно прочитать в [13].
На базе анализа вышеизложенного, были выбраны в качестве основания последующие базисные службы СУООБД:
·
Служба Длительного Хранения Объектов – управление хранением объектов
· Служба Управления Конкурентноспособным Доступом и Служба Транзакция – объединены вкупе протоколом согласованного управления.
· Служба Конфигурации Объектов – управление журнализацией конфигураций
3.2 Менеджерпамяти
Менеджер памяти является главным модулем системы.
Его наличие дозволяет
· Абстрагироваться от особенностей воззвания к разным видам памяти.
· Создавать сколь угодно вложенные друг в друга структуры данных.
· Иметь единый интерфейс на любом уровне вложенности.
· Организовать кэширование объектов
В состав менеджера памяти заходит 3 системы управления:
1. Система управления виртуальной памятью
2. Система управления каналами
3. Система управления кэшированием объектов
3.3 Виртуальная память и каналы
Виртуальная память представляет собой непрерывную для юзера, с ней работающего, область памяти, которая быть может вложена в другую виртуальную память. Виртуальная память состоит из частей, связанных меж собой в двунаправленную цепь. Любому сектору понятно его положение относительно нижнего логического уровня. Работа с виртуальной памятью происходит через канал, выделенный для нее. Канал – это набор черт описывающих: где размещена виртуальная память, и в котором ее месте мы находимся. количество каналов ограничено, потому канал выделяется той виртуальной памяти, которая нужна в данный момент. Система имеет набор каналов, которые могут иметь ссылку на виртуальную память, или быть незанятыми. 1-ые 5 каналов – это базисные каналы, отображенные на физические носители (оперативная память, файл). 2-ые 5 каналов – каналы виртуальной памяти, хранящие сборники объектов. Другие каналы предусмотрены для работы с объектами. Все каналы основываются на каких-то остальных каналах, образуя, в общем случае, 5 независящих деревьев. Корень – один из базисных каналов (0..4). одна и та же виртуальная память не быть может загружена в два канала. При переходе от верхнего канала к нижнему производится трансляция адреса.
Рис 3: Связь каналов с хранилищами объектов
Таблица 2:
Параметр канала
Семантика
NCHAN
Номер текущего канала
LOWCH
Нижний канал; в него вложен этот канал
CHGCTX
признак конфигурации данных заголовка фрагмента
TEKADR
Текущая позиция для чтения/записи
SYNCADDR
адресок начала заголовка текущего сектора в нижнем канале
TEKADR0
Позиция, соответственная началу данных фрагмента
PREDADDR
адресок заголовка предшествующего фрагмента (–1, если его нет)
NEXTADDR
адресок заголовка последующего фрагмента (–1, если его нет)
BUSYLEN
Занятая длина
LEN
Выделенная длина
Таблица 3:
Операция
Семантика (все операции работают с текущим каналом)
IBS
Чтение б из канала
OBS
Запись б в канал
GOTO
Переход по адресу в канале
@GOTO
Переход по смещению в канале
UPSIZE
Выделить доп. память в конце канала и встать на ее начало
DEFRAG
Создать виртуальную память непрерывной на уровне нижнего канала (т.е. однофрагментной)
Начало виртуальной памяти соответствует нулевому значению TEKADR. Доступ осуществляется через операции позиционирования (GOTO и @GOTO), чтения б (IBS) и записи б (OBS). Другие функции, реализуются через их (к примеру, чтение длинноватого слова). К памяти быть может использована функция UPSIZE с аргументом, содержащим нужное количество б для выделения. Память может гарантированно выделяться до наполнения всей выделенной длины. При исчерпании выделенной длины, делается запрос к нижестоящему уровню о выделении доборной памяти. Если такой запрос применяется к каналу ниже 5-го, соответственного дисковому файлу, файл возрастает в размере, если его выделенная длина исчерпана. Если повышение размера файла нереально из-за нехватки дискового места, то, в случае невозможности выделения памяти за счет упаковки, возбуждается ситуация NOMEMORY. При попытке доступа за границы определенной виртуальной памяти (к примеру, чтение опосля расположения данных), возникает ситуация OUTDATA.
3.4 Система управления кэшированием объектов
Самостоятельное кэширование данных – неотъемлемая черта хоть какой СУБД. кэш состоит из 2-ух частей: очереди кэшируемых объектов и памяти для кэшируемых объектов. память для кэшируемых объектов – это оперативная память, в которую объект загружается. В данной памяти могут размещаться лишь те объекты, идентификаторы которых находятся в очереди кэшируемых объектов. Удаляемый из очереди объект выгружается в дисковую память. В данной дипломной работе все создаваемые объекты являются размеренными (Persistent), т.е. они непременно сохраняются на диске и могут быть применены опосля открытия базы данных для использования.
задачка управления кэшированием объектов подобна задачке управления памятью в операционной системе. В операционной системе для организации процесса обмена меж оперативной и наружной памятью информация представлена набором частей (блоки переменной длины) либо страничек (блоки фиксированной длины). метод управления памятью именуется методом замещения, который описывает состав частей либо страничек в наиболее быстродействующей главный памяти. Таковым образом, частота оращений к наружной памяти, а, как следует, и быстродействие двухуровневой памяти (уровень наружной памяти и уровень оперативки) в целом, значительно зависят от избранного метода замещения. Наибольшее распространение получила страничная структура памяти.
В дипломной работе роль странички играет объект. Минимальную частоту воззваний к ВП (наружной памяти) давал бы метод, замещающий те объекты в ОП (оперативки), воззвание к которым в дальнейшем произойдет через очень длительное время. Но воплотить таковой метод нереально, так как заблаговременно неизвестна информация о будущих воззваниях к объектам программкой.
Более популярны последующие 5 алгоритмов замещения:
1. Случайное замещение (СЗ): с равной вероятностью быть может замещен хоть какой объект,
2. Ранее пришел – ранее ушел (РПРУ, либо FIFO): замещается объект подольше всех находившийся в оперативки,
3. Замещение более издавна использовавшегося объекта (НДИ),
4. метод рабочего набора (РК): хранятся в памяти лишь те объекты, к которым было воззвание в течении времени t, вспять от текущего момента,
5. Лестничный метод (ЛЕСТН): в перечне объектов при воззвании к объекту он меняется местами с объектом, находящемся поближе к голове перечня. При воззвании к отсутствующему в ОП объекту объект, находящийся в крайней позиции теснится.
Для метода замещения лучше, чтоб он владел 2-мя частично противоречивыми качествами: с одной стороны, он должен сохранять в ОП объекты к которым воззвания происходят более нередко, с иной – стремительно обновлять содержимое ОП при смене огромного количества рабочих объектов.
к примеру, метод РПРУ эффективен лишь в отношении резвого обновления ОП, он не выделяет в перечне объектов объекты, воззвания к которым происходят почаще, чем к остальным. метод НДИ также дозволяет стремительно обновлять содержимое ОП. Но последовательность одиночных воззваний достаточной длины к объектам, находящимся во ВП, выпихнет из ОП все объекты, к которым, в среднем, воззвания происходят почаще всего.
В [1] описывается класс многоуровневых алгоритмов замещения c, которые позволяют решить эту делему. Они зависят от конечного числа характеристик и при адаптивном подборе этих характеристик соединяют свойство резвого обновления части ОП со свойством сохранения в ОП тех объектов, которые более нередко запрашиваются.
В дипломной работе принято решение применять метод замещения из класса c, при последующих параметрах: предел времени нахождения объекта в ОП отсутствует, размеры подсписков на всех уровнях схожи, параметр
=1 (это соответствует методу замещения НДИ для объектов всех подсписков; если
– положение объекта в подсписке, и
£
, то при воззвании к нему применяется метод РПРУ, по другому НДИ).
Неэффективным является подход обычного освобождения от объектов, которые стоят в конце перечня кэша, так как они могут быть малы по размеру, а требуется загрузить объект, который занимает существенное количество памяти. В этом случае, пришлось бы ради 1-го объекта выгружать существенное количество остальных. Что привело бы к значимым потерям времени при их повторной загрузке.
Для определения подмножества объектов кэша, подлежащих вытеснению, можно применить метод решения задачки о ранце. Если б все объекты имели схожую длину, без этого можно было бы обойтись. Хотя метод решения задачки о ранце NP-сложен, решение можно компактно записать в виде рекурсивного метода, находящего решение за счет внедрения принципа динамического программирования Беллмана. Таковой метод более эффективен, когда размер кэша составляет 32 объекта, поскольку огромное количество избранных объектов можно представить битовыми полями в длинноватом слове. При большем размере кэша растут утраты памяти и быстродействия, и возникает вопросец о месте расположения данных промежных вызовов. Рекурсивный вызов в среде ДССП просит малых издержек ресурсов, а время расчета окупается за счет времени обмена с наружной памятью, работа с которой много медлительнее, чем с оперативной.
3.5 Система управления журнализацией и восстановлением
Журнализация предназначена во-1-х, для обеспечения способности отката неправильных действий транзакций, и, во-2-х, для восстановления базы данных опосля аппаратного сбоя. В ООБД журнализацию можно проводить на 3-х уровнях: инфологическом, даталогическом и физическом. На инфологическом уровне журнальчик фиксирует сообщения, циркулирующие в системе. На даталогическом уровне фиксируется какие примитивы были вызваны на выполнение сообщениями. На физическом уровне фиксируются низкоуровневые операции: по какому адресу в которой виртуальной памяти выполнялась запись, как поменялись границы виртуальной памяти.
Обыденные БД хранят моментальный снимок модели предметной области. Хоть какое изменение в момент времени t некого объекта приводит к недоступности состояния этого объекта в предшествующий момент времени. Любопытно, что при всем этом в большинстве развитых СУБД предшествующее состояние объекта сохраняется в журнальчике конфигураций, но возможность доступа к сиим данным для юзеров закрыта.
Для журнализации избран подход, примененный в СУБД Postgres, разработанной в институте г.Беркли, Калифорния под управлением М.Стоунбрейкера, как более обычный в реализации и предоставляющий полезные способности, труднодоступные в базах данных с обыденным типом журнализации (см. [23]). В данной системе, во-1-х, не ведется рядовая журнализация конфигураций базы данных, и одномоментно обеспечивается корректное состояние базы данных опосля перевызова системы с утратой состояния оперативки. Во-2-х, система управления памятью поддерживает исторические данные. Запросы могут содержать временные свойства интересующих объектов. Реализационно эти два нюанса соединены.
СУБД, имеющие таковой вид журнализации, именуются темпоральными СУБД. Главный тезис темпоральных систем заключается в том, что для хоть какого объекта данных, сделанного в момент времени t1 и уничтоженного в момент времени t2, в БД сохраняются (и доступны юзерам) все его состояния во временном интервале [t1, t2). Система не только лишь хранит информацию о прошедших состояниях объекта, да и предоставляет юзеру доступ к ней через язык запросов.
Т.е. журнальчик состоит из меток времен и значений объектов. СУБД POSTGRES является экспериментальной и, а именно, предполагается, что она работает на вычислительной аппаратуре, снаряженной статической оперативной памятью, не теряющей инфы при выключении наружного питания. Вообщем, Издержки на 100тическую память возмещатся быстродействием СУБД и доп возможностями, приобретаемыми при таком подходе, а конкретно: возможность получить
Совершенно говоря, любой объект в системе состоит из 3-х частей: Заголовка объекта, данных и истории. В заголовке объекта имеется поле VALUE, которое содержит ссылку на начало расположения снутри объекта данных о его состоянии. объект, с которым юзер желает работать, автоматом загружается системой в кэш, где ему выделяются 4 канала:
1. Канал объекта в кэше
2. канал объекта на диске
3. Канал данных объекта в кэше
4. канал истории конфигураций объекта на диске
Прикладной программер не работает впрямую с каналами. С каналами работают примитивы доступа к содержимому объекта. Прикладной программер работает с объектами лишь через их идентификаторы. А идентификаторам объектов 100вятся в соответствие каналы в системе кэширования объектов.
3.6 Принципы реализации механизма согласованного управления
Область деяния операции
Любой объект владеет поведением, реализуемым через способы (операции). Если операция работает лишь с внутренними данными объекта, то она является локальной, если же она отправляет сообщения остальным объектам, то – глобальной. Посланное к другому объекту сообщение порождает на нем выполнение соответственной операции. Через транзитивное замыкание можно представить процесс порождения отношением предок – потомок.
Областью деяния операции на объекте являются:
Данные состояния объекта, входные характеристики операции, системные объекты, также все объекты, владеющие определенным поведением, если это действие операции
Все действия хоть какой операции на объекте, попадают под одну из 4 категорий: запрос, создание, модификация, удаление. Для каждой операции на объекте определяются надлежащие огромного количества.
Огромное количество запросов QS(opi
(O)) определяется рекурсивно как QS(opi
(O)) = LocalQS(opi
(O)) È GlobalQS(opi
(O)), где
· LocalQS = Æ, если нет собственных ivj
из O «запрошенных» операцией opi
. {O}, по другому.
· GlobalQS =
opi
, отправляет сообщение к Os
для выполнения способа opj
, где Os
Î Scope(opi
(O)), и Ogq
ÎQS(opj
(Os
)).
Аналогично определяются можества сотворения модификации и удаления операции opi
на объекте O.
Огромное количество замен определяется как объединение множеств сотворения, модификации и удаления. Конфликт операций – выполнение 1-го из последующих критерий:
1. US(opi
(O)) Ç US(opj
(O’)) ¹Æ
2. QS(opi
(O)) Ç US(opj
(O’)) ¹Æ
3. US(opi
(O)) Ç QS(opj
(O’)) ¹Æ
Пользовательские транзакции можно разглядывать как операции над специальным объектом базы данных.
Пользовательские операции могут быть разбиты на ряд шагов, любой из которых делает некую логическую единицу работы. Шаги эти также можно считать едиными операциями. Такое разбиение дозволяет ввести понятие точки разрыва. Точка разрыва ставится меж 2-мя шагами на этом же уровне хоть какой операции.
Объектно-ориентированное расписание
Для роста производительности СУБД, некие операции могут вести взаимодействие друг с другом в базе данных. Некие из этих операций могут производиться на одном объекте. Совместное выполнение почти всех операций (псевдопараллельность) может приводить к произвольному чередованию операций (либо их шагов). порядок чередования именуется
. Потому что «пользовательские транзакции» являются лишь операциями на особом объекте, ОО-расписание можно найти на этом объекте как пару (S,<расп
), где S – огромное количество всех шагов (как локальных, так и глобальных), а <расп
– частичный порядок на огромном количестве шагов в S. Глобальные шаги в S – это итог воззвания операций к остальным объектам, и шаги основанные на итоге этих воззваний также врубаются в расписание.
Разные пользовательские транзакции могут вызвать один и этот же способ, и сразу будут производиться несколько копий одной и той же операции.
В работе [19] утверждается, что расписание
для T на особом объекте является корректным объектно-ориентированным расписанием, если:
1. Расписание состоит лишь из шагов операций, порожденных действием T, и любой из этих шагов производится буквально раз в Sch.
2. В расписании сохраняется отношение порядка выполнения шагов операций для всех транзакций.
3. Если порожденная от T транзакция имеет две операции над одним объектом, находящиеся в способе на этом же уровне вложенности, то времена выполнения этих операций не пересекаются; все вызванные подоперации одной операции заканчиваются до начала выполнения иной операции. Очередность выполнения задается системой управления транзакциями.
Таковым образом, корректное объектно-ориентированное расписание гарантирует, что спецификации точек разрыва для операций будут соблюдаться подабающим образом, т.е. остальные кооперативные (взаимодействующие) операции не могут созидать никаких промежных результатов, не считая обрисованных спецификацией точки разрыва.
Этот аспект правильности подменяет собой аспект сериализуемости в ООБД.
Эквивалентность расписаний
Для определения эквивалентности расписаний: вводится последующее правило: если итог одной операции выходит на базе результата иной операции, то в любом корректном расписании порядок следования конфликтующих операций схож. Если конфликта нет, то допустимым является хоть какой порядок следования операций. Если при всем этом получаются различные результаты, то любой из их, тем не наименее, является правильным. Этот феномен можно проиллюстрировать на последующем примере:
Положим, имеются две операции: прирастить сумму на счете в два раза и прирастить сумму на счете на 10%. Разумеется, что итог будет различным зависимо от порядка следования операций. Но, так как операции независимы, в любом случае он считается правильным.
Воздействие наличия позднего связывания на составление расписания операций в ООБД
Если объекты, которые доступны разным транзакциям, заблаговременно известны, задачка механизма согласованного управления относительно ординарна. Априорная информация упрощает статичное определение конфликтующих операций; как следует, стратегия управления чередованием операций быть может сформулирована. Но, позднее связывание (late binding), соответствующая черта объектно-ориентированных систем, приводит к трудности подготовительного определения объектов доступа. При отсутствии такового познания, одним из выходов является блокировка неких транзакций до того времени, пока вид объектов доступа не станет известен. Но, для длительных (long-duration) транзакций (к примеру, запись звука в мультимедийной БД) , таковая блокировка может привести к очень большенному времени ожидания.
Протокол употребляет жизнеутверждающий подход, при котором априорные познания недосягаемы. Когда протокол употребляет оптимистичный подход, неточное выполнение находится лишь когда все объекты доступа известны. При обнаружении неправильного чередования, для одной либо наиболее транзакций (операций) должен быть произведен обрыв (aborted) либо откат (rolled back) к моменту перед неправильным выполнением. Это отлично зарекомендовавший себя подход, но для длительных транзакций откат либо обрыв приведет к значимой утраты системных ресурсов, которые были применены и времени, потраченного на никчемные вычисления.
Одним из способов решения данной трудности заключается в том, чтоб ограничить сумму откатов. Для этого употребляется мысль точек проверки, ограничивающих глубину отката. Если происходит событие приводящее к обрыву либо откату, эффект, произведенный действиями за точкой проверки должен быть отменен. Это минимизирует утраты ресурсов и в то же время уменьшает длительные ожидания.
Спецификация точки проверки
Мысль точки проверки употребляется для минимизации глубины отката в случае обрыва транзакций. Эти точки могут быть описаны юзером. Точки проверки связаны с операциями на объектах и могут быть описаны как шаг операции. Нет необходимости иметь спецификацию точки проверки для всякого объекта в системе. Однако юзер может обрисовать точки проверки в неких операциях на неких объектах, так, что любая точка представляет логическую единицу работы. Мысль установки точек проверки предоставляет базе данных возможность определять, находится ли она в согласованном состоянии. Точка проверки служит как механизмом синхронизации, так и заботой о связности базы данных. Неважно какая пользовательская транзакция может иметь зависимость от результатов остальных транзакций. Таковым образом, точка проверки в транзакции имеет состояние базы данных в данной точке является непротиворечивым состоянием (consistent state). При всем этом точка проверки действует как точка встречи, в какой все активные транзакции системы фиксируют (commit) свою, может быть, отчасти изготовленную, до данной точки работу.
Приложение базы данных подразумевает значительную известность относительно семантики операций в базе данных. Семантика познаний быть может применена для установки точек проверки в транзакциях в точках, которые соответствуют логическому окончанию некой части работы. В обычных базах данных с стремительно выполняющимися транзакциями сама транзакция является логической единицей работы. Но в больших приложениях недозволено трактовать транзакцию полностью как логическую единицу работы. В этом и состоит полезность идеи точек проверки.
состояние пользовательских транзакций на объектах
Любой объект O в системе хранит состояние каждой пользовательской транзакции в системе. состояние пользовательской транзакции (т.е. операции на DBIO) может принимать одно из последующих значений:
(Never Activated)
Неважно какая пользовательская транзакция, которая не воздействовала на O прямо либо косвенно, находится в этом состоянии на O. Это эквивалентно тому, что не имеется никакой инфы о пользовательской транзакции в O.
(Completed)
Пользовательская транзакция находится в состоянии Завершена на O, если операция вызванная ей на O окончила выполнение всех собственных шагов.
(Chekpoint)
Пользовательская транзакция не произвела никаких действий с того времени, как оказалась в точке проверки.
(BlockedForCheckPoint)
Пользовательская транзакция ждет выполнения критерий, которые будут удовлетворять переводу ее в Точку проверки.
(Executing)
Пользовательская транзакция производится на O, если операция op(O), вызванная данной транзакцией производится.
Рис 4:
Таблица 4:
Деяния
Новое состояние транзакции
Никогда не активизировалась
объект O получил запрос на выполнение op(O) в первый раз для транзакции Tr(op(O)) и op(O) начинает производиться
Производится
Операция транзакции достигнула описанной для нее точки проверки, все другие активные операции на O «никогда не активизировались» в точке проверки
Находится в точке проверки
Операция транзакции достигнула описанной для нее точки проверки, но активные операции не находятся в собственных точках проверки
Блокирована для точки проверки
Tr(op(O)) окончила все свои шаги
Завершена
Таковым образом, если объект имеет точки проверки, описанные для собственных операций, то операции встречаются (рандеву) в точке проверки. Если операции в точке проверки произведены удачно, то в дальнейшем нет необходимости хоть какой операции откатываться (rollback) за точку проверки.
Шаги протокола согласованного управления
1. Операция запрошена (requested)
2. Операция вызывает другую операцию
3. Вызванная операция ворачивается
4. Операция завершена
5. Точка разрыва (breakpoint) достигнута
6. Точка проверки (checkpoint) достигнута
7. В точке проверки получено сообщение
Детально метод выполнения шагов описан в [19].
4. системы
Системе известны последующие базисные объекты: ROOT, FAIL, NULL, SAME, ATOMIC, INT, STR, DATIME, BIO, AGG, SET, SEQ.
1. ROOT – корень – предок всех объектов. Данных не имеет.
2. FAIL, копия ROOT – ворачивается, если при действии произошла ошибка.
3. NULL, копия ROOT – объект-заменитель при отсутствующем значении. Эта неувязка появилась не так давно, но в теории реляционных баз данных пока не отыскала применимого решения. Сущность трудности состоит в том, что при вводе данных, некие из их могут отсутствовать (к примеру, не известен год рождения), потому недозволено сказать, чему они в точности равны. В неких вариантах нуль может являться значением, для этого и вводится особое обозначение (NULL).
4. SAME, копия ROOT – объект, позволяющий создавать копии. Он значит, что для взаимодействующего с ним объекта создается копия.
5. ATOMIC – предок всех атомарных объектов. Задает для их главные способы поведения.
6. INT – целое.
7. STR – строчка.
8. DATIME – дата и время
9. BIO – условный объект
10.AGG – агрегат
11.SET – огромное количество
12.SEQ – последовательность
4.2 Строение объекта
Любому объекту выделяется персональное виртуальное место. Объект предваряется заголовком. За заголовком следуют виртуальные места данных и журнальчика. Любой объект имеет неповторимый идентификатор в границах системы.
Таблица 5:
(все поля 32-битные)
Поле
Семантика
OID
Идентификатор объекта (неповторимый в границах системы)
OBJBHR
Идентификатор объекта-поведения (способы)
OBJKH
Идентификатор объекта-действия
TRCOOBJ
Идентификатор транзакционного сообъекта
VALUE
адресок заголовка вложенного канала, хранящего адресок заголовка вложенного канала, хранящего историю конфигураций
Блок данных объекта
Атомарный объект хранит снутри блока данных свое
объект-условие хранит снутри блока данных три идентификатора в последующем порядке: идентификатор методаусловия, идентификатор способа, выполняемого, если условие выполнено («правда») и идентификатор способа, выполняемого, если условие не выполнено ( «ересь»).
У объектов агрегат, перечень и огромное количество 1-ое слово блока данных – размер элемента. Для перечня и огромного количества он равен 4. Для агрегата – 12.
Элементом перечня и огромного количества является идентификатор объекта. Элементом агрегата является кортеж:
· идентификатор объекта-значения (он непременно является потомком объекта-образца)
· идентификатор поля (FID)
· идентификатор объекта-образца
Если идентификатор объекта-экземпляра в перечне либо огромном количестве равен нулю, это значит, что элемент удален. Признаком конца перечня, огромного количества, полей объекта служит размер виртуальной памяти, выделенной для размещения данных.
Таблица 6:
Длина в б
денек
1
Час
1
Минутки
1
Секунды
2
Толики секунд
Таковая структура журнальчика позволяет фиксировать конфигурации не только лишь данных, да и поведений, knowhow…
Таблица 7:
Число б
адресок размещения в заголовке
4
Замененное денек
1
Час
1
Минутки
1
Секунды
2
Толики секунд
информация о транзакциях в системе
Все пользовательские объекты в системе имеют транзакционные сообъекты. Транзакционный сообъект – это объект, хранящий информацию о действии операций транзакций на состояние пользовательского объекта. Ссылка на сообъект находится снутри объекта, для которого отслеживаются действия.
Таблица 8:
(агрегата)
имя поля
количество унаследованных зависимостей
DSR
Огромное количество обретенных зависимостей
DS
Огромное количество зависимостей
Огромное количество зависимостей выходит объединением множеств локальных, унаследованных и обретенных зависимостей. Любой элемент какого-нибудь из этих множеств зависимостей – пара номеров транзакций (Ti
,Tj
). Если трактовать это множество как огромное количество ребер графа, в котором верхушки – номера транзакций, а ребра – зависимости меж транзакциями, то наличие цикла в графе значит некорректное выполнение транзакций.
В целях упрощения принято решение отрешиться от таблицы конфликтов. Таблица конфликтов обрисовывает какие операции конфликтуют меж собой, т.е. может ли выполняться операция A, если в данных момент производится операция B. Ячейка таблицы может принимать одно из 3-х значений: «Конфликтует», «Не конфликтует», «Непонятно».
Транзакции и объекты-поведения
Объекты поведения представляют собой огромное количество объектов, поле OBJKH которых хранит идентификатор выполняемого деяния. Это огромное количество имеет ширину элемента не 4, как обыденное огромное количество, хранящее данные, а 8. В последующих 4 байтах может храниться идентификатор перечня – строчки таблицы чередований в точках разрыва (части подсистемы транзакций). Таблица чередований появляется из точек разрыва и группировки спецификаций для объекта. Она дозволяет найти: в которых точках разрыва каких операций можно переключиться на выполнение операции, соответствующей данной строке таблицы чередований. Это статическая информация, которая быть может сформирована перед началом работы системы. Элемент строчки таблицы чередований состоит из 2 значений: идентификатора операции и идентификатора множества, хранящего номера точек разрыва.
4.3 Контекст транзакции
В системе есть объект DBIO (Database User-Intarface Object), которому известны состояния всех транзакций. Этот объект представляет собой огромное количество, элементами которого являются объекты-агрегаты, описывающие контекст транзакции.
Таблица 9:
имя поля
Размер в б
Значение
TR_MESS
4
OID сообщения
TR_KH
4
OID knowhow
TR_PARAM
4
OID агрегата с параметрами
TR_TARGET
4
OID мотивированного объекта сообщения
TR_RES
4
OID результата
TR_STACK
4
OID стека
TR_N
4
Номер транзакции
TR_HOSTN
4
Номер вызвавшей транзакции
TR_STATUS
1
состояние транзакции
TR_POINT
2
Точка разрыва, в какой находимся
Для каждой транзакции выделяется собственный стек. Механизм сохранения и вос100новления стеков описан в [7]. Стеки сохраняются в атомарных объектах.
5. Описание операций над объектами в БД
[] DB.NEW [] — сделать новейшую БД
[] DB.OPEN [] — открыть БД
[] DB.CLOSE [] — закрыть БД
Операции клонирования:
[oid] CLONE [oid’] — клонировать объект
[] CLONE_ROOT [oid’] — Сделать объект от «Корень»
[int] CLONE_INT [oid’] — Сделать объект «Целое»
[«string»] CLONE_STR [oid’] — Сделать объект «Строчка»
[«string»] CLONE_AGG [oid’] — Сделать объек-агрегат
[oid_if oid_then oid_else]
CLONE_BIO [oid’] — Сделать объект-условие
[] CLONE_SET [oid’] — Сделать объект-множество
[] CLONE_SEQ [oid’] — Сделать объект-последовательность
OIDROOT, OIDINT, OIDAGG, …, OIDSEQ -– Выяснить идентификаторы соотв. Объектов
[oid_bhr] SET_BHR [] — переопределить действие
[] GET_KH [oid] — выяснить действие
[oid] GET_INT [int] — Получить целое число из объекта-целого
[int oid] SET_INT [] — Занести целое число в объект-целое
[oid] PRINT_STR [] — Печатать на дисплее содержимое строчки
[«string» oid] SET_STR [] — Занести строчку в объект-строку
[oid_super oid] SUPER+ [] — наследовать данные из oid_super в oid
[oid] DELOBJ [] — удалить объект
Операции над обилием:
[oid_el oid] SET+E [] — добавить элемент в огромное количество
[oid_el oid] SET-E [] — удалить элемент из огромного количества
[oid_el oid] SET?E [0/1] — отыскать элемент в огромном количестве
[oid1 oid] SET+ [] — объединение
[oid1 oid] SET- [] — разность
[oid1 oid] SET* [] — пересечение
Операции над перечнем:
[oid_el n oid] SEQ+E [] — добавить элемент в последовательность
[n oid] SEQ-E [] — удалить n-й элемент из
последовательности
[oid_el oid] SEQ?E [0/n] — отыскать позицию в последовательности
[n oid] SEQ?N [0/oid] — найти oid n-го элемента послед-ти
Операции над агрегатом:
[fid oid_etalon oid] AGG+F [] — добавить поле к объекту
[fid oid] AGG-F [] — удалить поле из объекта
[fid oid] ETALON [oid] — получить идентификатор объекта-эталона
[fid oid] FIELD [oid] — получить идентификатор
объекта-значения
Операции над объектом-условием:
[oid] GET_BIO
[oid_else oid_then oid_if] — Получить характеристики объекта-условия
[oid_else oid_then oid_if oid]
SET_BIO [] — Сохранить характеристики объекта-условия
Особые операции:
[oid_str oid] SET_NAMEOBJ [oid] — называть объект
[oid_str fid] SET_NAMEFID [fid] — называть поле
[oid_str] NAMEOBJ [oid] — получить идентификатор по имени
[oid_str] NAMEFID [fid] — получить идентификатор поля по имени
[oid_mess oid_par oid] SEND [] — отправить сообщение объекту
[oid_mess oid_obj] METHOD? [] — найти идентификатор способа
[oid1 oid] CHIELD [1/0] — найти, является ли oid1 потомком oid
[oid_kh] RUN_KH [] — выполнить knowhow
[] NCHAN [chan] — выяснить номер текущего канала
[chan] !NCHAN [] — переключиться на данный канал
Операции просмотра:
[oid] JVIEW [] — просмотр журнальчика
[] A.VIEW [] — просмотр адресов объектов в БД
[] Q.VIEW [] — просмотр очереди
[] IC [] — просмотр состояния канала
6. Требования к техническим и программным средствам
ДССП реализована на огромном количестве компьютерных платформ (VAX, PDP-11, IBM PC, R3000, MC68020, SPARC) и операционных систем (MSDOS, MSDOS-экстендеры, unix, RT-11, RSX, OS9, CPM и др.). В данный момент фактически закончена разработка ДССП на Си, что обеспечивает перенос данной системы на всякую платформу, где есть Си.
Аппаратные средства:
Неважно какая платформа, на которой работает ДССП, с объемом оперативки для нужд БД не наименее 1 Мб.
Программные средства:
ДССП с диспетчером параллельных действий (версия 4.42) и Операционная Система.
Разрабатываемая СУООБД может также работать в качестве host-программы на файл-сервере, обрабатывая команды с рабочих станций, поступающие в их индивидуальные ящики на файл-сервере. Ответ рабочие станции получают также через почтовые ящики.
В предстоящем, могут быть реализованы сетевые протоколы тогда и СУООБД будет являться сервером в клиент-серверных приложениях.
Внедрение отдельных почтовых ящиков для нескольких параллельно работающих юзеров дозволяет возложить на СУООБД функции монитора [6], осуществляющего линеаризацию поступающих запросов к содержимому СУООБД.
7. Реализация макета
7.1 Построитель
LOAD TIMEM
LOAD M0
LOAD M2
LOAD Soms
LOAD CHMS
LOAD SYSOBJS
LOAD M3
LOAD LS_CASH
UNDEF
PROGRAM $KH_VOC
7.2 Заголовочный модуль для каналов
PROGRAM $M0
B16
1000 VALUE TOTMEMLEN
TOTMEMLEN BYTE VCTR MEMORY
: T-1 D -1 ;
: *4 SHL SHL ;
: &0FF 0FF & ;
: <= 1+ < ;
: >= 1- > ;
[20 Word VCTR CHAN] [каналы. Начиная с 5-го]
VAR NCHAN [Номер текущего канала]
: !NCHAN ! NCHAN ;
5 VALUE NBASECH [1-ый не базисный канал]
: GETDATA NCHAN 10 * + CHDATA ;
: PUTDATA NCHAN 10 * + ! CHDATA ;
[Размер заголовка блока в байтах]
FIX VAR HSIZE 10 ! HSIZE
: HSIZE+ HSIZE + ;
[Pred, Next, BusyLen, Len]
1 *4 VALUE ctfPREDADDR
[$M4] [как самодостаточный]
0 VALUE ctLOWCH [Нижний канал.]
[0=Оперативная/1=Дисковая память/2=Журнал/-1=свободен]
1 VALUE ctTEKADR [Логический адресок снутри участка (по данным)]
2 VALUE ctBUSYLEN [Длина фрагмента, занятая данными]
3 VALUE ctLEN [Максимальная допустимая длина данных фрагмента]
4 VALUE ctTEKADR0 [=TEKADR, когда TEKADR стоит на нулевом байте данных фрагм]
5 VALUE ctNEXTADDR [адресок начала заголовка последующего фрагмента (пф)]
6 VALUE ctPREDADDR [адресок начала заголовка предшествующего фрагмента (пф)]
7 VALUE ctSYNCADDR [адресок начала заголовка фрагмента (пф)]
8 VALUE ctCHGCTX [признак конфигурации контекста]
9 VALUE ct1STLONG [Первое число в канале]
[в исходном блоке в исходном слове данных лежит адресок начала данных]
: LOWCH ctLOWCH GETDATA ; : !LOWCH ctLOWCH PUTDATA ;
: TEKADR ctTEKADR GETDATA ; : !TEKADR ctTEKADR PUTDATA ;
: TEKADR0 ctTEKADR0 GETDATA ; : !TEKADR0 ctTEKADR0 PUTDATA ;
: TEKADR++ TEKADR 1+ !TEKADR ; : !+TEKADR TEKADR + !TEKADR ;
: BUSYLEN ctBUSYLEN GETDATA ; : !BUSYLEN ctBUSYLEN PUTDATA ;
: LEN ctLEN GETDATA ; : !LEN ctLEN PUTDATA ;
: NEXTADDR ctNEXTADDR GETDATA ; : !NEXTADDR ctNEXTADDR PUTDATA ;
: PREDADDR ctPREDADDR GETDATA ; : !PREDADDR ctPREDADDR PUTDATA ;
: SYNCADDR ctSYNCADDR GETDATA ; : !SYNCADDR ctSYNCADDR PUTDATA ;
: CHGCTX ctCHGCTX GETDATA ; : !CHGCTX ctCHGCTX PUTDATA ;
: FSTLONG ct1STLONG GETDATA ; : !FSTLONG ct1STLONG PUTDATA ;
TRAP NOMEMORY NOMEMORY#
: NOMEMORY# .»
No free memory» ;
TRAP OUTDATA OUTDATA#
: OUTDATA# .»
Out of data. » ;
TRAP OUTMEM OUTMEM#
: OUTMEM# .»
Out of memory. » ;
TRAP UNKCH UNKCH#
: UNKCH# .»
Unknown primitive channel:» NCHAN .D CR ;
TRAP O_NOTFND NOTFND#
: NOTFND# .»
Object not found. OID=» . CR ;
[*** информация по каналу ***]
: IC CR
.» NCHAN=» NCHAN .D SP .» LOWCH=» LOWCH .D CR
.»SYNCADDR=» SYNCADDR .D SP .»PREDADDR=» PREDADDR .D SP .»NEXTADDR=»
NEXTADDR .D CR
.» BUSYLEN=» BUSYLEN .D SP .» LEN=» LEN .D CR
.» TEKADR0=» TEKADR0 .D SP .» TEKADR=» TEKADR .D CR ;
CHANNEL DATACH «DATA.» CONNECT DATACH
7.3 Менеджервиртуальной памяти
PROGRAM $M2
B16 [физическая организация памяти]
[вычисление физического адреса и номера базового канала]
:: : POSIX [addr(i)] NCHAN C NBASECH < BR+ LEAVE [addr nchan] D
GOTO DELTA2 S( NCHAN ) TOLOW POSIX [addr(i-1)] ;
:: : TOLOW LOWCH !NCHAN ;
[Пересчет адреса в адресок нижнего уровня: TEKADR(i) -> TEKADR(i-1)]
:: : DELTA2 SYNCADDR HSIZE + TEKADR TEKADR0 — + ;
:: : IBS EON OUTDATA OUTDATA# LAST?
TEKADR POSIX TEKADR++ S( NCHAN ) !NCHAN BSGOTO
NCHAN BR 0 IBS0 1 IBS1 [2 IBS2] ELSE UNKCH ;
:: : OBS EON OUTDATA OUTDATA# LAST?
TEKADR POSIX TEKADR++ S( NCHAN ) !NCHAN BSGOTO
NCHAN BR 0 OBS0 1 OBS1 [2 OBS2] ELSE UNKCH ;
: LAST? TEKADR BUSYLEN TEKADR0 + = IF0 LEAVE NEXTBLK ;
[переход для базового канала ]
: BSGOTO [ADDR] NCHAN BR 0 BSGOTO0 1 BSGOTO1 [2 BSGOTO2] ELSE UNKCH ;
: BSGOTO0 !TEKADR ;
: BSGOTO1 C !TEKADR HSIZE+ SPOS DATACH ;
[ : BSGOTO2 C !TEKADR HSIZE+ SPOS JOURCH ;]
0 %IF
: ADDR [PARAGRAF OFFSET] + [address] ; [на данный момент пгф=1 б]
[Для файлов можно сделать неск. файлов и распределить по ним пространство]
%FI
: IBS0 TEKADR HSIZE+ MEMORY &0FF TEKADR++ ;
: IBS1 IB DATACH &0FF TEKADR++ ;
[: IBS2 IB JOURCH &0FF TEKADR++ ;]
: OBS0 &0FF TEKADR HSIZE+ ! MEMORY TEKADR++ ;
: OBS1 &0FF OB DATACH TEKADR++ ; [Запись байта]
[: OBS2 &0FF OB JOURCH TEKADR++ ;] [Запись байта]
:: : GOTO NCHAN NBASECH < BR+ BSGOTO VGOTO ;
: VGOTO TEKADR — @GOTO ;
[Переход по смещению]
:: : @GOTO C BRS @GOTO- D @GOTO+ ;
: @GOTO+ DO @GOTO1+ ;
: @GOTO- NEG DO @GOTO1- ;
: @GOTO1+
EON OUTDATA OUTDATA#
TEKADR TEKADR0 BUSYLEN + =
IF+ NEXTBLK TEKADR 1+ !TEKADR ;
: @GOTO1-
EON OUTDATA OUTDATA#
TEKADR TEKADR0 =
IF+ PREDBLK TEKADR 1- !TEKADR ;
: NEXTBLK CHGCTX IF+ SCTX NEXTADDR NOEXIST? !SYNCADDR RELCTX
TEKADR !TEKADR0 ;
: NOEXIST? [ADDR] C -1 = IF+ OUTDATA [ADDR] ;
[Pred, Next, BusyLen, Len]
:: : LCTX’ [UPCH] PUSH TEKADR ILS ILS ILS ILS POP
NCHAN E2 !NCHAN !LOWCH !LEN !BUSYLEN !NEXTADDR !PREDADDR !SYNCADDR
0 !CHGCTX ;
[Грузить параметры канала]
:: : LCTX [newch] LCTX’ 0 !TEKADR 0 !TEKADR0 ;
: RELCTX TEKADR0 TEKADR NCHAN SYNCADDR TOLOW GOTO LCTX !TEKADR !TEKADR0 ;
: PREDBLK CHGCTX IF+ SCTX PREDADDR NOEXIST? !SYNCADDR RELCTX
TEKADR BUSYLEN — !TEKADR0 ;
: IBSC [CHAN] S( NCHAN ) !NCHAN IBS ;
: ILSC S( NCHAN ) !NCHAN ILS ;
: OBSC [N CHAN] S( NCHAN ) !NCHAN OBS ;
: IOBSCC [SRC DST] C2 IBSC C2 OBSC ;
: DO_IOBSCC [SRC_CH DST_CH N] S( NCHAN )
C3 !NCHAN 0 GOTO DO IOBSCC [SRC DST] ;
: IWS IBS IBS SWB &0 ;
: ILS IWS IWS SETHI ; [SWW &0]
: OWS C OBS SWB OBS ;
: OLS C OWS SWW OWS ;
[Перейти к конечному блоку]
: GOTOENDBK NEXTADDR -1 = EX+ BUSYLEN TEKADR0 +
NEXTADDR !SYNCADDR RELCTX C !TEKADR0 !TEKADR ;
: GOBOTTOM RP GOTOENDBK BUSYLEN TEKADR0 + GOTO ;
: LENVMEM GOBOTTOM TEKADR [LEN] ; [длина виртуальной памяти]
: LASTADDR SYNCADDR LEN + HSIZE+ ;
: OBS-0 NCHAN BR 0 OBS00 1 OBS01 [2 OBS02] ELSE OBS0N ;
: OBS00 0 OBS0 ; : OBS01 0 OBS1 ; [: OBS02 0 OBS2 ;] : OBS0N 0 OBS ;
[Спецификация: Размер возрастает на N б. Если это нереально,
возникает исключительная ситуация NOMEMORY.
Опосля работы мы стоим в том же канале сначала выделенного места. ]
: UPSIZE [N] GOBOTTOM TEKADR E2 UPSIZE’ GOTO [] ;
: UPSIZE’ [N] GOBOTTOM LEN BUSYLEN — CALCOST [HARD soft] UPSIZEI
C BR0 D UPSIZEO ;
: CALCOST [N FREE] C2C2 <= BR+ COST1 COST2 [HARD soft] ;
: COST1 [N FREE] T0 E2 [0 N] ;
: COST2 [N FREE] C PUSH — POP [N-FREE FREE] ;
: UPSIZEI [N_soft] BUSYLEN + !BUSYLEN 1 !CHGCTX SCTX ;
: UPSIZEO [N_HARD] NCHAN BR 0 USO0 1 USO1 2 USO1 ELSE USON ;
: USO1 C GOBOTTOM TEKADR E2 DO OBS-0 [!TEKADR] BSGOTO
C BUSYLEN + !BUSYLEN LEN + !LEN 1 !CHGCTX SCTX ;
: USO0 NOMEMORY [Сюда можно вставить упаковку] ;
[Спецификация: увеличение размера (жестко, т.е. за счет нижнего уровня)]
: USON [N] SYNCADDR LASTADDR USON1 RELCTX [>] UPSIZE’ ;
: USON1 S( NCHAN ) TOLOW BUSYLEN = BR+ USON_ADD USON_NEW ;
[расширение повышением длины фрагмента]
: USON_ADD C2 [N SYNCADDR N] UPSIZE’ C BUSYLEN E2 — HSIZE — E2
[N LEN SYNCADDR] 3 *4 + GOTO OLS [N] [UPSIZEI] ;
[расширение созданием новейшего фрагмента]
: USON_NEW C2 [N SYNCADDR N] [GOBOTTOM] C HSIZE+ UPSIZE’
[N SYNCADDR N] C2 -1 0 C4 TEKADR PUSH WRITECTX D 4+ GOTO POP OLS [N] ;
: WRITECTX [PRED NEXT BUSY LEN] C4 OLS C3 OLS C2 OLS C OLS DD DD ;
FIX VAR UPCONST 10 ! UPCONST [Этому числу б кратно повышение]
[Увеличение размера нижнего уровня]
[увеличение физического размера этого уровня]
: SCTX CHGCTX IF0 LEAVE 0 !CHGCTX NCHAN BR 0 NOP 1 SCTX1 [2 SCTX2]
3 NOP 4 NOP ELSE SCTXN ;
: SCTXN TEKADR NCHAN LEN BUSYLEN NEXTADDR
PREDADDR SYNCADDR TOLOW GOTO 4 DO OLS !NCHAN GOTO ;
: SAVEALL NOP ; [СОХРАНИТЬ ВЕСЬ канал НА ПЕРВИЧНОМ УСТРОЙСТВЕ (ИСТОЧНИКЕ)]
: SCTX1 POS DATACH 8 SPOS DATACH BUSYLEN OL DATACH LEN OL DATACH SPOS DATACH ;
[
: SCTX2 POS JOURCH 8 SPOS JOURCH BUSYLEN OL JOURCH LEN OL JOURCH SPOS JOURCH ;
]
[Новенькая виртуальная память]
0 %IF
: NEWVM [N] TEKADR C2 HSIZE+ UPSIZE GOTO -1 -1 C3 C WRITECTX D ;
%FI
: NEWVM [N] C HSIZE+ UPSIZE TEKADR PUSH -1 -1 0 C4 WRITECTX DO OBS-0
POP [SYNCADR] ;
: END? NEXTADDR -1 = TEKADR BUSYLEN TEKADR0 + = & ;
: NEWVM1 [N] C HSIZE+ UPSIZE TEKADR PUSH -1 -1 E3 C WRITECTX WRI_DATA
POP [SYNCADR] ;
: LOADCH0 0 !NCHAN 0 !LOWCH 0 !TEKADR 0 !BUSYLEN
TOTMEMLEN !LEN 0 !TEKADR0 0 !SYNCADDR -1 !NEXTADDR -1 !PREDADDR ;
[ДЛЯ БАЗОВЫХ КАНАЛОВ LOWCH=NCHAN]
7.4 Система управления хранением объектов
PROGRAM $SOMS
B16
[СИСТЕМА УПРАВЛЕНИЯ ХРАНЕНИЕМ ОБЪЕКТОВ]
FIX LONG VAR MAXID
1 ! MAXID
: NEWID MAXID !1+ MAXID ;
: DEFMAXID 6 EL_MAX 1+ ! MAXID ;
[5 канал = ОПЕРАТИВНАЯ ПАМЯТЬ; 6 КАНАЛ = ДИСКОВАЯ память]
: L_SUHO 0 !NCHAN 0 GOTO 5 LCTX 1 !NCHAN 0 GOTO 6 LCTX ;
[создание структуры СУХО для ОП]
[9 — Размер, занимаемый элементом списка]
LONG VAR SIZE_EL 8 ! SIZE_EL
[сделать новейший объект]
ACT VAR WRI_DATA
: M.NEWOBJ [SIZE OID] 0 E2 8 5 X.NEWOBJ [] ;
: D.NEWOBJ [SIZE OID] 1 E2 8 6 X.NEWOBJ [] ;
: X.NEWOBJ [SIZE LOWCH OID SIZE_EL DIR_CHAN] C PUSH S( NCHAN ) !NCHAN UPSIZE
[.. OID] OLS [basechan] !NCHAN NEWVM1 [SYNCADDR] POP !NCHAN OLS [] ;
:: : M.VIEW 5 !NCHAN CR .»RAM:» VIEW.OBJ’ ;
:: : D.VIEW 6 !NCHAN CR .»HDD:» VIEW.OBJ’ ;
:: : A.VIEW M.VIEW D.VIEW ;
: IC.VIEW [A L] SHR SHR E2 GOTO DO IC1.V ;
: IC1.V TEKADR CR .D #> TOB SP SP ILS .D ;
: VIEW.OBJ’ 0 GOTO ILS D [Пропустили длину элемента]
CR .» OID ADDRESS» RP SHOWPAROBJ ;
: SHOWPAROBJ END? EX+ ILS C BR0 SPO1 SPO2 ;
: SPO1 D ILS D ;
: SPO2 CR .D SP ILS .D SP ;
: M.DEL [OID] 5 X.DEL ; : D.DEL [OID] 6 X.DEL ;
: A.DEL [OID] C M.DEL D.DEL ;
ACT VAR EL_AVAR
:: : X.DEL [OID NCHAN] EL_FIND [OID 1/0] IF+ EL_DEL D ;
[отыскать элемент в перечне по ID и встать на след. за OID слово]
: EL_DEL -4 @GOTO 0 OLS ;
:: : EL_FIND [OID NCHAN] » EL_COMPAR ! EL_AVAR EL_PEREBOR ;
: EL_PEREBOR !NCHAN 0 GOTO ILS D RP EL_FIND0 [OID 1/0] ;
: EL_FIND0 END? 0 E2 EX+ D ILS C BR0 D EL_AVAR ILS D ;
: EL_COMPAR [OUR_OID TEK_OID] C2 = C EX+ D ;
:: : EL_MAX [DIR-NCHAN] 0 E2 » MAX ! EL_AVAR EL_PEREBOR D [OID] ;
:: : DB.NEW !1 MAXID WOPEN DATACH
-1 OL DATACH -1 OL DATACH 14 OL DATACH 14 OL DATACH
-1 OL DATACH -1 OL DATACH 4 OL DATACH 4 OL DATACH
8 OL DATACH CLOSE DATACH
[ WOPEN JOURCH
-1 OL JOURCH -1 OL JOURCH 14 OL JOURCH 14 OL JOURCH
-1 OL JOURCH -1 OL JOURCH 4 OL JOURCH 4 OL JOURCH
8 OL JOURCH CLOSE JOURCH ]
DB.OPEN ;
: DB.CLOSE CLOSE DATACH [CLOSE JOURCH] ;
: DB.OPEN -1 !!! CHDATA
[DATA]
OPEN DATACH 1 !NCHAN 0 !TEKADR 0 !TEKADR0 1 !LOWCH
IL DATACH !PREDADDR IL DATACH !NEXTADDR 0 !SYNCADDR
IL DATACH !BUSYLEN IL DATACH !LEN 6 LCTX
[RAM]
0 !NCHAN 0 !LOWCH 0 !TEKADR 0 !BUSYLEN
TOTMEMLEN !LEN 0 !TEKADR0 0 !SYNCADDR -1 !NEXTADDR -1 !PREDADDR
» WRI_8OLS ! WRI_DATA [длина элемента каталога]
4 [<can more…] NEWVM1
[SYNCADR] GOTO 5 LCTX [4 UPSIZE 8 OLS] DEFMAXID
CHMS.INIT ;
: WRI_8OLS 8 OLS ;
7.5 Система управления каналами
PROGRAM $CHMS
3 VALUE LENGRP [Вместимость уровня приоритетов]
4 VALUE QChannels
LENGRP 3 * 1+ VALUE LenPrioQue [длина очереди приоритетов. Очередь — с 0]
: N2CH [N] QChannels * 0A + [NCHAN] ;
LenPrioQue 1+ N2CH 10 * LONG VCTR CHDATA [память характеристик каналов]
[для каждого канала можно завести 16. различных параметров]
: CHMS.INIT 0 !!! PrioQueOID
0 LenPrioQue DO SETNQ D ;
: SETNQ C C ! PrioQueNUM C N2CH [NUM CHAN1]
[вычислили номер канала для очередного объекта кэша]
C C3 1 ! Channels
1+ C C3 2 ! Channels
1+ C C3 3 ! Channels
1+ C C3 4 ! Channels D 1+ ;
[при воззвании к объекту необходимо повысить его Ценность]
: HIPRIODD D HIPRIO ;
: HIPRIO [OID] FINDOID C BR- D HIPRIO1 ;
: HIPRIO1 [N] C LENGRP / D C IF+ 1- LENGRP * [N N’] E2 UPOID [] ;
[Новейший объект добавляется на последн. поз-ю, а потом к нему примен. HIPRIO]
LenPrioQue LONG VCTR PrioQueOID [список OID]
LenPrioQue Word VCTR PrioQueNUM [номера записей в массиве каналов]
LenPrioQue QChannels 2 Word ARR Channels
[обменять в очереди с соседним вышестоящим]
: SWP2OBJ [N] C IF0 LEAVE C PrioQueOID C2 1- PrioQueOID
C3 ! PrioQueOID C2 1- ! PrioQueOID
C PrioQueNUM C2 1- PrioQueNUM C3 ! PrioQueNUM C2 1- ! PrioQueNUM 1- [N-1] ;
: SWP2OBJDD SWP2OBJ DD ;
: FINDOID [OID] 0 LenPrioQue DO CMPOID E2D C LenPrioQue = IF+ T-1 [-1/N] ;
: CMPOID [OID] C PrioQueOID [OID N OID(N)] C3 = EX+ 1+ ;
[Поднять объект от N_DOWN к N_UP в очереди]
: UPOID [N_UP N_DOWN ] C E3 — DO SWP2OBJ D [] ;
[Просмотр очереди (кэш объектов)]
: Q.VIEW 0 LenPrioQue
.» M.Hdr D.Hdr M.Dat D.His»
DO QELVIEW D ;
: QELVIEW [n] CR C C 2 TON LENGRP / E2D BR0 #- #) TOB
C PrioQueOID .» OID=» .D C PrioQueNUM .» Num=» .
.» Channels= » 1 QChannels DO PriNCH
DD 1+ ;
: PriNCH [NOID NCH] C2C2 Channels 4 TON SP SP 1+ [NOID NCH+1] ;
7.6 Работа с базисными объектами
PROGRAM $SYSOBJS
B16
LONG VAR ADRSTR LONG VAR LENSTR
0 VALUE N_OID 4 VALUE N_BHR 8 VALUE N_KH
0C VALUE N_TRC 10 VALUE N_VAL 14 VALUE N_HIS
13 VALUE JRECLEN
: G_OID N_OID GOTO ; : W_OID G_OID OLS ;
: G_BHR N_BHR GOTO ; : W_BHR G_BHR OLS ;
: G_KH N_KH GOTO ; : W_KH G_KH OLS ;
: G_TRC N_TRC GOTO ; : W_TRC G_TRC OLS ;
: G_VAL N_VAL GOTO ; : W_VAL G_VAL OLS ;
: G_HIS N_HIS GOTO ; : W_HIS G_HIS OLS ;
18 VALUE SZ_HDROBJ
: W_NULLBLK -1 OLS -1 OLS 0 OLS 0 OLS ;
[Описание системных объектов]
ACT VAR DATWR
LONG VAR OIDV
LONG VAR VALINT
[**** ROOT ****]
SZ_HDROBJ HSIZE+ HSIZE+ 4+ VALUE SIZE_ROOT
:: : CLONE_ROOT » DATWRROOT ! DATWR NEWOBJ1 ;
:: : CLONE_INT ! VALINT » DATWRINT ! DATWR NEWOBJ1 ;
:: : CLONE_SET 4 CLONE_INT ;
:: : CLONE_SEQ 4 CLONE_INT ;
:: : CLONE_AGG 0C CLONE_INT ;
:: : CLONE_STR [A L] ! LENSTR ! ADRSTR » DATWRSTR ! DATWR
LENSTR SIZE_ROOT + 4- ! SIZE_X NEWOBJ3 ;
:: : SET_BHR [OID_BHR OID] N_BHR E2 SET_X1 ;
:: : SET_KH [OID_KH OID] N_KH E2 SET_X1 ;
: SET_X1 [ADR OID] C2C2 N_TRSC E2 NEWJREC
C LOADOBJ FINDOID C BR- DD SET_X11 ;
: SET_X11 PrioQueNUM 2 Channels !NCHAN GOTO OLS ;
:: : SET_INT [int oid] C HIPRIO PUSH ! VALINT 4 » OLSI POP NEWDREC ;
: OLSI VALINT OLS ;
:: : GET_INT [OID] TODATA ILS ;
:: : TODATA [OID] C LOADOBJ C HIPRIO FINDOID PrioQueNUM
3 Channels !NCHAN 0 GOTO ;
:: : SET_STR [A L OID] C HIPRIO
PUSH ! LENSTR ! ADRSTR LENSTR » OLSS POP NEWDREC ;
: OLSS ADRSTR LENSTR DO DWS1 D ;
ACT VAR BYTE_STR
:: : PRINT_STR » PRIS ! BYTE_STR ACCESS_STR ;
:: : COPY2BUF_STR » C2BUF ! BYTE_STR ACCESS_STR ;
:: : ACCESS_STR [OID] TODATA LENVMEM 0 GOTO DO BYTE_STR ;
: PRIS IBS TOB ;
: C2BUF IBS ABUF !TB !1+ ABUF ;
: DD_ROOT
OIDV OLS 0 OLS 0 OLS 0 OLS SZ_HDROBJ HSIZE+ OLS [val]
SZ_HDROBJ OLS [his]
W_NULLBLK [W_NULLBLK] DATWR ;
LONG VAR SIZE_X
: DATWRROOT -1 OLS -1 OLS 0 OLS 4 OLS 0 OLS ;
: DATWRINT -1 OLS -1 OLS 4 OLS 4 OLS VALINT OLS ;
: DATWRSTR -1 OLS -1 OLS LENSTR OLS LENSTR OLS ADRSTR LENSTR DO DWS1 D ;
: DWS1 [A] C @B OBS 1+ ;
: NEWOBJ1 [] SIZE_ROOT ! SIZE_X NEWOBJ3 ;
: NEWOBJ3 » DD_ROOT ! WRI_DATA
NEWID C ! OIDV SIZE_X C2 D.NEWOBJ [OID] ;
9 VALUE LCH
LCH LONG VCTR CLONEHDR VAR DATCH LONG VAR LENVMEM1
:: : CLONE [OID] C HIPRIO
C LOADOBJ FINDOID PrioQueNUM C PUSH 2 Channels !NCHAN 0 GOTO
CLONE1 []
» CC_ROOT ! WRI_DATA NEWID C 0 ! CLONEHDR SZ_HDROBJ HSIZE+ C2 D.NEWOBJ
[OID] POP 3 Channels C ! DATCH !NCHAN LENVMEM C ! LENVMEM1
C2 [OID_NEW LEN OID_NEW] CLONE_DATA [OID_NEW] ;
: CLONE1
ILS 1 ! CLONEHDR [BHR] ILS 2 ! CLONEHDR [KH]
ILS 3 ! CLONEHDR [TRC] 0 4 ! CLONEHDR
SZ_HDROBJ 5 ! CLONEHDR -1 6 ! CLONEHDR
-1 7 ! CLONEHDR 0 8 ! CLONEHDR
0 9 ! CLONEHDR ;
: CCR1 [N] C CLONEHDR OLS 1+ ;
: CC_ROOT 0 LCH 1+ DO CCR1 D ;
: CLONE_DATA [LEN OID] » COPY_DATA E2 NEWDREC [] ;
: COPY_DATA [] DATCH NCHAN LENVMEM1 DO_IOBSCC DD ;
:: 0 VALUE N_TRSC
[Запись новейших данных, запись в журнальчик]
: NEWDREC [SIZED PROC OID] N_VAL N_TRSC C3 NEWJREC FINDOID
PrioQueNUM [SIZE PROC N] C PUSH
2 Channels !NCHAN
[SIZED PROC] ! WRI_DATA NEWVM1 G_VAL C OLS [ADR_DATA]
[перечитать канал данных]
GOTO POP 3 Channels LCTX [] ;
[новенькая запись в журнальчик. На вх: номер транз. и адресок из заголовка]
: NEWJREC [addr_hdr TRANS OID] C LOADOBJ FINDOID PrioQueNUM
[. TRANS N] C PUSH 4 Channels
!NCHAN JRECLEN UPSIZE OLS POP NCHAN PUSH 2 Channels !NCHAN
C GOTO ILS POP !NCHAN
E2 OWS OLS W_DATIME [] ;
B10
[Запись текущего времени]
: W_DATIME 1979 OWS 12 OBS 31 OBS TMGET TMS ;
: TMS [num] N2T GBR E2 GBR E2 GBR E2 OBS OBS OBS 100 * OWS ;
B16
[просмотр журнала объекта]
[Переключиться на журнальчик]
: OBJ.J [OID]
C LOADOBJ FINDOID PrioQueNUM 4 Channels !NCHAN ;
: JVIEW [oid] CR .»Updated data:»
OBJ.J LENVMEM JRECLEN / D 0 GOTO DO JVIEW1 ;
: JVIEW1 CR .»Trans= » ILS .D SP
IWS BR N_BHR .»Behav.=» N_VAL .»AddrVal=» N_KH .»Knowhow=»
ELSE .»?????? =» ILS SP .D SP JDATAV1 ;
: JDATAV1 S( BASE@ ) B10 IWS IBS IBS 2 TON #. TOB 2 TON #. TOB 4 TON
SP SP #: POS2 #: POS2 #. POS2 # IWS 4 TON TOB ;
: POS2 [B] IBS 2 TON TOB ;
[Определить размер объекта в памяти = заголовок + данные]
: SIZEMEMOBJ [N] C PrioQueOID BR0 T0 SMEMO1 [0/size] ;
: SMEMO1 3 Channels !NCHAN LENVMEM HSIZE+ HSIZE+ SZ_HDROBJ + [size] ;
7.7 Выполнение действий
PROGRAM $M3
[Выполнение действий (knowhow)]
FIX 1000 BYTE VCTR BUFTXT [Буфер для текста действий]
FIX LONG VAR ABUF
: BEGABUF 0 ‘ BUFTXT ! ABUF ;
: RUNCMD [OID_KH] BEGABUF «KH$» S2BUF N2BUF ABUF BEGABUF ABUF E2 C2 —
TEXEC ;
: MAKECMD [OID_KH] BEGABUF «: KH$» S2BUF C N2BUF # ABUF !TB !1+ ABUF
COPY2BUF_STR » ; » S2BUF
ABUF BEGABUF ABUF E2 C2 — TEXEC ;
: S2BUF [A L] DO S2BUF1 D ;
: S2BUF1 C @B ABUF !TB !1+ ABUF 1+ ;
: N2BUF [N] 8 DO CTN-SB D 8 [C1 .. Cn n] DO CTB ;
: CTN-SB [N] C 0F & #0 + E2 -4 SHT [C N’] ;
: CTB ABUF !TB !1+ ABUF ;
LONG VAR OIDK
: NEW_VOC «PROGRAM $KH_VOC» TEXEC ;
: RUN_KH [OID_KH] NEW_VOC C MAKECMD RUNCMD ;
7.8 кэширование объектов
PROGRAM $LS_CASH
[ Каналы: 1 — Header M.Obj 2 — Header D.Obj 3 — M.Data 4 — D.History ]
[Считаем, что все объекты — стабильные]
: LOADOBJ [OID] C FINDOID [искали в кэше] C BR- LOADOBJ-1 DD ;
: LOADOBJ-1 D [OID] [Отыскиваем в каталоге БД объект] [C] LOADOBJ1 [LOADOBJ2]
LenPrioQue 1- HIPRIO1 [] ;
: LOADOBJ1 6 LOADOBJ3 ;
[открыть дисковый объект в кэше]
: LOADOBJ3 [OID NDIRCH] EL_FIND [OID 1/0] IF0 O_NOTFND [Нет такого объекта]
C LenPrioQue 1- ! PrioQueOID [Внесли в кэш идентификатор объекта]
ILS [OID ADDR_MEM] [получили адрес размещения в дисковой памяти]
LenPrioQue 1- PrioQueNUM
[получили номер отведенной для работы с объектом группы каналов]
[OID ADDR_MEM NUM]
C 2 Channels [OID ADDR_MEM NUM CHANOBJ]
NCHAN NBASECH — !NCHAN [получили номер базового канала]
C3 GOTO LCTX [OID ADDR_MEM NUM] [загрузили заголовок дискового объекта]
E2D [O N]
C 4 Channels [OID NUM CHANHIST] [получили канал для истории]
G_HIS ILS
[O N C HISTORY] [HISTORY д.б. <>0]
GOTO NCHAN E2 LCTX [Открыли историю в канале] !NCHAN [O N]
C 3 Channels G_VAL ILS GOTO LCTX [временно открыли канал данных
впрямую с твердого диска]
[LOADDM]
NOP [тут необходимо установиться на объект в памяти и канал данных перекл. на него]
DD [] ;
VAR NCHANDAT
VAR NCHANOBJ LONG VAR LENDAT
: COPY_DAT1 [] NCHANOBJ 0 GOTOC [NCHANOBJ] NCHAN 0 GOTO 8 DO_IOBSCC D 14 OLS
0 OLS 10 GOTOC NCHAN 4 DO_IOBSCC DD -1 OLS -1 OLS LENDAT OLS LENDAT OLS
COPY_DAT ;
: GOTOC [NCHAN n] C2 S( NCHAN ) !NCHAN GOTO [NCHAN] ;
: COPY_DAT [] NCHANDAT NCHAN [SRC_CH DST_CH]
C2 !NCHAN LENVMEM [SRC_CH DST_CH LEN] 0 GOTO DO_IOBSCC DD ;
8. Контрольный пример, демонстрирующий способности технологии
DB.NEW
Сделаем объект «Поведение клоуна» для клоуна
[] «объект «Клоун»:
[.. ] «Клоун» CLONE_STR
[.. oid_str] CLONE_AGG
[.. oid_str oid] SET_NAMEOBJ [.. oid]
Определим ему цвет
«X» NEWFID SET_NAMEFID [fid] OIDINT «Клоун» NAMEOID AGG+F []
В ДССП можно найти новое слово
: NEWFIELD [ «Имя объекта» «имя поля»] NEWFID SET_NAMEFID [A L FID]
OIDINT C4C4 NAMEOID AGG+F DD [] ;
«Клоун» «Y» NEWFIELD
«Клоун» «цвет» NEWFIELD
Сделаем способы.
Сделать способ «Идти».
«<тело способа «Идти» >» CLONE_STR [oid_kh]
[oid_kh] «Идти» CLONE_STR E2 C2 SET_KH [OID_STRKH]
«способы
…
Подготовка для вызова способа по идентификатору:
«Идти» CLONE_STR C «Клоун» NAMEOBJ METHOD? E2 DELOBJ
Подготовка для вызова способа по имени:
«Идти» CLONE_STR
Вызов
[oid] 0 «Клоун» NAMEOBJ [oid_mth 0 oid_obj] SEND
9. Оценка трудозатратности разработки ПО с внедрением обычного и предлагаемого подходов
В этом разделе будет проведен высококачественный анализ трудозатратности. Это соединено, до этого всего, с индивидуальностью языка реализации, хорошего от традиционных ЯВУ.
Дальше, в качестве примера, рассматривается последующая задачка:
Клиенты имеют счета. Любой счет прирастить на 10% и опосля этого пометить юзера как получившего премию.
9.1 Табличные базы данных с низкоуровневыми операциями доступа
В качестве примера можно привести FoxPro 2.6 [11]. В ней есть недостающее для обыденных нужд подмножество SQL (SELECT, INSERT INTO); обычно взаимодействие с БД происходит при помощи операторов REPLACE, SCATTER, GATHER, SCAN … ENDSCAN и конкретного присвоения с указанием в качестве префикса поля имени области, в какой открыта таблица. Такие программки фактически непереносимы на клиент-серверные технологии, логика программ очень сложна и приводит при программировании к тяжело обнаруживаемым ошибкам. Плюсами же являются простота реализации языка таковых СУБД и малая требовательность к ресурсам.
Программный код обработки (MS FoxPro 2.6):
SELECT
CLIENT
SCAN
SELECT
SCHET
REPLACE
SUMMA WITH
SUMMA*1.1 FOR
SCHET.NUM_SCH=CLIENT.NUM_SCH
SELECT
CLIENT
REPLACE
PREMIA WITH
.T.
ENDSCAN
9.2 Реляционные базы данных
Реализация языка SQL дозволяет работать с базой данных только средствами SQL. Поддерживаются триггеры, дела меж таблицами, хранимые процедуры. Это обычные клиент-серверные СУБД. Управление целостностью данных возлагается на СУБД. Триггеры разрешают вынести фактически все проверки из логики программки. Недочетом является необходимость нормализации таблиц, что затрудняет добавление новейших таблиц при сопровождении программного средства, а время от времени просит перенормализации, что тянет за собой необходимость изменять программный код, а означает, и новейшие ошибки.
Программный код обработки (MS Visual FoxPro 3.0 и выше):
BEGIN TRANSACTION
UPDATE
SCHET SET
SUMMA=SUMMA*1.1
WHERE
NUM_SCH IN (SELECT
NUM_SCH FROM
CLIENT)
UPDATE
CLIENT SET
PREMIA = .T.
END TRANSACTION
9.3 Объектно-ориентированные базы данных
Разрешают хранить данные случайной степени трудности (детали САПР) и вида (звук, изображение). Разрешают программировать на уровне инфологической модели, т.е. исчезают заботы о нормализации. Новейшие методы могут работать сразу со старенькыми, обеспечивая преемственность. к примеру, если бухгалтерские проводки в последующем году проходят по новейшей схеме, переход на подходящую схему зависимо от даты СУБД выполнит сама.
Реализация для ООБД на формальном языке:
{«*»(1.1) ~> psumma
(sClient.num_sch=Schet.num_sch
(Schet, Client)), «:=»(True) ~> pPremia
(Client)}
порядок действий:
1
Умножение счетов на 1.1
1.1Операция селекции выбирает огромное количество счетов
1.2Операция проекции выбирает интересующую часть счета – сумму
1.3На суммы посылается операция «помножить» с аргументом 1.1
2
Пометка клиентов, как получивших премию
2.1Операция проекции выделяет интересующую часть инфы о клиенте – атрибут «премия»
2.2Операция присвоения посылается на выделенный атрибут «премия» с аргументом True
Примечание 1:
В операция селекции и проекции имеется некое отличие от операций реляционной алгебры. к примеру, операция проекции, выбирающая сумму, возвращает огромное количество сумм. По сути огромное количество сумм содержит не суммы, а идентификаторы атомарных объектов, хранящих суммы. Потому огромное количество может содержать несколько схожих сумм и не пропадает связь данных с необычным объектом-хранителем (счетом).
Примечание 2
: Оба конфигурации происходят в границах одной транзакции, поскольку эти деяния являются экземплярами 1-го огромного количества. Оба порядка действий: «поначалу помножить, позже – пометить» и «Поначалу пометить, позже – помножить» равноправны, так как деяния хранятся в огромном количестве. Если порядок важен, т.е. 2-ое действие употребляет итог первого, то нужно использовать не огромное количество, а опослядовательность.
Операции над сложными структурами транзитивно распространяются на операции над компонентами по методам, описанным выше в разделе «Уточнение способов решения задачки». Таковым образом, нет нужды в почти всех вариантах писать циклы, обработку вложенных структур. Внедрение итераторов дозволяет создавать собственный алгоритм выбора частей для обработки циклов.
9.4 Будущее внедрения разных баз данных
В прошлые годы много внимания уделялось вопросцу трудозатратности разработки программного обеспечения. Возросшая сложность программ и объемы применяемых данных не разрешают начать разрабатывать новейший продукт «с нуля». сейчас вперед выходят технологии, дозволяющие создавать просто сопровождаемые программки.
Но реляционные базы данных, быстрее всего, как и раньше останутся в качестве дешевых средств разработки приложений и, в почти всех вариантах, естественных средств представления предметной области, подобно радио и кино, которых не вытеснило телевидение.
10. Литература
[1] О.И.Авен Я.А.Коган “Управление вычислительным действием” М. Энергия 1978
[2] А.М.Андреев Д.В.Березкин, Ю.А.Кантонистов «Среда и хранилище: ООБД»
мир ПК №4 1998 (стр 74-81)
[3] М. Аткинсон, Ф. Бансилон и др. «Манифест систем объектно-ориентированных баз данных», СУБД № 4 1995
[4] В.Бобров «Объектно-ориентированные базы данных, мультимедийные типы данных и их обработка» Read.Me №4, 1996
[5] Н.П.Брусенцов, В.Б.Захаров и др. «Развиваемый адаптивный язык РАЯ диалоговой системы программирования ДССП» Москва МГУ 1987
[6] Бурцев А.А «Параллельное программирование. Учебное пособие по курсу «Операционные системы» — Обнинск : ИАТЭ, 1994 — 90 с.
[7] Бурцев А.А. «Сопрограммный механизм в ДССП как база для построения мониторов параллельных действий»
[8] Г.Буч «Объектно-ориентированное проектирование (с примерами внедрения)» М.Конкорд 1992
[9] К.Дж.Дейт «Введение в системы баз данных» 1998 Киев Диалектика
[10] Мутушев Д.М. Филиппов В.И. «Объектно-ориентированные базы данных» Программирование. — М., 1995 №6 стр. 59-76
[11] В.Ремеев «FoxPro. версия 2.5 для MS-DOS. Описание установок и функций» М. «Мистраль» 1994
[12]СУБД № 2 1995 «Системы баз данных третьего поколения: Манифест»
[13]СУБД № 1 1996 «Эталон систем управления объектными базами данных ODMG-93: лаконичный обзор и оценка состояния» Л.А.Калиниченко
[14]СУБД № 1 1996 «ТРЕТИЙ МАНИФЕСТ» Х.Дарвин, К.Дэйт
[15]СУБД № 5-6 1996 “Введение в СУБД часть 9” стр. 136-153 С.Д. Кузнецов
[16]Data & Knowledge Engineeging №15 (1995) стр 169-183 “Selection of object surrogates to support clustering” Jukka Teuhola
[17] Data & Knowledge Engineering. Amsterdam 1996 Том 18 №1 стр.29-54 «Unifying data, behaviours, and messages in object-oriented databases» Sylvia L. Osborn, Li Yu
[18] IEEE Transactions On Knowledge And Data Engineering Том 7 №2 Апрель 1995 стр. 274-292 «Security Constraint Processing in a Multilevel Secure Distributed Database Management System» B.Thuraisingham, W.Ford
[19] Journal of systems and software — N.Y., 1996 Том 35 №3 стр. 169-183
Shah P. Wong J. «Concurency control in a object-oriented data base system»
Документы в Internet (HTTP://www.citforum.ru):
[20] В. Индриков, АО ВЕСТЬ “Объектно-ориентированный подход и современные мониторы транзакций”
[21] Л.Калиниченко “Архитектуры и технологии разработки интероперабельных систем”, Институт заморочек информатики ран
[22] С.Д. Кузнецов «Базы современных баз данных»
[23] С. Кузнецов “Сохранность и целостность, либо Худший неприятель для себя — это ты сам”
]]>