
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                      ОПЕРАЦИОННАЯ СИСТЕМА
 
                              МОС ВП
 
 
 
                СИСТЕМА УПРАВЛЕНИЯ ДАННЫМИ СУД-32
 
 
 
                      ПРОЕКТИРОВАНИЕ ФАЙЛОВ
 
 
 
                     Руководство пользователя
 
 
 
                           00152-01 92 01
 
                             Листов 393
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                              1987
 
 
 
 
 
 
 
 
 
 
                             - 2 -
 
                         00152-01 92 01
 
 
 
 
 
 
                            АННОТАЦИЯ
 
 
 
 
        Данный документ  содержит  сведения,  необходимые  для
 
   проектирования файлов системы управления данными СУД-32  (в
 
   дальнейшем СУД-32).
 
        Изучение  данного  документа  рекомендуется  системным
 
   программистам, ответственным за создание и поддержку  рабо-
 
   тоспособности файлов СУД-32.
 
        Для пользователей указанной категории необходимо хоро-
 
   шее знакомство с соглашениями о файлах, принятыми в  опера-
 
   ционной системе МОС ВП (в дальнейшем МОС ВП), а также  вла-
 
   дение языком оператора системы DCL.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                             - 3 -
 
                         00152-01 92 01
 
 
 
 
 
 
                           СОДЕРЖАНИЕ
 
 
 
 
 
                                                    

 
   1.  ОБЩАЯ ХАРАКТЕРИСТИКА СУД-32                          13
 
 
   1.1.    Основные понятия и определения                   15
 
   1.2.    Носители файлов                                  17
 
   1.2.1.    Магнитные диски                                18
 
   1.2.1.1.  Блок начальной загрузки                        23
 
   1.2.1.2.  Собственный блок                               24
 
   1.2.1.3.  Заголовки файлов                               24
 
   1.2.2.    Магнитные ленты                                25
 
   1.3.    Защита данных на томе                            26
 
   1.4.    Сервисные возможности СУД-32                     27
 
   1.4.1.    Характерстики языка FDL                        28
 
   1.4.2.    Управляющие блоки СУД-32                       29
 
   1.4.3.    Сервисные функции СУД-32                       30
 
   1.5.    Обслуживающие программы СУД-32                   30
 
   1.5.1.    Программа ANALYZE                              31
 
   1.5.2.    Программа CONVERT                              32
 
   1.5.3.    Программа CONVERT/RECLAIM                      33
 
   1.5.4.    Программа CREATE/FDL                           34
 
   1.5.5.    Программа EDIT/FDL                             34
 
   1.6.    Системные ресурсы при работе СУД-32              35
 
   1.6.1.    Использование памяти                           35
 
   1.6.2.    Ограничения асинхронного ввода-вывода          38
 
   1.6.3.    Квота захвата записи                           38
 
 
                             - 4 -
 
                         00152-01 92 01
 
 
   1.6.4.    Ограничения на число открытых файлов           38
 
   1.7.    Установка умолчаний процессам системы            38
 
 
   2.  ПРОЕКТИРОВАНИЕ ФАЙЛОВ                                40
 
 
   2.1.    Концепция записи                                 41
 
   2.1.1.    Режимы доступа к записям                       41
 
   2.1.1.1.  Последовательный доступ                        43
 
   2.1.1.2.  Прямой доступ по значению ключа или  по
 
             относительному номеру записи                   45
 
   2.1.1.3.  Прямой доступ по адресу записи в файле         47
 
   2.1.2.    Форматы записей                                48
 
   2.1.2.1.  Записи фиксированной длины                     48
 
   2.1.2.2.  Записи переменной длины                        49
 
   2.1.2.3.  Записи переменной  длины  с  постоянной
 
             управляющей частью                             52
 
   2.1.2.4.  Формат потока                                  54
 
   2.2.    Концепции организации файлов                     55
 
   2.2.1.    Структура последовательного файла              55
 
   2.2.2.    Структура относительного файла                 56
 
   2.2.3.    Структура индексного файла                     59
 
   2.2.4.    Сравнение организаций файлов                   64
 
   2.3.    Эффективность                                    69
 
   2.3.1.    Вопросы проектирования                         69
 
   2.3.1.1.  Быстродействие программы                       70
 
   2.3.1.2.  Размер памяти                                  72
 
   2.3.1.3.  Разделяемый доступ к файлу                     73
 
   2.3.2.    Компромиссы  проектирования  файлов   и
 
             прикладных программ                            74
 
   2.3.2.1.  Начальное распределение пространства           75
 
   2.3.2.2.  Непрерывность файла                            76
 
 
                             - 5 -
 
                         00152-01 92 01
 
 
   2.3.2.3.  Расширение файла                               76
 
   2.3.2.4.  Единицы ввода-вывода                           78
 
   2.3.2.5.  Задание множества областей                     80
 
   2.3.2.6.  Задание степени заполнения                     81
 
   2.3.2.7.  Множество буферов                              81
 
   2.3.2.8.  Глобальные буферы                              83
 
   2.3.2.9.  Обработка  с  опережающим   чтением   и
 
             запаздывающей записью                          83
 
   2.3.2.10. Обработка с отложенной записью                 84
 
   2.4.    Настройка последовательного файла                85
 
   2.4.1.    Пересечение границ блоков                      86
 
   2.4.2.    Мультиблоки                                    86
 
   2.4.3.    Число буферов                                  87
 
   2.4.4.    Задание    опережающего    чтения     и
 
             запаздывающей записи                           88
 
   2.5.    Настройка относительного файла                   89
 
   2.5.1.    Размер бакета                                  89
 
   2.5.2.    Число буферов                                  91
 
   2.5.3.    Глобальные буферы                              93
 
   2.5.4.    Использование отложенной записи                94
 
   2.6.    Настройка индексного файла                       95
 
   2.6.1.    Структура файла                                95
 
   2.6.1.1.  Прологи                                        96
 
   2.6.1.2.  Структура первичного индекса                   97
 
   2.6.1.3.  Структуры альтернативных индексов             100
 
   2.6.1.4.  Структура записей данных                      101
 
   2.6.1.5.  Ключи                                         101
 
   2.6.1.6.  Области                                       103
 
   2.6.2.    Оптимизация эффективности файла               107
 
   2.6.2.1.  Размер бакета                                 107
 
 
                             - 6 -
 
                         00152-01 92 01
 
 
   2.6.2.2.  Степень заполнения                            109
 
   2.6.2.3.  Число буферов                                 111
 
   2.6.2.4.  Глобальные буферы                             113
 
   2.6.2.5.  Использование отложенной записи               113
 
 
   3.  СОЗДАНИЕ ФАЙЛОВ И ИХ ПЕРВИЧНАЯ ЗАГРУЗКА             116
 
 
   3.1.    Характеристики файла                            116
 
   3.1.1.    Использование управляющих блоков СУД-32       117
 
   3.1.1.1.  Блок доступа к файлу                          117
 
   3.1.1.2.  Блоки дополнительных атрибутов                117
 
   3.1.2.    Использование языка описания файла            118
 
   3.1.2.1.  Использование редактора FDL                   119
 
   3.1.2.2.  Некоторые  особенности   проектирования
 
             файла                                         131
 
   3.1.2.3.  Установка  характеристик   для   файлов
 
             описаний                                      137
 
   3.1.3.    Использование FDL-подпрограмм                 139
 
   3.2.    Создание файла                                  141
 
   3.2.1.    Создание файла из прикладной программы        141
 
   3.2.2.    Использование  обслуживающей  прогамммы
 
             CREATE                                        142
 
   3.2.3.    Использование  обслуживающей  программы
 
             CONVERT                                       143
 
   3.2.4.    Использование подпрограммы FDL$CREATE         143
 
   3.3.    Защита файлов                                   146
 
   3.3.1.    Защита,     основанная     на      коде
 
             идентификации пользователя                    147
 
   3.3.2.    Списки управления доступом                    148
 
   3.4.    Загрузка файла данными                          148
 
   3.4.1.    Функции обслуживающей программы CONVERT       148
 
 
                             - 7 -
 
                         00152-01 92 01
 
 
   3.4.2.    Подпрограммы  обслуживающей   программы
 
             CONVERT                                       150
 
   3.5.    Обзор возможностей создания файла               154
 
   3.5.1.    Функции диспозиции файла                      154
 
   3.5.2.    Характеристики файла                          155
 
   3.5.3.    Распределение и позиционирование файлов       158
 
 
   4.  СПЕЦИФИКАЦИИ ФАЙЛОВ И ИХ ИСПОЛЬЗОВАНИЕ В СУД-32     161
 
 
   4.1.    Понятие спецификации файла                      162
 
   4.1.1.    Форматы спецификации файла                    163
 
   4.1.1.1.  Локальный узел                                164
 
   4.1.1.2.  Удаленный узел                                165
 
   4.1.2.    Использование значений по умолчанию для
 
             спецификации файла                            166
 
   4.2.    Логические   имена   и   синтаксический
 
           анализ                                          168
 
   4.2.1.    Пример использования логических имен          169
 
   4.2.2.    Типы логических имен                          171
 
   4.2.3.    Синтаксический   анализ    спецификации
 
             файла                                         172
 
   4.3.    Использование одной спецификации  файла
 
           для поиска нескольких файлов                    175
 
   4.3.1.    Обработка одного файла                        184
 
   4.3.2.    Обработка нескольких файлов                   186
 
   4.3.3.    Обработка одного или нескольких файлов        188
 
 
   5.  УСЛОЖНЕННОЕ ИСПОЛЬЗОВАНИЕ СПЕЦИФИКАЦИЙ ФАЙЛА        190
 
 
   5.1.    Применение значений по умолчанию                190
 
   5.2.    Особенности синтаксического  анализа  в
 
           СУД-32                                          196
 
 
                             - 8 -
 
                         00152-01 92 01
 
 
   5.2.1.    Проверка на открытие при  помощи  блока
 
             имени                                         197
 
   5.2.2.    Форматы спецификации файла и трансляции
 
             логических имен                               199
 
   5.2.3.    Специальные       соглашения        для
 
             синтаксического анализа                       202
 
   5.2.3.1.  Соглашения синтаксического анализа  для
 
             списка поиска                                 202
 
   5.2.3.2.  Соглашения синтаксического анализа  для
 
             спецификации связанного файла                 205
 
   5.2.3.3.  Синтаксический   анализ    спецификации
 
             входного файла                                207
 
   5.2.3.4.  Синтаксический   анализ    спецификации
 
             выходного файла                               208
 
   5.3.    Соглашения  по  синтаксису  каталога  и
 
           конкатенация каталогов                          211
 
   5.3.1.    Использование  нормального   синтаксиса
 
             каталога                                      212
 
   5.3.2.    Применение     корневого     синтаксиса
 
             каталога                                      215
 
   5.3.3.    Использование   корневого    синтаксиса
 
             каталога                                      216
 
   5.3.4.    Конкатенация   спецификаций    корневых
 
             каталогов                                     219
 
   5.3.5.    Пример использования корневого каталога       223
 
   5.4.    Использование  файлов,  постоянных  для
 
           процесса                                        226
 
 
   6.  РАЗДЕЛЕНИЕ ФАЙЛОВ И БУФЕРИЗАЦИЯ                     230
 
 
   6.1.    Разделение файла                                231
 
 
                             - 9 -
 
                         00152-01 92 01
 
 
   6.1.1.    Типы разделения файла и потоки  доступа
 
             к записям                                     232
 
   6.1.2.    Блокированное межпроцессное  разделение
 
             файла                                         241
 
   6.1.3.    Межпроцессное     разделение     файла,
 
             блокированное пользователем                   245
 
   6.2.    Захват записей                                  246
 
   6.2.1.    Автоматический захват записей                 249
 
   6.2.2.    Ручное освобождение записи                    251
 
   6.2.3.    Управление захватом  записи  и  снятием
 
             захвата                                       253
 
   6.2.4.    Методы программирования для разделяемых
 
             файлов                                        259
 
   6.2.4.1.  Ожидание записей                              259
 
   6.2.4.2.  Повторная попытка при  ошибках  захвата
 
             записи                                        261
 
   6.3.    Методы    локальной    и    разделяемой
 
           буферизации                                     263
 
   6.3.1.    Режимы передачи записей                       263
 
   6.3.2.    Понимание буферизации                         264
 
   6.3.3.    Буферизация для последовательных файлов       269
 
   6.3.4.    Буфферизация для относительных файлов         270
 
   6.3.5.    Буферизация для индексных файлов              272
 
   6.3.6.    Использование  глобальных  буферов  для
 
             разделяемых файлов                            274
 
 
   7.  ОБРАБОТКА ЗАПИСЕЙ                                   278
 
 
   7.1.    Операции  над  записями  и  организация
 
           файла                                           279
 
   7.1.1.    Определение режима доступа к записям          282
 
 
                            - 10 -
 
                         00152-01 92 01
 
 
   7.1.2.    Обработка последовательных файлов             284
 
   7.1.2.1.  Последовательный доступ                       285
 
   7.1.2.2.  Прямой доступ                                 285
 
   7.1.3.    Обработка относительных файлов                286
 
   7.1.3.1.  Последовательный доступ                       287
 
   7.1.3.2.  Прямой доступ                                 287
 
   7.1.4.    Обработка индексных файлов                    288
 
   7.1.4.1.  Последовательный доступ                       290
 
   7.1.4.2.  Прямой доступ                                 290
 
   7.1.5.    Доступ по адресу в файле                      293
 
   7.1.6.    Блочный ввод-вывод                            295
 
   7.2.    Текущий контекст записи                         296
 
   7.2.1.    Текущая запись                                299
 
   7.2.2.    Следующая запись                              300
 
   7.3.    Синхронные и асинхронные операции               302
 
   7.3.1.    Использование синхронных операций             304
 
   7.3.2.    Использование асинхронных операций            305
 
   7.4.    Операции над записями                           307
 
   7.4.1.    Поиск и чтение записей                        307
 
   7.4.2.    Занесение записей                             309
 
   7.4.3.    Корректировка записей                         311
 
   7.4.4.    Удаление записей                              312
 
 
   8.  ОСОБЕННОСТИ ВЫПОЛНЕНИЯ ПРОГРАММ,ИСПОЛЬЗУЮЩИХ СУД-32 313
 
 
   8.1.    Задание режимов работы СУД-32                   313
 
   8.1.1.    Использование редактора языка  описания
 
             файла                                         314
 
   8.1.2.    Использование   операторов   СУД-32   в
 
             языках программирования                       318
 
   8.2.    Режим,   относящийся   к   открытию   и
 
 
                            - 11 -
 
                         00152-01 92 01
 
 
           закрытию файлов                                 320
 
   8.2.1.    Режимы доступа  к  файлу  и  разделения
 
             файла                                         320
 
   8.2.2.    Спецификация файла                            322
 
   8.2.3.    Производительность файла                      323
 
   8.2.3.1.  Размер расширения                             323
 
   8.2.3.2.  Размер блока указателей извлечения            324
 
   8.2.3.3.  Обзор         режимов         повышения
 
             производительности системы                    326
 
   8.2.4.    Режимы доступа к записям                      329
 
   8.2.5.    Режимы для добавления записей файла           329
 
   8.2.6.    Режимы   для   обеспечения   надежности
 
             данных                                        331
 
   8.2.7.    Режимы для диспозиций файла                   332
 
   8.2.8.    Режимы для индексных файлов                   333
 
   8.2.9.    Режимы   для   обработки   файлов    на
 
             магнитной ленте                               335
 
   8.2.10.   Режимы  для   нестандартной   обработки
 
             файла                                         336
 
   8.3.    Обзор режимов операций над записями             337
 
   8.3.1.    Режимы поиска и чтения записей                337
 
   8.3.2.    Режимы занесения записей                      342
 
   8.3.3.    Режимы корректировки записей                  345
 
   8.3.4.    Режимы удаления записей                       347
 
   8.4.    Пример  работы  с  полями  управляющего
 
           блока                                           348
 
 
   9.  ОБСЛУЖИВАНИЕ ФАЙЛОВ                                 350
 
 
   9.1.    Отображение характеристик файла                 350
 
   9.1.1.    Выполнение проверки на наличие ошибки         351
 
 
                            - 12 -
 
                         00152-01 92 01
 
 
   9.1.2.    Генерация статистического отчета              356
 
   9.1.3.    Использование интерактивного режима           362
 
   9.1.4.    Исследование последовательного файла          364
 
   9.1.5.    Исследование относительного файла             366
 
   9.1.6.    Исследование индексного файла                 369
 
   9.2.    Создание  файла  FDL  по  существующему
 
           файлу данных                                    374
 
   9.3.    Оптимизация и повторное  проектирование
 
           характеристик файла                             377
 
   9.3.1.    Повторное проектирование файла FDL            379
 
   9.3.2.    Оптимизация файла данных                      381
 
   9.4.    Обеспечение непрерывности файла                 383
 
   9.4.1.    Использование команды COPY языка DCL          383
 
   9.4.2.    Использование  обслуживающей  программы
 
             CONVERT                                       384
 
   9.4.3.    Возврат  назад  бакетов  в   файлах   с
 
             прологом 3                                    385
 
   9.5.    Копирование  записей  файла  данных   с
 
           сохранением атрибутов                           385
 
   9.6.    Создание архивных копий                         386
 
 
   ПРИЛОЖЕНИЕ                                              388
 
 
       ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ                       392
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 13 -
 
                         00152-01 92 01
 
 
                 1. ОБЩАЯ ХАРАКТЕРИСТИКА СУД-32
 
 
 
        Проектирование файлов СУД-32  является  весьма  важной
 
   процедурой, от успешного выполнения которой зависит  эффек-
 
   тивность  выполнения  прикладных   программ,   использующих
 
   СУД-32.
 
        В тексте документа приняты следующие условные  обозна-
 
   чения:
 
        1) зарезервированные  слова  в  языковых  конструкциях
 
   задаются с  использованием  латинских  букв  и  спецзнаков.
 
   Спецзнаки используются  в  качестве  обязательных  символов
 
   языковых конструкций. Исключение  составляют  символы  "<",
 
   ">", "[" и "]",  которые  применяются  также  при  описании
 
   самих языковых конструкций;
 
        2) символы "[" и "]" используются в качестве ограничи-
 
   телей элементов описания конструкций,  задание  которых  не
 
   обязательно. Исключением является задание кода  идентифика-
 
   ции пользователя (UIC), который заключается в символы  "[",
 
   "]" и в этом случае эти символы являются элементами  конст-
 
   рукции;
 
        3) управляющие  символы,  соответствующие  им  клавиши
 
   терминала и коды изображаются с помощью знаков "<"  и  ">".
 
   Знак "/" разделяет обозначение двух  клавиш,  одновременное
 
   нажатие которых необходимо для ввода управляющего символа.
 
 
        П р и м е р.
 
 
     <CR>      - обозначение управляющего символа CR или
                 клавиши возврата каретки;
 
     <CTRL/Z)> - обозначение клавиш CTRL (УС) и Z,
                 нажимаемых одновременно или управляющего
                 символа CTRL/Z;
 
 
 
                            - 14 -
 
                         00152-01 92 01
 
 
     <085>     - обозначение кода;
 
        4) в языковых конструкциях  метапеременные  выделяются
 
   жирным шрифтом. В примерах диалога  с  ЭВМ  жирным  шрифтом
 
   выделяются ответы оператора терминала. Жирным шрифтом выде-
 
   ляются также термины, определение которых встречается впер-
 
   вые;
 
        5) в  ответах, завершающихся  нажатием  клавиши  <CR>,
 
   обозначение самой этой клавиши, как правило, не приводится.
 
   В ответах, завершающихся нажатием клавиши отличной от <CR>,
 
   приводится обозначение этой клавиши. Если ответ не  требует
 
   нажатия никаких клавиш, кроме завершающей,  или  эхо-печать
 
   ответа не выполняется, то в ответе  приводится  обозначение
 
   соответствущей завершающей клавиши;
 
        6) альтернативные элементы конструкций  заключаются  в
 
   фигурные скобки:
 
 
                        /      \
                        !      !
                       <        >
                        !      !
                        \      /
 
 
        7) в документации  сообщения  системы,  выдаваемые  на
 
   английском языке, приводятся также и на русском языке.  При
 
   этом сообшение на русском языке приводится сразу  же  после
 
   эквивалентного ему сообщения  на  английском  языке.  После
 
   сообщения может располагаться пояснение.
 
        В примерах диалога, содержащего  текст  на  английском
 
   языке, сначала следует текст диалога, а затем эквивалентный
 
   ему текст на русском языке. Зарезервированные слова  языко-
 
   вых конструкций задаются только на английском языке.
 
 
 
 
 
 
                            - 15 -
 
                         00152-01 92 01
 
 
        1.1. Основные понятия и определения
 
 
        Файлы СУД-32 состоят из записей. Запись - совокупность
 
   взаимосвязанных данных, трактуемых  прикладной  программой,
 
   взаимодействующей с СУД-32, как единое целое.
 
        Запись является единицей обмена между СУД-32  и  прик-
 
   ладной программой.
 
        Каждая запись, как правило,  описывает  информационный
 
   об'ект, например служащего, деталь, заказ на поставку комп-
 
   лектующих  и  т.п.  Информационным  об'ектам  соответствует
 
   совокупность характеристик, являющихся полями или элемента-
 
   ми записи.
 
        Например,  для  записи  типа  "служащий"  характерными
 
   являются поля "табельный номер", "фамилия", "имя", "отчест-
 
   во", "оклад". Каждое поле в записи представляет собой сово-
 
   купность байтов или символов, состоящих в свою  очередь  из
 
   двоичных разрядов или битов.
 
        Взаимодействие СУД-32 с прикладными  программами  осу-
 
   ществляется на уровне  записей.  Структуризация  записей  и
 
   обработка записей на уровне полей должна  предусматриваться
 
   самой прикладной программой. Например, программное  обеспе-
 
   чение МИС СМ предоставляет пользователям средства для взаи-
 
   модействия с СУД-32 на уровне полей, однако соответствующие
 
   компоненты этого окружения рассматриваются  самой  системой
 
   СУД-32 как прикладные программы. Важнейшим аспектом исполь-
 
   зования СУД-32 является проектирование файлов СУД-32, кото-
 
   рое в свою очередь зависит от организации файлов.
 
        Организация файла - способ размещения в  нем  записей,
 
   который в совокупности со средой  его  хранения  определяет
 
   технологию манипулирования данными, т.е. методы  доступа  к
 
 
 
                            - 16 -
 
                         00152-01 92 01
 
 
   данным.
 
        СУД-32 поддерживает три способа организации данных:
 
        1) последовательная. Предусматривает размещение  запи-
 
   сей друг за другом в порядке их поступления в файл;
 
        2) относительная. Предусматривает размещение записей в
 
   нумеруемых ячейках одинаковой длины. Нумерация ячеек прово-
 
   дится относительно начала файла и номер  ячейки  трактуется
 
   как номер записи;
 
        3) индексная. Предусматривает упорядоченное размещение
 
   записей в соответствии со значениями поля, определенного  в
 
   качестве главного ключа. При этом для ускорения  доступа  к
 
   отдельным записям образуются так называемые индексы,  имею-
 
   щие специальную организацию.
 
        С понятием организация  файла  тесно  связано  понятие
 
   метод доступа к файлу.
 
        Метод доступа к файлу  определяет  порядок  извлечения
 
   записи из файла или занесения записи в файл.
 
        СУД-32 поддерживает два метода доступа:
 
        1) последовательный. Записи заносятся в файл или  изв-
 
   лекаются из него, начиная с заданной точки, в том порядке в
 
   каком они поступают и размещаются в файле, одна за другой;
 
        2) прямой, предусматривающий извлечение записи из фай-
 
   ла по ее номеру, значению ключа или адресу в файле.  Место-
 
   положение записи, заносимой в файл, определяется ее номером
 
   при относительной организации файла или значением ключа при
 
   индексной организации файла. При извлечении записи просмотр
 
   всех предшествующих записей не требуется.
 
        При обработке записей важное значение имеет их формат,
 
   который влияет на физическое размещение записей на  носите-
 
   лях. Различаются следующие форматы:
 
 
                            - 17 -
 
                         00152-01 92 01
 
 
        1) фиксированной длины. Каждая запись  в  файле  имеет
 
   одинаковую длину;
 
        2) переменной длины. Записи файла могут  иметь  разную
 
   длину;
 
        3)  переменной  длины  с   фиксированной   управляющей
 
   частью. Записи могут иметь разную длину, но каждая  из  них
 
   включает управляющую  часть  фиксированной  длины,  которая
 
   является дополнением переменной части записи;
 
        4) потока. Запись в формате потока представляет  собой
 
   последовательность  байтов,   заканчивающихся   специальным
 
   завершающим символом - терминатором,  являющимся  признаком
 
   конца записи. В качестве терминатора чаще всего используют-
 
   ся управляющие символы <CR>  (записи  типа  STREAM_CR)  или
 
   <LF> (записи типа STREAM_LF).
 
        При создании файла необходимо указать тип носителя, на
 
   котором создается файл, характеристики файла и записей. Эти
 
   данные задаются либо в прикладной  программе,  взаимодейст-
 
   вующей с СУД-32, либо для служебной программы СУД-32. После
 
   создания файла прикладная  программа  получает  возможность
 
   заносить, извлекать или модифицировать записи в файле.
 
 
 
        1.2. Носители файлов
 
 
        В качестве носителей для хранения файлов  используются
 
   магнитные диски или  магнитные  ленты.  На  этих  носителях
 
   СУД-32 поддерживает специальную структуру данных,  называе-
 
   мую файловой структурой.
 
        Средствами  СУД-32  также  обеспечивается   ввод-вывод
 
   записей с устройств или на устройства других типов,  напри-
 
   мер ацпу, терминал и др., о которых  говорят  как  об  уст-
 
 
 
                            - 18 -
                            
                         00152-01 92 01
 
 
   ройствах нефайловой структуры. Однако  поддержка  устройств
 
   нефайловой структуры не является основной функцией СУД-32.
 
 
 
        1.2.1. Магнитные диски
 
 
        Файлы СУД-32 размещаются на дисках с файловой структу-
 
   рой МОС ВП. Термин "файловая структура" на дисках относится
 
   к иерархической организации файлов и каталогов, необходимых
 
   для доступа к данным. Логическая организация записей файлов
 
   и доступ к записям файлов  поддерживаются  соответствующими
 
   средствами СУД-32.
 
        Наименьшей адресуемой  единицей  информации  на  диске
 
   файловой структуры МОС ВП является блок, размер  блока  512
 
   байтов. Количество блоков, которое может быть размещено  на
 
   диске является его важнейшей характеристикой и должно  учи-
 
   тываться при проектировании файлов.
 
        Блоки нумеруются последовательно, начиная  с  0.  Один
 
   или несколько  блоков  могут  рассматриваться  как  единица
 
   обмена между диском и памятью.
 
        При инициализации диска, который в дальнейшем именует-
 
   ся томом, все дисковое пространство разбивается на  клаСТЕ-
 
   ры. Кластер - последовательность смежных блоков, количество
 
   блоков в кластере зависит от типа устройства и регулируется
 
   на этапе инициализации диска. Размер кластера от 1 до 65535
 
   блоков. Обычно для  дисков  малой  емкости  устанавливается
 
   небольшой размер кластера. А  для  дисков  большой  емкости
 
   рекомендуется больший размер кластера. Тем самым достигает-
 
   ся оптимальное  сочетание  использования  дискового  прост-
 
   ранства и производительности системы при выполнении  опера-
 
   ций ввода-вывода.
 
 
 
                            - 19 -
 
                         00152-01 92 01
 
 
        Последовательность физически смежных, т.е. непрерывных
 
   кластеров,  занимаемых  файлом,  составляет  экстент.  Файл
 
   может занимать один или несколько экстентов,  расположенных
 
   в различных участках дисковой памяти. Если  для  размещения
 
   файла имеется достаточное  количество  непрерывных  клаСТЕ-
 
   ров, то файлу отводится один экстент. Если же  достаточного
 
   количества непрерывных кластеров на диске  не  имеется,  то
 
   файлу отводится несколько экстентов. Последнее имеет  место
 
   также и при расширении файла, если существующий экстент  не
 
   может быть расширен, ввиду того, что соседние с ним клаСТЕ-
 
   ры отведены под экстент другого файла.
 
        На рис.1 и 2 приведено размещение  файлов,  занимающих
 
   один (рис.1) или несколько (рис.2) экстентов. Прямоугольни-
 
   ки, обведенные пунктирной линией обозначают  кластеры, сос-
 
   тоящие из двух блоков каждый. На рис.2 файл  а  занимает  2
 
   экстента.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 20 -
 
                         00152-01 92 01
 
 
                 Файлы, занимающие один экстент
 
 
                           Файл а
   -------------------------------------------------------
   !   --------------  --------------  --------------    !
   !   ! ----  ---- !  ! ---- ----  !  ! ---- ----  !    !
   !   ! !  !  !  ! !  ! !  ! !  !  !  ! !  ! !  !  !    !
   !   ! ----  ---- !  ! ---- ----  !  ! ---- ----  !    !
   !   --------------  --------------  --------------    !
   !------------------------------------------------------
                          Экстент
 
                           Файл в
             -----------------------------------
             !   -------------  -------------  !
             !   ! ---- ---- !  ! ---- ---- !  !
             !   ! !  ! !  ! !  ! !  ! !  ! !  !
             !   ! ---- ---- !  ! ---- ---- !  !
             !   -------------  -------------  !
             -----------------------------------
                          Экстент
 
 
                            Файл с
   ----------------------------------------------------------
   ! ------------- ------------- ------------- -------------!
   ! ! ---- ---- ! ! ---- ---- ! ! ---- ---- ! ! ---- ---- !!
   ! ! !  ! !  ! ! ! !  ! !  ! ! ! !  ! !  ! ! ! !  ! !  ! !!
   ! ! ---- ---- ! ! ---- ---- ! ! ---- ---- ! ! ---- ---- !!
   ! ------------- ------------- ------------- -------------!
   ----------------------------------------------------------
                           Экстент
 
 
 
 
                             Рис. 1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 21 -
 
                         00152-01 92 01
 
 
              Файл, занимающий несколько экстентов
 
 
                        Файл а
   ------------------------------------------------------
   !  ---------------  ---------------  --------------  !
   !  !  ---- ----  !  !  ---- ----  !  ! ---- ----  !  !
   !  !  !  ! !  !  !  !  !  ! !  !  !  ! !  ! !  !  !  !
   !  !  ---- ----  !  !  ---- ----  !  ! ---- ----  !  !
   !  ---------------  ---------------  --------------  !
   ------------------------------------------------------
                       Экстент
 
                         Файл в
        --------------------------------------
        !  ---------------  ---------------  !
        !  !  ---- ----  !  !  ---- ----  !  !
        !  !  !  ! !  !  !  !  !  ! !  !  !  !
        !  !  ---- ----  !  !  ---- ----  !  !
        !  ---------------  ---------------  !
        --------------------------------------
                        Экстент
 
                         Файл с
   ----------------------------------------------------------
   !                                                        !
   ! ------------- ------------- ------------- -------------!
   ! ! ---- ---- ! ! ---- ---- ! ! ---- ---- ! ! ---- ---- !!
   ! ! !  ! !  ! ! ! !  ! !  ! ! ! !  ! !  ! ! ! !  ! !  ! !!
   ! ! ---- ---- ! ! ---- ---- ! ! ---- ---- ! ! ---- ---- !!
   ! ------------- ------------! ------------- --------------
                        Экстент
 
                         Файл а
        ---------------------------------------
        !  ---------------  ----------------  !
        !  !  ---- ----  !  !   ---- ----  !  !
        !  !  !  ! !  !  !  !   !  ! !  !  !  !
        !  !  ---- ----  !  !   ---- ----  !  !
        !  ---------------  ----------------  !
        !--------------------------------------
                        Экстент
 
 
 
                             Рис. 2
 
 
        Пользователям представляются  большие  возможности  по
 
   управлению размещением файлов  на  диске.  Например,  можно
 
   указать число блоков, которое следует  зарезирвировать  для
 
   размещения файла и даже задать их точное местоположение  на
 
   томе, т.е определить физическое местонахождение файла.
 
 
 
 
                            - 22 -
 
                         00152-01 92 01
 
 
        С другой стороны управление  размещением  файла  может
 
   быть осуществлено автоматически  средствами  СУД-32.  Может
 
   быть принято компромиссное решение, состоящее  в  том,  что
 
   пользователь определяет начальный размер файла,  используе-
 
   мый при его создании, и величину, на которую СУД-32  должен
 
   расширять файл при его заполнении. Выбор же  местоположения
 
   соответствующих экстентов осуществляет СУД-32.
 
        При этом можно  определить  возможность  использования
 
   последних кластеров файла, если  они  окажутся  свободными,
 
   для других файлов.
 
        При необходимости несколько дисковых томов могут  быть
 
   об'единены в один набор, рассматриваемый системой как  один
 
   большой диск. Различные экстенты файла могут размещаться на
 
   различных дисках набора. Обычно при создании файла или  при
 
   обращении к файлу можно не указывать том набора на  котором
 
   создается или находится файл.  Однако,  при  необходимости,
 
   возможно обращение к конкретному тому набора.
 
        Для каждого файла, помимо блоков данных, на диске соз-
 
   даются дополнительные  управляющие  блоки,  которые  СУД-32
 
   использует при работе с файлом на уровне записей.
 
        При работе с данными следует учитывать некоторые физи-
 
   ческие особенности дисков, влияющие  на  производительность
 
   СУД-32.
 
        Существенное  влияние  на  производительность  системы
 
   может оказать размещение на одной дорожке диска  взаимосвя-
 
   занных блоков одного или даже  нескольких  файлов,  которые
 
   будут обрабатываться совместно при помощи  важных  приложе-
 
   ний, критичных по производительности. Целесообразность раз-
 
   мещения таких блоков на одной дорожке или на смежных дорож-
 
   ках обуславливается тем, что время  позиционирования,  т.е.
 
 
                            - 23 -
 
                         00152-01 92 01
 
 
   время установки головок диска под заданную дорожку  сущест-
 
   венно больше (в 2 - 4 раза) времени оборота диска, за кото-
 
   рое заданные блоки считываются с диска или записываются  на
 
   диск.
 
        Производительность системы также может быть существен-
 
   но повышена, если учитывать цилиндрическую организацию дис-
 
   ка. Блоки взаимосвязанных данных рекомендуется размещать на
 
   дорожках одного цилиндра, во избежание многократного  пози-
 
   ционирования головок при чтении-записи взаимосвязанных бло-
 
   ков, находящихся на различных дорожках. Этот фактор  должен
 
   учитываться при выборе размера кластера для дисков  большой
 
   емкости. Размер кластера обычно выбирается кратным  емкости
 
   цилиндра, поскольку нецелесообразно пересечение  кластерами
 
   границ цилиндра.
 
        Для относительных и  индексно-последовательных  файлов
 
   должен также учитываться размер бакета (раздел 2).
 
        Длина записи может быть равна длине блока, меньше дли-
 
   ны блока или  превышать  размер  блока.  Соответственно,  в
 
   одном блоке может быть одна запись, несколько  записей  или
 
   часть записи.
 
        Каждый том файловой структуры МОС ВП содержит  индекс-
 
   ный файл, создаваемый при инициализации тома.  В  индексном
 
   файле содержится информация  о  блоке  начальной  загрузки,
 
   адресном блоке и блоках заголовков файлов.
 
 
 
        1.2.1.1. Блок начальной загрузки
 
 
        Блок начальной загрузки (BOOTSTRAP) - физически первый
 
   блок диска, имеет номер 0. Он  создается  на  каждом  диске
 
   файловой структуры МОС ВП, однако используется  только  при
 
 
 
                            - 24 -
 
                         00152-01 92 01
 
 
   загрузке  операционной  системы  с  системного  диска.  При
 
   попытке запуска операционной системы с диска, отличного  от
 
   системы на системную консоль выдается соответствующее сооб-
 
   щение.
 
 
 
        1.2.1.2. Собственный блок
 
 
        Собственный (НОМЕ) блок - блок, физически следующий за
 
   блоком начальной загрузки, этот блок содержит информацию  о
 
   томе, включающую:
 
          - метку тома;
 
          - адрес индексного файла;
 
          - максимальное количество файлов, которое может быть
 
            размещено на томе;
 
          - код  идентификации  пользователя  (UIC)  владельца
 
            тома;
 
          - информация о защите всех  файлов,  находящихся  на
 
            томе.
 
        В целях повышения надежности на томе может быть созда-
 
   но несколько идентичных собственных блоков.
 
 
 
        1.2.1.3. Заголовки файлов
 
 
        Заголовки файлов, содержащиеся в индексном файле тома,
 
   описывают содержимое файлов. Каждый заголовок включает дан-
 
   ные о:
 
          - владельце файла;
 
          - коде защиты файла;
 
          - дате и времени создания файла;
 
          - списке и адресах экстентов, занимаемых файлом.
 
 
 
 
                            - 25 -
 
                         00152-01 92 01
 
 
        При большом количестве экстентов  создается  несколько
 
   заголовков файла, с каждым из  которых  связан  идентифика-
 
   ционный номер или индекс файла.
 
        Другим способом идентификации файла является его  имя.
 
   Имя файла, в свою очередь, связано с каталогом  пользовате-
 
   ля, который об'единяет несколько файлов. При открытии  фай-
 
   ла, с целью его создания, для СУД-32 указывается имя  файла
 
   и автоматически создается его индекс, являющийся указателем
 
   заголовка файла в индексном файле тома.
 
        При открытии существующего файла  также  задается  его
 
   имя, по  которому  определяется  индекс  файла.  Дальнейшее
 
   обращение к файлу осуществляется через индекс,  т.е.  Через
 
   заголовки файла, находящиеся в индексном файле тома.
 
 
 
        П р и м е ч а н и е. В документации  по  МОС  ВП,  для
 
   сокращения, вместо термина "индексно-последовательный файл"
 
   применяется также термин "индексный файл". С  точки  зрения
 
   файловой структуры, индексный файл тома - это файл,  содер-
 
   жащий заголовки файлов. Из контекста всегда  ясно  о  каком
 
   индексном файле идет речь.
 
 
 
        1.2.2. Магнитные ленты
 
 
        Последовательные файлы  СУД-32  могут  размещаться  на
 
   магнитных лентах. Система поддерживает стандартную  органи-
 
   зацию данных, известную под названием ANSI.
 
        Каждый файл в формате ANSI  обрамляется  начальными  и
 
   конечными метками - блоками, длиной по 80 байт, содержащими
 
   следующую информацию:
 
          - имя файла;
 
 
 
                            - 26 -
 
                         00152-01 92 01
 
 
          - дату создания;
 
          - срок хранения файла.
 
        Записи в файле могут быть блокированными или  неблоки-
 
   рованными. Все блоки файлов (блоки меток  и  блоки  данных)
 
   отделяются друг от друга межблочными промежутками.
 
        Система поддерживает  хранение  ленточных  многотомных
 
   файлов.
 
 
 
        1.3. Защита данных на томе
 
 
        Операционная  система  обеспечивает  защиту  данных  с
 
   целью авторизации доступа к ним на уровне  файла,  каталога
 
   или всего тома для дисков и, на уровне тома, для  магнитных
 
   лент.
 
        Для целей защиты данных используются:
 
          - код идентификации пользователя  UIC,  определяющий
 
            владельца файла, каталога или тома и  связанный  с
 
            ним код защиты,  определяющий  полномочия  четырех
 
            категорий пользователей при работе с данными;
 
          - управляющие списки доступа (ACL), включающие  опи-
 
            сания, разрешающие или запрещающие доступ к  соот-
 
            ветствующим элементам данных, например к файлам.
 
        При попытке доступа к необходимому об'екту, например к
 
   файлу, система выполняет следующие действия:
 
        1) если имеется список ACL, связанный с файлом, прово-
 
   дится проверка полномочий пользователя по доступу к файлу;
 
        2) если имеется список ACL,  связанный  с  файлом,  но
 
   возможность доступа пользователя к файлу запрещена или явно
 
   не опеределена, то проводится проверка кода защиты файла  с
 
   целью определения полномочий UIC пользователя для доступа к
 
 
 
                            - 27 -
 
                         00152-01 92 01
 
 
   данному файлу;
 
        3) проверка кода защиты по UIC проводится и в том слу-
 
   чае, если не имеется списка ACL, связанного с файлом.
 
        Проверка кодов защиты по UIC является  стандартной,  в
 
   то время как проверка по спискам ACL является  необязатель-
 
   ной, но более гибкой.
 
 
 
        1.4. Сервисные возможности СУД-32
 
 
        СУД-32 обеспечивает организацию  доступа  к  файлам  и
 
   записям операционной системы МОС ВП.
 
        С другой стороны, СУД-32 является высокоразвитой  фай-
 
   ловой системой, которая может использоваться  для  хранения
 
   данных и гибкого доступа к ним из прикладных программ.
 
        При этом  определение  данных  для  работы  с  файлами
 
   СУД-32 обеспечивается на  внешнем  уровне  -  в  прикладных
 
   программах  пользователя  или  в  компонентах  программного
 
   обеспечения многофункциональной  операционной  системы  мис
 
   см, использующих СУД-32.
 
        Сервисные функции  СУД-32  реализованы  как  системные
 
   функции СУД-32, вызываемые через  специальные  макрокоманды
 
   при использовании языка  программирования  низкого  уровня,
 
   такого как МАКРОАССЕМБЛЕР, либо  собственно  как  операторы
 
   ввода-вывода в языках программирования высокого уровня.
 
        При вызове  сервисных  функций  СУД-32  как  системных
 
   функций необходимо создание и заполнение специальных управ-
 
   ляющих структур. При программировании  на  языках  высокого
 
   уровня  используются   различные   модификации   операторов
 
   ввода-вывода и в этом случае явное использование  управляю-
 
   щих структур СУД-32 не требуется. Для более полного исполь-
 
 
 
                            - 28 -
 
                         00152-01 92 01
 
 
   зования возможностей СУД-32 можно воспользоваться  необяза-
 
   тельными возможностями операций ввода-вывода языка програм-
 
   мирования или использовать структуры СУД-32 при помощи спе-
 
   циального языка описания файла (сокращенно язык FDL). Таким
 
   образом, в программах, составленных на языках  программиро-
 
   вания низкого уровня,  используются  управляющие  структуры
 
   СУД-32 в явном виде, или их создание обеспечивается средст-
 
   вами языка FDL. В программах, составленных на языках  прог-
 
   раммирования высокого  уровня,  как  правило,  используется
 
   исключительно FDL.
 
 
 
        1.4.1. Характерстики языка FDL
 
 
        Язык FDL используется для определения  файла  при  его
 
   создании и для определения рабочих атрибутов,  используемых
 
   при работе с файлами. Выбор атрибутов файла при его  созда-
 
   нии, который может проводиться путем использования  атрибу-
 
   тов уже имеющихся других файлов СУД-32  или  заданием новых
 
   атрибутов, существенно сказывается в дальнейшем на произво-
 
   дительности системы, в особенности при  работе  с  большими
 
   индексными файлами.
 
        FDL позволяет  использовать  практически  все  рабочие
 
   атрибуты, задаваемые на этапе создания файла и  большинство
 
   атрибутов, необходимых в процессе работы с файлами, которые
 
   фиксируются в управляющих структурах (блоках) СУД-32, таких
 
   как:
 
          - блок доступа к файлу (FAB);
 
          - блок доступа к записи (RAB);
 
          - расширенный блок атрибутов (XAB).
 
        Описания FDL задаются в отдельном файле. Более деталь-
 
 
 
                            - 29 -
 
                         00152-01 92 01
 
 
   но язык FDL описан в разделе 3.
 
 
 
        1.4.2. Управляющие блоки СУД-32
 
 
        Управляющие блоки СУД-32 делятся на две  категории,  в
 
   зависимости от того, относится содержащаяся в них  информа-
 
   ция к файлу в целом или к записям.
 
        Информация, относящаяся к файлу,  содержится  в  блоке
 
   FAB, который  должен  присутствовать  в  каждой  программе,
 
   использующей СУД-32. В блоке FAB задаются спецификация фай-
 
   ла, его атрибуты.
 
        Информация, относящаяся к записям, содержится в  блоке
 
   RAB,  который  также  должен  присутствовать  в  программе,
 
   использующей СУД-32. В RAB задаются адреса, типы и  размеры
 
   входных и выходных буферов, режим доступа к записям, другие
 
   характеристики.
 
        Блоки FAB и RAB делятся на поля, которым присваиваются
 
   символические имена - смещения относительно их начала.
 
        Например, доступ к полю  FAB,  в  котором  указывается
 
   размер файла в блоках, задаваемому на длине двойного слова,
 
   может   быть   осуществлен   по   символическому   смещению
 
   FAB$L_ALQ, значение которого равно числу байтов  от  начала
 
   блока FAB до начала данного поля. Аналогичным образом иден-
 
   тифицируются и поля RAB.
 
        Для различия  в  символических  смещениях  FAB  и  RAB
 
   используются обязательные префиксы FAB и RAB  соответствен-
 
   но. Буква, следующая за символом $ определяет  формат  поля
 
   (например L - двойное  слово,  B  -  байт).  Так,  смещение
 
   RAB$B_MBF задает число байт от начала блока RAв  до  начала
 
   поля, в котором задается число  буферов,  используемых  при
 
 
 
                            - 30 -
 
                         00152-01 92 01
 
 
   вводе-выводе. Формат этого поля - байт.
 
        Помимо FAB  и  RAB  СУД-32  использует  дополнительные
 
   управляющие  блоки  XAB,  которые  содержат  дополнительные
 
   атрибуты файлов. Для выполнения разных функций используются
 
   разные блоки XAB. Например, в блоке XAB ключа задается зна-
 
   чение ключа при занесении записей в индексный файл.
 
        Соответственно символические смещения полей блока  XAB
 
   начинаются с префикса XAB. Управляющие блоки  СУД-32  более
 
   детально описаны в разделе 3.
 
 
 
        1.4.3. Сервисные функции СУД-32
 
 
        Сервисные функции СУД-32 делятся на две группы:
 
        1) сервисные функции для работы с файлами. К ним отно-
 
   сятся операторы создания, открытия и закрытия файла, расши-
 
   рения дискового пространства, отведенного под файл, получе-
 
   ния характеристик файла и другие;
 
        2) сервисные функции для  работы  с  записями.  К  ним
 
   относятся операторы поиска и  получения  записи  из  файла,
 
   занесения записи в файл, удаления и модификации записи.
 
        Более детально сервисные функции СУД-32 описаны в раз-
 
   делах 6 и 7.
 
 
 
        1.5. Обслуживающие программы СУД-32
 
 
        К обслуживающим программам СУД-32 относятся программы:
 
        1) ANALYZE;
 
        2) CONVERT;
 
        3) CONVERT/RECLAIM;
 
        4) CREATE/FDL;
 
 
 
 
                            - 31 -
 
                         00152-01 92 01
 
 
        5) EDIT/FDL.
 
        Эти программы позволяют создать файлы СУД-32, провести
 
   начальную загрузку записей в файлы, проанализировать файлы.
 
   Файлы могут использовать полный набор атрибутов,  необходи-
 
   мых для создания файлов и работы с ними.  Это  обеспечивает
 
   возможность эффективного создания  файлов  при  минимальных
 
   расходах системных ресурсов.
 
 
 
        1.5.1. Программа ANALYZE
 
 
        Программа ANALYZE выполняет следующие функции:
 
        1) проверку внутренней структуры файлов;
 
        2) выдачу статистического  отчета  о  структуре  и  об
 
   использовании файла;
 
        3) интерактивную проверку структуры файла;
 
        4) создание FDL-файла на  основании  имеющегося  файла
 
   СУД-32.
 
        Данная программа  оказывается  особенно  полезной  для
 
   создания FDL-файла на основе уже имеющегося СУД-файла.  При
 
   создании любого нового СУД-файла желательно создание  файла
 
   описаний FDL, и использование для этой цели  ANALYZE сокра-
 
   щает  трудоемкость  данной  процедуры.  Если  же  отдельные
 
   структуры  нового  файла  должны  отличаться  от  атрибутов
 
   существующего файла СУД-32, на основе которого  был  создан
 
   FDL для нового файла, то созданный FDL-файл можно  отредак-
 
   тировать, используя для этой цели программу EDIT/FDL. Вызов
 
   программы ANALYZE осуществляется по команде DCL:
 
 
        ANALYZE/RMS_FILE вхф
 
 
   где вхф - задает спецификацию файла СУД-32, подлежащего
 
 
 
                            - 32 -
 
                         00152-01 92 01
 
 
             обработке программой ANALYZE.
 
        Более детально программа ANALYZE описана в разделе 9.
 
 
 
        1.5.2. Программа CONVERT
 
 
        Обслуживающая программа  CONVERT  копирует  записи  из
 
   одного или более файлов в некоторый выходной файл, дополни-
 
   тельно изменяя формат записи и организацию  файла  в  соот-
 
   ветствие с атрибутами выходного файла.
 
        Обслуживающая программа  CONVERT  особенно  полезна  в
 
   цикле настройки файла. После того, как пользователь проана-
 
   лизировал существующий файл, он может использовать програм-
 
   му CONVERT, чтобы создать новый файл, имеющий новые,  опти-
 
   мизированные характеристики, и скопировать содержимое  ста-
 
   рого файла в новый. Пользователь может  также  использовать
 
   программу CONVERT для  реорганизации  файла,  который  имел
 
   много вставок и удалений.
 
        Для вызова CONVERT используется следующая команда DCL:
 
 
        CONVERT вхф[,...] выхф
 
 
   где вхф  - спецификация входного преобразуемого файла
 
              СУД-32;
 
       выхф - спецификация выходного преобразованного файла
 
              СУД-32.
 
        На рис.3 приведена диаграмма работы программы CONVERT.
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 33 -
 
                         00152-01 92 01
 
 
               Диаграмма работы программы CONVERT
 
 
            ---------------
            !    Файл     !
            !    FDL      !
            ---------------
                   !
                   V
            ---------------         ---------------
            !   CONVERT   !<--------!    вхф      !
            ---------------         ---------------
                   !
                   V
             --------------
             !    выхф    !
             --------------
 
 
 
                             Рис. 3
 
 
        Более подробно программа CONVERT описана в разделе 3.
 
 
 
        1.5.3. Программа CONVERT/RECLAIM
 
 
        Программа  CONVERT/RECLAIM  создает  пустые  бакеты  в
 
   индексных файлах, что  обеспечивает  последующее  занесение
 
   новых записей в файл. Таким образом резервируется необходи-
 
   мое место на диске и можно избежать расширения файла.
 
        Вызов программы CONVERT/RECLAIM проводится по  команде
 
   DCL:
 
 
        CONVERT/RECLAIM выхф
 
 
   где выхф - спецификация выходного индексного файла, в
 
              котором создаются пустые бакеты.
 
        Более подробно данная программа описана в разделе 3.
 
 
 
 
 
 
 
 
 
 
                            - 34 -
 
                         00152-01 92 01
 
 
        1.5.4. Программа CREATE/FDL
 

        Программа CREATE/FDL использует созданный предварите-
 
   льно файл FDL для создания нового, "пустого" файла данных.
 
        Вызов программы CREATE/FDL осуществляется  по  команде
 
   DCL:
 
 
        CREATE/FDL=вхф [выхф]
 
 
   где вхф  - спецификация файла FDL на основании данных ко-
 
              торого создается новый, "пустой" файл данных;
 
       выхф - спецификация выходного файла данных, создава-
 
              емого по команде CREATE/FDL.
 
        Более подробно данная программа описана в разделе 3.
 
 
 
        1.5.5. Программа EDIT/FDL
 
 
        Программа EDIT/FDL позволяет создавать  и  модифициро-
 
   вать вспомогательные файлы, содержащие описания характерис-
 
   тик файлов СУД-32. Эти описания размещаются в FDL-файле и в
 
   файлах, которые вызываются из файла FDL.
 
        Файл FDL представляет собой  упорядоченную  последова-
 
   тельность ключевых слов атрибутов файлов и их значений.
 
        Программа EDIT/FDL проводит обработку файла FDL,  про-
 
   веряет правильность задания атрибутов файлов данных,  нахо-
 
   дящихся в файле FDL, т.е. синтаксис языка FDL.  При  помощи
 
   программы EDIT/FDL может быть создана  модель  создаваемого
 
   файла данных,  которая  "проигрывается"  путем  модификации
 
   атрибутов, содержащихся в файле  FDL.  В  результате  могут
 
   быть выявлены значения  атрибутов,  влияющих  на  повышение
 
   эффективности обработки записей.
 
 
 
 
                            - 35 -
 
                         00152-01 92 01
 
 
        Например, количество  индексных  ступеней  существенно
 
   влияет на время реакции системы  при  обработке  индексного
 
   файла, и определяет это количество - величина бакета, выби-
 
   раемая при создании  файла.  Программа  EDIT/FDL  позволяет
 
   выявить зависимость образования новых индексных ступеней от
 
   варьирования размера бакета индексного файла, позволяя  тем
 
   самым подобрать оптимальное значение.
 
        Вызов EDIT/FDL осуществляется по команде DCL:
 
 
        EDIT/FDL файл
 
 
   где файл - спецификация файла FDL, подлежащего созданию,
 
              обновлению или оптимизации.
 
 
 
        1.6. Системные ресурсы при работе СУД-32
 
 
        Производительность СУД-32 зависит от системных  ресур-
 
   сов, выделяемых системе в целом  или  отдельным  процессам,
 
   использующим файлы СУД-32.
 
        При разработке программ,  использующих  СУД-32,  целе-
 
   сообразно проконсультироваться с администратором операцион-
 
   ной системы, поскольку применение СУД-32 может  потребовать
 
   дополнительных ресурсов, например, оперативной или дисковой
 
   памяти, выделяемой процессу на этапе  выполнения  программы
 
   пользователя.
 
 
 
        1.6.1. Использование памяти
 
 
        Одним из путей увеличения  производительности  системы
 
   при работе с файлами данных является увеличение  количества
 
   и размера буферных областей,  резервируемых  в  оперативной
 
   памяти для каждой прикладной программы. Как указано в  раз-
 
 
                            - 36 -
 
                         00152-01 92 01
 
 
   деле 6, количество буферов и размер бакетов и блоков  могут
 
   быть вычислены при оптимизации файла в соответствии с  осо-
 
   бенностями доступа к файлу (для индексных файлов  с  учетом
 
   структуры индекса и других факторов).
 
        Помимо буферных областей для каждого  файла  создаются
 
   специальные управляющие  структуры  СУД-32,  которые  также
 
   влияют на размер оперативной памяти,  используемой  процес-
 
   сом.
 
        Расход памяти существенно  возрастает  при  увеличении
 
   числа файлов, которые  обрабатываются  одновременно.  Об'ем
 
   памяти, требуемой для буферов ввода-вывода варьируется  для
 
   каждого файла. Размер памяти, отводимой управляющим  струк-
 
   турам остается для каждого файла примерно одинаковым.
 
        Размер рабочего набора процесса, т.е. об'ем  оператив-
 
   ной памяти, используемой процессом зависит от трех парамет-
 
   ров программы МОС ВП SYSGEN:
 
        1) умолчание WSDEFAULT, определяющее  начальный размер
 
   рабочего набора в страницах (1 страница содержит  512  бай-
 
   тов);
 
        2) квота рабочего набора WSQUOTA, определяющая  размер
 
   в страницах, до которого может  расширяться  рабочий  набор
 
   при наличии физических  страниц  памяти,  если  не  введено
 
   новое, большее значение параметра WSEXTENT;
 
        3) расширение рабочего набора  WSEXTENT,  определяющее
 
   размер в страницах, до которого может  расширяться  рабочий
 
   набор, включая использование свободных  страниц  физической
 
   памяти.
 
        Перечисленные параметры гарантируют процессу достаточ-
 
   ный об'ем памяти с  минимальными  затратами  на  страничный
 
   обмен. Более подробно  перечисленные  параметры  описаны  в
 
 
                            - 37 -
 
                         00152-01 92 01
 
 
   документе [1].
 
        При работе с разделяемыми файлами, во избежание  избы-
 
   точных операций ввода-вывода, например ввода с диска блока,
 
   который уже считан в память другим процессом, рекомендуется
 
   использовать глобальную буферизацию.
 
        Глобальная буферизация памяти обеспечивается следующи-
 
   ми четырьмя основными параметрами программы SYSGEN:
 
        1) RMS_GBLBUFQUO - максимальное число глобальных буфу-
 
   ров, независимо от количества пользователей или файлов;
 
        2) GBLSECTIONS - максимальное число глобальных секций,
 
   присутствующих в системе одновременно;
 
        3) GBLPAGES - число элементов глобальной таблицы стра-
 
   ниц, одновременно используемых в системе;
 
        4) GBLPAGFIL - число системных страниц, отведенных для
 
   глобальных секций файла или для вспомогательных  глобальных
 
   секций, используемых одновременно в системе.
 
        При открытии файла  СУД-32  размещает  его  атибуты  в
 
   управляющем районе P1 виртуального  адресного  пространства
 
   процесса, в так называемом сегменте ввода-вывода процесса.
 
        Размер этого сегмента определяется параметром програм-
 
   мы SYSGEN PIOPAGES и не может  быть  расширен  динамически.
 
   Если   при   попытке   открытия   файла   размер   сегмента
 
   ввода-вывода оказывается недостаточным для размещения атри-
 
   бутов файла, то возникает  ошибочная  ситуация  и  открытие
 
   файла не производится.
 
        Приведенные параметры SYSGEN описаны в документе [1].
 
 
 
 
 
 
 
 
 
 
                            - 38 -
 
                         00152-01 92 01
 
 
        1.6.2. Ограничения асинхронного ввода-вывода
 
 
        При выполнении асинхронного ввода-вывода записей необ-
 
   ходимо проанализировать следующие ограничения:
 
        1) асинхронных системных прерываний (ASTLM);
 
        2) буферизованного ввода-вывода (BIOLM);
 
        3) прямого ввода-вывода (DIOLM).
 
        Описание перечисленных ограничений описано в документе
 
   [1].
 
 
 
        1.6.3. Квота захвата записи
 
 
        При обновлении разделяемого  файла  следует  учитывать
 
   квоту очереди блокируемых записей (ENQLM), выделенную  про-
 
   цессу. Обычно размер этой квоты равен числу записей, захват
 
   которых осуществляется системой СУД-32, умноженному на чис-
 
   ло одновременно открытых файлов. Следует учесть, что захват
 
   записей проводится с целью запрещения их обновления другими
 
   процессами до тех пор, пока их обновление не будет заверше-
 
   но процессом, который захватил записи.
 
        Описание квоты ENQLM приведено в документе [1].
 
 
 
        1.6.4. Ограничения на число открытых файлов
 
 
        Число файлов, которые  могут быть  открыты  процессом,
 
   определяется значением квоты FILLM, описание которой приве-
 
   дено в документе [1].
 
 
 
        1.7. Установка умолчаний процессам системы
 
 
        При создании или открытии файла используются некоторые
 
   умолчания, которые явно не задаются. Иерархия использования
 
 
                            - 39 -
 
                         00152-01 92 01
 
 
   умолчаний следующая:
 
        1) умолчания, задаваемые соответствующими значениями в
 
   FAB и RAB;
 
        2) умолчания,  установленные пользователем,  например,
 
   размер расширения файла;
 
        3) умолчания процесса;
 
        4) умолчания, принятые для тома или системные  умолча-
 
   ния.
 
        К системным умолчаниям, например, относятся умолчания,
 
   установленные параметрами программы SYSGEN.
 
        Для установки умолчаний  процесса  или  системы  можно
 
   использовать команду SET RMS_DEFAULT языка DCL.
 
        Наконец, умолчание для файла устанавливаются по коман-
 
   де SET FILE языка DCL.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 40 -
 
                         00152-01 92 01
 
 
                    2. ПРОЕКТИРОВАНИЕ ФАЙЛОВ
 
 
 
        Выбор организации файла, определение его характеристик
 
   и структуры записи оказывает решающее влияние на  эффектив-
 
   ность прикладных программ, использующих файлы.
 
        Вопросы  проектирования  файлов,   рассматриваемые   в
 
   данноM разделе относятся в первую очередь  к  разработчикам
 
   прикладных программ, использующих СУД-32.  Все  возможности
 
   СУД-32 доступны при программировании с использованием языка
 
   МАКРО. Не все приведенные здесь  возможности  доступны  для
 
   языков программирования высокого уровня,  хотя  большинство
 
   из  них  может  быть  использовано  при  помощи   программы
 
   FDL$PARSE,  возможно  как  часть  процедур   USEROPEN   или
 
   USER_ACTION.
 
        Однако программисты, использующие языки программирова-
 
   ния высокого уровня, должны учитывать рекомендации по рабо-
 
   те с файлами СУД-32, приведенные  в  соответствующих  руко-
 
   водствах.
 
        Вопросы проектирования и оптимизации СУД-файлов должны
 
   анализироваться и учитываться на двух этапах:
 
        1) перед написанием прикладных программ, особенно если
 
   речь идет о больших файлах и об их большой изменчивости;
 
        2) после написания программ, если полученная  произво-
 
   дительность не является удовлетворительной.
 
        Именно вопросам  проектирования файлов, оптимизации их
 
   хранения и использования посвящен данный раздел документа.
 
 
 
 
 
 
 
 
 
 
                            - 41 -
 
                         00152-01 92 01
 
 
        2.1. Концепция записи
 
 
        Наименьшей единицей обмена между буфером СУД-32 и дис-
 
   ком является блок. Несколько блоков могут быть об'единены в
 
   мультиблоки или бакеты. Мультиблок - атрибут  СУД-32  этапа
 
   выполнения, рассматриваемый как  единица  ввода-вывода  для
 
   последовательных дисковых файлов.
 
        Бакет, с другой стороны, - это структура памяти,  сос-
 
   тоящая из 1 - 63 блоков, используемая при создании и  обра-
 
   ботке относительных и индексных файлов. Бакет содержит одну
 
   или несколько записей или ячеек записей.
 
        Структура каждой записи файла определяется  прикладной
 
   программой, создающей файл. Программы,  которые  используют
 
   этот файл, должны использовать аналогичные определения.
 
 
 
        2.1.1. Режимы доступа к записям
 
 
        Режим доступа определяет  метод  включения  записей  в
 
   файл и поиска записей в  файле.  Режим  доступа  не  следут
 
   путать с  организацией  файла,  обуславливающей  физическое
 
   размещение записи на носителях.
 
        СУД-32 поддерживает следующие режимы доступа  к  запи-
 
   сям:
 
          - последовательный;
 
          - прямой по значению ключа;
 
          - прямой по относительному номеру записи;
 
          - прямой по адресу записи в файле.
 
        Организация файла в процессе работы программы, исполь-
 
   зующей файл, изменена быть не может, однако режим доступа к
 
   файлу может быть изменен в любое время.
 
 
 
 
                            - 42 -
 
                         00152-01 92 01
 
 
        Например, относительный файл может обрабатываться пос-
 
   ледовательно одной программой или даже отдельными  операто-
 
   рами программы и по прямому доступу другой  программой  или
 
   другими операторами той же программы.
 
        В табл.1 приведены возможные варианты организации фай-
 
   лов и режимов доступов к файлам.
 
                                                    Таблица 1
 
               Организация файлов и режимы доступа
 
   ----------------------------------------------------------
    Режим    !           Организация файла
   доступа   !
             !-----------------------------------------------
             ! Последовательная ! Относительная ! Индексная
   ----------!------------------!---------------!------------
             !                  !               !
   Последо-  !        Да        !       Да      !     Да
   вательный !                  !               !
             !          1)      !               !
   Прямой по !        Да        !       Да      !     Нет
   номеру    !                  !               !
   записи    !                  !               !
             !                  !               !
   Прямой по !        Нет       !       Нет     !     Да
   ключу     !                  !               !
             !          2)      !               !
   Прямой по !        Да        !       Да      !     Да
   адресу    !                  !               !
   записи    !                  !               !
             !                  !               !
 
   -------------------
   1)
     только для записей фиксированной длины;
 
   2)
     для дисковых файлов.
 
        С режимом доступа связанно  понятие  поток  доступа  к
 
   записям или сокращенно поток.
 
        Поток - окно,  через  которое  программа  осуществляет
 
   доступ к файлу. В одной и той же программе может быть  соз-
 
   дано несколько потоков, каждый из которых связан с  отдель-
 
   ным блоком RAB, в котором  задаются  спецификации  операций
 
   над записями. Поток определяет  процесс  обработки  записей
 
 
 
                            - 43 -
 
                         00152-01 92 01
 
 
   файла, в то время как режим  доступа  определяет  следующую
 
   запись, подлежащую обработке.
 
 
 
        2.1.1.1. Последовательный доступ
 
 
        При последовательном доступе  обработка  начинается  с
 
   определенной записи и выполняется  для  каждой  последующей
 
   записи до конца файла.
 
        При  обработке  последовательного  файла  (рис.4)  для
 
   получения требуемой записи необходимо просмотреть все пред-
 
   шествующие записи. Поскольку записи прилегают друг к другу,
 
   определение адреса следующей записи обеспечивается системой
                                                    
   СУД-32 автоматически.
 
 
 
       Последовательная обработка последовательного файла
 
 
     Ппрограмма             СУД-32           блоки
    пользователя                             диска
   ----------------      ------------     -------------
   !  ----------  !      !          !     !           !
   !  ! Читать !--!----->!-  -  -  -!---->!     А     !
   !  ! след.  !<-!------!- - - - - !<----!           !
   !  ! запись !  !      !          !     !-----------!
   !  ----------  !      !          !     !           !
   !            <-!------!- - - - - !<----!     В     !
   !      .      -!----->!- - - - - !---->!           !
   !      .       !      !          !     !-----------!
   !      .       !      !          !     !     .     !
   !              !      !          !     !     .     !
   !              !      !          !     !     .     !
   !  ----------  !      !          !     !-----------!
   !  ! Читать !--!----->!-  -  -  -!---->!           !
   !  ! след.  !  !      !          !     !     F     !
   !  ! запись !<-!------!-  -  -  -!<----!           !
   !  ----------  !      !          !     !           !
   ----------------      ------------     -------------
 
 
 
                             Рис. 4
 
 
        Последовательная организация файла не дает возможности
 
   вернуться к уже обработанной записи. Для этой цели  необхо-
 
 
                            - 44 -
 
                         00152-01 92 01
 
 
   димо заново открыть файл и обработать  повторно  все  пред-
 
   шествующие ей записи. Добавить новые записи можно только  в
 
   конец файла.
 
        Относительный файл также может быть обработан последо-
 
   вательно, даже если отдельные его ячейки являются  пустыми.
 
   СУД-32 игнорирует пустые ячейки при чтении файла и  обраба-
 
   тывает только занятые записями ячейки. На схеме,  приведен-
 
   ной на рис.5 видно, что пустые  ячейки,  находящиеся  между
 
   записями а, в и с, игнорируются.
 
 
 
         Последовательная обработка относительного файла
 
 
       Программа             СУД-32           Ячейки
     пользователя                             файла
   ----------------      ------------     -------------
   !  ----------  !      !          !     !           !
   !  ! Читать !--!----->!-  -  -  -!---->!     А     !
   !  ! след.  !<-!------!-  -  -  -!<----!           !
   !  ! запись !  !      !          !     !-----------!
   !  ----------  !      ! -  -  -  !---->!   Пустая  !
   !      .       !      ! !        ! ----!           !
   !      .       !      ! !        ! !   !-----------!
   !      .       !      ! !        ! --->!           !
   !  ----------  !      ! !        !     !     В     !
   !  ! Читать !--!----->!--        !     !           !
   !  ! след.  !<-!------!-  -  -  -!<----!           !
   !  ! запись !  !      !          !     !-----------!
   !  ----------  !      !          !     !           !
   !      .       !      !          !     !  Пустая   !
   !      .       !      !          !     !           !
   !      .       !      !          !     !           !
   !  ----------  !      !          !     !-----------!
   !  ! Читать !--!----->!-  -  -  -!---->!  Пустая   !
   !  ! след.  !  !      !          !   --!           !
   !  ! запись !<-!------!-  -  -  -!<- ! !-----------!
   !  ----------  !      !          ! ! ! !           !
   !              !      !          ! ! ! !     С     !
   ----------------     ------------  ! ->!           !
                                      ----!           !
                                          -------------
 
 
 
                             Рис. 5
 
 
        При занесении в относительный файл запись  попадает  в
 
 
 
                            - 45 -
 
                         00152-01 92 01
 
 
   пустую ячейку, если ее номер больше номера  ячейки  записи,
 
   обработка которой предшествовала занесению новой  записи  в
 
   файл.
 
        В индексном файле обеспечивается логическая  упорядоч-
 
   ность записей по значениям ключевого поля. Путем  определе-
 
   ния  дополнительных  альтернативных  ключевых  полей  можно
 
   логически упорядочить один и тот же файл несколькими спосо-
 
   бами.
 
        При последовательном чтении индексного  файла  вначале
 
   необходимо указать номер рабочего ключа - основного, перво-
 
   го альтернативного, второго альтернативного  и т.д.,  -  по
 
   которым СУД-32 определяет первую запись,  с  которой  начи-
 
   нается  обработка.  Каждая  очередная  запись  определяется
 
   автоматически путем поиска значений соответствующих  ключе-
 
   вых полей, превосходящих по величине значения  предшествую-
 
   щих полей.
 
        При включении записи в индексный файл указание  значе-
 
   ния ключа не  требуется.  СУД-32  анализирует  имеющиеся  в
 
   записях файла  значения  первичного  ключа  для  размещения
 
   записи и значения альтернативных ключей для вставки  ссылки
 
   на запись в альтернативные индексы. При обработке  несколь-
 
   ких операторов занесения записей в  индексный  файл  СУД-32
 
   проверяет порядок следования значений их ключей.
 
 
 
        2.1.1.2. Прямой доступ по значению ключа или  по
 
                 относительному номеру записи
 
 
        Прямой доступ обеспечивается для всех относительных  и
 
   индексных файлов. При прямом  доступе  порядок,  в  котором
 
   происходит обработка записей, определяет программа  пользо-
 
 
 
                            - 46 -
 
                         00152-01 92 01
 
 
   вателя, а не организация  файла.  Для  получения  требуемой
 
   записи необходимо указать ее относительный номер (для отно-
 
   сительных файлов и некоторых последовательных  файлов)  или
 
   рабочий ключ плюс значение ключа  (для  индексных  файлов),
 
   идентифицирующие запись. Прямой доступ  к  последовательным
 
   файлам возможен, если файлы располагаются на диске и содер-
 
   жат записи фиксированной длины (п.2.1.2).
 
        При прямом доступе к последовательным или  относитель-
 
   ным файлам, в отличие от последовательного  доступа,  можно
 
   обращаться к любой записи файла.  Например,  можно  сначала
 
   прочитать запись с номером 6, а затем запись с номером 2.
 
        При прямом доступе к индексному файлу необходимо  ука-
 
   зание рабочего ключа (первичного или альтернативного) и его
 
   значения, по которому осуществляется поиск записи.  Найден-
 
   ная запись передается в программу пользователя. Прямой дос-
 
   туп может быть осуществлен при выполнении одного из следую-
 
   щих условий:
 
          - точное совпадение значения ключа;
 
          - приблизительное совпадение значений ключа  (значе-
 
            ние ключа в некоторой записи больше или равно зна-
 
            чению ключа, заданному в прикладной программе);
 
          - групповое  совпадение  значений  ключа.  Групповое
 
            совпадение применяется только для ключей со  стро-
 
            ковым типом данных . Групповое  совпадение  -  это
 
            совпадение заданного числа первых символов  значе-
 
            ния ключа;
 
          - комбинация приблизительного и группового  совпаде-
 
            ния.
 
        В отличие от операции GET, которая требует  задания  в
 
   прикладной программе значения ключа, операции,  выполняющие
 
 
                            - 47 -
 
                         00152-01 92 01
 
 
   занесение записи в индексный файл, задания  значения  ключа
 
   записи не требуют. Значения всех ключей (первичного и любо-
 
   го из альтернативных) находятся в самой записи. При  откры-
 
   тии индексного файла СУД-32 извлекает все определения  клю-
 
   чей, запомненные в данном файле. Таким образом,  местополо-
 
   жение и длина каждого поля ключа в записи  известны.  После
 
   занесения записи в индексный файл проводится  соответствую-
 
   щее обновление индексных ступеней в соответствии со  значе-
 
   ниями всех ключевых полей записи. Этим самым  гарантируется
 
   прямой доступ к записи по значению любого из ее ключей.
 
 
 
        2.1.1.3. Прямой доступ по адресу записи в файле
 
 
        Каждая запись имеет уникальный  адрес  внутри  данного
 
   файла - адрес записи в файле (АЗФ). Наличие  адреса  записи
 
   дает возможность прямого доступа к записи дискового  файла,
 
   организованного любым допустимым в СУД-32 способом. В част-
 
   ности, режим доступа по адресу записи является единственным
 
   способом прямого доступа к последовательному файлу с  запи-
 
   сями переменной длины.
 
        Важным свойством адреса записи в  файле  является  то,
 
   что этот адрес остается постоянным в течение всего  времени 
 
   существования данной записи в этом файле. СУД-32 при  зане-
 
   сении записи в файл  помещает  адрес записи в блок RAB. При 
 
   необходимости  его можно сохранить для последующего исполь-
 
   зования  в качестве указателя на запись, с целью  обращения 
 
   к записи в режиме произвольного доступа.
 
        При считывании записи из  файла  ее  адрес  необходимо 
 
   задать в блоке RAB.
 
 
 
 
 
                            - 48 -
 
                         00152-01 92 01
 
 
        2.1.2. Форматы записей
 
 
        Структура записей для СУД-32 значения не имеет. Исклю-
 
   чение составляет необходимость указания местоположения клю-
 
   чей в записях индексного файла. Важнейшей для СУД-32 харак-
 
   теристикой записей файла является их формат.
 
        СУД-32 поддерживает четыре различных формата записей:
 
        1) фиксированной длины;
 
        2) переменной длины;
 
        3) переменной длины с постоянной управляющей частью;
 
        4) потока.
 
        Форматы записей фиксированной длины и переменной длины
 
   допустимы для последовательных, относительных  и  индексных
 
   файлов. Формат записей переменной длины с постоянной управ-
 
   ляющей частью допускается для  последовательных  и  относи-
 
   тельных файлов. Формат потока допускается только для после-
 
   довательных файлов. В относительных файлах все записи  хра-
 
   нятся в ячейках фиксированной длины, даже если сами  записи
 
   были бы в формате переменной длины или переменной  длины  с
 
   постоянной управляющей частью.
 
 
 
        2.1.2.1. Записи фиксированной длины
 
 
        Записи, представленные в формате фиксированной  длины,
 
   имеют одинаковый размер, который устанавливается  в  момент
 
   создания файла. Фиксированная одинаковая длина каждой запи-
 
   си не обязательно предполагает ее полное заполнение  данны-
 
   ми. Например, значения  отдельных  полей  в  части  записей
 
   могут отсутствовать. Однако такие записи следует  дополнять
 
   до  указанного  фиксированного   размера   соответствующими
 
   символами-заполнителями, например, пробелами.
 
 
                            - 49 -
 
                         00152-01 92 01
 
 
        Размер записи является  атрибутом  файла,  содержащего
 
   записи фиксированной длины и СУД-32 учитывает его при обра-
 
   ботке файла.
 
 
 
        2.1.2.2. Записи переменной длины
 
 
        Размер записей переменной длины не  является  фиксиро-
 
   ванным. Каждая  запись  переменной  длины  занимает  только
 
   такое пространство, которое ей необходимо для  того,  чтобы
 
   вместить данные этой записи,  т.е.  При  отсутствии  данных
 
   символы-заполнители не требуются.
 
        Каждой записи переменной длины  предшествует  префикс,
 
   содержащий счетчик длины записи в байтах.
 
        При обработке записи  счетчик  длины  записи  задается
 
   отдельно от записи (в полях FAB и RAB).
 
        СУД-32 использует два типа форматов переменной  длины:
 
   формат V и формат D. Используемый формат  зависит  от  уст-
 
   ройства, на котором располагается данный файл.
 
        Формат V применяется для представления  записей  пере-
 
   менной длины в файлах, располагающихся на дисках. В  файлах
 
   формата V префикс записи занимает 2  байта.  Указанные  два
 
   байта в значение счетчика, представляемое двоичным  числом,
 
   не входят.
 
        Формат D применяется  в  записях,  располагающихся  на
 
   магнитных лентах. Этот формат соответствует стандарту  ANSI
 
   для ленточных файлов. В формате D префикс занимает 4 байта.
 
   Длина задается десятичным числом в символьном коде и учиты-
 
   вает 4 байта префикса. Однако при обработке  записи  в  FAB
 
   или RAB задается фактическая длина записи в двоичном виде.
 
        При создании  файла  указывается  максимальный  размер
 
 
 
                            - 50 -
 
                         00152-01 92 01
 
 
   записи. Любая попытка занести в файл запись, имеющую размер
 
   больший, чем этот максимальный размер, приводит  к  ошибке.
 
   Если в качестве максимального значения  задается  значение,
 
   равное 0, то в данный файл может быть занесена запись любой
 
   длины. Однако следует учитывать, что записи в относительных
 
   и индексных файлах, должны целиком содержаться внутри неко-
 
   торого бакета.
 
        На рис.6  приведены  форматы  записей,  поддерживаемые
 
   СУД-32 для последовательных файлов.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 51 -
 
                         00152-01 92 01
 
 
                         Форматы записей
 
 
   ----------------------------------------------
   !Данные!/!Данные!/!                !Данные!//! Фиксирован-
   !      !/!      !/!............... !      !//! ные 
   ---------------------------------------------- (формат F)
   !--32----!--32----!                !----32---!
 
   --------------------------------------------
   !   I         !   I         !   I          !
   !   I  8 байт !   I 16 байт !   I 20 байт  ! Формат D
   !   I         !   I         !   I          !
   --------------------------------------------
     \             !             /
       \           !           /
         \         !         /
           \       !       /
             \     !     /
               \   !   /
                 \ ! /
           Счетчик  (4 байта)
 
   --------------------------------------------
   !  I          !  I          !  I           !
   !  I  8 байт  !  I  16 байт !  I  24 байта ! Формат V
   !  I          !  I          !  I           !
   --------------------------------------------
     \            !            /
       \          !          /
         \        !        /
           \      !      /
             \    !    /
               \  !  /
                 \!/
            Счетчик  ( 2 байта )
 
 
 
                             Рис. 6
 
 
        В относительном файле все записи, и переменной и  фик-
 
   сированной длины, записываются в ячейки фиксированной  дли-
 
   ны. Следовательно,  при  использовании  записей  переменной
 
   длины,  экономия  пространства  памяти  отсутствует.  Более
 
   того, на запись  требуется  два  дополнительных  байта  для
 
   счетчика ее длины.
 
        В индексном файле длина записи переменной длины  огра-
 
   ничена только размером  бакета  или  максимальным  размером
 
   записи. Учитывая возможность изменения размера записи, нап-
 
 
                            - 52 -
 
                         00152-01 92 01
 
 
   ример, при ее корректировке, заносить в файл записи  макси-
 
   мально допустимого размера не рекомендуется.
 
 
 
        2.1.2.3. Записи переменной  длины  с  постоянной
 
                 управляющей частью
 
 
        Записи  переменной  длины  с  постоянной   управляющей
 
   частью похожи на записи  переменной  длины.  Отличие  между
 
   ними состоит в том, что поле постоянной  управляющей  части
 
   является префиксом для части  данных  переменной  длины.  В
 
   отличие от записей переменной длины, однако,  записи  пере-
 
   менной длины с постоянной управляющей частью не могут  быть
 
   использованы в индексных файлах.
 
        При создании файла задаются два размера:
 
        1) максимальный размер всей записи;
 
        2) размер постоянной управляющей части.
 
        При попытке занесения в файл  записи,  размер  который
 
   превышает максимальный, возникает ошибка.
 
        Постоянная управляющая часть позволяет  конструировать
 
   записи, содержащие дополнительные данные, которые,  возмож-
 
   но, не  имеют  непосредственного  отношения  к  содержимому
 
   самих записей. Например, постоянная управляющая часть  каж-
 
   дой записи, создаваемой текстовым редактором (в  частности,
 
   EDT) может содержать последовательный номер  записи  (номер
 
   строки). Использование таких номеров полезно при редактиро-
 
   вании файла. При выполнении других операций над  файлом  их
 
   можно игнорировать.
 
        Постоянная и переменная части записи задаются раздель-
 
   но, однако при занесении записи в файл СУД-32  проводит  их
 
   об'единение. Размер  переменной  части  определяется  путем
 
 
 
                            - 53 -
 
                         00152-01 92 01
 
 
   вычитания от задаваемой длины записи  длины  ее  постоянной
 
   части. Перед этой записью затем помещается  2-байтный  пре-
 
   фикс, содержащий счетчик общей длины записи в виде двоично-
 
   го числа. На рис.7 приведена схема занесения в файл  записи
 
   переменной длины с постоянной управляющей частью.
 
 
 
        Схема занесения в файл записи переменной длины с
 
                  постоянной управляющей частью
 
 
                        ---------------
   ------------         ! Управляющая !     ----------
   ! Создание !-------->!    часть    !---->! СУД-32 !
   ! записи   !         ---------------     ----------
   ------------                               !   !
        !               ---------------       !   !
        !-------------->!   Данные    !-------!   !
                        ---------------           !
                                                  !
           ---------------------------------------!
           !
           V
   ---------------       ----------------------------------
   ! Занесение   !       !         !             !        !
   !     в       !       !         ! Постоянная  !        !
   ! файл записи !------>! Счетчик ! управляющая ! Данные !
   ! и префикса  !       !         !    часть    !        !
   ---------------       ----------------------------------
                         !            Запись              !
                         !<------------------------------>!
 
 
 
                             Рис. 7
 
 
        При чтении из файла записи переменной длины с постоян-
 
   ной управляющей частью СУД-32 использует поле счетчика  для
 
   того, чтобы определить об'единенную длину постоянной управ-
 
   ляющей части и переменной части данных.  Постоянная  управ-
 
   ляющая часть затем отделяется от  переменной  части  данных
 
   этой записи для обработки так, как это показано  на  рис.8.
 
   Фиксированная длина постоянной управляющей части вычитается
 
   из счетчика записи и, таким образом, в программу  пользова-
 
 
 
                            - 54 -
 
                         00152-01 92 01
 
 
   теля передается только длина переменной части данных.  Пос-
 
   тоянную управляющую часть  записи  можно  игнорировать,  не
 
   задавая для нее отдельного буфера.
 
 
 
         Схема чтения из файла записи переменной длины с
 
                  постоянной управляющей частью
 
 
   ----------     ---------------------------------------
   ! Чтение !     !         ! Постоянная управ-!        !
   ! записи !---->! Счетчик ! ляющая часть     ! Данные !--!
   ----------     ---------------------------------------  !
                  !                                     !  !
                  !<--------------Запись--------------->!  !
                                                           !
       !---------------------------------------------------!
       !
       !                   !--------------V
       V                   !          ----------    ---------
   ----------       --------------    ! Данные !--->! Обра- !
   ! СУД-32 !------>! Разделение !    ----------    ! ботка !
   !        !       !   записи   !                  ---------
   ----------       --------------
                           !
                           !          ---------------
                           !          ! Управляющая !
                           !--------->!    часть    !
                                      ---------------
 
 
 
                             рис. 8
 
 
 
 
        2.1.2.4. Формат потока
 
 
        Записи в формате потока разделяются  при  помощи  спе-
 
   циальных символов или последовательностей  символов,  назы-
 
   ваемых "терминаторами".  Терминаторы  являются  частью  той
 
   записи, которую они разделяют. Имеется три варианта формата
 
   потока - STREAM, STREAM_CR и STREAM_LF - в  зависимости  от
 
   применяемых терминаTоров. Записи формата STREAM могут  быть
 
   разделены любым специальным символом, а форматы STREAM_CR и
 
   STREAM_LF разделяются, соответственно, символами  <CR>  или
 
 
                            - 55 -
 
                         00152-01 92 01
 
 
   <LF>.
 
        Данные в файле  формата  потока  интерпретируются  как
 
   непрерывная последовательность байтов без какой-либо управ-
 
   ляющей информации.
 
        Поддержка формата  потока  обеспечивается  только  для
 
   последовательных файлов на дисках.
 
 
 
        2.2. Концепции организации файлов
 
 
        Организация файлов определяет физическое  расположение
 
   записей в файле. Организацию файлов  не  следует  путать  с
 
   режимом доступа к записям. Режим доступа к записям  опреде-
 
   ляет, каким образом записи будут заноситься в файл и извле-
 
   каться из файла. Организация файла  обеспечивает  требуемое
 
   размещение записей в файле с целью эффективного  доступа  к
 
   ним. Способ организации файла выбирается в момент  создания
 
   файла. Изменение способа организации файла возможно  только
 
   с использованием специальной обслуживающей программы СУД-32
 
   - CONVERT. При этом проводится повторное создание файла.
 
 
 
        2.2.1. Структура последовательного файла
 
 
        При последовательной организации файла записи в  файле
 
   расположены одна за  другой.  Последовательная  организация
 
   файла обеспечивается для всех типов устройств. Записи  рас-
 
   полагаются в том порядке, в котором  они  были  записаны  в
 
   данном файле. Другими словами, если нужно получить доступ к
 
   четвертой записи, то она может быть найдена между третьей и
 
   пятой записями.
 
        Добавлять записи к последовательному файлу можно толь-
 
   ко в его конец, поскольку физическое местоположение  каждой
 
 
                            - 56 -
 
                         00152-01 92 01
 
 
   записи зафиксировано по отношению ко всем другим записям  в
 
   данном файле.
 
        При корректировке существующей записи в последователь-
 
   ном файле следует учитывать, что изменение ее длины  невоз-
 
   можно. Корректировка проводится путем извлечения записи  из
 
   файла, изменения ее содержимого и занесения записи на  ста-
 
   рое место.
 
 
 
        2.2.2. Структура относительного файла
 
 
        Относительная организация файлов обеспечивается только
 
   для дисков. Этот тип организации  является  более  сложным,
 
   чем последовательная организация,  но  менее  сложным,  чем
 
   индексная.  При  этом  способе  организации  обеспечивается
 
   самый быстрый прямой доступ  к  записям,  число  параметров
 
   настройки файла невелико.
 
        Относительный файл состоит из последовательности ячеек
 
   фиксированной длины, которые пронумерованы  последовательно
 
   от 1 до N.  Номер  ячейки  является  относительным  номером
 
   записи, который указывает на положение данной записи  отно-
 
   сительно начала файла. Каждой записи, записанной  в  данный
 
   файл, приписывается некоторая конкретная ячейка внутри дан-
 
   ного файла. Например, вторая по порядку  занесения  в  файл
 
   запись, могла бы быть помещена в четвертую ячейку.  В  этом
 
   случае данная запись имела бы относительный номер равный 4.
 
   При поиске этой записи, необходимо указать ее относительный
 
   номер.
 
        Относительный номер записи является,  значением  ключа
 
   при прямом режиме доступа. Ячейки фиксированной длины  поз-
 
   воляют СУД-32 вычислять  действительное  положение  записи.
 
 
 
                            - 57 -
 
                         00152-01 92 01
 
 
   запись может быть удалена из любой ячейки в файле, освобож-
 
   дая тем самым  ячейки  для  новых  записей,  которые  могут
 
   использоваться повторно.
 
        На рис.9 представлена общая схема относительной  орга-
 
   низации файла.
 
 
 
           Общая схема относительной организации файла
 
 
                    Относительные ячейки
           ----------------------------------------
          /         !         !           !        \
        /           !         !           !          \
      /             !         !           !            \
      1             2         3           4             5
      V             V         V           V             V
   ---------------------------------------------------------
   !    1-я    !       !    2-я    !    3-я    !    4-я    !
   ! занесенная! пустая! занесенная! занесенная! занесенная!
   !   запись  ! ячейка!   запись  !   запись  !   запись  !
   ---------------------------------------------------------
 
 
 
                             Рис. 9
 
 
        Для того, чтобы получить доступ к записи в относитель-
 
   ном файле в режиме  прямого  доступа  необходимо  знать  ее
 
   относительный номер. Один способ отслеживания ячеек записей
 
   состоит в том, чтобы присваивать каждой  записи  внутренний
 
   номер, совпадающий с номером ячейки.
 
        Хотя каждая запись в относительном файле связывается с
 
   некоторой ячейкой фиксированной длины, действительный  раз-
 
   мер отдельных записей  может  варьироваться  по  длине  (то
 
   есть, в одном и том же файле могут быть записи разного раз-
 
   мера). Ясно, что размер каждой записи  должен  быть  меньше
 
   или равен размеру ячейки фиксированной длины. Пусть, напри-
 
   мер, фиксированная длина каждой ячейки в некотором  относи-
 
   тельном файле составляет 256 байтов. В данном файле имеется
 
 
 
                            - 58 -
 
                         00152-01 92 01
 
 
   только три записи, причем каждая имеет разную длину. Первая
 
   запись содержит 192 байта, вторая - 128 байтов, а третья  -
 
   253 байта. Каждая из этих  записей  может  располагаться  в
 
   одном и том же относительном файле, поскольку каждая из них
 
   занимает свою собственную ячейку фиксированной  длины,  как
 
   это показано на рис.10. Поскольку данные записи имеют пере-
 
   менную длину, каждая из них  имеет  3-х  байтовый  префикс,
 
   который указывает на данную запись и  на  то,  свободна  ли
 
   данная ячейка (так называемый  флаг  удаления).  Эти  байты
 
   пользователю не доступны  и  используются  только  системой
 
   СУД-32. Однако их размер следует учитывать при проектирова-
 
   нии файла.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 59 -
 
                         00152-01 92 01
 
 
              Размещение записей переменной длины в
 
                       относительном файле
 
 
         /------- Ячейки фиксированной  длины --------\
       /                                                \
     / ----256 байт----!------256 байт-----!---256 байт--\
   /                   !                   !               \
   ----------------------------------------------------------
   !---! Запись 1 !////!---! Запись 2 !////!---!  Запись 3  !
   !---!   192    !////!---!    128   !////!---!    253     !
   !---!  байта   !////!---!   байтов !////!---!   байта    !
   ----------------------------------------------------------
 
   Обозначения:
 
   -------
   !-----!
   !-----! - управляющая информация СУД-32
   !-----!
   -------
 
   -------
   !/////!
   !/////! - неиспользуемые байты
   !/////!
   -------
 
 
 
                            Рис. 10
 
 
 
 
        2.2.3. Структура индексного файла
 
 
        Третий способ организации файлов, называемый индексным
 
   возможен только для дисков. Индексная организация позволяет
 
   хранить в файле записи в предварительно определенном поряд-
 
   ке сортировки. Порядок сортировки определяют ключи файла. К
 
   записям индексного файла возможен последовательный или пря-
 
   мой доступ по значению одного из ключей. Физическое  разме-
 
   щение записей на диске обеспечивает СУД-32.
 
        Ключ - это некоторое поле внутри каждой записи,  опре-
 
   деленное его местоположением и длиной. Значение ключа может
 
   быть  строкой  символов,  упакованным  десятичным   числом,
 
 
 
                            - 60 -
 
                         00152-01 92 01
 
 
   двоичным числом без знака состоящим из 2-х,  4-х  или  8-ми
 
   байтов или целым числом со знаком состоящим из 2-х, 4-х или
 
   8-ми байтов. При идентификации местоположения и длины  клю-
 
   чей, состоящих из строк символов, пользователь может  опре-
 
   делить простые или сегментированные ключи. Простой  ключ  -
 
   это некоторая единственная непрерывная  строка  символов  в
 
   данной записи. Целые, двоичные или  упакованные  десятичные
 
   ключи всегда являются  простыми  ключами.  Сегментированный
 
   ключ может состоять  из  нескольких  (от  двух  до  восьми)
 
   полей, каждое из которых представлено  символьной  строкой.
 
   Эти поля не обязательно должны быть смежными. Когда обраба-
 
   тываются записи, которые содержат  сегментированные  ключи,
 
   СУД-32 трактует отдельные сегменты как некоторое  логически
 
   непрерывное поле данных.
 
        Для индексного файла должен быть задан по крайней мере
 
   один ключ, определяющий порядок  сортировки  записей.  Этот
 
   обязательный ключ является первичным ключом. Помимо  этого,
 
   могут быть определены дополнительные ключи, которые обозна-
 
   чаются как альтернативные ключи. Каждый альтернативный ключ
 
   также определяется своим местоположением  и  длиной  внутри
 
   записи. Прямой доступ к записям файла может быть  осущеСТВ-
 
   лен как по первичному ключу, так и по любому альтернативно-
 
   му ключу. При занесении записей в  индексный  файл,  СУД-32
 
   использует значения первичного и альтернативных ключей  для
 
   того, чтобы построить соответствующие индексы, т.е.  Струк-
 
   туры, позволяющие извлекать из файла отсортированные записи
 
   наиболее быстрым способом.
 
        Помимо определения простых или сегментированных ключей
 
   пользователь может задать следующие характеристики ключей:
 
          - возможность задания дублирующих значений для  пер-
 
 
                            - 61 -
 
                         00152-01 92 01
 
 
            вичного и альтернативных ключей;
 
          - возможность изменения значений для  альтернативных
 
            ключей;
 
          - возможность отсутствия значений для альтернативных
 
            ключей, т.е. задания "нулевых значений".
 
        Возможность  задания  дублирующих  значений  допускает
 
   наличие в файле нескольких записей с  одинаковым  значением
 
   соответствующего ключа. При чтении  записей  только  первая
 
   запись с повторяющимся значением ключа может быть извлечена
 
   прямым доступом к ней, следующие за ней записи  извлекаются
 
   в  последовательном  режиме.  Эта  возможность  применяется
 
   только для индексных файлов. В относительных файлах иденти-
 
   фикатор записи, который представляет собой некоторый  отно-
 
   сительный номер записи, всегда является уникальным.
 
        Задание возможности изменения значений ключей относит-
 
   ся только к альтернативным ключам  и  означает  возможность
 
   замены их значений в записях индексного  файла  на  другие.
 
   Когда происходит такая  модификация,  СУД-32  автоматически
 
   корректирует соответствующий индекс для того,  чтобы  отра-
 
   зить в нем новое значение ключа.
 
        Если значение альтернативного ключа может  быть  нуле-
 
   вым то такое нулевое значение  в  индексе,  соответствующем 
 
   данному ключу, отсутствует. Усеченные значения альтернатив-
 
   ных ключей в соответствующие индексы также не заносятся.
 
        Перечисленные характеристики ключей можно явным  обра-
 
   зом запретить, то есть можно указать,  что  для  некоторого
 
   заданного ключа не допускаются  дублирующие  значения,  что
 
   значения ключа не могут изменяться и  что  не  должно  быть
 
   нулевых значений. Тогда, если дублирующие значения не допу-
 
   скаются, то СУД-32 отвергает любой запрос на занесение  за-
 
 
                            - 62 -
 
                         00152-01 92 01
 
 
   писи в файл, если эта запись содержит значение ключа, кото-
 
   рое присутствует в другой записи, уже  имеющейся  в  файле. 
 
   Аналогичным образом, если ключи не могут изменяться, СУД-32  
 
   не позволяет корректировать запись с модификацией  значения
 
   данного ключа. Записи, чьи ключи не  могут  быть  нулевыми,
 
   всегда имеют некоторый элемент в соответствующем  альтерна-
 
   тивном индексе.
 
        СУД-32 создает и  поддерживает  отдельный  индекс  для
 
   каждого ключа, который определен для индексного файла. Каж-
 
   дый индекс хранится в самом файле. Таким образом, индексный
 
   файл содержит, по крайней мере, один индекс (для первичного
 
   ключа) и по одному индексу для каждого альтернативного клю-
 
   ча, если они определены.
 
        На рис.11 показана общая структура индексного файла, у
 
   которого определен только первичный ключ  (поле  "табельный
 
   номер"). Предполагается, что  в  одном  бакете  размещается
 
   одна запись. При наличии альтернативных ключей для  каждого
 
   из них строятся индексные  ступени,  аналогичные  индексным
 
   ступеням первичного ключа, и структура файла выглядит  нес-
 
   колько сложнее.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 63 -
 
                         00152-01 92 01
 
 
            Структура индексного файла с одним ключем
 
 
                    ---------------------
                    ! Определение ключа !
                    ---------------------
                              !
        /--Индекс первичного ключа (табельный номер)--\
       /                      !                        \
       -------------------------------------------------
       ! 0020 ! ... ! 0100 ! ... ! 0875 ! ... !  3250  !
       -------------------------------------------------
         !             !                           !
      ----             ----                     ----
      !                   !                     !
      V                   V                     V
   -----------------   -----------------      --------------
   !0020!Иванов!150!...!0100!Петров!210! .... !3250!Ким!215!
   -----------------   -----------------      --------------
 
 
 
                            рис. 11
 
 
        Записи в индексном файле отсортированы  по  первичному
 
   ключу. Для альтернативных ключей последовательность  соРТИ-
 
   ровки устанавливается при помощи упорядоченных указателей в
 
   индексах на соответствующие записи.
 
        Индексный файл состоит из так  называемого  пролога  и
 
   одной или более индексных ступеней. Пролог содержит  инфор-
 
   мацию о данном файле, включая и атрибуты файла. СУД-32 под-
 
   держивает три различных вида пролога. Обычно  по  умолчанию
 
   СУД-32 создает индексный файл с версией пролога 3. При соз-
 
   дании файла, однако, можно указаTь  необходимость  создания
 
   предыдущей версии пролога, например,  для  совместимости  с
 
   системой СУД для ЭВМ семейства СМ 4.
 
        При занесении записей в  индексный  файл,  если  соот-
 
   ветствующий бакет заполнен и  места  для  новой  записи  не
 
   имеется, то происходит расщепление бакета, то есть  образо-
 
   вание нового бакета с соответствующим перемещением половины
 
   записей старого бакета в новый  и  образованием  7-байтовых
 
 
 
                            - 64 -
 
                         00152-01 92 01
 
 
   указателей на  новый  бакет,  называемых  векторами  ссылки
 
   записи (RRV). Вектора ссылки записи приводят к дополнитель-
 
   ным накладным расходам на дисковую память.
 
        В дополнение к накладным расходам  памяти  на  вектора
 
   ссылки, расщепление бакетов может привести к тому, что неп-
 
   рерывность экстентов файла будет  нарушена.  Для  избежания
 
   расщепления бакетов можно указать, что при начальном  зане-
 
   сении записей в файл бакеты с данными и бакеты с  индексами
 
   не должны заполняться полностью. Это целесообразно  делать,
 
   если известно, что приложение потребует вставки  записей  в
 
   файл  после  его  начальной  загрузки.  Степень  начального
 
   заполнения бакетов задается при создании  файла  с  помощью
 
   так называемого коэффициента заполнения бакетов.
 
 
 
        2.2.4. Сравнение организаций файлов
 
 
        В табл.2 перечисляются характеристики файлов, в  зави-
 
   симости от их организации.
 
                                                    Таблица 2
 
                      Характеристики файлов
 
   ----------------------------------------------------------
                    !       Организация файла
                    !----------------------------------------
    Характеристики  ! Последова- ! Относительная ! Индексная
                    ! тельная    !               !
   ----------------------------------------------------------
                    !            !               !
   Носитель данных: !            !               !
                    !            !               !
   диск             !    Да      !      Да       !     Да
                    !            !               !
   магнитная лента  !    Да      !      Нет      !     Нет
                    !            !               !
   другие устрой-   !    Да      !      Нет      !     Нет
   ства, ориентиро- !            !               !
   ванные на записи !            !               !
                    !            !               !
   Формат записи:   !            !               !
                    !            !               !
   фиксированная    !    Да      !      Да       !     Да
 
 
                            - 65 -
 
                         00152-01 92 01
 
 
                                          Продолжение табл. 2
   ----------------------------------------------------------
                    !       Организация файла
                    !----------------------------------------
    Характеристики  ! Последова- ! Относительная ! Индексная
                    ! тельная    !               !
   ----------------------------------------------------------
                    !            !               !
   Длина:           !            !               !
                    !            !               !
   переменная длина !    Да      !      Да       !     Да
                    !            !               !
   переменная длина !    Да      !      Да       !     Нет
   с постоянной уп- !            !               !
   равляющей частью !            !               !
   (только на диске)!            !               !
                    !            !               !
   потокA (только   !    Да      !      Нет      !     Нет
   на диске)        !            !               !
                    !            !               !
   неопределенный   !    Да      !      Нет      !     Нет
   (только на диске)!            !               !
                    !            !               !
   Накладные расходы!    Нет     ! 1 или 2 байта ! 1 или 3
   на одну запись   !            !               ! байта 1)
                    !            !               !
   Операции над за- !            !               !
   писями:          !            !               !
                    !            !               !
   CONNECT          !    Да      !       Да      !    Да
                    !            !               !
   DELETE           !    Нет     !       Да      !    Да
                    !            !               !
   DISCONNECT       !    Да      !       Да      !    Да
                    !            !               !
   FIND             !    Да      !       Да      !    Да
                    !            !               !
   FLUSH            !    Да      !       Да      !    Да
                    !            !               !
   FREE             !    Нет     !       Да      !    Да
                    !            !               !
   GET              !    Да      !       Да      !    Да
                    !            !               !
   REWIND           !    Да      !       Да      !    Да
                    !            !               !
   TRUNCATE         !    Да      !       Нет     !    Нет
                    !            !               !
   UPDATE (только на!    Да      !       Да      !    Да
   диске)           !            !               !
                    !            !               !
   PUT              !    Да      !       Да      !    Да
                    !            !               !
   Единица ввода-   ! 1 или более!      Бакет    ! Бакет
   вывода           !  Блоков    !               !
                    !            !               !
   Методы ввода-    !            !               !
   вывода:          !            !               !
                    !            !               !
   отложенная запись! Нормальный !  По выбору    !  По выбору
 
 
                            - 66 -
 
                         00152-01 92 01
 
 
                                          Продолжение табл. 2
   ----------------------------------------------------------
                    !       Организация файла
                    !----------------------------------------
    Характеристики  ! Последова- ! Относительная ! Индексная
                    ! тельная    !               !
   ----------------------------------------------------------
                    !            !               !
                    !    Режим   !               !
                    !            !               !
   многоблочный     !     Да     ! Размер бакета ! Размер
   счетчик          !            !               ! бакета
                    !            !               !
   потоки с многими !     Да     !        Да     !      Да
   доступами        !            !               !
                    !            !               !
   многократные     !     Да     !        Да     !      Да
   буферы           !            !               !
                    !            !               !
   групповая вставка!     Нет    !        Нет    !      Нет
                    !            !               !
   разделение досту-! Только по  ! Чтение/запись ! Чтение/
   па к файлу       ! чтению     !               ! запись
                    !            !               !
   другие свойства  !Записи сцеп-! Максимальный  ! Области
                    !ленные по   ! номер записи  !
                    ! блокам     !               !
                    !            !               !
 
   -------------------
   1)
     Накладные  расходы  для записей фиксированной длины
 
     составляют 1 байт, для записей переменной длины или
 
     переменной длины с   постоянной управляющей частью -
 
     3 байта. Дополнительные накладные расходы - расходы
 
     на ячейку.
 
        В табл.3, 4, 5 показаны преимущества и недостатки каж-
 
   дой организации файла.
 
                                                     Таблица 3
 
     Преимущества и недостатки последовательной организации
                              файла
 
   -----------------------------------------------------------
   Преимущества                !          Недостатки
   -----------------------------------------------------------
                               !
   Самая простая организация   !   Для  того, чтобы  прочитать
                               ! конкретную запись, необходимо
                               ! получить доступ ко всем запи-
                               ! сям,  предшествующим  данной
                               !
 
 
                            - 67 -
 
                         00152-01 92 01
 
 
                                           Продолжение табл. 3
   -----------------------------------------------------------
   Преимущества                !          Недостатки
   -----------------------------------------------------------
                               !
   Минимальные накладные расхо-!   Нет прямого  доступа по ад-
   ды на диске                 ! ресу  записи  в файле  или по
                               ! ключу 1)
                               !
   Допускается сцепление запи- !
   сей по блокам               !
                               !
     Наиболее оптимальная орга-!   Интерактивная     обработка
   низация,  если  прикладная  ! файла,  в особенности при об-
   программа  осуществляет дос-! ращении  к  файлу  нескольких
   туп ко всем  записям при об-! пользователей замедляется
   работке  файла, за  исключе-!
   нием случаев, если файл дол-!   Программы не могут получить
   жен обрабатываться одновре- ! доступ  к   записи,   которая
   менно несколькими пользова- ! уже  была   обработана,   без
   телями.                     ! закрытия и повторного  откры-
     Наиболее гибкий формат за-! тия данного файла
   писей                       !
                               !   Доступ к файлу  нескольких
     Возможен  обмен данными с ! пользователей возможен толь-
   другими операционными сиСТЕ-! ко по чтению.
   мами, например ес ЭВМ, СМ 4.!
   обеспечивается формат стан- !   Пользователь  может добав-
   дарта ANSI                  ! лять записи только  в  конец
                               ! файла. 1)
     Нет ограничений на тип но-!
   сителя, поддерживаются все  !   Удаление записей невозмож-
   типы носителей, допустимые в! но
   СМ 1700. Файл является пере-!
   носимым                     !
                               !
 
   -------------------
   1)
     Эти ограничения не существуют для дисковых последовате-
 
     льных  файлов с форматом  записей  фиксированной длины.
 
     записи в  таких  файлах  могут  быть  занесены в файл и
 
     извлечены  из файла,  используя  прямой доступ по ключу,
 
     который   зависит от  возможностей  конкретного   языка
 
     программирования.
 
 
 
 
 
 
 
 
 
 
 
                            - 68 -
 
                         00152-01 92 01
 
 
                                                    Таблица 4
 
      Ппреимущества и недостатки относительной организации
                              файла
 
   ----------------------------------------------------------
     Преимущества               !    Недостатки
   ----------------------------------------------------------
                                !
     Прямой доступ для всех язы-!   Поддерживаются   только
   ков программирования, опера- ! диски
   ции  GET  и PUT  работают по !   Хранение записей в  фик-
   прямому доступу              ! сированных  ячейках  с воз-
                                ! можным  наличием  "пустых"
     Допускается удаление запи- ! ячеек  приводит  к  неопти-
   сей                          ! мальному использованию дис-
                                ! ка
     Прямой и  последовательный !
   доступ с незначительными нак-!    Программа  должна  знать
   ладными расходами            ! относительный номер  записи
     Допускается совместный дос-! или  адрес  записи в  файле
   туп к файлу нескольких поль- ! для получения доступа к ней
   зователей по записи          !
                                !    Нет общего доступа   как
                                ! в  индексной   организации
                                ! файла. Интерактивная обра-
                                ! ботка замедляется при пос-
                                ! ледовательном  доступе  к
                                ! файлу
                                !
                                !    Записи  можно  заносить
                                ! только в  свободные ячейки,
                                ! однако  возможна  корректи-
                                ! ровка  записей  в  тех  же
                                ! ячейках
                                !
                                !    Повторение относительных
                                ! номеров  записей не  допус-
                                ! кается. Пространство, зани-
                                ! маемое  каждой  записью на
                                ! диске,  по  величине  равно
                                ! самой большой записи в дан-
                                ! ном файле
                                !
 
                                                     Таблица 5
 
       Преимущества и недостатки индексно-последовательной
                        организации файла
 
   -----------------------------------------------------------
      Преимушества               !      Недостатки
   -----------------------------------------------------------
                                 !
     Наиболее гибкий прямой дос- !   Самые большие  накладные
   туп: по одному из нескольких  ! расходы памяти: дисковой и
   ключей  или  адресу  записи в ! оперативной
   файле                         !
                                 !
 
 
                            - 69 -
 
                         00152-01 92 01
 
 
                                           Продолжение табл. 5
   -----------------------------------------------------------
      Преимушества               !      Недостатки
   -----------------------------------------------------------
                                 !
     Возможен доступ по группово-!
   му или приблизительному значе-!
   нию ключа                     !
                                 !
     Возможны дублирующиеся зна- !   Наиболее  сложное  прог-
   чения ключей                  ! раммирование
                                 !
     Автоматическая   сортировка !   Наибольшее время доступа
   записей  по  первичному и аль-! к записи
   тернативному  ключам, исполь- !
   зуемая во время последователь-!
   ного доступа                  !
                                 !
     Местоположение  записи  для !
   пользователя прозрачно        !
                                 !
     Допускается совместный дос- !
   туп к файлу по записи         !
                                 !
     Потенциальный диапазон зна- !
   чений ключей физически не за- !
   дается,  как  в  относительной!
   организации файла             !
                                 !
     Разнообразие форматов данных!
   для ключей                    !
                                 !
 
 
        2.3. Эффективность
 
 
        При проектировании файла режим доступа к записям, фор-
 
   мат записи и организация файла  должны  выбираться с  целью
 
   оптимизации эффективности обработки файла прикладными прог-
 
   раммами. В данном разделе обсуждаются общие вопросы  эффек-
 
   тивности и конкретные компромиссы, которых следует  придер-
 
   живаться при программировании прикладных программ.
 
 
 
        2.3.1. Вопросы проектирования
 
 
        При разработке прикладной программы, наибольшее внима-
 
   ние уделяется следующим вопросам:
 
 
 
 
                            - 70 -
 
                         00152-01 92 01
 
 
        1) быстродействию программы, которое должно быть  мак-
 
   симально возможным;
 
        2) размеру используемой памяти,  который  должен  быть
 
   сведен к минимуму;
 
        3) возможности  использования  данных,  обрабатываемых
 
   программой, другими программами (совместный доступ  к  дан-
 
   ным);
 
        4) простоте проектирования программы с целью минимиза-
 
   ции времени ее написания и отладки.
 
 
 
        2.3.1.1. Быстродействие программы
 
 
        Одной из важнеших характеристик  быстродействия  прог-
 
   раммы является скорость выполнения операций ввода-вывода.
 
        Например, когда прикладная программа в первый раз зат-
 
   ребует данные из некоторого файла, то контроллер диска дол-
 
   жен организовать поиск этих данных на диске,  на  что  ТРЕ-
 
   буется значительное время по сравнению с обработкой  данных
 
   в оперативной памяти. Контроллер диска должен  затем  пере- 
 
   дать эти данные в основную память.  И,  наконец,  программа 
 
   обрабатывает эти данные и продолжает работу. Если данные из  
 
   файла, которые запрашивает программа, уже находятся в памя- 
 
   ти, то операции поиска на диске и передачи исключаются.
 
        На время выполнения операций ввода-вывода при работе с
 
   файлами СУД-32 влияют многие факторы.
 
        Следует тщательно продумать структуру  файла,  которая
 
   зависит от разнообразных атрибутов файла, влияющих на время
 
   выполнения операций ввода-вывода. К ним относятся:
 
          - размер бакета (для относительного  или  индексного
 
            файла);
 
 
 
                            - 71 -
 
                         00152-01 92 01
 
 
          - число ключей (для индексного файла);
 
          - число дублирующихся значений ключа (для индексного
 
            файла);
 
          - начальное распределение пространства для файла;
 
          - размер расширения файла по умолчанию.
 
        Важным представляется определение размера файла, кото-
 
   рый зависит от числа записей в данном файле.  Размер  файла
 
   влияет на время выполнения операций ввода-вывода при после-
 
   довательном просмотре файла или для отслеживания некоторого
 
   индекса. Выполнение  операций  ввода-вывода  неизбежно  при
 
   отработке операций над файлами, таких как OPEN и  CLOSE,  и
 
   при выполнении операций над записями, таких как GET и PUT.
 
        Большое значение при работе с СУД-32  имеет  эффектив-
 
   ность работы файлового процессора  МОС  ВП,  преобразующего
 
   виртуальные блоки файла в логические дисковые блоки.
 
        И, наконец, на выполнение операций ввода-вывода влияют
 
   характеристики запоминающего устройства, на котором  распо-
 
   ложены программа пользователя и  файлы  данных.  Собственно
 
   физические операции чтения-записи данных на дисках  или  на
 
   магнитных лентах занимают значительную часть времени выпол-
 
   нения всей операции ввода-вывода. Тип выбранного устройства
 
   (с перемещаемыми головками, с  фиксированными  головками  и
 
   так далее) и требования к нему (активность ввода-вывода для
 
   данного устройства внутри системы) являются решающими  фак-
 
   торами для эффективности ввода-вывода.
 
        Таким образом для повышения  быстродействия  программы
 
   рекомендуется:
 
        1) держать в основной памяти как можно больше  данных,
 
   так чтобы системе было необходимо обращаться  к  диску  или
 
   ленте как можно реже;
 
 
                            - 72 -
 
                         00152-01 92 01
 
 
        2) организовать свои данные на  диске  таким  образом,
 
   чтобы контроллер диска смог быстро их найти;
 
        3) передавать большие части данных в память для  того,
 
   чтобы уменьшить число выполняемых системой передач данных.
 
 
 
        2.3.1.2. Размер памяти
 
 
        При выполнении операций ввода-вывода необходима  бУФЕ-
 
   ризация данных в памяти.
 
        Размер буферов ввода-вывода можно варьировать. В общем
 
   случае, чем больше буферы, тем быстрее задача  обрабатывает
 
   данные.
 
        Об'ем дисковой памяти, который  требуется  СУД-32  для
 
   хранения данных, зависит от организации  данного  файла,  а
 
   также от возможностей обработки файла с учетом его  органи-
 
   зации.
 
        Например,  для  последовательной   организации   файла
 
   СУД-32 добавляет один пустой байт, если это необходимо  для
 
   того, чтобы выровнять каждую  запись  фиксированной  длины,
 
   переменной длины или переменной длины с  постоянной  управ-
 
   ляющей частью на границу четного байта. Когда файл содержит
 
   записи переменной длины, СУД-32 помещает также перед каждой
 
   записью поле счетчика ее длины.
 
        При относительной организации файла СУД-32 создает  на
 
   диске некоторую последовательность ячеек для хранения запи-
 
   сей на основе длины записей. Ячейки на 1 байт длиннее,  чем
 
   размер записей фиксированной длины, или на 3 байта длиннее,
 
   чем максимальный заданный  размер  для  записей  переменной
 
   длины.
 
        При индексно-последовательной организации файла СУД-32
 
 
 
                            - 73 -
 
                         00152-01 92 01
 
 
   добавляет к данным пользователя следующую информацию:
 
          - индекс для каждого заданного ключа;
 
          - 15 байтов управляющей информации для каждого баке-
 
            та (заголовок бакета);
 
          - 7-ми байтовый заголовок для каждой записи;
 
          - поле счетчика для каждой записи переменной длины;
 
          - другие накладные расходы различной длины для запи-
 
            сей, которые СУД-32 перемещает во  время  активной
 
            работы с файлом и для удаленных записей. Необходи-
 
            мо сводить размер записей к  возможному  минимуму,
 
            требующемуся для прикладной программы.
 
        Другим фактором, который влияет на  размер  индексного
 
   файла являются сжатие  данных.  Возможно  сжатие  ключей  в
 
   бакетах данных и в бакетах индекса, а также данных в  баке-
 
   тах  первичных  данных.  Если  используются  сжатие  ключа,
 
   индекса или данных, то файл требует меньше пространства  на
 
   диске, а каждый буфер  ввода-вывода  может  вмещать  больше
 
   информации. В некоторых случаях сжатие может  ликвидировать
 
   один уровень индекса, что уменьшает число дисковых  передач
 
   при прямом доступе.
 
        Сжатые файлы требуют несколько  больше  времени  цент-
 
   рального процессора, если пользователь осуществляет  доступ
 
   к ним в режиме прямого доступа, но это дополнительное время
 
   центрального процессора, обычно, компенсируется  улучшенной
 
   эффективностью работы всей системы в целом.
 
 
 
        2.3.1.3. Разделяемый доступ к файлу
 
 
        Обычно несколько пользователей требуют получить доступ
 
   к файлу или к некоторой группе файлов в одно и то же время,
 
 
 
                            - 74 -
 
                         00152-01 92 01
 
 
   т.е. имеет место совместный доступ к файлу.  При  необходи-
 
   мости повышения эффективности работы с разделяемыми  файла-
 
   ми, следует обращать особое внимание на захват записей и на
 
   глобальные буферы. Для получения дополнительной  информации
 
   по использованию разделяемых файлов  следует  обратиться  к
 
   разделу 6.
 
 
 
        2.3.2. Компромиссы  проектирования  файлов   и
 
               прикладных программ
 
 
        При проектировании файлов и прикладных  программ  сле-
 
   дует учитывать, что одновременно в системе  несколько  про-
 
   цессов могут конкурировать за системные  ресурсы, например,
 
   за память. Если  все  процессы  потребуют  больших  об'емов
 
   памяти, то неизбежен интенсивный обмен страницами  и  обмен
 
   рабочими наборами, что замедлит общую эффективность  данной
 
   системы.
 
        Использование прикладных  программ  и  файлов  данных,
 
   может иметь влияние на производительность системы в  целом.
 
   Например, если известно, что к трем файлам доступ осущеСТВ-
 
   ляется в течение 80 процентов времени, то для  этих  файлов
 
   можно распределить больше ресурсов. Эффективность программ,
 
   которые используют другие файлы будет меньше, но система  в
 
   целом будет работать быстрее.
 
        Типы компромиссов при  проектировании  разбиваются  на
 
   две категории: выбор атрибутов файла и  системных  парамет-
 
   ров.
 
        Шесть атрибутов файла управляют  тем,  как  расположен
 
   файл на диске и какая часть  файла  передается  в  основную
 
   память при необходимости. Это следующие атрибуты:
 
 
 
                            - 75 -
 
                         00152-01 92 01
 
 
        1) начальное распределение пространства для файла;
 
        2) непрерывность;
 
        3) расширение файла;
 
        4) единицы ввода-вывода;
 
        5) множество областей;
 
        6) коэффициент заполнения.
 
        Четыре параметра во время выполнения программы  управ-
 
   ляют  воздействием  некоторых  операций  на   эффективность
 
   ввода-вывода. К ним относятся:
 
        1) множество буферов;
 
        2) глобальные буферы;
 
        3) обработка с  опережающим  чтением  и  с  отложенной
 
   записью;
 
        4) обработка с отложенной записью.
 
        В подпунктах  данного  пункта  описано,  как  атрибуты
 
   проектирования  файла  и  параметры  могут  максимизировать
 
   эффективность, и дается обзор системных параметров, исполь-
 
   зуемых во время выполнения программы. В разделе 6  детально
 
   рассмотрены  системные  параметры,  используемые  во  время
 
   выполнения программы.
 
 
 
        2.3.2.1. Начальное распределение пространства
 
 
        При создании файла рекомендуется выделить  достаточное
 
   пространство для всего файла в одном  непрерывном  экстенте
 
   на диске. Распределение пространства для всего файла позво-
 
   ляет создать только один указатель извлечения  в  заголовке
 
   данного файла, что уменьшает число поисков  и  передач  при
 
   работе с файлом. Следует также распределить некоторое доба-
 
   вочное пространство с учетом возможного роста размера файла
 
 
 
                            - 76 -
 
                         00152-01 92 01
 
 
   для того, чтобы уменьшить число необходимых расширений.
 
        Это дополнительное пространство  рекомендуется  учиты-
 
   вать при начальном распределении  памяти  для  файла,  если
 
   предполагается добавление записей в файл.
 
        Распределение пространства для файла проводится  путем
 
   задания атрибута ALLOCATION языка FDL.
 
 
 
        2.3.2.2. Непрерывность файла
 
 
        Задание атрибута FILE CONTIGUOUS языка FDL  со  значе-
 
   нием YES, обеспечивает выделение файлу непрерывного экстен-
 
   та. Однако, если на диске не имеется достаточного непрерыв-
 
   ного пространства при попытке создания непрерывного  файла,
 
   то возникает фатальная ошибка и файл не создается.
 
        Атрибут FILE BEST_TRY_CONTIGUOUS языка FDL  всегда  по
 
   умолчанию принимает значение YES,  что  означает  необходи-
 
   мость распределения непрерывного пространства для файла при
 
   его наличии на диске. Однако, если достаточного непрерывно-
 
   го пространства не имеется, то создается файл, состоящий из
 
   нескольких несмежных экстентов, т.е. непрерывность файла не
 
   обеспечивается.
 
 
 
        2.3.2.3. Расширение файла
 
 
        Для обеспечения добавления записей  к  файлу,  следует
 
   задать некоторое разумное значение величины расширения фай-
 
   ла по умолчанию с целью минимизации количества самих проце-
 
   дур расширения, состоящих в выделении файлу дополнительного
 
   пространства на диске по мере его заполнения данными.  Если
 
   не удалось установить некоторое оптимальное значение  вели-
 
   чины расширения по умолчанию, то СУД-32 все же будет  авто-
 
 
                            - 77 -
 
                         00152-01 92 01
 
 
   матически расширять данный файл, когда это необходимо.  При
 
   этом СУД-32 сначала создает некоторое минимальное  расшире-
 
   ние, записывает туда данные и затем усекает любые неисполь-
 
   зованные байты при закрытии файла. Однако значение расшире-
 
   ния, выбранное самой системой, может не быть оптимальным.
 
        Таким образом представляется целесообразным при созда-
 
   нии файла указать величину его расширения по умолчанию. Эта
 
   величина будет зависеть и от размера записей в данном файле
 
   и от числа записей, которые будут добавлены в данный файл в
 
   течение некоторого заданного времени для  конкретной  прик-
 
   ладной программы.
 
        При создании описания файла на  языке  FDL  редактором
 
   EDIT/FDL эта величина вычисляется и приписывается  атрибуту
 
   FILE EXTENSION. Для указания величины расширения можно так-
 
   же использовать команду SET FILE/EXTENSION языка  DCL.  Для
 
   последовательных файлов можно установить размер  расширения
 
   во  время  выполнения  программы  при  помощи  команды  SET
 
   RMS_DEFAULT/EXTEND_QUANTITY=N языка DCL.  При  этом  данное
 
   значение N перекрывает значение величины  расширения,  соз-
 
   данное другим способом. Если редактор EDIT/FDL для создания
 
   описания файла не используется, то необходимо самостоятель-
 
   но вычислить значение атрибута EXTENSION, используя средний
 
   размер записи, число записей,  которые  будут  добавлены  к
 
   данному файлу в течение некоторого заданного периода време-
 
   ни, число записей в бакете и размер бакета.
 
        Если размер расширения выбран неверно,  то  добавление
 
   записей к файлу может привести к  значительному  увеличению
 
   несмежных экстентов, занимаемых файлом, а это в  свою  оче-
 
   редь приведет к снижению эффективности работы с файлом.
 
 
 
 
                            - 78 -
 
                         00152-01 92 01
 
 
        2.3.2.4. Единицы ввода-вывода
 
 
        Время выполнения операций ввода-вывода  можно  сущест-
 
   венно сократить, устанавливая  оптимальный  размер  данных,
 
   передаваемых в  память  или  из  памяти  за  одну  операцию
 
   ввода-вывода, т.е. как единое целое. Другими словами  время
 
   выполнения операций ввода-вывода зависит от выбора  единицы
 
   ввода-вывода. Буфер ввода-вывода должен соответствовать  по
 
   размеру выбранной единице, что связано с размером  основной
 
   памяти. Отсюда, чем больше буфер ввода-вывода,  тем  больше
 
   записей может быть помещено в основную память  и,  следова-
 
   тельно, улучшится эффективность системы. Однако, если общий
 
   размер всех буферов ввода-вывода в системе  начнет  прибли-
 
   жаться к размеру доступной основной памяти,  то  увеличится
 
   интенсивность   обмена   страниц   (PAGING)   и    выгрузки
 
   (SWAPPING). Начиная с этого момента увеличение размера еди-
 
   ницы ввода-вывода будет в действительности снижать  систем-
 
   ную эффективность.
 
        СУД-32 выполняет операции  ввода-вывода  над  блоками,
 
   мультиблоками или бакетами.
 
        Блок состоит из 512 непрерывных  байтов.  Он  является
 
   физической единицей ввода-вывода для диска.
 
        Мультиблок - это два или более блока, которые  система
 
   СУД-32 трактует как одну единицу  ввода-вывода  (количество
 
   блоков определяет  мультиблочный  коэффицент).  Мультиблоки
 
   используются только для файлов с последовательной организа-
 
   цией. Мультиблочный коэффициент  является  атрибутом  этапа
 
   выполнения программы. Для того, чтобы  установить  мультиб-
 
   лочный  коэффицент,  следует   использовать   команду   SET
 
   RMS_DEFAULT/BLOCK_COUNT=N языка DCL, где N является  числом
 
 
 
                            - 79 -
 
                         00152-01 92 01
 
 
   блоков в мультиблоке. Значение N может быть задано в диапа-
 
   зоне от 1 до 127. Для определения  текущего  мультиблочного
 
   коэффицента, следует задать команду SHOW RMS_DEFAULT  языка
 
   DCL.
 
        Для дисковых файлов число N следует  выбирать  кратным
 
   количеству блоков на дорожке диска. Однако эта рекомендация
 
   не является обязательной. Для того, чтобы определить подхо-
 
   дящее значение N, необходимо проэкспериментировать  до  тех
 
   пор, пока будет найдено значение, для которого преимущества
 
   большого размера превышают накладные расходы  памяти,  свя-
 
   занные  с  резервированием  больших  буферов  ввода-вывода,
 
   необходимых для размещения мультиблоков.
 
        Бакет - это единица ввода-вывода для  относительных  и
 
   индексных файлов. Бакет состоит из одного или более блоков.
 
   Поскольку блок состоит из 512 байтов, то бакет  состоит  из
 
   некоторого числа, кратного 512 байтам. Максимальный  размер
 
   бакета равен 63 блокам.
 
        Для относительных файлов размер бакета устанавливается
 
   в момент создания файла или при помощи атрибута языка  опи-
 
   сания файла FILE BUCKET_SIZE. Хотя размер бакета может быть
 
   достаточно большим, вплоть до  63  блоков,  размер  бакета,
 
   больший чем одна дорожка диска, обычно  не  будет  улучшать
 
   эффективность системы.
 
        Для индексных файлов размер бакета  устанавливается  в
 
   момент создания файла при помощи атрибутов  языка  описания
 
   файла FILE BUCKET_SIZE или AREA BUCKET_SIZE. Размер  бакета
 
   определяет число уровней индекса, которое  является   опре-
 
   деляющим  для  времени  доступа  к  данным.   Обслуживающая
 
   программа EDIT/FDL может помочь выбрать оптимальный  размер
 
   бакета. Эта программа  выдает  некоторый  граф,  в  котором
 
 
                            - 80 -
 
                         00152-01 92 01
 
 
   задаются различные  диапазоны  размеров  бакета  и  эффект,
 
   который оказывает каждый размер на структуру данного файла.
 
   В разделе 3 этот процесс описан подробно.
 
        Следует учитывать, что при чтении записи, размер кото-
 
   рой меньше установленной единицы ввода-вывода, тем не менее
 
   в память  передается  вся  единица:  блок,  мультиблок  или
 
   бакет.
 
 
 
        2.3.2.5. Задание множества областей
 
 
        Другая стратегия проектирования файла состоит  в  том,
 
   чтобы поместить некоторый индексный файл в подходящее  мно-
 
   жество областей. Область - это некоторая часть данного фай-
 
   ла, которая представляется для СУД-32 как некоторое  единое
 
   целое. Каждая область имеет свой собственный размер  расши-
 
   рения, начальный размер размещения, указание о непрерывнос-
 
   ти и размер бакета. Имеется возможность управлять  местопо-
 
   ложением области на диске, т.е. помещать данную область  на
 
   конкретный дисковый том, начиная с заданного  цилиндра  или
 
   блока.
 
        В некоторых случаях  разделение  индексного  файла  на
 
   множество областей является желательным (подпункт 2.6.1.6).
 
        Например, можно поместить область данных на один том в
 
   некотором наборе томов и поместить область индекса на  дру-
 
   гой  том  данного  набора  томов.  Такое  размещение  может
 
   существенно повысить производительность системы.
 
        Распределив  дополнительное  пространство  для  данной
 
   области данных с учетом  будущих  расширений  файла,  можно
 
   обеспечить непрерывность бакетов  данных,  что  существенно
 
   для последовательного доступа к файлу.
 
 
 
                            - 81 -
 
                         00152-01 92 01
 
 
        2.3.2.6. Задание степени заполнения
 
 
        Для индексных файлов попытка вставить некоторую запись
 
   в некоторый заполненный бакет может привести к  расщеплению
 
   бакета. СУД-32 пытается сохранить половину записей в перво-
 
   начальном бакете и перемещает другие записи в  заново  соз-
 
   данный бакет.  Каждая  из  перемещенных  записей  оставляет
 
   вместо себя некоторый указатель на данный новый бакет.  Эти
 
   7-ми байтовые указатели называются векторами ссылки  записи
 
   (RRV). При поиске перемещенной записи сначала следует обра-
 
   щение к тому бакету, где раньше располагалась  эта  запись,
 
   читается ее вектор ссылки и затем  приводится  обращение  к
 
   новому бакету, на  который  указывает  этот  вектор  ссылки
 
   записи. Однако расщепление бакета и 7-ми байтовые указатели
 
   могут  привести  к  увеличению  и  замусориванию  дискового
 
   пространства, вызвать создание разрывных экстентов.
 
        Для того, чтобы избежать  расщепления  бакетов,  можно
 
   указать, что при начальной загрузке записей  бакеты  данных
 
   или индекса полностью заполняться не  будут.  Это  рекомен-
 
   дуется делать при  необходимости  пополнения  файла  новыми
 
   записями.
 
        В подпункте 2.6.2.2.  Степень заполнения бакетов  опи- 
 
   сывается  подробнее.
 
 
 
        2.3.2.7. Множество буферов
 
 
        СУД-32 обеспечивает  использование  множества  буферов
 
   ввода-вывода в зависимости от организации и от  использова-
 
   ния файла. Увеличение числа буферов улучшает производитель-
 
   ность системы. Однако при этом следует следить, чтобы прик-
 
   ладная программа не испытывала затруднений из-за размера ее
 
 
                            - 82 -
 
                         00152-01 92 01
 
 
   рабочего набора.
 
        Автоматизировать выбор оптимального числа буферов  для
 
   прикладной программы может редактор EDIT/FDL.
 
        Увеличение размера и числа буферов может, как правило,
 
   увеличить эффективность системы в случае, если  прочитанные
 
   в эти буферы данные будут сразу же обработаны и если  рабо-
 
   чий набор позволяет иметь эти буферы.
 
        Число буферов ввода-вывода является параметром,  кото-
 
   рый можно установить в процессе  выполнения  программы  при
 
   помощи команды SET  RMS_DEFAULT/BUFFER_COUNT=N  языка  DCL,
 
   где N является числом буферов. Эта команда позволяет  уста-
 
   новить заданное число буферов по умолчанию.  Можно  устано-
 
   вить разные значения для последовательных, относительных  и
 
   индексных файлов. Для того, чтобы определить текущие  уста-
 
   новленные значения, надо задать  команду  SHOW  RMS_DEFAULT
 
   языка DCL.
 
        Число буферов ввода-вывода можно  установить  в  самой
 
   программе в поле RAB$B_MBF блока RAB или в  атрибуте  языка
 
   FDL - CONNECT MULTIBUFFER_COUNT. Обе эти возможности позво-
 
   ляют установить счетчик множества буферов для каждого обра-
 
   батываемого файла и этот счетчик заменяет  любое  значение,
 
   которое было установлено ранее,  например, по  команде  SET
 
   RMS_DEFAULT/BUFFER_COUNT=N языка DCL.
 
        Администратор системы  может  установить  значения  по
 
   умолчанию для всей операционной системы. Программисты могут
 
   устанавливать значения по умолчанию  отдельно  для  каждого
 
   процесса.
 
 
 
 
 
 
 
 
                            - 83 -
 
                         00152-01 92 01
 
 
        2.3.2.8. Глобальные буферы
 
 
        При разделении  относительного  или  индексного  файла
 
   несколькими процессами можно использовать глобальные  бУФЕ-
 
   ры. Глобальный буфер - это некоторый буфер ввода-вывода,  к
 
   которому могут получить доступ  два  или  более  процессов.
 
   Если два или более  процессов  запрашивают  одну  и  ту  же
 
   информацию из некоторого файла,  то  каждый  процесс  может
 
   использовать  глобальные  буферы  вместо  выделения   своих
 
   собственных.
 
        Глобальные буферы являются атрибутами самого  файла  в
 
   момент его создания.  Атрибут  языка  описания  файла  FILE
 
   GLOBAL_BUFFER_COUNT устанавливает эту возможность и  задает
 
   число глобальных  буферов.  Выполнение  глобальных  буферов
 
   возможно также по команде  DCL  SET  FILE/GLOBAL_BUFFERS. В
 
   подразделе 6.3 глобальные буферы описаны более подробно.
 
 
 
        2.3.2.9. Обработка  с  опережающим   чтением   и
 
                 запаздывающей записью
 
 
        С целью повышения эффективности  обработки  последова-
 
   тельных файлов во время выполнения программы  можно  задать
 
   возможность использования операции с опережающим чтением  и
 
   запаздывающей записью. Эти операции выполняются по  умолча-
 
   нию для некоторых  языков  программирования  и  могут  быть
 
   заданы при помощи специальных указаний в других языках.
 
        Для указанных двух операций  необходимо  использовать,
 
   по крайней  мере,  два  буфера ввода-вывода.  Использование
 
   более двух буферов обычно не приводит к увеличению произво-
 
   дительности системы.
 
 
 
 
                            - 84 -
 
                         00152-01 92 01
 
 
        Опережающее чтение и запаздывающая  запись  функциони-
 
   руют одинаковым  образом.  При  опережающем  чтении  данные
 
   читаются в память до того, когда они понадобятся программе,
 
   так, что программе не придется  ждать  завершения  операции
 
   ввода-вывода для того,  чтобы  начать  обработку  очередной
 
   записи.
 
        При  запаздывающей  записи,  после  заполнения  одного
 
   буфера, следующие обработанные записи поступают  во  второй
 
   буфер, а одновременно выполняется операция  вывода  первого
 
   буфера, так, что и в этом случае не надо  ждать  завершения
 
   операции ввода-вывода.
 
 
 
        2.3.2.10. Обработка с отложенной записью
 
 
        Режим отложенной записи можно задать только для  отно-
 
   сительных и индексных файлов. При отложенной записи  СУД-32
 
   задерживает вывод на диске модифицированного бакета  разде-
 
   ляемого файла до тех пор, пока этот  буфер  не  понадобится
 
   для другого бакета, требуемого другим пользователем или  до
 
   закрытия файла. При дальнейшей модификации данных,  находя-
 
   щихся в том же бакете, эффективность работы системы  увели-
 
   чивается. Данный процесс носит название кэширования данных.
 
        Наибольший эффект от  кэширования  данных  достигается
 
   при последовательном доступе к файлу. В  этом  случае,  как
 
   правило, извлекаются и модифицируются  все  записи  бакета,
 
   при этом ввод и вывод  бакета  осуществляется  только  один
 
   раз.
 
        Обработка последовательных файлов всегда  производится
 
   в режиме отложенной записи, поскольку буфер записывается на
 
   диск только после того, как он полностью заполнится.
 
 
 
                            - 85 -
 
                         00152-01 92 01
 
 
        Отложенная запись является операцией по умолчанию  для
 
   некоторых языков программирования и может быть  задана  при
 
   помощи специальных указаний в других языках.
 
        Недостатком обработки с  отложенной  записью  является
 
   возможность потери изменений, проведенных в бакете,  но  не
 
   выведенных на диск, в случае аварийного отказа системы.
 
 
 
        2.4. Настройка последовательного файла
 
 
        Последовательные файлы являются простыми по  конструк-
 
   ции. Они состоят из некоторого заголовка файла и последова-
 
   тельности записей данных. Записи располагаются в порядке их
 
   поступления в файл.
 
        Все записи фиксированной длины имеют  один  и  тот  же
 
   размер. При наличии пустых  или  неполных  значений  полей,
 
   записи дополняются соответствующим числом заполнителей, что
 
   приводит к избыточному расходу памяти. Записи могут пересе-
 
   кать границы блоков, максимальный размер  записей  фиксиро-
 
   ванной длины в последовательном файле составляет 32765 бай-
 
   тов.
 
        Записи переменной длины могут иметь разные длины. Мож-
 
   но задать размер самой большой возможной записи,  и  СУД-32
 
   будет принудительно  отслеживать  этот  максимум  для  всех
 
   записей, добавляемых в этот файл. Каждая запись  переменной
 
   длины начинается с поля счетчика длины  записи,  состоящего
 
   из 2-х байтов. Если записям  разрешено  пересекать  границы
 
   блоков, максимальный размер записи составляет 32763 байта.
 
        Записи  переменной  длины  с  постоянной   управляющей
 
   частью состоят из постоянной управляющей области и перемен-
 
   ной области данных. Управляющая область может быть  исполь-
 
 
 
                            - 86 -
 
                         00152-01 92 01
 
 
   зована для любых целей, но, как правило,  она  используется
 
   для того, чтобы хранить такую информацию, как номера  строк
 
   или символ управления кареткой в файлах  для  печати.  Пос-
 
   тоянная управляющая область может быть длиной от 1  до  255
 
   байтов. Если записям разрешено пересекать  границы  блоков,
 
   максимальный размер записи переменной  длины  с  постоянной
 
   управляющей частью составляет 32763 байта минус размер пос-
 
   тоянной управляющей части.
 
        Записи в формате потока являются непрерывными потоками
 
   байтов,  разделенных  специальными  символами,  называемыми
 
   терминаторами. Записи в формате потока могут быть длиной до
 
   32763 байтов. Терминатором является символы перевода строки
 
   <LF>, вертикальной табуляции (<VT> или <CTRL/K>),  перевода
 
   формата <FF> или комбинация, используемая по  умолчанию,  -
 
   <CR>< LF>. Для формата STREAM_CR терминатором является сим-
 
   вол <CR>, а для формата STREAM_LF - символ <LF>.
 
        Неопределенные  записи  задаются   последовательностью
 
   байтов, без специальных терминаторов.
 
 
 
        2.4.1. Пересечение границ блоков
 
 
        Для обеспечения  возможности  пересечения  записями  в
 
   последовательном файле границ  блоков  следует  задать  эту
 
   возможность. Для этой цели предназначен атрибут языка  опи-
 
   сания файла RECORD BLOCK_SPAN, действующий и по умолчанию.
 
 
 
        2.4.2. Мультиблоки
 
 
        Возможность работы с мультиблоками на этапе выполнения
 
   устанавливается  по  команде  SET  RMS_DEFAULT/BLOCK_SIZE=N
 
   языка  DCL,  атрибутом   языка   описания   файла   CONNECT
 
 
                            - 87 -
 
                         00152-01 92 01
 
 
   MULTIBLOCK_COUNT или в поле RAB$MBC блока RAB (при выполне-
 
   нии программы). Устанавливаемый оптимальный размер N  зави-
 
   сит от использования данного файла, способ выбора N опреде-
 
   ляется экспериментально.
 
        Увеличение размера мультиблока может увеличить  произ-
 
   водительность системы, таким же самым образом, как увеличе-
 
   ние размера бакета может  улучшить  производительность  при
 
   работе с относительным или индексным файлом.
 
        По умолчанию размер N=16.
 
 
 
        2.4.3. Число буферов
 
 
        Во время  выполнения  программы  для  последовательных
 
   файлов можно задать число и  размер  буферов  ввода-вывода.
 
   Число     буферов     устанавливается     командой      SET
 
   RMS_DEFAULT/SEQUENтIAL/DISK/BUFFER_COUNT=N языка DCL, аТРИ-
 
   бутом языка описания файла CONNECT MULTIBUFFER_COUNT или  в
 
   поле RAB$B_MBF блока RAB. Размер буфера можно задать  атри-
 
   бутом языка описания файла CONNECT MULTIBLOCK_COUNT  или  в
 
   поле RAB$B_MBC блока RAB.
 
        При простых операциях с последовательными файлами дос-
 
   таточно одного  буфера  ввода-вывода.  В  действительности,
 
   увеличение числа буферов занимает место  в  рабочем  наборе
 
   процесса и  может  существенно  снизить  производительность
 
   системы.
 
        При обработке последовательных файлов, можно использо-
 
   вать  обработку  с  опережающим  чтением  и   запаздывающей
 
   записью. При этом типе обработки  два  буфера  используются
 
   взаимозаменяемо.  Один  буфер  содержит  следующие  записи,
 
   которые будут читаться или записываться на диск, в то время
 
 
 
                            - 88 -
 
                         00152-01 92 01
 
 
   как другой буфер находится в состоянии ввода-вывода.
 
        Длина буферов, используемых для последовательных  фай-
 
   лов, определяется при помощи заданного счетчика  мультибло-
 
   ка. Оптимальное число блоков на буфер  зависит  от  размера
 
   записи.
 
        Умолчание 16 обычно достаточно в большинстве случаев.
 
        Текущий счетчик буферов по умолчанию, можно определить
 
   по команде SHOW RMS_DEFAULT  языка  DCL.  Для  того,  чтобы
 
   установить счетчик буферов по умолчанию, надо  использовать
 
   команду DCL SET RMS_DEFAULT/SEQUENTIAL/BUFFER_COUNT=N языка
 
   DCL, где N является числом буферов.
 
 
 
        2.4.4. Задание    опережающего    чтения     и
 
               запаздывающей записи
 
 
        Задание параметров опережающего чтения и запаздывающей
 
   записи для последовательных файлов может увеличить произво-
 
   дительность системы.  Эти  операции  требуют  двух  буферов
 
   ввода-вывода. Использование более чем двух  буферов  обычно
 
   не приводит к увеличению производительности системы.
 
        В большинстве языков программирования опережающее чте-
 
   ние и запаздывающая запись являются операциями  по  умолча-
 
   нию. Для других языков необходимо задать эти операции явно.
 
   Если используется язык высокого уровня, в котором не имеет-
 
   ся средств для задания опережающего чтения и  запаздывающей
 
   записи, то для того, чтобы установить эти возможности, сле-
 
   дует составить специальную подпрограмму на языке  МАКРО,  в
 
   функции которой входит открытие файла. В этой  подпрограмме
 
   в поле RAB$L_ROP блока RAB для опережающего чтения  следует
 
   задать режим RAB$V_RAH, для запаздывающей  записи  -  режим
 
 
 
                            - 89 -
 
                         00152-01 92 01
 
 
   RAB$V_WBH.
 
 
 
        2.5. Настройка относительного файла
 
 
        Относительный файл состоит из заголовка файла и после-
 
   довательности  ячеек  фиксированной  длины.  Каждая  ячейка
 
   содержит одну запись. Первым байтом в каждой ячейке являет-
 
   ся управляющее поле, в котором отмечается признак  удаления
 
   записи, за ним следует сама запись.  Размер  ячейки,  таким
 
   образом, на один байт больше чем размер записи.
 
        При заполнении файла можно оставить  некоторые  ячейки
 
   пустыми. Ячейки последовательно  нумеруются.  Номер  ячейки
 
   является относительным номером записи, который  может  быть
 
   использован для прямого доступа к данной записи.
 
        Записи в относительном файле могут быть  фиксированной
 
   длины, переменной длины или переменной длины  с  постоянной
 
   управляющей частью.  Записи  фиксированной  длины  наиболее
 
   приемлимы для относительных файлов, поскольку размер ячейки
 
   также фиксирован. Максимальный размер записи  фиксированной
 
   длины в относительном файле  составляет  16383  байта.  Для
 
   записей переменной  длины  максимальный  размер  составляет
 
   16381 байт. Максимальный размер для записей переменной дли-
 
   ны с постоянной управляющей частью  составляет  16381  байт
 
   минус размер постоянной управляющей части. Размер  постоян-
 
   ной управляющей части может быть от 1 до 255 байтов.
 
 
 
        2.5.1. Размер бакета
 
 
        Для относительных файлов единицей обмена данными между
 
   диском и памятью является бакет. Размер бакета задается при
 
   создании файла. При  конвертировании  файла  размер  бакета
 
 
                            - 90 -
 
                         00152-01 92 01
 
 
   может быть изменен (см. раздел 9).
 
        Размер бакета можно задать в атрибуте  языка  описания
 
   файла FILE BUCKET_SIZE или в полях  FAB$B_BKS  и  XAB$B_BKZ
 
   блока FAB. Программа редактор FDL (EDIT/FDL) вычисляет раз-
 
   мер бакета, задавая вопрос о  предполагаемом  использовании
 
   данного файла. Самым большим допустимым  размером  является
 
   63.
 
        Если прикладная программа будет, в основном, обрабаты-
 
   вать файл в режиме прямого доступа, то, обычно,  выбирается
 
   малый размер бакета, если же, в основном, в режиме последо-
 
   вательного доступа - большой размер бакета, и, если исполь-
 
   зуются оба режима  доступа,  выбирается  некоторый  средний
 
   размер бакета.
 
        При преимущественно последовательном доступе программа
 
   EDIT/FDL устанавливает размер бакета,  равным  16  записям.
 
   Определение размера  бакета  при  последовательном  доступе
 
   улучшает производительность системы по сравнению с увеличе-
 
   нием числа буферов ввода-вывода.
 
        При преимущественно прямом доступе редактор FDL  уста-
 
   навливает размер бакета, равный четырем записям. При  необ-
 
   ходимости  увеличения  размера  бакета  нужно  использовать
 
   команду MODIFY редактора языка описания файла.
 
        Эффективный способ проектирования относительного файла
 
   состоит в том,  чтобы  выровнять  данный  файл  на  границу
 
   цилиндра и  затем  задать  размер  одной  дорожки  диска  в
 
   качестве размера бакета. Этот метод требует точного  вырав-
 
   нивания файла, возможности его открытия в режиме без разде-
 
   ления и чтобы диск, на котором находится  данный  файл  был
 
   смонтирован для программы как личный.
 
 
 
 
                            - 91 -
 
                         00152-01 92 01
 
 
        2.5.2. Число буферов
 
 
        Счетчик числа буферов можно установить во время выпол-
 
   нения     программы     при     помощи     команды      SET
 
   RMS_DEFAULT/RELATIVE/BUFFER_COUNT=N языка DCL,  в  атрибуте
 
   языка описания файла CONNECT MULTIBUFFER_COUNT или  в  поле
 
   RAB$B_MBF блока RAB.  Эффективность  использования  буферов
 
   зависит от режима доступа к записям.
 
        Можно говорить о двух режимах доступа к записям:  пол-
 
   ностью прямом и полностью последовательном. При прямом дос-
 
   тупе возможна ситуация, когда происходит  повторное  прямое
 
   обращение к записям (прямое обращение с  временной  локаль-
 
   ностью) и ситуация, когда осуществляется прямое обращение к
 
   близлежащим записям (прямое  обращение  с  пространственной
 
   локальностью).
 
        При  полностью  последовательной  обработке  доступ  к
 
   записям осуществляется последовательно, хотя первая  запись
 
   может быть локализована прямым доступом. Обращение к каждой
 
   записи осуществляется не более одного раза.  Для  наилучшей
 
   производительности системы следует использовать один  буфер
 
   с достаточно большим размером бакета, что дает  возможность
 
   обращаться  к  большому  числу  записей  за  одну  операцию
 
   ввода-вывода.
 
        Полностью прямой доступ предлагает  однократную  обра-
 
   ботку каждой записи и отсутствие обращения к соседним запи-
 
   сям. Здесь следует  использовать  один  буфер  с  некоторым
 
   минимальным размером бакета. Кэширование данных не рекомен-
 
   дуется, поскольку не исключена  вероятность  что  требуемые
 
   записи будут разбросаны по всему файлу. Обращение к записям
 
   будет   вызывать    необходимость    выполнения    операций
 
 
 
                            - 92 -
 
                         00152-01 92 01
 
 
   ввода-вывода и буферизация дополнительных бакетов  приведет
 
   к избыточному расходу памяти в рабочем наборе.
 
        При прямой обработке с временной локальностью, предус-
 
   матривающей повторный доступ к записям, возможно многократ-
 
   ное обращение к одним и тем же записям. В этом случае  сле-
 
   дует использовать множество небольших буферов с целью кэши-
 
   рования записей, к которым будет  осуществляться  повторный
 
   доступ.  Размер  бакета  может  быть  небольшим,  поскольку
 
   вероятность доступа к записям, прилегающим к обрабатываемой
 
   записи, невелика.
 
        Буферизация записей в больших бакетах приведет к  лиш-
 
   нему  расходу  пространства  памяти.  Выделение  нескольких
 
   буферов обеспечивает сохранение в памяти записей, к которым
 
   возможно повторное обращение.
 
        При прямом доступе  с  пространственной  локальностью,
 
   предусматривающим обращение к записям, смежным с  обрабаты-
 
   ваемой записью, следует использовать большой размер  буфера
 
   и бакета, что увеличит вероятность того, что записи, распо-
 
   ложенные рядом с обрабатываемой записью и сама  эта  запись
 
   находится в одном и том же бакете. В таких случаях рекомен-
 
   дуется выделение не более двух буферов.
 
        При комбинации приведенных выше двух способов обработ-
 
   ки данных необходим некоторый компромисс.
 
        В качестве примера можно привести использование первой
 
   записи в файле в качестве некоторого указателя на последнюю
 
   запись, к которой осуществлялся доступ. При обработке  сле-
 
   дует читать первую запись для того, чтобы найти  местополо-
 
   жение следующей записи, которую  надо  обрабатывать.  Затем
 
   следует перейти к этой записи, выполнить необходимые опера-
 
   ции и заменить указатель в первой записи. Поскольку обраще-
 
 
                            - 93 -
 
                         00152-01 92 01
 
 
   ние к первой записи осуществляется несколько раз, то  имеет
 
   место временная локальность. Вместе с этим, поскольку запи-
 
   си добавляются последовательно в конец файла, то имеет мес-
 
   то также и пространственная локальность.
 
        При добавлении  записи  в  относительный  файл,  можно
 
   использовать режим отложенной записи (атрибут языка описа-
 
   ния файла FILE DEFERRED_WRITE или поле  FAB$L_FOP  в  блоке
 
   RAB - режим FAB$V_DFW). При этом режиме  буфер,  в  который
 
   были перемещены записи, не записывается на диск до тех пор,
 
   пока данный буфер не понадобится для других целей или  дан-
 
   ный файл не будет закрыт. Этот режим, однако, может привес-
 
   ти к потере записей при аварийном отказе системы.
 
        Для определения числа  буферов  по  умолчанию  следует
 
   использовать команду SHOW RMS_DEFAULT языка DCL. Для  того,
 
   чтобы установить  счетчик  буферов  по  умолчанию,  следует
 
   использовать                  команду                   SET
 
   RMS_DEFAULT/RELATIVE/BUFFER_COUNT=N  языка   DCL,   где   N
 
   является числом буферов.
 
 
 
        2.5.3. Глобальные буферы
 
 
        Если несколько процессов разделяют относительный файл,
 
   то можно задать возможность использования глобальных  бУФЕ-
 
   ров. Глобальный буфер - это буфер ввода-вывода, к  которому
 
   могут осуществлять доступ несколько  процессов.  Если  нес-
 
   колько процессов запрашивают одну и  ту  же  информацию  из
 
   файла, то  каждый  процесс  может  использовать  глобальные
 
   буферы вместо выделения своих собственных.
 
        Глобальные буферы не являются полезными во  всех  слу-
 
   чаях. Не всегда кэширование данных  может  уменьшить  число
 
 
 
                            - 94 -
 
                         00152-01 92 01
 
 
   операций ввода-вывода, необходимых  для  обработки  данного
 
   файла. Вне зависимости от числа выделенных глобальных буфе-
 
   ров, СУД-32 всегда выделяет один буфер ввода-вывода на каж-
 
   дый процесс, что обеспечивает эффективную возможность буфе-
 
   ризации данных.
 
        Если несколько процессов разделяют данный файл и  осу-
 
   ществляют доступ к одним и тем же записям в некоторой  пос-
 
   ледовательности транзакций, то выделение достаточного коли-
 
   чества глобальных буферов для кэширования этих  разделяемых
 
   записей дает определенные преимущества.
 
 
 
        2.5.4. Использование отложенной записи
 
 
        Режим  отложенной  записи  может  быть  использован  в
 
   период выполнения программы и  может  существенно  повысить
 
   производительность. Он  является  режимом  по  умолчанию  в
 
   некоторых языках программирования. В  случае  отсутствия  в
 
   языке возможности задания этого режима явным образом, можно
 
   обратиться к подпрограмме на МАКРОАССЕМБЛЕРе, которая уста-
 
   новит в поле FAB$L_FOP блока FAB значение  FAB$V_DFW  перед
 
   открытием файла.
 
        При отложенной записи СУД-32 задерживает вывод на диск
 
   модифицированного бакета до тех пор, пока данный  буфер  не
 
   понадобится для другого бакета или пока другому процессу не
 
   понадобится  использовать   модифицированный   бакет.   Эта
 
   задержка улучшает производительность системы, если  очеред-
 
   ная запись, к которой осуществляется  доступ,  находится  в 
 
   том же самом бакете, поскольку  это  уменьшает  число необ- 
 
   ходимых   операций   ввода-вывода.  Данный  режим  наиболее 
 
   эффективен при последовательном доступе.
 
 
 
                            - 95 -
 
                         00152-01 92 01
 
 
        Например, пусть длина записи относительного файла сос-
 
   тавляет 100 байтов, размер бакета  2  блока,  т.е.  В  один
 
   бакет помещается 10 записей. Для вывода в  файл  записей  с
 
   1-й по 10-ю без режима отложенной записи необходимо 11 опе-
 
   раций вывода - одна для открытия файла и по одной на каждую
 
   запись.
 
        При отложенной записи понадобится только две  операции
 
   ввода-вывода - одна для открытия файла и  одна  для  вывода
 
   бакета.
 
 
 
        2.6. Настройка индексного файла
 
 
        В этом разделе  рассматривается  структура  индексного
 
   файла и способы оптимизации эффективности работы с ним.
 
 
 
        2.6.1. Структура файла
 
 
        Индексный файл состоит из заголовка файла,  пролога  и
 
   одной или более индексных  структур.  Первичный  индекс,  в
 
   частности, содержит записи данных. Если данный  файл  имеет
 
   альтернативные ключи,  то  он  будет  иметь  альтернативный
 
   индекс для каждого  альтернативного  ключа.  Альтернативные
 
   индексы содержат записи данных вторичного  индекса  (SIDR),
 
   которые содержат указатели на собственно  записи  данных  в
 
   первичном индексе. Индексные структуры содержат также  зна-
 
   чения ключей, по которым СУД-32 осуществляет доступ к запи-
 
   сям в индексном файле.
 
 
 
 
 
 
 
 
 
 
                            - 96 -
 
                         00152-01 92 01
 
 
        2.6.1.1. Прологи
 
 
        В  прологе  размещается  информация  о  файле.  Данная
 
   информация включает атрибуты файла,  дескрипторы  ключей  и
 
   дескрипторы областей. Проверить  пролог  можно  при  помощи
 
   обслуживающей программы ANALYZE.
 
        Существует три типа пролога - пролог  1,  пролог  2  и
 
   пролог 3. Пролог 1 и пролог 2  используются  для  поддержки
 
   совместимости с СУД для ЭВМ типа СМ 4, поэтому далее  гово-
 
   рится только о прологе 3, используемом в СУД-32.
 
        Файлы с прологом 3 допускают наличие нескольких ключей
 
   с данными разного типа. Значениями ключей могут быть данные
 
   всех типов, включая строковые, битовые и  целые.  Обеспечи-
 
   вается возможность экономии пространства диска за счет сжа-
 
   тия данных, индексов и ключей файла.
 
        Для ключей в бакетах индекса  или  данных  допускается
 
   сжатие первых или последних  символов.  При  сжатии  первых
 
   символов любые символы значения ключа, идентичные начальным
 
   символам предшествующего  ключа,  отбрасываются.  Например,
 
   упорядоченные значения ключей JOHN, JOHNS, JOHNSON и  JONES
 
   хранятся как JOHN, S, ON и NES.
 
        При сжатии последних символов любые повторяющиеся сим-
 
   волы в конце значения данного  ключа  также  отбрасываются.
 
   Например,  значение   ключа   JOHNSON00000   хранится   как
 
   JOHNSON0.
 
        При сжатии данных вхождения пяти или  более  повторяю-
 
   щихся символов подряд сжимаются до одного символа.
 
        Очевидно, что сжатие увеличивает время обработки файла
 
   в озу, но уменьшает время выполнения операций  ввода-вывода
 
   бакетов и существенно экономит память - дисковую  и  опера-
 
 
 
                            - 97 -
 
                         00152-01 92 01
 
 
   тивную.
 
        Файлы данных занимают меньшее пространство  на  диске.
 
   Кроме того, каждый буфер ввода-вывода может вместить больше
 
   информации,  так  что  буферное  пространство  используется
 
   более  эффективно.  Сжатие  может  также  уменьшить   число
 
   индексных ступеней,  что  также  уменьшает  число  операций
 
   ввода-вывода при прямом доступе к записям.
 
        Кроме того, файл с прологом 3 может иметь  сегментиро-
 
   ванные первичные ключи, но данные сегменты не могут  перек-
 
   рываться. В качестве перекрывающихся сегментированных  клю-
 
   чей могут использоваться только альтернативные ключи.
 
        Для повторного использования пустых  бакетов,  образо-
 
   вавшихся в результате удаления записей необходимо использо-
 
   вать  обслуживающую  программу  CONVERT/RECLAIM.  При  этом
 
   новый файл не создается и адреса записей в файле  не  изме-
 
   няются.
 
 
 
        П р и м е ч а н и е.  Использование  индексных  файлов
 
   СУД-32, подготовленных в режиме совместимости для обработки
 
   средствами СУД-32, возможно только после их  преобразования
 
   программой CONVERT в новый файл с форматом пролога 3.
 
 
 
        2.6.1.2. Структура первичного индекса
 
 
        Первичная индексная ступень включает сами записи  дан-
 
   ных, упорядоченные последовательно в соответствии со значе-
 
   нием первичного ключа. Эта ступень образует нулевой уровень
 
   индексной структуры.
 
        Записи данных сгруппированы в бакеты. Поскольку записи
 
   данных упорядочены по первичному  ключу,  последняя  запись
 
 
 
                            - 98 -
 
                         00152-01 92 01
 
 
   бакета содержит наибольшее значение первичного  ключа.  Это
 
   наибольшее значение ключа в бакете вместе с  указателем  на
 
   бакет с данными образует запись, которая помещается в бакет
 
   на следующем уровне индексной структуры (уровне 1).
 
        Записи индекса также размещаются в бакетах.  Последняя
 
   запись индекса в бакете в  свою  очередь  имеет  наибольшее
 
   значение ключа в этом бакете. Это значение, вместе с указа-
 
   телем на бакет индекса, помещается в бакет следующей ступе-
 
   ни. Этот процесс продолжается до тех пор, пока  все  записи
 
   индекса на некотором уровне не  помещаются  в  один  бакет.
 
   Этот самый верхний уровень называется корневым.
 
        На рис.12 приведена диаграмма индексной структуры.  На
 
   рис.13 показана структура первичного индекса. Здесь предпо-
 
   лагается, что сжатие записей не произведено.  Записи  имеют
 
   длину 132 байта с полем первичного ключа длиной  6  байтов.
 
   Размер бакета равен одному блоку, что означает, что  каждый
 
   бакет на уровне 0 может содержать 3 записи. Вычисление чис-
 
   ла записей в бакете для этого случая показано ниже:
 
 
       512 байтов - 15 байтов накладных расходов = 497 байтов
 
       497/132 = 3,77
 
 
        Полученное частное округляется до ближайшего  меньшего
 
   целого, что дает 3.
 
        Поскольку размер ключа небольшой и файл данных в  этом
 
   примере состоит только из  21  записи,  то  записи  индекса
 
   могут все разместиться в одном бакете на уровне  1.  Записи
 
   индекса в этом примере имеют длину 6 байтов. Каждая  запись
 
   индекса имеет один байт управляющей информации. В этом при-
 
   мере размер указателей составляет 2 байта на запись  индек-
 
   са, что дает общий размер записи индекса, равный 9  байтам.
 
 
                            - 99 -
 
                         00152-01 92 01
 
 
   вычисление числа записей в бакете показано ниже:
 
 
       512 байтов - 15 байтов накладных расходов = 497 байтов
 
       497/9 = 55,2
 
 
        Полученное частное  также  округляется  до  ближайшего
 
   меньшего целого, то есть, 55.
 
        При необходимости прочитать запись со  значением  пер-
 
   вичного ключа равным 5, сначала  читается  бакет  корневого
 
   уровня, в котором проводится поиск первой записи индекса со
 
   значением ключа большим или равным 5. В данном примере  это
 
   запись со значением ключа 6. Данная запись содержит  указа-
 
   тель на бакет данных уровня 0, который содержит  записи  со
 
   значениями ключа 4, 5, и 6. Производится чтение этого баке-
 
   та и из него выбирается требуемая запись.
 
 
 
                  Диаграмма индексной структуры
 
 
                     --------------  Уровень 2
          -----------!            !-----------
          !          --------------          !
          !            !   !   !             !
          !       ------   !   ------        !
          !       !        !        !        !
          V       V        V        V        V
        -----   -----    -----    -----    -----
        !   !-->!   !--->!   !--->!   !--->!   ! Уровень 1
        -----   -----    -----    -----    -----
         /!\     /!\      /!\      /!\      /!\
        / ! \   / ! \    / ! \    / ! \    / ! \
     ----------------------------------------------
     !  !  !  !  !  !  !  !  !  !  !  !  !  !  !  !
     ----------------------------------------------
       \_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
 
                                               Уровень 0
 
 
 
                            Рис. 12
 
 
 
 
 
 
                            - 100 -
 
                         00152-01 92 01
 
 
                  Структура первичного индекса
 
 
                       --------------------
                       ! 3 ! 6 ! ... ! 21 !
                       --------------------
                         !   !         !
     ---------------------   !         !
     !              ----------         --------
     !              !                         !
     V              V                         V
   -------------  -------------            ----------------
   ! 1 ! 2 ! 3 !  ! 4 ! 5 ! 6 !    ...     ! 19 ! 20 ! 21 !
   -------------  -------------            ----------------
 
 
 
                            Рис. 13
 
 
 
 
        2.6.1.3. Структуры альтернативных индексов
 
 
        Структуры альтернативных индексов аналогичны структуре
 
   первичного индекса. На самом нижнем  уровне  альтернативные
 
   индексы содержат записи данных вторичного  индекса  (SIDR).
 
   Каждая запись данных вторичного индекса  содержит  значение
 
   альтернативного ключа, и один или несколько  указателей  на
 
   записи данных в первичном индексе, в  которых  присутствует
 
   данное значение. Наличие  нескольких  указателей  обеспечи-
 
   вается только в том случае, если допускаются  дублирующиеся
 
   значения альтернативных ключей и если  повторение  значений
 
   альтернативных ключей действительно имеет место.
 
        Если для альтернативного ключа допускается отсутствую-
 
   щее (нулевое) значение, то последнее в альтернативный инде-
 
   кс не заносится. Возможность задания нулевых значений опре-
 
   деляется на этапе создания файла.в качестве заполнителя для
 
   строковых типов данных можно задать любой символ,  хотя  по
 
   умолчанию используется "пробел", а для типа "целое" - ноль.
 
        Файл с альтернативными индексами требует больше диско-
 
 
 
                            - 101 -
 
                         00152-01 92 01
 
 
   вого пространства, чем файл без этих структур.
 
 
 
        2.6.1.4. Структура записей данных
 
 
        Записи данных в индексном файле могут быть или  фикси-
 
   рованной длины или переменной длины. Каждая запись фиксиро-
 
   ванной длины начинается с заголовка. Записи переменной дли-
 
   ны включают заголовок записи, за которым следует 2-х  байт-
 
   ное поле длины записи. Записи не могут  пересекать  границы
 
   бакетов.
 
        Для файлов с прологом  3  максимальный  размер  записи
 
   составляет 16300 байтов. Для файлов с прологом 1 и прологом
 
   2 наибольший размер записи фиксированной  длины  составляет
 
   16362 байта, наибольший размер записи переменной длины сос-
 
   тавляет 16360 байтов.
 
        Размер записи должен соответствовать требованиям прик-
 
   ладной программы.
 
        Данные в записях должны содержать значения  первичного
 
   ключа. Записи могут содержать значения альтернативных  клю-
 
   чей или, если допускаются  нулевые  значения  ключей, поля,
 
   состоящие из заполнителей.
 
 
 
        2.6.1.5. Ключи
 
 
        Ключ - это поле записи, которое идентифицирует  данную
 
   запись. Задав ключ, можно извлечь запись по значению  этого
 
   ключа. Имеется два типа ключей - первичные  и  альтернатив-
 
   ные. Записи данных упорядочены по значениям первичного клю-
 
   ча. Наиболее эффективном с точки зрения  времени  обработки
 
   данных является размещение первичного ключа начиная с  0-го
 
   байта записи. Допускаются дублирующиеся значения первичного
 
 
                            - 102 -
 
                         00152-01 92 01
 
 
   ключа, но при этом производительность системы снижается.
 
        И первичные и альтернативные ключи могут быть строками
 
   символов или числовыми значениями. Тип данных ключа задает-
 
   ся атрибутом языка описания файла KEY TYPE.
 
        Число альтернативных ключей оказывает  прямое  влияние
 
   на время выполнения  операций  ввода-вывода,  время  работы
 
   центрального процессора и используемое дисковое пространст-
 
   во. Число операций ввода-вывода и время  центрального  про-
 
   цессора, необходимые для выполнения операторов PUT,  UPDATE
 
   и DELETE, прямо  пропорционально  числу  ключей.  Например,
 
   ввод в файл записи со значением первичного  ключа  и  тремя
 
   альтернативными ключами занимает приблизительно в три  раза
 
   больше времени, чем ввод записи только  с  одним  первичным
 
   ключом.
 
        Кроме того, для того, чтобы откорректировать  значение
 
   альтернативного ключа, необходим двойной проход по  альтер-
 
   нативному индексу и кроме того существует вероятность  рас-
 
   щепления бакета. Прямой доступ к записи по  альтернативному
 
   ключу в общем случае требует одну  дополнительную  операцию
 
   ввода-вывода по сравнению  с  соответствующим  доступом  по
 
   первичному ключу. Для хранения каждой  структуры  альтерна-
 
   тивного индекса  требуется  дополнительное  дисковое прост-
 
   ранство.
 
        Наличие дублирующихся значений для альтернативных клю-
 
   чей более вероятно, чем для первичных ключей. При  этом  не
 
   исключена возможность потери производительности системы  за
 
   счет вставок в бакеты данных  сгруппированных  записей  или
 
   указателей, длинных последовательных поисков, большого чис-
 
   ла операций ввода-вывода и потери физической близости  дан-
 
   ных из-за расщепленных бакетов.
 
 
                            - 103 -
 
                         00152-01 92 01
 
 
        При возможности следует проверять ключи записи прежде,
 
   чем запись будет занесена в файл. Это утверждение  приобре-
 
   тает особое значение, когда имеется и первичный и альтерна-
 
   тивный ключи. Предотвращая ошибки в значениях ключей, можно
 
   избежать излишних корректировок структуры индексов файла.
 
        В общем случае, по мере того, как растет число ключей,
 
   увеличивается и время, которое занимает добавление и удале-
 
   ние записей в файле.  Если  время  центрального  процессора
 
   является критичным ресурсом, то следует задавать как  можно
 
   меньшее число ключей.
 
        Однако, если имеет место простое чтение записей в фай-
 
   ле, то число ключей имеет  относительно  малое  влияние  на
 
   производительность системы.
 
 
 
        2.6.1.6. Области
 
 
        Область - это некоторая часть  файла,  которую  СУД-32
 
   трактует как единое целое. Использование нескольких  облас-
 
   тей имеет три преимущества.
 
        Во-первых, можно разделить индексный файл на отдельные
 
   области. Каждая область может иметь свой собственный размер
 
   бакета, свое начальное размещение, размер расширения и мес-
 
   тоположение на томе так же, как если бы каждая область была
 
   некоторым отдельным файлом. Однако, если области имеют раз-
 
   ные размеры бакета, то все  размеры  буферов  в  прикладной
 
   программе  равны  размеру  самого  большого  бакета.   Если
 
   используется несколько областей, то сам файл не будет  неп-
 
   рерывным. Однако можно сделать непрерывной  каждую  область
 
   внутри данного файла, если задать  атрибут  языка  описания
 
   файла AREA CONTIGUOUS. Для того, чтобы  гарантировать,  что
 
 
 
                            - 104 -
 
                         00152-01 92 01
 
 
   данная область создастся без ошибки,  следует  использовать
 
   атрибут AREA BEST_TRY_CONTIGUOUS.
 
        Во-вторых, при  разделении  области  данных  и  ключа,
 
   появляется тенденция физической близости связанных бакетов,
 
   что уменьшает время поиска на диске для получения доступа к
 
   бакетам.
 
        В-третьих, минимизируется  число  перемещений  головок
 
   диска, когда выполняется некоторая последовательность  опе-
 
   раций. Например, если имеется  набор  томов  на  нескольких
 
   дисках, предназначенных только для одного пользователя,  то
 
   последний может поместить уровень данных индексного файла в
 
   некоторую область на один диск,  а  уровни  индексов  этого
 
   файла в некоторую область на другой диск. Отсюда  очевидное
 
   повышение эффективности системы за счет минимизации переме-
 
   щения головок дисков при обработке индексов и данных.
 
        Одна стратегия состоит в том, чтобы распределить неко-
 
   торую отдельную область для  уровня  0  первичного  индекса
 
   (уровня данных). Соответствующие бакеты являются единствен-
 
   ными, к которым осуществляется ссылка при  последовательном
 
   доступе к записям по их первичному ключу, так что их разме-
 
   щение в отдельной области оптимизирует этот тип операций.
 
        Не следует распределять отдельные области для уровня 1
 
   индекса и для других уровней индекса,  если  данный  индекс
 
   состоит только из одного уровня. В таком случае СУД-32 соз-
 
   давала бы  некоторый  дополнительный  уровень  в  структуре
 
   индекса.
 
        В большинстве случаев следует распределять, по крайней
 
   мере, одну область для каждого альтернативного индекса.  По
 
   умолчанию редактор языка описания файла создает две области
 
   для каждого индекса. В индексном файле -  одну  для  уровня
 
 
                            - 105 -
 
                         00152-01 92 01
 
 
   данных и одну для всех уровней индекса. Всего можно распре-
 
   делить до 255 областей, что достаточно в  большинстве  слу-
 
   чаев для обработки всех ступеней альтернативного индекса.
 
        Можно установить отдельную область для каждого из сле-
 
   дующих элементов:
 
        1) первичного индекса уровня 0 (уровня данных);
 
        2) первичный индекс уровня 1 (первая индексная ступень
 
   первичного ключа);
 
        3) первичный индекс  уровня  2+  (остальные  индексные
 
   ступени первичного ключа);
 
        4) альтернативный индекс уровня 0 (записи данных  вто-
 
   ричного индекса);
 
        5) альтернативный индекс уровня  1  (первая  индексная
 
   ступень альтернативного ключа);
 
        6) альтернативный индекс уровня 2+ (остальные  индекс-
 
   ные ступени альтернативного ключа).
 
        Структуры 4), 5), 6) повторяются для каждого альтерна-
 
   тивного ключа.
 
        Следует убедиться, что выделяется  достаточное  прост-
 
   ранство для каждой области  и  задается  непрерывность  для
 
   каждой из них. Следует учесть, что расширение области  при-
 
   водит к созданию несмежного экстента. Данный экстент  может
 
   размещаться в любом месте диска, и потеря  преимущества  от
 
   выделения нескольких областей неизбежна.
 
        Если для файла используют  одну  область,  то  следует
 
   выделить достаточное  непрерывное  пространство  для  всего
 
   файла в момент его создания. Если  позднее  к  этому  файлу
 
   добавляются новые данные, то файлу следует выделить некото-
 
   рое дополнительное пространство. Это значение устанавливает
 
   атрибут языка описания файла FILE  ALLOCATIONS.  Для  того,
 
 
                            - 106 -
 
                         00152-01 92 01
 
 
   чтобы гарантировать, что данное распределение является неп-
 
   рерывным, надо установить для атрибута языка описания файла
 
   FILE CONTIGUOUS значение YES.
 
        Если используется несколько областей, то следует выде-
 
   лить память для каждой из них, задавая нужное значение  для
 
   атрибута языка описания файла AREA ALLOCATION.
 
        Если файл является относительно  небольшим,  или  если
 
   известно, что его  надо  будет  расширять,  то  не  следует
 
   использовать несколько областей. В таких случаях более важ-
 
   ным является определение правильного размера расширения.
 
        Для задания нескольких областей с помощью  файла  FDL,
 
   следует определить каждую область ее собственным  первичным
 
   параметром AREA, задавая в этом параметре требуемое  число-
 
   вое значение, указывающее размер области.
 
        Чтобы сопоставить  каждой  области,  специфицированной
 
   параметром  AREA,  конкретный  индексный  уровень,  следует
 
   задавать так называемый первичный параметр KEY с  его  вто-
 
   ричными   параметрами   DATA_AREA,   LEVEL1_INDEX_AREA    и
 
   INDEX_AREA. Ключ 0 известен как первичный  (главный)  ключ.
 
   Следовательно, в структуре главного индекса первичный аТРИ-
 
   бут KEY, который идентифицирует данный ключ,  должен  полу-
 
   чить значение 0. Затем внутри секции KEY 0  следует  припи-
 
   сать вторичному атрибуту  DATA_AREA  число,  которое  ранее
 
   определено для  области,  в  которой  желательно  появление
 
   записей.
 
        Затем необходимо сопоставить вторичный параметр  ключа
 
   LEVEL1_INDEX_AREA параметру AREA  путем  назначения  номера
 
   области вторичному параметру LEVEL1_INDEX_AREA.  Необходимо
 
   также назначить номер некоторой области вторичному парамет-
 
   ру INDEX_AREA для других уровней индекса в структуре  глав-
 
 
                            - 107 -
 
                         00152-01 92 01
 
 
   ного индекса. Для каждой структуры альтернативного  индекса
 
   следует  использовать  те  же  самые  вторичные   параметры
 
   (DATA_AREA, LEVEL1_INDEX_AREA, INDEX_AREA) в другом первич-
 
   ном параметре KEY. В секциях KEY, которые  определяют  аль-
 
   тернативные ключи, параметр DATA_AREA определяет то  место,
 
   куда система СУД-32 будет помещать записи данных вторичного
 
   индекса.
 
 
 
        2.6.2. Оптимизация эффективности файла
 
 
        В этом пункте описываются действия при  проектировании
 
   файла, которые могут повысить эффективность работы с ним.
 
 
 
        2.6.2.1. Размер бакета
 
 
        Для индексных файлов размер  бакета  влияет  на  число
 
   уровней в структуре индекса, отчего зависит  производитель-
 
   ность большинства прикладных программ. Размер бакета  можно
 
   задать в атрибуте языка описания файла FILE BUCKET_SIZE или
 
   в полях FAB$B_BKS блока FAB и XAB$B_BKZ блока хAB  в  прик- 
 
   ладной программе.
 
        Число уровней индекса в редких случаях  должно  превы-
 
   шать четыре, так что размер бакета следует выбирать в соот-
 
   ветствии с этим фактором. В общем случае, чем меньше размер
 
   бакета, тем больше  уровней  в  индексной  структуре.  Если
 
   небольшое увеличение размера бакета исключает хотя бы  один
 
   уровень, то следует воспользоваться  этой  возможностью.  С
 
   некоторого момента, однако, уменьшение числа уровней приво-
 
   дит к дополнительным затратам на обработку больших бакетов.
 
        Как правило, не следует увеличивать размер бакета  без
 
   гарантии уменьшения числа уровней. Например, пусть  некото-
 
 
                            - 108 -
 
                         00152-01 92 01
 
 
   рый размер бакета,  равный  4  или  более,  дает  индекс  с
 
   четырьмя уровнями, а размер бакета  равный  10  или  более,
 
   дает индекс с тремя уровнями. В этом случае выбирать размер
 
   бакета, равный 9 не следует, потому что  это  не  уменьшает
 
   число уровней, и, следовательно не улучшает  производитель-
 
   ность системы, а  наоборот  ухудшает  ее.  Каждая  операция
 
   ввода-вывода при таком размере бакета занимает большее вре-
 
   мя, а число обращений  к  диску  остается  прежним.  Однако
 
   больший размер бакета всегда будет улучшать  производитель-
 
   ность, если к записям осуществляется последовательный  дос-
 
   туп по первичному ключу, поскольку в один бакет  помещается
 
   большее число записей.
 
        При кэшировании всех уровней за исключением уровня  0,
 
   можно существенно улучшить время обработки файла, хотя опе-
 
   рации добавления, возможно, займут немного больше времени.
 
        Глубина индексной структуры может быть уменьшена двумя
 
   способами. Во-первых, можно увеличить число записей в баке-
 
   те, увеличив тем самым его  размер,  увеличить  коэффициент
 
   заполнения, используя сжатие или уменьшив размер  ключей  и
 
   записей.
 
        Однако эти методы  имеют  разные  недостатки.  Большие
 
   размеры бакетов требуют  больше  буферного  пространства  в
 
   памяти, а число записей в бакете влияет на время поиска  по
 
   бакету. Больший коэффициент заполнения уменьшает  свободное
 
   дисковое пространство,  необходимое  для  пополнения  файла
 
   новыми записями, что может привести к расщеплению  бакетов.
 
   Сжатие увеличивает время поиска записи.
 
        С другой стороны,  можно  уменьшить  глубину  индекса,
 
   уменьшив число записей в файле.
 
 
 
 
                            - 109 -
 
                         00152-01 92 01
 
 
        Если используется несколько областей, то можно устано-
 
   вить различный размер бакета для  каждой  области.  Следует
 
   использовать различные размеры  бакетов,  если  выполняется
 
   прямой доступ к записям по непредсказуемой схеме  и  записи
 
   данных являются сравнительно большими.  Использование  раз-
 
   личных размеров бакетов позволяет задавать  меньший  размер
 
   бакетов для индексных ступеней и  для  вторичного  индекса,
 
   чем для ступени первичных данных.
 
        Определение оптимального размера бакета обеспечивается
 
   редактором EDIT/FDL.
 
        Следует использовать один и тот же размер  бакета  для
 
   всех областей, если записи данных являются  небольшими  или
 
   если доступ к записям следует некоторой  кластерной  схеме,
 
   то-есть, если записи, к которым осуществляется доступ имеют
 
   ключи, которые близки по значению.
 
        В общем случае, уменьшение размера бакета  увеличивает
 
   другие ресурсы, а именно:
 
        1) число уровней в структуре дерева;
 
        2) число бакетов, необходимых для поддержания структу-
 
   ры дерева;
 
        3) число буферов, необходимых для кэширования.
 
        С другой стороны, уменьшение размера бакета  уменьшает
 
   число записей в бакете и среднее число  ключей,  просматри-
 
   ваемых в бакете при продвижении по дереву.
 
 
 
        2.6.2.2. Степень заполнения
 
 
        Если известно, что данная прикладная программа требует
 
   немедленного занесения новых записей в файл, то при первич-
 
   ной загрузке записей в файл следует зарезервировать некото-
 
 
 
                            - 110 -
 
                         00152-01 92 01
 
 
   рое пространство в бакетах. Это обеспечивается путем  зада-
 
   ния некоторого процента заполнения бакетов в  диапазоне  от
 
   50 % до 100 %. Процент заполнения 50 %  от  размера  бакета
 
   означает, что СУД-32 будет заполнять записями только  поло-
 
   вину каждого бакета при первичной загрузке файла,  оставляя
 
   остальную часть бакета пустой для последующей вставки запи-
 
   сей. Это значение степени заполнения  будет  минимизировать
 
   число расщеплений бакетов в дальнейшем.
 
        Если вводимые в файл записи распределены  неравномерно
 
   (ассиметричны) по значению первичного ключа, то даже  зада-
 
   ние процента заполнения, меньшего чем 100  %,  не  уменьшит
 
   числа расщеплений бакетов. Если записи имеют близкие значе-
 
   ния ключа или если они добавляются в один конец  файла,  то
 
   все равно произойдет образование большого числа расщеплений
 
   бакетов, а частично заполненные бакеты в файле  приведут  к
 
   избыточному расходу пространства диска. Если  такой  случай
 
   имеет место, то следует задать процент  заполнения,  равный
 
   100 %, и затем использовать обслуживающую программу CONVERT
 
   для реорганизации файла после занесения в файл новых  запи-
 
   сей.
 
        С другой стороны, если вводимые в файл записи  распре-
 
   делены достаточно равномерно по  их  первичному  ключу,  то
 
   задание коэффициента  заполнения,  меньшего  100  %,  может
 
   существенно уменьшить число расщеплений  бакетов.  За  это,
 
   однако,  приходиться  расплачиваться  избыточным   расходом
 
   пространства диска на начальном этапе работы с файлом.
 
        Величина степени заполнения устанавливается атрибутами
 
   языка описания файла KEY DATA_FILL и KEY INDEX_FILL. Значе-
 
   ние, указанное для обоих атрибутов, должно быть одинаковым.
 
 
 
 
                            - 111 -
 
                         00152-01 92 01
 
 
        2.6.2.3. Число буферов
 
 
        При выполнении программы можно задать требуемое  число
 
   буферов при помощи атрибута языка  описания  файла  CONNECT
 
   MULTIBUFFER_COUNT или поля RAB$B_MBF блока RAB. Число бУФЕ-
 
   ров, которое необходимо каждой прикладной программе,  зави-
 
   сит от типа доступа к записям.
 
        Для индексных файлов необходимо  минимум  два  буфера.
 
   Если прикладная программа выполняет последовательный доступ
 
   к файлу, то двух буферов достаточно, поскольку большее чис-
 
   ло буферов может ухудшить  производительность  системы.  Во
 
   время последовательного доступа к  заданному  бакету  будет
 
   осуществляться доступ подряд столько раз, сколько записей в
 
   этом бакете. После того, как СУД-32 прочитает записи в этом
 
   бакете, обращений к нему больше  не  будет.  Следовательно,
 
   при последовательном доступе нет  необходимости  кэшировать
 
   дополнительные бакеты.
 
        При прямом доступе к индексным  файлам  СУД-32  должна
 
   читать индексную часть данного файла для того, чтобы  лока-
 
   лизовать ту запись, которую необходимо  обработать.  СУД-32
 
   пытается держать бакеты старших индексных ступеней в  памя-
 
   ти. Буфера для бакетов с данными и бакетов с индексом  ниж-
 
   него уровня имеют тенденцию повторного использования в пер-
 
   вую очередь, когда  необходимо  кэшировать  другие  бакеты.
 
   Следовательно, следует использовать столько буферов, сколь-
 
   ко может обеспечить рабочий набор процесса, так  что  можно
 
   кэшировать как можно больше бакетов.
 
        Когда осуществляется доступ к записям в последователь-
 
   ном режиме, даже после того, как по прямому доступу локали-
 
   зована первая запись, следует использовать достаточно боль-
 
 
 
                            - 112 -
 
                         00152-01 92 01
 
 
   шой размер бакета. В этом случае достаточно использовать  2
 
   буфера по умолчанию.
 
        При комбинации двух указанных типов доступа к  записям
 
   необходим некоторый компромисс между выбором размера бакета
 
   и числа буферов.
 
        При добавлении записей в индексный файл следует задать
 
   режим отложенной  записи (атрибут языка описания файла FILE
 
   DEFERRED_WRITE или бит FAB$V_DFW  в  поле  FAB$L_FOP  блока
 
   FAB). При этом режиме  буфер,  в  который  были  перемещены
 
   записи, не записывается на диск до  тех  пор,  пока  данный
 
   буфер не понадобится для других целей или  данный  файл  не
 
   будет закрыт. Этот режим, однако, может  привести  к  тому,
 
   что записи будут теряться, если произойдет аварийный  отказ
 
   системы до того, как данные записи будут записаны на диск.
 
        Для определения значения текущего счетчика буферов  по
 
   умолчанию, надо задать команду SHOW RMS_DEFAULT языка  DCL.
 
   Для того, чтобы установить счетчик  буферов  по  умолчанию,
 
   надо           использовать           команду           SET
 
   RMS_DEFAULT/INDEXED/BUFFER_COUNT=N языка DCL, где N являет-
 
   ся числом буферов.
 
        В общем случае, при установке числа  буферов,  которое
 
   необходимо прикладной программе следует учитывать:
 
        1) время центрального процессора;
 
        2) доступность требуемой памяти;
 
        3) страничные отказы;
 
        4) операции ввода-вывода.
 
        Размер бакета определяется при  создании  файла,  хотя
 
   его  можно  изменить  при  помощи  обслуживающей  программы
 
   CONVERT (см. раздел 9).
 
 
 
 
                            - 113 -
 
                         00152-01 92 01
 
 
        2.6.2.4. Глобальные буферы
 
 
        При разделении индексного файла одновременно  несколь-
 
   кими процессами можно задать использование глобальных бУФЕ-
 
   ров. Глобальный буфер - это буфер ввода-вывода, к  которому
 
   могут осуществить доступ два или более процессов. Если  два
 
   или более процессов запрашивают одну и ту же информацию  из
 
   некоторого файла, то каждый процесс может использовать гло-
 
   бальные буферы вместо выделения своих собственных.
 
        Только одна копия буферов резидентна в памяти в  любое
 
   время, хотя буферы подсчитываются для  определения  размера
 
   рабочего набора каждого процесса.
 
        Общим  принципом  использования   глобальных   буферов
 
   является тот  же  принцип,  что  и  для  локальных  буферов
 
   ввода-вывода, резервируемых каждым процессом.  Однако  гло-
 
   бальные буфера дают существенные преимущества только,  если
 
   несколько процессов обращаются к одним  и  те  же  бакетам,
 
   которые могут быть помещены в  глобальные  буферы  с  целью
 
   избежания выполнения операций ввода-вывода для каждого про-
 
   цесса. Если несколько процессов независимо читают записи  и
 
   используют последовательный доступ, то  наиболее  вероятно,
 
   что они будут ссылаться на различные бакеты. В этом  случае
 
   обшее число операций ввода-вывода не будет  уменьшено,  так
 
   что глобальные буферы производительности не улучшают.
 
        Глобальные буферы используются при обработке с  отло-
 
   женной записью.
 
 
 
        2.6.2.5. Использование отложенной записи
 
 
        Режим  отложенной  записи  может  быть  использован  в
 
   период выполнения программы и  может  существенно  повысить
 
 
                            - 114 -
 
                         00152-01 92 01
 
 
   производительность. Он  является  режимом  по  умолчанию  в
 
   некоторых языках программирования. В  случае  отсутствия  в
 
   языке возможности явного задания этого режима, можно  обра-
 
   титься к подпрограмме на МАКРОАССЕМБЛЕРе, которая установит
 
   в поле FAB$L_FOP значение FAB$V_DFW перед открытием файла.
 
        При отложенной записи СУД-32 задерживает вывод на дис-
 
   ке модифицированного бакета до тех пор, пока  данный  буфер
 
   не понадобится для другого бакета или пока другому процессу
 
   не понадобится модифицированный бакет. Если серия  операций
 
   будет требовать этого бакета, перед тем как он будет  выве-
 
   ден на диск, то будет экономия одной операции  ввода-вывода
 
   на каждую операцию.
 
        Обычно наибольшее увеличение производительности проис-
 
   ходит при использовании отложенной  записи  при  последова-
 
   тельном доступе, поскольку непосредственный доступ  к  дан-
 
   ным, обычно, результат  нескольких  операций  ввода-вывода,
 
   необходимых для получения записи.
 
        При режиме отложенной  записи  глобальные  буферы  для
 
   того,  чтобы  сохранить  модифицированную  информацию,   не
 
   используются. Если модифицирован некоторый глобальный буфер
 
   и установлен режим отложенной  записи, то содержимое  этого
 
   глобального буфера будет копироваться в некоторый локальный
 
   буфер процесса до того, как другим процессам будет разреше-
 
   но получить доступ к содержимому данного глобального  буфе-
 
   ра.  Последующее  использование  данного  модифицированного
 
   буфера процессом, который задержал его вывод на диск, будет
 
   осуществляться ссылкой на локальный буфер  этого  процесса,
 
   до тех пор, пока этот буфер остается в этом локальном кэше.
 
   Ссылка на глобальный  буфер  другим  процессом  приведет  к
 
   тому, что содержимое  локального  буфера  первого  процесса
 
 
                            - 115 -
 
                         00152-01 92 01
 
 
   будет записано назад на диск.
 
        Если некоторый глобальный буфер модифицирован и  режим
 
   отложенной записи не установлен, тогда содержимое  из  гло-
 
   бального буфера будет просто записано на диск. Следователь-
 
   но, использование глобального буфера  вместе  с  отложенной
 
   записью может привести к  небольшому  увеличению  накладных
 
   расходов при обработке, если, в действительности, не проис-
 
   ходит дальнейших ссылок на данный модифицированный буфер до
 
   того, как он выбрасывается из кэш. По  этой  причине  может
 
   потребоваться   захват   отложенной записи  для  процессов,
 
   которые повторно не осуществляют  доступ  к  буферам  после
 
   того, как записи были в них записаны.
 
        Не все операции над индексными файлами могут использо-
 
   вать режим отложенной записи. Любая операция, которая вызы-
 
   вает расщепление бакета принудительно записывает  назад  на
 
   диск модифицированные  бакеты.  Эта  принудительная  запись
 
   назад уменьшает шансы на потерю информации, если произойдет
 
   аварийный сбой системы.
 
        Использование режима отложенной записи будет приводить
 
   обычно к улучшению производительности системы. Пусть,  нап-
 
   ример, индексный файл имеет один ключ, и его  записи  имеют
 
   длину по 100 байтов. Размер бакета  составляет  3  блока  с
 
   коэффициентом заполнения 67 %. Таким образом, в  среднем  в
 
   каждом бакете содержится 10 записей. Пусть имеется програм-
 
   ма пакетной обработки, которая читает каждую запись и  кор-
 
   ректирует ее часть, начиная с первой записи в данном  файле
 
   и продвигаясь последовательно по  записям.  Без  отложенной
 
   записи произошло бы 11 операций ввода-вывода на  диске  для
 
   каждых 10 записей - одна операция для того, чтобы прочитать
 
   данный бакет, и по одной  для  того,  чтобы  записать  этот
 
 
                            - 116 -
 
                         00152-01 92 01
 
 
   бакет для каждой записи. При отложенной записи произошло бы
 
   только две операции ввода-вывода на  диске  для  каждых  10
 
   записей - одна операция для того,  чтобы  прочитать  данный
 
   бакет, и другая - для того,  чтобы  записать  данный  бакет
 
   после того, как будут завершены операции над записями.
 
 
 
 
           3. СОЗДАНИЕ ФАЙЛОВ И ИХ ПЕРВИЧНАЯ ЗАГРУЗКА
 
 
 
        Перед созданием файла необходимо задать  его  характе-
 
   ристики, выбранные на  этапе  проектирования.  Затем  нужно
 
   создать файл с этими характеристиками и определить полномо-
 
   чия доступа к данному файлу. Наконец, необходимо  загрузить
 
   в файл подготовленные заранее данные.
 
        В данном разделе описывается процесс создания файлов и
 
   наполнения их данными.
 
 
 
        3.1. Характеристики файла
 
 
        Имеется два способа задания характеристик, необходимых
 
   для создания некоторого файла. Если используется язык  мак-
 
   роассемблера  или  бЛИСС-32,  характеристики  задаются  при
 
   помощи управляющих блоков СУД-32 непосредственно в приклад-
 
   ной программе.
 
        Если прикладная программа составляется на языке  прог-
 
   раммирования высокого уровня, МАКРОАССЕМБЛЕРе или БЛИСС-32,
 
   то можно использовать язык описания файла (FDL), являющийся
 
   специализированным языком СУД-32, который  применяется  для
 
   составления описания файлов.
 
 
 
 
 
 
                            - 117 -
 
                         00152-01 92 01
 
 
        3.1.1. Использование управляющих блоков СУД-32
 
 
        Установить характеристики  позволяют  два  управляющих
 
   блока СУД-файла: блок доступа к файлу (FAB) и блоки  допол-
 
   нительных атрибутов (XAB).
 
        Управляющие блоки позволяют выбрать значения по  умол-
 
   чанию, которые обеспечивает система СУД-32,  или  перекрыть
 
   значения по умолчанию и определить характеристики,  которые
 
   подходят для прикладной программы.
 
 
 
        3.1.1.1. Блок доступа к файлу
 
 
        Блок доступа к файлу (FAB) является  управляющим  бло-
 
   ком, который описывает некоторый конкретный файл. Поля бло-
 
   ка доступа к файлу содержат следующую  информацию,  относя-
 
   щуюся к файлу:
 
          - адрес спецификации файла;
 
          - организацию файла;
 
          - формат записи;
 
          - информацию о дисковом пространстве.
 
        Использование блока доступа к файлу позволяет ипользо-
 
   вать характеристики СУД-32 во время  создания  файла  и  во
 
   время выполнения  программы.  Для  каждого  файла,  который
 
   будет открыт или создан  в  прикладной  программе,  следует
 
   определить один блок доступа к файлу.
 
        Описание блока FAB приведено в документе [2].
 
 
 
        3.1.1.2. Блоки дополнительных атрибутов
 
 
        Блоки дополнительных атрибутов (XAB)  являются  управ-
 
   ляющими блоками, которые содержат дополнительную информацию
 
 
 
                            - 118 -
 
                         00152-01 92 01
 
 
   об атрибутах файла. Различные блоки дополнительных  атрибу-
 
   тов могут использоваться для того, чтобы предоставить  сис-
 
   теме следующую информацию:
 
          - первоначальный размер и расширение (XABALL);
 
          - защита файла (XABPRO);
 
          - определение ключа (XABKEY);
 
          - информация о дате и времени (XABDAT).
 
        Подобно блокам доступа к  файлу  блоки  дополнительных
 
   атрибутов позволяют использовать  характеристики  СУД-32  в
 
   момент создания файла и в момент выполнения программы.
 
        В отличие от блока  доступа  к  файлу,  однако,  блоки
 
   дополнительных атрибутов являются необязательными управляю-
 
   щими блоками, в которых задаются  дополнительные  атрибуты,
 
   отсутствующие в блоке доступа к файлу.
 
        Более подробная  информация  о  блоках  дополнительных
 
   атрибутов приведена в документе [2].
 
 
 
        3.1.2. Использование языка описания файла
 
 
        Использование языка описания файла является  одним  из
 
   самых простых способов создания файлов. На этом языке  опи-
 
   сываются атрибуты файла. Описания на языке FDL сами  оформ-
 
   ляются в виде файлов. Создание  и  редактирование  описаний
 
   осуществляет обслуживающая программа СУД-32 - EDIT/FDL.
 
        Для создания файлов по описаниям на языке FDL  исполь-
 
   зуются программы CREATE/FDL и соNVERT. При помощи  обслужи-
 
   вающей программы ANALYZE  можно  создать  файл,  содержащий 
 
   описания на языке FDL, используя существующие файлы данных.  
 
   Файлы описаний, созданные программой ANALYZE, содержат спе-
 
   циальные секции анализа,  которые  можно  использовать  при 
 
 
 
                            - 119 -
 
                         00152-01 92 01
 
 
   редактировании этих описаний программой  EDIT/FDL, с  целью  
 
   изменения атрибутов существующих файлов.
 
        Таким образом наличие файлов описаний позволяет  отка-
 
   заться при программировании от использования блоков  FAB  и
 
   XAB, что существенно упрощает составление программ.  Однако
 
   в языке FDL предусмотрены не все возможности, допустимые  в
 
   СУД-32. Для того, чтобы использовать полный  набор  возмож-
 
   ностей СУД-32  при  открытии  файла  все  же  рекомендуется
 
   использовать управляющие блоки СУД-32.
 
        Обслуживающая программа EDIT/FDL  содержит  встроенные
 
   процедуры, автоматизирующие процесс проектирования  файлов.
 
   При необходимости, для  создания  и  редактирования  файлов
 
   описаний, можно использовать стандартный  редактор  МОС  ВП
 
   или команду сREATE языка DCL. Однако использование редакто-
 
   ра FDL предпочтительно, поскольку он проводит  синтаксичес-
 
   кий анализ описаний файлов.
 
 
 
        3.1.2.1. Использование редактора FDL
 
 
        Редактор FDL функционирует в двух режимах  -  интерак-
 
   тивном и командном. В командном режиме  выполняется  только
 
   одна  процедура  -  OPTIMIZE,  обеспечивающая   оптимизацию
 
   существующего файла, при наличии файла описания, созданного
 
   ранее (п.9.3.2).
 
        В командном режиме выполняются все процедуры редактора
 
   FDL. После вызова редактора выдается меню  основных  команд
 
   редактора. Для ввода команды достаточно указать  ее  первый
 
   символ.
 
        В табл.6 приводятся команды редактора FDL.
 
 
 
 
 
                            - 120 -
 
                         00152-01 92 01
 
 
                                                    Таблица 6
 
                      Команды редактора FDL
 
   ----------------------------------------------------------
    Команда  !                Функция
   ----------------------------------------------------------
             !
    ADD      !   Ввод  в  файл  FDL  одной  или  более строк.
             ! если  данная  строка  уже существует, то можно
             ! заменить ее на новую строку
             !
   <CTRL/Z>  !   Так же как и команда EXIT, завершает работу
             ! редактора и  создает  отредактированный  файл,
             ! если  команда введена на уровне основного меню
             ! команд.
             !   если  CTRL/Z  введена на любом другом уровне
             ! редактора,  то  происходит  возврат на уровень
             ! основного меню
             !
    DELETE   !   Удаление  одной или  нескольких строк из ре-
             ! дактируемого файла FDL
             !
    EXIT     !   Создает выходной файл описаний и заканчивает
             ! сеанс  работы с  редактором  FDL. Редактор FDL
             ! оставляет  неизменным  входной  файл FDL после
             ! его  редактирования. Созданный  файл  Oписаний
             ! по умолчанию является последовательным файлом,
             ! состоит из  строк  переменной  длины,  которые
             ! завершаются  символом  <CR>.  Код защиты файла
             ! по  умолчанию  идентичен  коду  защиты  СУД-32
             ! для  его  изменения  необходимо ознакомится  с
             ! подпунктом 3.1.2.3
             !
    HELP     !   Получение пояснений о возможностях редактора
             ! FDL
             !
    INVOKE   !   Выбор процедуры проектирования файла
             !
    MODIFY   !   Изменение строк файла FDL
             !
    QUIT,    !   Аварийное завершение сеанса работы редактора
   <CTRL/C>  ! без создания выходного файла FDL
             !
    SET      !   Установка характеристик редактора по умолча-
             ! нию
             !
    VIEW     !   Вывод на  экран  содержимого  файла описания
             !
    ?        !   Вывод на экран более детальной информации  о
             ! вопросе, заданном редактором FDL, и повторение
             ! вопроса
 
        В большинстве случаев ввод команды редактора  приводит
 
   к появлению на экране другого меню,  соответствующего  выб-
 
   ранной команде. В частности, ввод команды  ADD  приводит  к
 
 
 
                            - 121 -
 
                         00152-01 92 01
 
 
   появлению меню, приведенного в примере.
 
 
        П р и м е р 1.
 
 
                    Первичные атрибуты
 
    ACCESS     установка режима доступа к файлу
    AREA х     определение атрибутов области х файла
    CONNECT    установка Aтрибутов этапа выполнения
    DATE       установка даты создания файла
    FILE       установка атрибутов всего файла
    JOURNAL    установка атрибутов ведения журнального файла
    KEY Y      определение характеристик ключа Y
    RECORD     определение атрибутов записи
    SHARING    установка режима разделения файла
    SYSTEM     установка атрибутов системы
    TITLE      определение заголовка FDL-файла
 
        Первичный атрибут [FILE]:
 
        Однако наиболее существенной  функцией  редактора  FDL
 
   является возможность автоматизации  проектирования  индекс-
 
   ных, относительных и последовательных файлов.
 
        Для этой цели в редакторе FDL предусмотрено семь  про-
 
   цедур (сценариев), вызовы  которых  перечисляются  в  меню,
 
   ПОЯВЛЯЮЩЕМСЯ НА ЭКРАНЕ ПО КОМАНДЕ INVOKE. ПЕРЕЧЕНЬ  ВОЗМОЖ-
 
   ных сеансов работы приведен  в  табл.7,  отработка  каждого
 
   сеанса осуществляется в процессе диалога с пользователем.
 
                                                    Таблица 7
 
                     Сценарии редактора FDL
 
   ----------------------------------------------------------
    Процедуры  !            Функции
   ----------------------------------------------------------
               !
    ADD_KEY    !   Моделирование  или  добавление  параметров
               ! индекса
               !
    DELETE/KEY !   Удаление параметров индексов
               !
    INDEXED    !   Начало диалога с целью определения требуе-
               ! мых  характеристик  индексного  файла
               !
    OPTIMIZE   !   Повторное проектирование файла с использо-
               ! ванием  описания,  созданного  обслуживающей
               ! программой ANALYZE. Файл  описания  является
               ! для редактора FDL входным.
               !   В процессе повторного проектирования файла
 
 
                            - 122 -
 
                         00152-01 92 01
 
 
                                          Продолжение табл. 7
   ----------------------------------------------------------
    Процедуры  !            Функции
   ----------------------------------------------------------
               !
               ! Проводится по существу его оптимизация, т.е.
               ! настройка параметров его индексов, использо-
               ! ванием статистики по данному файлу, получен-
               ! ной программой ANALYZE в результате обработ-
               ! ки секций ANALYSIS языка FDL
               !
    RELATIVE   !   Начало диалога, в процессе  которого у по-
               ! льзователя запрашивается информация об отно-
               ! сительном файле, который должен быть создан
               ! в соответствии с  описаниями  на  языке FDL.
               ! редактор FDL задает значения для некоторых
               ! атрибутов
               !
    SEQUENTIAL !   Начало диалога, в процессе  которого у по-
               ! льзователя запрашивается информация о после-
               ! довательном файле, который должен быть  соз-
               ! дан в соответствии  с  описаниями  на  языке 
               ! FDL. Редактор FDL задает значения для  неко-
               ! торых атрибутов
               !
    TOUCHUP    !   Начало диалога, в процессе которого у по-
               ! льзователя  запрашивается  информация о тех
               ! изменениях, которые необходимо сделать в су-
               ! ществующем индексе
               !
 
        Вызов требуемого сценария осуществляется одним из сле-
 
   дующих способов:
 
        1) по команде INVOKE после отображения главного  меню.
 
   После задания  необходимых  значений  в  ответ  на  вопросы
 
   редактора на экран выводится список атрибутов  и  значения,
 
   приписанные этим атрибутам. После этого можно  использовать
 
   команды редактирования для того, чтобы выполнить дальнейшую
 
   модификацию значений данных атрибутов и для завершения дан-
 
   ного сценария;
 
        2) указанием сценария в качестве значения квалификато-
 
   ра SCRIPT в команде вызова редактора, например:
 
 
               EDIT/FDL/SCRIPT=сценарий
 
 
        В этом случае главное меню  опускается,  а  на  экране
 
 
 
                            - 123 -
 
                         00152-01 92 01
 
 
   появляется меню соответствующего сценария.
 
        В примере 2 показана работа редактора  FDL.  Отдельные
 
   фрагменты примера пронумерованы.
 
 
        П р и м е р 2.
 
 
                          Редактор FDL
 
       ADD       вставка  одной  или  нескольких  строк  в
                 FDL-файл
       DELETE    удаление  одной  или  нескольких  строк  из
                 FDL-файла
       EXIT      выход из  редактора с  созданием  FDL-файла
       HELP      пояснения  о  возможностях  FDL  редактора
   (1) INVOKE    выбор  сценария  работы
       MODIFY    изменение  существующего  FDL-файла
       QUIT      выход из  редактора,  не создавая FDL-файл
       SET       установка  характеристик  редактора
       VIEW      вывод  содержимого  текущего FDL-файла
   (2)  функция редактора [HELP]: INVOKE
 
                       Возможные сценарии
 
       ADD_KEY     добавление  новых  параметров  индексов
       DELETE_KEY  удаление  параметров  индексов
       INDEXED     моделирование параметров всего индексного
                   файла
   (3) OPTIMIZE    настройка  всех  параметров  индексов
       RELATIVE    выбор параметров для относительного файла
       SEQUENTIAL  выбор  параметров  для  последовательного
                   файла
       TOUCHUP     изменение  параметров  для  определенного
                   индекса
 
   (4) выбор сценария          [-]:INDEXED
 
   (5) величина кластера диска [3]:3
 
   (6) число ключей в файле (1-255)[1]:1
 
       LINE    размер  бакета / глубина индекса / как двумер-
               ный график
       FILL    размер бакета / процент заполнения при загруз-
               ке / глубина  индекса
   (7) KEY     размер бакета / длина ключа /  глубина индекса
       RECORD  размер бакета / длина записи / глубина индекса
       INIT    размер  бакета  / число  записей при начальной
               загрузке / глубина  индекса
       ADD     размер бакета / число записей при добавлении /
               глубина индекса
 
   (8)  выбор типа графика      [LINE]:LINE
 
   (9)  число первоначально загружаемых записей (0-1гига)
        [-]:100000
 
 
                            - 124 -
 
                         00152-01 92 01
 
 
 
   (10) (FAST-CONVERT NOFAST_CONVERT RMS-PUTS)
        Метод начальной загрузки         [FAST]   :FAST
 
   (11) число записей, которые будут добавлены после
        начальной загрузки         (0-1гига)[0]   :0
 
   (12) KEY 0 процент заполнения    (50-100)[100] :100
 
   (13) (FIхED VARIABLE)
        формат записи                        [VAR]:VARIABLE
 
   (14) сред. длина                 (1-32229)[-]  :80
 
   (15) макс. длина                 (0,80-32229[0]:0
 
   (16) (BIN2 BIN4 BIN8 INT4 INT8 DECIMAL STRING)
        кл. 0 тип                            [STR]:STRING
 
   (17) кл. 0 сегментация                 (YES/NO):NO
 
   (18) кл. 0 длина                     (1-255)[-]:9
 
   (19) кл. 0 позиция                   (0-255)[-]:0
 
   (20) кл. 0 дублирование            (YES/NO)[NO]:NO
 
   (21) версия пролога                    (0-3)[3]:3
 
   (22) сжатие ключа данных          (YES/NO)[YES]:YES
 
   (23) сжатие записи данных         (YES/NO)[YES]:YES
 
   (24) сжатие индекса               (YES/NO)[YES]:YES
 
 
                   *!
                   9!
                   8!
         Глубина   7!
                   6!
         индекса   5!
                   4!
   (25)            3!33
                   2!   22222222222222222222
                   1!                        111111111
                    +-+---+----+----+----+----+----+-+
                      1   5   10    15   20   25  30 32
 
                          Размер бакета (в блоках)
 
 
 
 
 
 
 
 
 
 
 
                            - 125 -
 
                         00152-01 92 01
 
 
       PV-версия пролога         3 кт-кл. 0 тип        STRING
       EM-режим FLATTER        (3) DK-DUP кл. 0            N0
       KL-кл. 0 длина            9 кр-кл. 0 позиция         0
       RC-сжатие записей       0 % кс-сжатие ключа        0 %
       IC-сжатие индекса       0 % вF-зап. бакета       100 %
       RF-формат записи   VARIABLE RS-длина записи         80
       LM-загрузка       FAST_CONV IL-нач. загрузка    100000
       AR-добавление             0
 
          (для окончания введите "FD")
 
   (26) параметр файла [повтор] :FD
 
   (27) текст заголовка (1-126 симв.)[NULL]
        :FDL_SESSION_EXAMPLE
 
   (28) спец. файла данных  (1-126 символов)[NULL]
        :EXAMPLE_DAT
 
   (29) (CARRIAGE_RETURN FORTRAN NONE PRINT)
        упр.кареткой            [саRR]:CARRIAGE_RETURN
 
       режим при определении умолчания: (FLATTER_FILES)
 
       предлAгаемые  размеры  бакета:   (   3   3   27)
 
       число уровней в индексе:         (   2   2    1)
 
   (30)число бакетов в индексе:         (  72   72   1)
 
       страниц для кэшир. индекса:      (216   216  27)
 
       поиск индекса в файле:           (168  169  766)
 
   (31) лл. 0 разм. бакета                 (1-63)[3]:3
 
   (32) кл. 0 имя                 (1-32 симв.)[NULL]:SSNUM
 
   (33) глобальные буферы    (YES/NO)[NO]           :NO
 
   (34) глубина ключа 0 установлена, чтобы не превысить
        2 инд. Уровня, т.е. всего 3 уровня.
 
   (35) <CR> - продолжение (<CTRL/Z> - возврат на меню)
        :<CTRL/Z>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 126 -
 
                         00152-01 92 01
 
 
                          Редактор FDL
 
       ADD       вставка  одной  или  нескольких  строк  в
                 FDL-файл
       DELETE    удаление  одной  или  нескольких  строк  из
                 FDL-файла
       EXIT      выход из  редактора с  созданием  FDL-файла
       HELP      пояснения  о  возможностях  FDL  редактора
   (36)INVOKE    выбор  сценария  работы
       MODIFY    изменение  существующего  FDL-файла
       QUIT      выход из  редактора,  не создавая FDL-файл
       SET       установка  характеристик  редактора
       VIEW      вывод  содержимого  текущего FDL-файла
 
   (37) функция редактора  [HELP]:EXIT
 
   (38) DISK$:[FOх.RMS]FDL_SESSION_ехамPLE.FDL;1 40 LINES
 
 
 
                пояснение фрагментов примера 2:
 
   (1)  основное меню редактора. Содержит команды редактора,
        Которые может использовать пользователь.
 
   (2)  команда INVOKE вызывает Mеню для выбора сценария. Ко-
        Манда HELP является  командой по умолчанию, поскольку
        Она указана в квадратных  скобках. Здесь  и далее для
        Вызова команды  по умолчанию достаточно нажать <CR>.
 
   (3)  это меню для выбора  сценария. Оно    содержит   имена
        Допустимых   процедур,   выбираемых    для    проекти-
        Рования файла. Значения  по  умолчанию не имеется. Имя
        Процедуры вводится явно.
 
   (4)  вызов INDEXED вызывает  появление  вопросов, ответы на
        Которые    обеспечивают    автоматическое     создание
        Фрагментов  описания файла на языке FDL при проектиро-
        Вании индексного файла.
 
   (5)  размер кластера диска устанавливается равным 3.
 
   (6)  определяется только один ключ - первичный.
 
   (7)  список типов графиков.
 
   (8)  выбор требуемого вида графика из приведенного выше
        списка.
 
   (9)  при первоначальной загрузке загружается 100000 записей
 
   (10) выбор метода быстрой загрузки записей (указание FAST).
 
   (11) указание о запрещении ввода в файл новых записей после
        его первоначальной загрузки.
 
   (12) указание о заполнении индексных бакетов, содержащих
        Первичный ключ на 100%.
 
 
 
                            - 127 -
 
                         00152-01 92 01
 
 
   (13) выбор формата  записей   переменной длины.
 
   (14) выбор среднего размера записи, равного 80 символам.
 
   (15) выбор неограниченного максимального размера записи.
 
   (16) выбор строкового типа данных для первичного ключа.
 
   (17) запрещение сегментации в первичном ключе.
 
   (18) выбор длины первичного ключа, равной 9.
 
   (19) определение местоположения первичного ключа с нулевой
        позиции записи.
 
   (20) запрещение дублирующихся значений первичного ключа.
 
   (21) выбор версии пролог 3.
 
   (22) выбор сжатия для ключей данных.
 
   (23) выбор сжатия для записей данных.
 
   (24) выбор сжатия в индексе.
 
   (25) линейный график, показывающий глубину индекса в
        зависимости от размера бакета, список установлен-
        ных атрибутов файла.
 
   (26) ввод признака конца проектирования файла - FD.
 
   (27) ввод спецификации файла описания в качестве заго-
        ловка.
 
   (28) ввод спецификации проектируемого файла данных.
 
   (29) выбор символа управления кареткой - <CR>.
 
   (30) основные параметры проектируемого файла. Показаны
        также рекомендуемые размеры для различных уровней
        и другая информация.
 
   (31) размер бакета по умолчанию для первичного ключа.
 
   (32) имя первичного ключа.
 
   (33) выбор возможности использования глобальных буферов.
 
   (34) это сообщение показывает глубину индекса первичного
        ключа и дает общее число уровней.
 
   (35) нажатие клавиши  <CTRL/Z> обеспечивает возврат  в
        основное меню.
 
   (36) основное меню.
 
   (37) выход из редактора с созданием файла описания.
 
   (38) результирующее сообщение о спецификации файла описания
 
 
                            - 128 -
 
                         00152-01 92 01
 
 
        И его размере.
 
        В примере большинство значений атрибутов и ответов  на
 
   вопросы было выбрано равным значению по умолчанию.  Сущест-
 
   вует три других способа, позволяющих выбрать эти же умолча-
 
   ния:
 
        1) нажатие клавиши <CR>;
 
        2) использование квалификатора /RESPONSES=AUTOMATIC  в
 
   командной строке вызова редактора;
 
        3) использOвание команды SET на уровне оновного меню и
 
   затем выбор RESPONSES=AUTOMATIC на уровне меню команды SET.
 
        Когда редактор FDL создает файл описаний, то он  груп-
 
   пирует атрибуты в основные секции. Заголовки данных  секций
 
   называются "первичными атрибутами". Атрибуты внутри некото-
 
   рой первичной секции  называются  "вторичными  атрибутами".
 
   Некоторые вторичные атрибуты содержат третий уровень  аТРИ-
 
   бутов, называемый "квалификаторами".
 
        Основной  функцией  редактора  FDL  является  создание
 
   некоторого файла  описаний,  который  содержит  оптимальные
 
   значения различных атрибутов. Полный файл описаний содержит
 
   первичные и вторичные атрибуты,  а  также  квалификаторы  с
 
   приписанными им значениями. При отсутствии отдельных  атри-
 
   бутов или квалификаторов в файле  описаний  принимаются  их
 
   значения по умолчанию.
 
        Атрибуты IDENT,  SYSTEM,  FILE,  RECORD,  AREA  и  KEY
 
   являются первичными, остальные атрибуты являются  вторичны-
 
   ми. В примере 3 приведен текст файла описаний.
 
 
 
 
 
 
 
 
 
 
                            - 129 -
 
                         00152-01 92 01
 
 
        П р и м е р 3.
 
 
                         Файл описаний
 
   IDENT   " 1-MAR-1987 14:07:46 редактор FDL"
   SYSTEM
           SOURCE                M32/VOS
 
   FILE
           GLOBAL_BUFFER_COUNT   0
           NAME            DISK$SUD:[SUDTEST]INDEXED.DAT;3
           ORGANIZATION        INDEXED
           OWNER               [SUD1,TEST]
           PROTECTION (SYSTEM:RWED,OWNER:RWD,GROUP:RE,WORLD:)
 
   RECORD
           BLOCK_SPAN              YES
           CARRIAGE_CONTROL        NONE
           FORMAT                  VARIABLE
           SIZE                    2048
 
   AREA 0
           ALLOCATION              233
           BEST_TRY_CONTIGUOUS     YES
           BUCKET_SIZE             5
           EXTENTION               60
 
   AREA1
           ALLOCATION              5
           BEST_TRY_CONTTIGOUS     YES
           BUCKET_SIZE             5
           EXTENTION               5
 
   AREA2
           ALLOCATION              18
           BEST_TRY_CONTIGUOUS     YES
           BUCKET_SIZE             3
           EXTENTION               6
 
   KEY 0
           CHANGES                 NO
           DATA_AREA               0
           DATA_FILL               100
           DATA_KEY_COMPRESSION    NO
           DATA_RECORD_COMPRESSION NO
           DUPLICATES              NO
 
           INDEX_AREA              1
           INDEX_COMPRESSION       NO
           INDEX_FILL              100
           LEVEL1_INDEX_AREA       1
           NAME                    "NUM"
           NULL_KEY                NO
           PROLOG                  3
           SEG0_LENGTH             8
           SEG0_POSITION           0
           TYPE                    BIN8
 
 
 
                            - 130 -
 
                         00152-01 92 01
 
 
   KEY1
           CHANGES                 YES
           DATA_AREA               2
           DATA_FILL               100
           DATA_KEY_COMPRESSION    YES
           DUPLICATES              YES
 
           INDEX_AREA              2
           INDEX_COMPRESSION       YES
           INDEX_FILL              100
           LEVEL1_INDEX_AREA       2
           NAME                    "NAME"
           NULL_KEY                YES
           NULL_VALUE              0
           SEG0_LENGTH             39
           SEG0_POSITION           9
           TYPE                    STRING
 
           Перевод сообщений файла описаний FDL
 
                      файл описаний
 
     Иден. "1-MAP-1987 14:07:46 редактор FDL"
     системы
 
             Источник                  M32/VOS
 
   Файл
      число-глобальных-буферов       0
      имя                    DISK$SUD:[SUDTEST]INDEXED.DAT;3
      организация                    индексная
      владелец (система:RWED,владелец:RWD,группа:RE,прочие:)
 
   Запись
      пересеч-границ-блока           да
      управление-кареткой            нет
      формат                         переменная
      размер                         2048
 
   Область 0
      размещение                     233
      по-возможноСТИ-непрерывный     да
      размер-бакета                  5
      расширение                     60
 
   Область 1
      размещение                     5
      по-возможноСТИ-непрерывный     да
      размер-бакета                  5
      расширение                     5
 
   Область 2
      размещение                     18
      по-возможноСТИ-непрерывный     да
      размер-бакета                  3
      расширение                     6
 
   Ключ 0
      изменения                      нет
 
 
                            - 131 -
 
                         00152-01 92 01
 
 
      область-данных                 0
      степень-заполнения-данных      100
      сжатие-данных-ключа            нет
      сжатие-данных-записи           нет
      дубликаты                      нет
 
      область-индекса                1
      сжатие-индекса                 нет
      степень-заполнения-индекса     100
      область-индекса-уровня-1       1
      имя                            "NUM"
      нулевой-ключ                   нет
      пролог                         3
      длина-сегмента-0               8
      позиция-сегмента-0             0
      тип                            BIN8
 
   Ключ 1
      изменения                      да
      область-данных                 2
      степень-заполнения-данных      100
      сжатие-данных-ключа            да
      дубликаты                      да
 
      область-индекса                2
      сжатие-индекса                 да
      степень-заполнения-индекса     100
      имя                            "NAME"
      нулевой-ключ                   да
      нулевое-значение               0
      длина-сегмента-0               39
      позиция-сегмента-0             9
      тип                            строковый
 
 
        3.1.2.2. Некоторые  особенности   проектирования
 
                 файла
 
 
        Вызов редактора FDL для  проектирования  нового  файла
 
   возможEн одним из двух способов:
 
        1) по команде DCL
 
 
             EDIT/FDL/CREATE файл-описаний
 
 
        Квалификатор /CREATE сообщает редактору FDL о  необхо-
 
   димости создания нового файла описаний, спецификация  кото-
 
   рого указана в команде  (параметр  файл-описаний).  В  этом
 
   случае необходимо задать команду  INVOKE  для  вызова  меню
 
   процедур, а затем вызвать одну из трех допустимых в  данном
 
 
                            - 132 -
 
                         00152-01 92 01
 
 
   меню процедур - INDEXED, RELATIVE и SEQUENTIAL для проекти-
 
   рования индексного,  относительного  или  последовательного
 
   файлов соответственно;
 
        2) заданием квалификатора /SCRIPT  с  указанием  имени
 
   одной из трех вышеперечисленных процедур.
 
        В процессе выполнения  процедуры  задаются  вопросы  о
 
   характеристиках файла. В вопросах задаются возможные допус-
 
   тимые ответы, например, диапазон приемлемых значений,  ТРЕ-
 
   буемый тип значения в скобках и ответ по умолчанию в  квад-
 
   ратных скобках. Например:
 
 
   число ключей в файле (1 - 255) [1]:
 
 
        Этот вопрос предлагает ввести число ключей, по которым
 
   осуществляется доступ к индексному файлу. Ответом по  умол-
 
   чанию является 1. Для ввода данного значения  по  умолчанию
 
   следует нажать клавишу <CR>.
 
        Если значения по умолчанию не допускаются, то в  квад-
 
   ратных скобках указывается символ [-]. Такие  вопросы  тре-
 
   буют обязательного ответа.
 
        После диалога процедур SEQUENTIAL или RELATIVE, редак-
 
   тор FDL возвращается в основное меню.
 
        При вызове процедуры INDEXED, после завершения диалога
 
   проводится отображение на экране выбранного в процессе диа-
 
   лога графика проектирования - линейного или поверхностного.
 
        В линейном графике глубина индекса строится по размеру
 
   бакета. При всех остальных равных значениях  размер  бакета
 
   определяет число уровней в данном индексе, а число  уровней
 
   имеет непосредственное влияние на эффективность  выполнения
 
   программы обработки индексного файла. Меньшее  число  уров-
 
   ней, в общем случае, уменьшает среднее число значений  клю-
 
 
                            - 133 -
 
                         00152-01 92 01
 
 
   ча, просматриваемых при спуске по  дереву  индекса.  Однако
 
   гладкие файлы (без расщеплений, с высоким процентом  запол-
 
   нения) содержат больше записей в бакете данных и могут при-
 
   вести к большим временам  поиска  в  бакете  данных.  Таким
 
   образом, линейный график является гибким  инструментом  для
 
   выбора оптимального размера бакета. Пример линейного графи-
 
   ка приведен на рис.14.
 
 
 
                    Пример линейного графика
 
 
           *!
           9!
           8!
   Глубина 7!
           6!
   индекса 5!
           4! 4
           3!  33333
           2!       22222222222222222222222222
           1!
            +-+---+----+----+----+----+----+--+
              1   5    10   15   20   25  30 32
 
                  Размер бакета (в блоках)
 
 
 
                            Рис. 14
 
 
 
        Как показано на рис.14, размер бакета, равный 1 блоку,
 
   дает в результате индекс с 4 уровнями.  Увеличение  размера
 
   бакета до 2 блоков уменьшает число уровней индекса до 3, но
 
   увеличение до 5 блоков не уменьшает  совсем  число  уровней
 
   индекса. Размер бакета в 7 блоков, однако, уменьшает  число
 
   уровней индекса до 2.
 
        При выборе размера бакета, следует помнить, что в чис-
 
   ло приводимых на графике уровней не входит  уровень  собст-
 
   венно данных, т.е. 0-й уровень. При необходимости  создания
 
   3-х уровневого файла  число  индексных  уровней  необходимо
 
 
                            - 134 -
 
                         00152-01 92 01
 
 
   ограничить до 2.
 
        Режим выдачи поверхностного графика позволяет  выбрать
 
   некоторый диапазон значений  для  того,  чтобы  увидеть  их
 
   эффект. Для его получения необходимо ввести следующие  зна-
 
   чения:
 
        1) процент заполнения бакетов;
 
        2) длина ключа;
 
        3) размер записи;
 
        4) число первоначально загружаемых записей;
 
        5) число добавляемых записей.
 
        Этот диапазон будет отображаться по оси Y графика.
 
        Переменной по оси х графика  является  размер  бакета.
 
   Числа, представленные в поле графика, указывают число уров-
 
   ней для каждого размера бакета и для каждого другого значе-
 
   ния.
 
        На рис.15 приведен поверхностный график, который пока-
 
   зывает некоторый диапазон значений коэффициента  начального
 
   заполнения бакетов от 40 % до 100 %.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 135 -
 
                         00152-01 92 01
 
 
                      Поверхностный график
 
 
           100! 43\222222222\2222222222222211111
              ! 433\22222222\2222222222222222111
            90! 433\22222222\2222222222222222211
   Процент    ! 433\22222222\2222222222222222222
            80! 433\22222222\2222222222222222222
   Заполнения ! 433\22222222\2222222222222222222
            70! 4333\2222222\2222222222222222222
   При        ! 4333\2222222\2222222222222222222
   начальной60! 4333\2222222\2222222222222222222
   загрузке   ! 43333\2222222\222222222222222222
            50! 43333\2222222\222222222222222222
              ! 543333\2222222\22222222222222222
            40! 5433333\222222\22222222222222222
              +-+---+----+----+----+----+----+-+
                1   5    10   15   20   25  30 32
 
                  Размер бакета (в блоках)
 
 
 
                            Рис. 15
 
 
 
        Область на графике внутри знаков "обратный слэш" ("\")
 
   представляет те комбинации, которые СУД-32 найдет  приемле-
 
   мыми. Например, процент заполнения 70 % и размер бакета  10
 
   блоков является хорошей комбинацией. Однако процент  запол-
 
   нения 70 % и размер бакета 15 блоков является плохой, пото-
 
   му что эта комбинация лежит вне границ, очерченных  знаками
 
   "обратный слэш".
 
        Если информация, предоставленная пользователем  редак-
 
   тору FDL в ответах на  вопросы,  является  достоверной,  то
 
   значения,  прилегающие  к  левой  границе  знака  "обратный
 
   слэш", являются оптимальными. Если у пользователя нет  уве-
 
   ренности в достоверности информации, предоставленной редак-
 
   тору, то целесообразно выбирать значения, которые  лежат  у
 
   правой границы знаков "обратный слэш".
 
        После того, как диалог завершен и редактор  FDL  выдал
 
   некоторый график, в некоторых атрибутах проектируемого фай-
 
 
 
                            - 136 -
 
                         00152-01 92 01
 
 
   ла данных можно сделать изменения. Проектирование не завер-
 
   шается до тех пор,  пока  не  будут  введены  символы  "FD"
 
   ("окончание  проектирования"),  после  чего  редактор   FDL
 
   задаст еще несколько вопросов. Затем можно  возвратиться  к
 
   основному меню и просмотреть атрибуты языка описания файла,
 
   которые редактор FDL создал для проектируемого файла.
 
        В примере показаны атрибуты, которые  можно  изменить,
 
   когда редактор FDL выводит  график.  Каждый  атрибут  имеет
 
   двухбуквенную мнемонику. Для того, чтобы изменить  атрибут,
 
   необходимо задать соответствующую мнемонику. Нажатием  кла-
 
   виши <CR> можно повторно отобразить данный экран. Для того,
 
   чтобы начать конечную фазу проектирования, необходимо ввес-
 
   ти "FD".
 
 
        П р и м е р.
 
 
       PV-версия пролога         3 кт-кл. 0 тип        STRING
       EM-режим FLATTER        (3) DK-DUP кл. 0            N0
       KL-кл. 0 длина            9 кр-кл. 0 позиция         0
       RC-сжатие записей       0 % кс-сжатие ключа        0 %
       IC-сжатие индекса       0 % вF-зап. Бакета       100 %
       RF-формат записи   VARIABLE RS-длина записи         80
       LM-загрузка       FAST_CONV IL-нач. Загрузка    100000
       AR-добавление             0
 
        Конечная фаза проектирования составляет другую  группу
 
   вопросов, на которые необходимо дать ответ. Данные  вопросы
 
   позволяют задавать значения для таких атрибутов, как  TITLE
 
   - необязательный первичный атрибут, который позволяет зада-
 
   вать заголовок файла описания. Значения, указанные в  отве-
 
   тах на вопросы, редактор FDL приписывает атрибутам описания
 
   файла. После ответов на вопросы конечной фазы можно возвра-
 
   титься в основное меню и отобразить на экране  результирую-
 
   щий файл описаний.
 
        Если файл описаний удовлетворяет пользователя,  то  по
 
 
 
                            - 137 -
 
                         00152-01 92 01
 
 
   команде EXIT его можно создать на диске и завершить  работу
 
   редактора. Для выхода из редактора без создания файла  сле-
 
   дует использовать команду QUIT.
 
        Если в процессе обработки процедуры какому-либо  конк-
 
   ретному атрибуту не было приписано  соответствующее  значе-
 
   ние, то можно использовать команду ADD для того, чтобы  его
 
   добавить. Следует помнить, что, если некоторый  атрибут  не
 
   появится в файле описаний,  то  он  принимает  значение  по
 
   умолчанию. Список значений по умолчанию для каждого атрибу-
 
   та приведен в документе [3]. Для того, чтобы модифицировать
 
   некоторый атрибут, надо использовать команду MODIFY. Анало-
 
   гичным образом, для того, чтобы удалить некоторый  атрибут,
 
   надо использовать команду DELETE.
 
 
 
        3.1.2.3. Установка  характеристик   для   файлов
 
                 описаний
 
 
        Файл описаний, используемый для создания  файлов  дан-
 
   ных, имеет свои собственные конкретные характеристики. Нап-
 
   ример, по умолчанию  все  файлы  описаний  содержат  записи
 
   переменной длины, для управления кареткой используется сим-
 
   вол <CR>. Код защиты  файла  выбирается  в  соответствии  с
 
   умолчаниями системы СУД-32 и умолчаниями процесса.
 
        При необходимости, можно создать файл описаний со зна-
 
   чениями, которые отличаются от значений по  умолчанию.  Для
 
   того, чтобы это сделать, необходимо  сначала  создать  файл
 
   описаний с теми характеристиками, которые необходимо  уста-
 
   новить в требуемых файлах описаний. Затем, используя коман-
 
   ды ASSIGN или DEFINE языка DCL, необходимо назначить  имени
 
   этого файла описаний логическое имя EDF$MAKE_FDL.  Редактор
 
 
 
                            - 138 -
 
                         00152-01 92 01
 
 
   FDL затем может создавать требуемые выходные  файлы  описа-
 
   ний, используя характеристики, указанные в файле  описаний,
 
   который имеет логическое имя EDF$MAKE_FDL.
 
        Указанный  подход  применяется  только  для  изменения
 
   внешних характеристик самого файла описаний и  не  затраги-
 
   вает атрибутов СУД-файла, представленных в этом файле  опи-
 
   саний.
 
        Например, при необходимости установки требуемого  кода
 
   защиты для всех файлов описаний, которые будут  создаваться
 
   впоследствии необходимо выполнить следующие действия:
 
        1) создать файл описаний OUTSPEC.FDL, содержащий толь-
 
   ко такие атрибуты:
 
 
   FILE  PROTECTION (SYSTEM=RWED, OWNER=RWED, GROUP=R)
 
 
        2) присвоить имени данного  файла  логическое  имя  по
 
   команде DCL:
 
 
   ASSIGN OUTSPEC.FDL EDF$MAKE_FDL
 
 
   с этого момента обслуживающая программа  редактор  FDL  для
 
   создания файлов описаний будет брать внешние характеристики
 
   этих файлов из файла описаний EDF$MAKE_FDL.  Это  означает,
 
   что для создаваемых  файлов  описаний  устанавливается  код
 
   защиты (RWED,  RWED,  R),  т.е.  Доступ  RWED  для  системы
 
   (SYSTEM) и для владельца (OWNER), доступ для членов  группы
 
   (GROUP) только по чтению и полностью отвергается доступ для
 
   всех остальных (WORLD) пользователей.
 
 
 
 
 
 
 
 
 
 
                            - 139 -
 
                         00152-01 92 01
 
 
        3.1.3. Использование FDL-подпрограмм
 
 
        Характеристики файла можно  установить  в  момент  его
 
   создания из прикладной программы.
 
        Для этой цели используются четыре FDL-подпрограммы:
 
        1) FDL$CREATE - создание файла по заданной  специфика-
 
   ции языка описания файла и его закрытие (п.3.2.4);
 
        2) FDL$GENERATE - создание файла описания или  отдель-
 
   ных строк этого файла путем анализа содержимого управляющих
 
   блоков СУД-32;
 
        3)  FDL$PARSE  -  выполнение  синтаксического  анализа
 
   (грамматического  разбора)  описания  файла,  распределение
 
   управляющих блоков СУД-32 и заполнение в них  соответствую-
 
   щих полей;
 
        4)  FDL$RELEASE  -  освобождение  виртуальной  памяти,
 
   использованной управляющими блоками СУД-32.
 
        Подпрограммы  FDL$GENERATE,  FDL$PARSE  и  FDL$RELEASE
 
   вызываются во время выполнения прикладной программы.  Прик-
 
   ладные программы составляются на  языках  программирования,
 
   которые допускают обращение к управляющим блокам СУД-32.
 
        В примерах показаны программы на языке паскаль,  кото-
 
   рые вызывают подпрограммы FDL$PARSE и FDL$GENERATE.
 
 
        П р и м е р.
 
 
   [INHERIT('SYS$LIBRARY:STARLET')]
   PROGRAM EXAMPLE2 (INPUT, OUTPUT, ORDER_MASTER);
 
   (* эта  программа  заполняет  свои  собственные  блоки *)
   (* доступа  к  файлу, блоки  доступа к записям и блоки *)
   (* дополнительных  атрибутов, обращаясь к подпрограмме *)
   (* FDL$PARSE. Затем,  на  основании содержимого блоков *)
   (* FAB,   RAB   и   XAB,   подпрограмма   FDL$GENERATE *)
   (* создает   новый   файл   описаний  для   заполнения *)
   (* управляющих  блоков  СУД-32.  FDL$PARSE  использует *)
   (* FDL-файл (TESTING.FDL), подготовленный  заранее.    *)
 
 
 
                            - 140 -
 
                         00152-01 92 01
 
 
   TYPE
   (*+                                                    *)
   (*управляющие флаги интерфейса обращения к             *)
   (*языку описания файла                                 *)
   (*-                                                    *)
 
             $BIT1 = [BIT(1), UNSAFE] BOOLEAN;
             FDL2$TYPE = RECORD CASE INTEGER OF
             1: (FDL_FDLDEF_BITS : [BYTE(1)] RECORD END;
                );
 
             2: (FDL$V_SIGNаL : [POS(0)] $BIT1;
                (*ошибка сигнала; не возвращаться         *)
                 FDL$V_FDL/STRING : [POS(1)]$BIT1;
                (*основная спецификация языка описания    *)
                (*файла является строкой символов         *)
                 FDL$V_DEFAULT_STRING : [POS(2)]$BIT1;
 
                (* спецификацией языка описания файла по  *)
                (* умолчанию является строка символов     *)
                 FDL$V_FULL_OUTPUT : [POS(3)]$BIT1;
                (* задание полной спецификации языка      *)
                (* описания файла                         *)
                )
             END;
 
   MAIL_ORDER = RECORD
                ORDER_NUM : [KEY(0)] INTEGER;
                NAME : PACKED ARRAY[1..20] OF CHAR;
                ADDRESS : PACKED ARRAY[1..20] OF CHAR;
                CITY : PACKED ARRAY[1..19] OF CHAR;
                STATE : PACKED ARRAY[1..2] OF CHAR;
                ZIP_CODE : [KEY(1)] PACKED ARRAY[1..5]
                    OF CHAR;
                ITEM_NUM : [KEY(2)] INTEGER;
                SHIPPING : REAL;
                END;
 
                ORDER_FILE = [UNSAFE] FILE OF MAIL_ORDER;
                PTR_TO_FAB = ^FAB$TYPE
                PTR_TO_RAB = ^RAB$TYPE;
                BYTE = 0..255;
 
             VAR
                ORDER_MASTER : ORDER_FILE;
                FLAGS        : FDL2$TYPE;
                ORDER_REC    : MAIL_ORDER;
                TEMP_FAB     : PTR_TO_FAB;
                TEMP_RAB     : PTR_TO_RAB;
                STATUS       : INTEGER;
 
           FUNCTION FDL$PARSE
            (%STDESCR FDL_FILE : PACKED ARRAY [L..U:INTEGER]
                OF CHAR;
            VAR FAB_PTR : PTR_TO_FAB;
            VAR RAB_PTR : PTR_TO_RAB) : INTEGER; EXTERN;
 
        FUNCTION FDL$GENERATE
          (%REF FLAGS : FDL2$TYPE;
 
 
                            - 141 -
 
                         00152-01 92 01
 
 
          FAB_PTR : PTR_TO_FAB;
          RAB_PTR : PTR_TO_RAB;
         (%STDESCR FDL_FILE_DST : PACKED ARRAY [L..U:INTEGER]
                   OF CHAR) : INTEGER;
 
            EXTERN;
 
        BEGIN
          STATUS := FDL$PARSE ('TESTING',TEMP_FAB,TEMP_RAB);
            FLAGS::BYTE := 0;
            STATUS := FDL$GENERATE (FLAGS,
                                    TEMP_FAB,
                                    TEMP_RAB,
                                    'SYS$OUTPUT:');
       END.
 
        Подробная информация о подпрограммах FDL  приведена  в
 
   документе [3].
 
 
 
        3.2. Создание файла
 
 
        После определения характеристик на этапе  проектирова-
 
   ния файла, последний может  быть  создан  с  использованием
 
   этих характеристик одним из следующих четырех способов:
 
        1) из прикладной программы с использованием  управляю-
 
   щего блока FAB;
 
        2) при помощи обслуживающей программы CREATE/FDL;
 
        3) при помощи обслуживающей программы CONVERT;
 
        4) при помощи подпрограммы FDL$CREATE.
 
 
 
        3.2.1. Создание файла из прикладной программы
 
 
        Создание файла из прикладной программы  осуществляется
 
   в соответствии с теми атрибутами, которые задаются в  блоке
 
   FAB. Если заданы блоки дополнительных атрибутов, то  содер-
 
   жащиеся в них характеристики также применяются к  создавае-
 
   мому файлу.
 
        В блоках  дополнительных  атрибутов  могут  задаваться
 
   характеристики, идентичные тем,  которые  указаны  в  блоке
 
 
                            - 142 -
 
                         00152-01 92 01
 
 
   FAB. В этом  случае  значения  характеристик  в  блоке  FAB
 
   недействительны.
 
        При создании файла из прикладной программы  происходит
 
   его открытие.
 
        Можно также открыть  существующий  файл  СУД-32,  если
 
   только установлен режим CIF (CREATE IF) в  поле  FOP  блока
 
   FAB. В этом случае новый файл не создается.
 
        Процедура создания файла из  прикладной  программы  на
 
   основе содержимого FAB и XAB подробно описана  в  документе
 
   [2].
 
 
 
        3.2.2. Использование  обслуживающей  прогамммы
 
               CREATE/FDL
 
 
        Программа CREATE/FDL позволяет создать файл СУД-32 без
 
   составления прикладной программы. Перед вызовом  CREATE/FDL
 
   необходимо создать файл описаний, содержащий требуемые спе-
 
   цификации языка FDL. Для этой  цели  используется  редактор
 
   FDL.
 
        Программа CREATE/FDL создает пустой файл СУД-32 с  ат-
 
   рибутами, указанными в файле описаний.
 
        Например, для того, чтобы создать пустой файл данных с
 
   именем CUSTRECS.DAT, с атрибутами, указанными в файле  опи-
 
   сания с именем INDEXED.FDL,  необходимо  вызвать  программу
 
   CREATE/FDL по команде DCL:
 
 
   CREATE/FDL=INDEXED.FDL CUSTRECS.DAT.
 
 
 
 
 
 
 
 
 
 
                            - 143 -
 
                         00152-01 92 01
 
 
        3.2.3. Использование  обслуживающей  программы
 
               CONVERT
 
 
        Программа CONVERT создает новый файл данных на  основе
 
   существующего файла данных. При этом атрибуты нового  файла
 
   могут быть изменены в соответствии с описаниями, указанными
 
   в файле описаний. Таким образом программа CONVERT  проводит
 
   по существу изменение атрибутов существующего  файла  путем
 
   его повторного создания, используя для этой цели файл  опи-
 
   саний.
 
        Если  необходимо  изменить  характеристики  некоторого
 
   конкретного файла, то можно задать команду DCL:
 
 
   CONVERT/FDL=файл-описаний вхф выхф
 
 
   где файл-описаний - спецификация файла описаний;
 
       вхф - спецификация входного файла данных;
 
       выхф - спецификация выходного файла данных.
 
        Более подробно программа CONVERT описана  в  документе
 
   [3].
 
 
 
        3.2.4. Использование подпрограммы FDL$CREATE
 
 
        Для создания файла из прикладных программ,  составлен-
 
   ных на языках программирования высокого уровня, для которых
 
   непосредственный доступ к  блокам  FAB  и  XAB  невозможен,
 
   используется подпрограмма FDL$CREATE.  Для  создания  файла
 
   необходим файл описания, содержащий  атрибуты  создаваемого
 
   файла. Файл описаний указывается в прикладной  программе  в
 
   соответствии с соглашениями о вызове FDL$CREATE. FDL$CREATE
 
   создает пустой файл и закрывает его.
 
 
 
 
                            - 144 -
 
                         00152-01 92 01
 
 
        В примерах показаны  вызовы  FDL$CREATE  из  программ,
 
   составленых на языках ФОРТРАН и КОБОЛ.
 
 
        П р и м е р 1.
 
 
             Вызов FDL$CREATE из программы на языке
                           ФОРТРАН
 
   *    эта  программа   вызывает   подпрограмму  FDL$CREATE.
   *    она  создает  выходной  индексный  файл,   называемый
   *    NEW_MASTER.DAT, по спецификациям в файле FDL с именем
   *    INDEXED.FDL.  Можно  также  задать  имя  файла FDL по
   *    умолчанию и имя,  которое  получает  созданный  файл.
   *    данная программа выдает также всю статистику.
 
        IMPLICIT     INTEGER*4      (A-Z)
        EXTERNAL     LIB$GET_LUN,   FDL$CREATE
        CHARACTER    IN_FILE*11     /'INDEXED.FDL'/,
        1            OUT_FILE*14    /'NEW_MASTER.DAT'/,
        1            DEF_FILE*11    /'DEFAULT.FDL'/,
        1            RES_FILE*50
        INTEGER*2    FIDBLK(3)      /0,0,0/
 
        I = 1
        STATUS = FDL$CREATE (IN_FILE,OUT_FILE,
                 DEF_FILE,RES_FILE,FIDBLK,,)
        IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))
   *
        STATUS=LIB$GET_LUN(LOG_UNIT)
        OPEN (UNIT=LOG_UNIT,FILE=RES_FILE,STATUS='OLD')
        CLOSE (UNIT=LOG_UNIT, STATUS='KEEP')
   *
        WRITE (6,1000) (RES_FILE)
        WRITE (6,2000) (FIDBLK (I), I=1,3)
 
   *
   1000 FORMAT (1X,'THE RESULT FILENAME IS: ',A50)
   *
   2000 FORMAT (/1X,'FID-NUM: ',I5/,
        1        1X,'FID-SEQ: ',I5/,
        1        1X,'FID-RVN: ',I5)
   *
        END
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 145 -
 
                         00152-01 92 01
 
 
        П р и м е р 2.
 
 
                 Вызов FDL$CREATE из программы на
                            языке КОБОЛ
 
   *    FDLCR.COB
   *
   *    эта программа вызывает подпрограмму  FDL$CREATE.  Она
   *    создает    выходной    индексный   файл,   называемый
   *    NEW_MASTER.DAT, по спецификациям в файле FDL с именем
   *    INDEXED.DAT.  Можно  также  задать  имя  файла FDL по
   *    умолчанию и  имя,  которое  получает  созданный файл.
   *    данная   программа   выдает   также   всю  статистику
   *    FDL$CREATE.
   *
   *    Имена данных
   *
   *    OUT-REC      Oпределяет выходную запись
   *
   *    STATVALUE    получает значение состояния из обра-
   *                 щения к данной подпрограмме
   *
   *    NORMAL       получает значение из SS$_NORMAL
   *
   *    FIDBLOCK     получает статистику FDL$CREATE:
   *
   *                 (1) идентификатор файла (FID-NUM)
   *                 (2) последовательный номер файла
   *                     (FID-SEQ)
   *                 (3) относительный номер тома (RVN)
   *    RESNAME      получает имя того файла, который соз-
   *                 дается
   *
   IDENTIFICATION DIVISION.
   PROGRAM-ID. FDL-CREATE-EXAMPLE.
 
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   SOURCE-COMPUTER.  СМ 1700.
   OBJECT-COMPUTER.  СМ 1700.
 
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
           SELECT OUT-FILE ASSIGN TO 'NEW_MASTER.DAT'.
 
   DATA DIVISION.
   FILE SECTION.
   FD      OUT-FILE
           DATA RECORD IS OUT-REC.
   01      OUT-REC.
           02      OUT-NUM      PIC X(4).
           02      OUT-MAME     PIC X(20).
           02      OUT-COLOR    PIC X(4).
           02      OUT-WEIGHT   PIC X(4).
           02      SUPLNAME     PIC X(20).
           02      FILLER       PIC X(28).
 
   WORKING-STORAGE SECTION.
 
 
                            - 146 -
 
                         00152-01 92 01
 
 
   01      MORE-DATA-FLAGS      PIC XXX  VALUE 'YES'.
           88      THERE-IS-DATA         VALUE 'YES'.
           88      THERE-IS-NO-DATA      VALUE 'NO'.
 
   01      STATVALUE           PIC S9(9) COMP.
 
   01      FIDBLOCK            USAGE IS COMP.
           02      NUM         PIC S9(9) VALUE 0.
           02      SEQ         PIC S9(9) VALUE 0.
           02      RVN         PIC S9(9) VALUE 0.
 
   01      RESNAME             PIC X(50).
 
   PROCEDURE DIVISION.
 
   MAIN.
           PERFORM CREATE-FILE THRU DISPLAY-STATS.
           STOP RUN.
 
   CREATE-FILE.
           CALL 'FDL$CREATE' USING
                     BY DESCRIPTION 'INDEXED.FDL'
                     BY DESCRIPTOR 'NEW_MASTER.DAT'
                     BY DESCRIPTOR 'DEFAULT.DAT'
                     BY DESCRIPTOR RESNAME
                     BY REFERENCE FIDBLOCK
                     BY VALUE 0
                     BY VALUE 0
                     BY VALUE 0
                     BY VALUE 0
                     BY VALUE 0
               GIVING STATVALUE.
 
           IF STATVALUE IS FAILURE
           CALL 'LIB$STOP' USING BY VALUE STATVALUE.
 
   DISPLAY-STATS.
       DISPLAY 'THE RESULT FILENAME IS: ',RESNAME CONVERSION.
         DISPLAY 'FID NUMBER:           ',NUM CONVERSION.
         DISPLAY 'FID SEQUENCE:         ',SEQ CONVERSION.
         DISPLAY 'VOLUME NUMBER:        ',RVN CONVERSION.
 
 
        3.3. Защита файлов
 
 
        Защита файлов СУД-32 от случайного или  неавторизован-
 
   ного доступа осуществляется одним из следующих способов:
 
        1) кодами идентификации пользователя  (UIC)  и  кодами
 
   защиты;
 
        2) списками управления доступом (ACL).
 
        Файлы на лентах могут быть защищены только при  помощи
 
   кодов идентификации пользователя.
 
 
                            - 147 -
 
                         00152-01 92 01
 
 
        3.3.1. Защита,     основанная     на      коде
 
               идентификации пользователя
 
 
        С каждым файлом связан код идентификации  пользователя
 
   - UIC, определяющий владельца файла и код  защиты,  который
 
   указывает, кому разрешается доступ  к  файлу  и  для  каких
 
   целей.
 
        При открытии файла текущий  UIC  пользователя  сравни-
 
   вается с кодом идентификации пользователя-владельца данного
 
   файла. В зависимости от взаимосвязей этих кодов,  пользова-
 
   тель может быть классифицирован как принадлежащий  к  одной
 
   из следующих категорий:
 
        1) система (SYSTEM);
 
        2) владелец (OWNER);
 
        3) группа (GROUP);
 
        4) все остальные (WORLD).
 
        В зависимости от того, в какую категорию попал пользо-
 
   ватель, ему могут быть разрешены  или  запрещены  следующие
 
   типы доступа:
 
        1) READ - чтение файла;
 
        2) WRITE - запись в файл;
 
        3) EXECUTE - выполнение файла-образа;
 
        4) DELETE - удаление файла на диске.
 
        Категории пользователей и типы доступа к файлу задают-
 
   ся в коде защиты файла при его создании.
 
        После создания файла можно изменить его код защиты при
 
   помощи команды SET PROTECTION языка DCL.
 
 
 
 
 
 
 
 
 
                            - 148 -
 
                         00152-01 92 01
 
 
        3.3.2. Списки управления доступом
 
 
        Списки управления доступом (ACL)  используются  только
 
   для файлов на магнитных дисках.
 
        Список управления доступом  -  это  список  элементов,
 
   каждый из которых предоставляет  доступ  или  отказывает  в
 
   доступе к файлу конкретному пользователю или  группе  поль-
 
   зователей.
 
        Списки управления доступом предоставляют более широкие
 
   возможности по защите файлов, чем коды защиты.
 
        Список управления доступом к файлу создается при помо-
 
   щи редактора ACL. Вызвать этот редактор  можно  при  помощи
 
   двух команд DCL:
 
 
   EDIT/ACL
   SET FILE/ACL
 
 
        3.4. Загрузка файла данными
 
 
        В данном подразделе приводится описание процесса  пер-
 
   вичной загрузки файла данными с использованием  обслуживаю-
 
   щей программы CONVERT.
 
 
 
        3.4.1. Функции обслуживающей программы CONVERT
 
 
        Обслуживающая программа CONVERT позволяет как создать,
 
   так и загрузить данными файл.
 
        Программа CONVERT создает новый выходной файл с  атри-
 
   бутами, заданными в файле описаний на основе  существующего
 
   входного файла. Если этот файл  не  пустой,  т.е.  Содержит
 
   данные, то они переписываются в выходной файл. Таким  обра-
 
   зом, можно создать первичный файл данных, используя средст-
 
   ва, отличные от СУД-32 - например, редактор  EDT,  а  затем
 
 
                            - 149 -
 
                         00152-01 92 01
 
 
   при помощи  программы  CONVERT  преобразовать  его  в  файл
 
   СУД-32 с необходимыми атрибутами.
 
        Чтобы создать  файл,  пользователю  необходим  входной
 
   файл данных и FDL-файл, описывающий выходной файл,  который
 
   необходимо  создать.  Затем  пользователь  задает   команду
 
   CONVERT в следующем виде:
 
 
        CONVERT/CREATE/FDL=FDL-файл вх-файл вых-файл
 
 
   где FDL-файл - спецификация  описания выходного файла на
 
                  языке FDL;
 
       вх-файл  - спецификация входного файла с исходными
 
                  данными;
 
       вых-файл - спецификация выходного  файла,  который
 
                  должен быть создан и  загружен  данными
 
                  из входного файла.
 
        Как и команда CREATE/FDL, эта  команда  создает  файл,
 
   указанный  в  качестве  выходного  (параметр  вых-файл),  с
 
   характеристиками,   заданными   в   файле   FDL   (параметр
 
   FDL-файл). Однако, в отличие от команды CREATE/FDL, команда
 
   CONVERT выполняет загрузку выходного файла данными из вход-
 
   ного файла вх-файл.
 
        Например, чтобы создать файл CUST.IDX на основе  файла
 
   FDL с именем STDINDEX.FDL и скопировать записи из  входного 
 
   файла CUST.SEQ в файл CUST.IDX, необходимо задать следующую
 
   команду:
 
 
        CONVERT/CREATE/FDL=STDINDEX.FDL CUST.SEQ CUST.IDX
 
 
        Записи, загруженные из  файла  CUST.SEQ,  будут  иметь
 
   характеристики (формат, длину и т.д.), специфицированные  в
 
   файле STDINDEX.FDL.
 
 
                            - 150 -
 
                         00152-01 92 01
 
 
        3.4.2. Подпрограммы  обслуживающей   программы
 
               CONVERT
 
 
        Обращение к программе CONVERT возможно также из  прик-
 
   ладной программы при помощи последовательности трех следую-
 
   щих вызовов:
 
        1) CONV$PASS_FILES - задание входного и выходного фай-
 
   лов, и (при необходимости) имени FDL-файла;
 
        2) CONV$PASS_OPTIONS - задание квалификаторов програм-
 
   мы CONVERT. Могут быть заданы любые  квалификаторы  CONVERT
 
   или их значения по умолчанию;
 
        3) CONV$CONVERT - копирование записей из входного фай-
 
   ла в выходной файл. Организация и  формат  выходного  файла
 
   могут не совпадать с организацией и форматом входного  фай-
 
   ла.
 
        Каждый вызов представляет собой обращение к соответст-
 
   вующей подпрограмме CONVERT.
 
        В примерах  показаны  вызовы  подпрограмм  CONVERT  из
 
   программ на языках ФОРТРАН (пример 1) и КОБОЛ (пример 2).
 
 
        П р и м е р 1.
 
 
               Вызов подпрограмм CONVERT из программы
                         на языке ФОРТРАН
 
   *    Эта  программа  обращается  к  подпрограммам CONVERT
   *    с   целью   создания  нового   выходного  индексного
   *    файла,  с  именем   CUSTDATA.DAT,  на  основе  файла
   *    описаний  INDEXED.FDL  и  имеющегося  последователь-
   *    ного  файла  SEQ.DAT. При  этом  выдаются  статиСТИ-
   *    ческие данные  о работе  программы CONVERT.
 
        IMPLICIT INTEGER*4(а-Z)
 
   *    Устанавливается  список параметров: число параметров,
   *    CREATE,  NOSHARE,  FAST_LOAD,  MERGE,  APPEND,  SORT,
   *    WORK_FILES,  KEY=0, NOPAD, PAD CHARACTER, NOTRUNCATE,
   *    NOEXIT,  NOFIXED_CONTROL, FILL_BUCKETS, NOREAD_CHECK,
   *    NOWRITE_CHECK,  FDL и NOEXEPTION.
   *
 
 
                            - 151 -
 
                         00152-01 92 01
 
 
        INTEGER*4 OPTIONS(19)
        1 /18,1,0,1,0,0,1,2,0,0,0,0,0,0,0,0,0,1,0/
 
   *    Устанавливается список статистики как некоторый  мас-
   *    сив с необходимым числом элементов.  Их четыре: число
   *    файлов, число  записей, число  исключенных  записей и
   *    число хороших записей (в указанном порядке).
 
        INTEGER*4 STATSBLK(5) /4,0,0,0,0/
 
   *    Декларация имен файлов
 
        CHARACTER       IN_FILE*7 /'SEQ.DAT'/,
        1               оUT_FILE*12 /'CUSTDATA.DAT'/,
        1               FDL_FILE*11 /'INDEхED.FDL'/
 
   *    Обращение к подпрограммам в требуемом порядке
 
        STATUS = CONV$PASS_FILES (IN_FILE,OUT_FILE,FDL_FILE)
        IF (.NOT. STATUS) CALL LIB$STOP (%VAL (STATUS))
        STATUS = CONV$PASS_OPTIONS (OPTIONS)
        IF (.NOT. STATUS) саLL LIB$STOP (%VAL(STATUS))
        STATUS = CONV$CONVERT (STATSBLK)
        IF (.NOT. STATUS) саLL LIB$STOP (%VAL(STATUS))
 
   *    Отображение статистической информации
 
        WRITE (6,1000) (STATSBLK(I),I=2,5)
   1000 FORMAT (1х,'NUMBER OF FILES PROCESSED: ',I5/,
        1       1х,'NUMBER OF RECORDS: ',I5/,
        1       1х,'NUMBER OF EXCEPTION RECORDS: ',I5/,
        1       1х,'NUMBER OF VALID RECORDS: ',I5)
        END
 
        П р и м е р 2.
 
 
             Вызов подпрограмм программы CONVERT
                из   программы на языке КОБОЛ
 
   *    CONV.COB
   *
   *    Данная программа обращается к подпрограммам программы
   *    CONVERT с целью создания выходного  индексного  файла
   *    с именем   CUSTDATA.DAT  на  основе  файла   описаний
   *    INDEXED.FDL  и существующего  последовательного файла
   *    SEQ.DAT. При этом выдаются  статистические  данные  о
   *    работе программы CONVERT.
   *
   *    Имена данных:
   *
   *    IN-REC      определяет входную запись
   *    OUT-REC     определяет выходную запись
   *    STATVALUE   получает значение состояния из обращения
   *                к данной подпрограмме
   *    NORMAL      получает значение из SS$_NORMAL
   *    OPTIONS     определяет список параметров программы
   *                CONVERT
   *
 
 
                            - 152 -
 
                         00152-01 92 01
 
 
   *    STATSBLK    получает  статистику  программы  CONVERT.
   *                первое  поле  данных (NUM-STATS) содержит
   *                общее число элементов информации, которую
   *                хочет получить пользователь. Их четыре:
   *
   *     (1) число обработанных файлов (NUM-STATUS)
   *     (2) число обработанных записей (NUM-FILES)
   *     (3) число исключенных записей (NUM-REGS)
   *     (4) число верных записей (NUM-VALRECS)
   *
   *
   IDENTIFICATION DIVISION.
   PROGRAM-ID. PARTS.
   *
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   SOURCE-COMPUTER. СМ 1700.
   OBJECT-COMPUTER. СМ 1700.
   INPUT-OUTPUT SECTION.
   FILE CONTROL.
            SELECT IN-FILE ASSIGN TO 'SEQ'.
            SELECT OUT-FILE ASSIGN TO 'CUSTDATA'.
   *
   DATA DIVISION.
   *
   FILE SECTION.
   FD       IN-FILE
            DATA RECORD IS IN-REC.
   01       IN-REC.
            02       IN-NUM        PIC X(4).
            02       IN-NAME       PIC X(20).
            02       IN-COLOR      PIC X(4).
            02       IN-WEIGHT     PIC X(4).
            02       SUPL-NAME     PIC X(20).
            02       FILLER        PIC X(28).
   *
   FD       OUT-FILE
            DATA RECORD IS OUT-REC.
   01       OUT-REC.
            02       OUT-NUM        PIC X(4).
            02       OUT-NAME       PIC X(20).
            02       OUT-COLR       PIC X(4).
            02       OUT-WGHT       PIC X(4).
            02       SUPLNAME       PIC X(20).
   *
   WORKING-STORAGE SECTION.
   *
   01       MORE-DATA-FLAGS         PIC X(3)   VALUE 'YES'.
            88       THERE-IS-DATA             VALUE 'YES'.
            88       THERE-IS-NO-DATA          VALUE 'NO'.
   01       STATVALUE               PIC S9(9)  сOMP.
   *
   01       OPTIONS                 USAGE IS COMP.
            02       NUM-OPTS       PIC S9(9)  VALUE 18.
            02       CREATE         PIC S9(9)  VALUE 1.
            02       NOSHARE        PIC S9(9)  VALUE 0.
            02       FASTLOAD       PIC S9(9)  VALUE 1.
            02       NOMERGE        PIC S9(9)  VALUE 0.
            02       NOPPEND        PIC S9(9)  VALUE 0.
 
 
                            - 153 -
 
                         00152-01 92 01
 
 
            02       XSORT          PIC S9(9)  VALUE 1.
            02       XWORKFILES     PIC S9(9)  VALUE 2.
 
            02       KEY0           PIC S9(9)  VALUE 0.
            02       NOPAD          PIC S9(9)  VALUE 0.
            02       PADCHAR        PIC S9(9)  VALUE 0.
            02       NOTRUNCATE     PIC S9(9)  VALUE 0.
            02       NOEXIT         PIC S9(9)  VALUE 0.
 
            02       NOFIXEDCTRL    PIC S9(9)  VALUE 0.
            02       NOFILLBUCKETS  PIC S9(9)  VALUE 0.
            02       NOREADCHECK    PIC S9(9)  VALUE 0.
            02       NOWRITECHECK   PIC S9(9)  VALUE 0.
            02       FDL            PIC S9(9)  VALUE 1.
            02       NOEXCEPTION    PIC S9(9)  VALUE 0.
   *
   01       STATSBLK                USAGE IS COMP.
            02       NUM-STATS      PIC S9(9)  VALUE 4.
            02       NUM-FILES      PIC S9(9)  VALUE 0.
            02       NUM-RECS       PIC S9(9)  VALUE 0.
            02       NUM-EXCS       PIC S9(9)  VALUE 0.
            02       NUM-VALRECS    PIC S9(9)  VALUE 0.
   *
   PROCEDURE DIVISION.
   MAIN.
    PERFORM CONVERT-FILE THRU DISPLAY-STATS.
 
    OPEN INPUT IN-FILE.
    READ IN-FILE
              AT END MOVE 'NO' то MORE-DATA-FLAGS.
    CLOSE IN-FILE.
    STOP RUN.
   *
   CONVERT FILE.
    CALL 'CONV$PASS_FILES' USING BY DESCRIPTOR 'SEQ.DAT'
                                 BY DESCRIPTOR 'CUSTDATA.DAT'
                                 BY DESCRIPTOR 'INDEXED.FDL'
                           GIVING STATVALUE.
 
   IF STATVALUE IS FAILURE
   CALL 'LIB$STOP' USING BY VALUE STATVALUE.
   CALL 'CONV$PASS_OPTIONS' USING BY CONTENT OPTIONS
                            GIVING STATVALUE.
 
   IF STATVALUE IS FAILURE
   CALL 'LIB$STOP' USING BY VALUE STATVALUE.
   CALL 'CONV$CONVERT' USING BY REFERENCE STATBLK
                       GIVING STATVALUE.
   IF STATVALUE IS FAILURE
   CALL 'LIB$STOP' USING BY VALUE STATVALUE.
 
   DISPLAY 'число обработ.файлов     :',NUM-FILES CONVERSION.
   DISPLAY 'всего записей            :',NUM-RECS  CONVERSION.
   DISPLAY 'число исключенных записей :',NUM-EXCS CONVERSION.
   DISPLAY 'число верных записей  :',NUM-VALRECS  CONVERSION.
 
 
 
 
 
 
                            - 154 -
 
                         00152-01 92 01
 
 
        3.5. Обзор возможностей создания файла
 
 
        В данном подразделе суммируются возможности по  созда-
 
   нию  файла,  которые  доступны  при  использовании  системы
 
   СУД-32. Эти возможности реализуются путем задания необходи-
 
   мых квалификаторов или ключевых слов в  операторе  открытия
 
   файла - OPEN. Они включают такие  аспекты  создания  файла,
 
   как диспозиция файла, распределение файла и  местоположение
 
   в дисковом пространстве.  Кроме  того,  поскольку  операция
 
   открытия файла рассматривается как часть операции по созда-
 
   нию файла, следует учитывать информацию  из  разделA  8  по
 
   поводу режимов открытия файла во время выполнения  програм-
 
   мы, связанных с созданием файла.
 
 
 
        3.5.1. Функции диспозиции файла
 
 
        Функции, приведенные в  табл.8  составляют  диспозицию
 
   файла.
 
                                                    Таблица 8
 
   ----------------------------------------------------------
       Функция       !            Описание
   ----------------------------------------------------------
                     !
   Создать-если      !   Данный файл создается, если в том же
   (CREATE-IF)       ! самом  каталоге не  существует файла с
                     ! тем же самым  именем, или  данный файл
                     ! открывается, если в том же самом ката-
                     ! логе существует  некоторый  файл с тем
                     ! же самым именем.
                     !
                     !   Язык описания  файла: FILE CREATE_IF
                     ! прикладная программа: разряд FAB$V_сIF
                     !            в поле  FAB$L_FOP блока FAB
                     !
   Максимальная      !   Данный файл создается с заданным но-
   версия            ! мером  версии  или  номером версии, на
   (MAXIMIZE         ! единицу  большим, чем у файла с тем же
    VERSION)         ! самым  именем  и  в  том  же самом ка-
                     ! талоге.
                     !
                     !   Язык описания файла:
                     !                  FILE MAXIMIZE_VERSION
 
 
                            - 155 -
 
                         00152-01 92 01
 
 
                                          Продолжение табл. 8
   ----------------------------------------------------------
       Функция       !            Описание
   ----------------------------------------------------------
                     !
                     ! Прикладная программа:разряд  FAB$V_MXV
                     !           в  поле  FAB$L_FOP блока FAB
                     !
   Замена            !   Созданный  файл  заменяет файл с тем
   версии            ! же именем файла, типом файла и номером
   (SUPERSEDE        ! версии в том же самом каталоге.
    VERSION)         !
                     !   Язык описания файла: FILE SUPERSEDE
                     ! прикладная программа: разряд FAB$V_SUP
                     !             в поле FAB$L_FOP блока FAB
                     !
   Временный, поме-  !   Создается временный файл (не имеющий
   ченный для удале- ! элемента в  каталоге),  помеченный для
   ния               ! удаления. Данный файл  удаляется авто-
   (TEMPORARY,       ! матически, когда он закрыватся.
    DELETE)          !
                     !   Язык  описания файла: FILE TEMPORARY
                     ! прикладная программа: разряд FAB$V_TMD
                     !             в поле FAB$L_FOP блока FAB
                     !
   Временный         !   Создается временный файл (не имеющий
   (TEMPORARY)       ! элемента в каталоге), который сохраня-
                     ! ется, когда он закрывается. К  данному
                     ! файлу доступ  впоследствии может  быть
                     ! осуществлен только, если  известен его
                     ! внутренний идентификатор.
                     !
                     !   Язык описания файла: FILE DIRECTORY_
                     !                        ENTRY NO
                     ! Прикладная программа: разряд FAB$V_TMP
                     !             в поле FAB$V_FOB блока FAB
                     !
 
 
        3.5.2. Характеристики файла
 
 
        В табл.9 описываются допустимые характеристики  файла,
 
   задаваемые при его создании.
 
                                                    Таблица 9
 
   ----------------------------------------------------------
    Характеристика   !         Описание
   ----------------------------------------------------------
                     !
   Размер бакета     !   Определяет число блоков, которые бу-
   (BUCKET SIZE)     ! дут  использоваться  в  каждом  бакете
                     ! (единица  вода-вывода системы СУД-32).
                     ! эта  характеристика  файла применяется
                     ! только  для  относительных и индексных
                     ! файлов.
                     !
 
 
                            - 156 -
 
                         00152-01 92 01
 
 
                                          Продолжение табл. 9
   ----------------------------------------------------------
    Характеристика   !         Описание
   ----------------------------------------------------------
                     !
                     !   Язык описания файла:
                     !                       FILE BUCKET_SIZE
                     !   Прикладная программа:
                     !         поле FAB$B_BKS в блоке FAB или
                     !                XAB$B_BKZ в блоках  XAB
                     !
   Размер блока      !   Определяет  число  байтов  в  каждом
   (BLOCK SIZE)      ! блоке.  Эта характеристика применяется
                     ! только  для файлов на магнитной ленте.
                     !
                     !   Язык описания файла:
                     !                     FILE мт_BLоCK_SIZE
                     !   прикладная программа:
                     !             поле FAB$B_BLS в блоке FAB
                     !
   Информация о дате ! Задает значения для времени и даты при
   (DATE INFORMATION)! дублировании, создании или  преобразо-
                     ! вании файла.
                     !
                     !   Язык описания файла: DATE атрибуты и
                     !                          FILE REVISION
                     !   прикладная программа:
                     !         поля блокA  XAB даты и времени
                     !
   Организация файла !   Определяет  организацию файла - по-
   (FILE             ! следовательную или индексную.
    ORGANIZATION)    !
                     !   Язык описания файла:
                     !                      FILE ORGANIZATION
                     !   Прикладная программа:
                     !             поле FAB$B_ORG в блоке FAB
                     !
   Защита файла      !   Определяет  защиту  для создаваемого
   (FILE PROTECTION) ! файла.
                     !
                     !   Язык описания файла:      FILE OWNER
                     !                        FILE PROTECTION
                     !                     FILE MT_PROTECTION
                     !   Прикладная программа:
                     !                 поля  блока XAB защиты
                     !
   Размер постоянной !   Определяет число байтов в постоянной
   управляющей части ! управляющей части для записей перемен-
   (FIXED CONTROL    ! ной  длины  с  постоянной  управляющей
    SIZE)            ! частью.
                     !
                     !   Язык описания файла:
                     !                FILE CONTROL_FIELD_SIZE
                     !   Прикладная программа:
                     !             Поля FAB$B_FSZ в блоке FAB
                     !
   Характеристики    ! Определяет  характеристики  некоторого
   ключа             ! ключа в индексном файле, включая  раз-
   (KEY              ! мер  (размеры)  ключа,  начальную  по-
 
 
                            - 157 -
 
                         00152-01 92 01
 
 
                                          Продолжение табл. 9
   ----------------------------------------------------------
    Характеристика   !         Описание
   ----------------------------------------------------------
                     !
    CHARACTERISTICS) ! Зицию,  тип ключа,  степень заполнения
                     ! бакета и дополнительные характеристики
                     ! ключа.
                     !
                     !   Язык описания файла:    KEY атрибуты
                     !   Прикладная программа:
                     !          поля блока XAB описания ключа
                     !
   Максимальный      !   Определяет максимальный номер  запи-
   номер записи      ! Си  в данном файле. Применяется только
   (MAXIMUM RECORD   ! для относительных файлов.
    NUMBER)          !
                     !   Язык описания файла:
                     !                 FILE MAX_RECORD_NUMBER
                     !   Прикладная программа:
                     !             Поле FAB$L_MRN в блоке FAB
                     !
   Максимальный      !   Определяет максимальный размер запи-
   размер записи     ! си  для  всех  записей  данного файла.
   (MAXIMUM RECORD   ! этот параметр указывает на размер всех
    SIZE)            ! записей в файле с записями  фиксирова-
                     ! нной длины, размер самой большой запи-
                     ! си в файле с записями переменной длины
                     ! или размер  переменной  части  записей
                     ! переменной длины с постоянной управля-
                     ! ющей частью.
                     !
                     !   Значение 0 для  записей   переменной
                     ! длины  означает,  что  размер   записи
                     ! неограничен, за исключением  файлов на
                     ! магнитной ленте, для которых  значение
                     ! 0 устанавливает  некоторый эффективный
                     ! размер  записи, равный  размеру  блока
                     ! минус 4.
                     !   Записи переменной длины  или  записи
                     ! переменной длины с  постоянной   упра-
                     ! вляющей  частью  должны  удовлетворять
                     ! конкретным физическим ограничениям.
                     !
                     !   Язык описания файла:     RECORD SIZE
                     !   Прикладная программа:
                     !             Поле FAB$L_MRS в блоке FAB
                     !
   Атрибуты записи   !   Задают дополнительные характеристики
   (RECORD           ! записи, например, возможность  пересе-
    ATTRIBUTES)      ! чения  границы  блоков (атрибут RECORD
                     ! BLOCK_SPAN языка описания файла), сог-
                     ! лашения по управлению кареткой,  такие
                     ! как:
                     !
                     ! - каждой  записи  предшествует  символ
                     !  перевода строки, а заканчивает запись
                     !  символ возврата каретки;
                     ! - каждая запись может содержать символ
 
 
                            - 158 -
 
                         00152-01 92 01
 
 
                                          Продолжение табл. 9
   ----------------------------------------------------------
    характеристика   !         описание
   ----------------------------------------------------------
    Х                !         Описание          
                     !  Управления кареткой, принятый в языке
                     !  ФОРТРАН;
                     ! - каждая  запись  может быть в формате
                     !  Печати, где имеется 2-х байтовая пос-
                     !  тоянная управляющая часть, содержащая
                     !  ппецификацию управления кареткой.
                     !
                     !   Язык описания файла:
                     !                      RECORD BLOCK_SPAN
                     !            или RECORD CARRIAGE_CONTROL
                     !   Прикладная программа:
                     !             поле FAB$B_RAT в блоке FAB
                     !
   Формат записи     !   Определяет формат записей:  фиксиро-
   (RECORD FORMAT)   ! ванной длины, переменной длины,  пере-
                     ! менной длины с  постоянной управляющей
                     ! частью, потока (записи разделяются не-
                     ! которыми управляющими символами) и не-
                     ! определенный  (только для последовате-
                     ! льных файлов).
                     !
                     !   Язык описания файла :  RECORD FORMAT
                     !   Прикладная программа:
                     !             Поле FSB$B_RMF в блоке FAB
                     !
 
 
        3.5.3. Распределение и позиционирование файлов
 
 
        В блоках FAB  или  XAB  могут  быть  заданы  некоторые
 
   характеристики  распределения  и  позиционирования   файла.
 
   Любое значение, заданное в  блоке  XAB,  перекрывает  любое
 
   соответствующее значение в блоке FAB. В табл.10  приводятся
 
   характеристики распределения и позиционирования файла.
 
                                                   Таблица 10
 
   ----------------------------------------------------------
     Характеристика  !          Описание
   ----------------------------------------------------------
                     !
   Размер файла или  !   Задается число блоков, которое отво-
   области           ! водится  файлу  или  области. Значение
   (ALLOCATION       ! округляется  до   ближайшего  четного,
    QUANTITY         ! кратного  размеру   кластера   данного
                     ! тома.
                     !
                     !   Язык описания файла: FILE ALLOCATION
                     !                    или AREA ALLOCATION
 
 
                            - 159 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 10
   ----------------------------------------------------------
     Характеристика  !          Описание
   ----------------------------------------------------------
                     !
                     !   Прикладная программа:
                     !             поле FSB$L_ALQ в блоке FAB
                     !              или XAB$L_ALQ в блоке XAB
                     !
   Области           !   Для файла  отводится  одна  или  не-
   (AREAS)           ! сколько  областей.  Применяется только
                     ! для индексных файлов. Последовательные
                     ! и  относительные  файлы  всегда содер-
                     ! жатся  в одной  единственной  области.
                     ! индексные файлы  могут быть  размещены
                     ! в  конкретных  областях. Например, для
                     ! того, чтобы  отделить  область  данных
                     ! от области индекса.
                     !
                     !   Язык описания файла:        AREA N
                     !   Прикладная программа:
                     !             Поле XAB$в_аID в блоке XAB
                     !
   Непрерывность     !   Файл  или  область определяются  как
   (CONTIGUOUS)      ! непрерывный.  Если  непрерывность   не
                     ! обеспечивается,  то  возникает ошибка.
                     !
                     !   Язык описания файла: FILE CONTIGUOUS
                     !                    или AREA CONTIGUOUS
                     !   Прикладная программа:
                     !                       разряд FAB$V_CTG
                     !         в поле FAB$V_FOP блока FAB или
                     !                       разряд XAB$V_стG
                     !             в поле XAB$L_аор блока XAB
                     !
   Непрерывность     !   Минимизация числа экстентов, отводи-
   по-возможности    ! мых файлу. Если файл не может быть со-
   (CONTIGUOUS BEST  ! здан как непрерывный, ошибки  тем   не
    TRY)             ! менее не возникает.
                     !
                     !   Язык описания файла:  FILE BEST_TRY_
                     !                         CONTIGUOUS или
                     !               AREA BEST_TRY_CONTIGUOUS
                     !   Прикладная программа:
                     !                       разряд FAB$V_сBT
                     !                   в поле FAB$L_FOP или
                     !                       разряд XAB$V_свт
                     !                       в поле XAB$L_аор
                     !
   Граница цилиндра  !   Указывает, что файл или область дол-
   (CYLINDER         ! жны быть распределены, начиная с неко-
    BOUNDARY)        ! торой доступной границы цилиндра.
                     !
                     !   Язык описания файла:   AREA POSITION
                     !                           ANY_CYLINDER
                     !   Прикладная программа:
                     !                       разряд XAB$V_ONC
                     !             в поле XAB$B_аор блока XAB
                     !
 
 
                            - 160 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 10
   ----------------------------------------------------------
     Характеристика  !          Описание
   ----------------------------------------------------------
                     !
   Положение цилиндра!   Указывает, что  данный  файл или об-
   (CYLINDER         ! ласть должны  начинаться  с  заданного
    POSITION)        ! номера цилиндра.
                     !
                     !   Язык описания файла:   AREA POSITION
                     !                               CYLINDER
                     !   Прикладная программа:
                     !                       разряд XAB$V_CYL
                     !                     в поле XAB$в_ALN и
                     !                         поле XAB$L_LOC
                     !
   Расширение по     !   Определяет минимальное число  блоков
   умолчанию         ! для расширения файла (экстента), когда
   (DEFAULT          ! требуется дополнительное  пространство
    EXTENSION)       ! на диске.
                     !
                     !   Язык описания файла:  FILE EXTENSION
                     !   Прикладная программа:
                     !         поле FAB$W_DEQ в блоке FAB или
                     !                  XAB$W_DEQ в блоке XAB
                     !
   Tочное            !   Указывает, что  СУД-32 должна выдать
   позиционирование  ! соответствующую ошибку, если запрошен-
   (HARD             ! ное позиционирование или  выравнивание
    POSITIONING)     ! файла или области не может быть выпол-
                     ! нено.
                     !
                     !   Язык описания файла:     AREA EXACT_
                     !                            POSITIONING
                     !   Прикладная программа:
                     !                       разряд XAB$V_HRD
                     !             в поле XAB$B_AOP блока XAB
                     !
   Положение         !   Указывает, что данный файл  или  об-
   логического блока ! ласть должны быть расположены, начиная
   (LOGICAL BLOCK    ! с заданного  номера логического блока.
    POSITION)        !
                     !   Язык описания файла:
                     !                  AREA POSITION LOGICAL
                     !   Прикладная программа:
                     !                       разряд XAB$V_LBN
                     !                     в поле XAB$B_ALN и
                     !               поле XAB$L_LOC блока XAB
                     !
   Относительное     !   Указывает, что данный  файл (или об-
   положение файла   ! ласть должны быть расположены как мож-
   (RELATED FILE     ! но ближе к указанному  файлу (или вир-
    POSITION)        ! туальному номеру блока).
                     !
                     !   Язык описания файла:
                     !                  AREA POSITION FILE_ID
                     !           или  AREA POSITION FILE_NAME
                     !   Прикладная программа:
                     !                       разряд XAB$V_RFL
 
 
                            - 161 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 10
   ----------------------------------------------------------
     Характеристика  !          Описание
   ----------------------------------------------------------
                     !
                     !                     в поле XAB$в_ALN и
                     !               поле XAB$L_LOC блока XAB
                     !
   Положение         !   Указывает, что данный  файл  или об-
   виртуального блока! ласть должны быть расположены, начиная
   (VIRTUAL BLOCK    ! с заданного номера виртуального блока.
    POSITION)        !
                     !   Язык описания файла:
                     !                  AREA POSITION VIRTUAL
                     !   Прикладная программа:
                     !                       разряд XAB$V_VBN
                     !                     в поле XAB$B_ALN и
                     !               поле XAB$L_LOC блока FAB
                     !
   Номер тома        !   Указывает номер тома в наборе томов,
   (VOLUME NUMBER)   ! на который должны быть помещены данный
                     ! файл или область.
                     !
                     !   Язык описания файла:
                     !                            AREA VOLUME
                     !   Прикладная программа:
                     !             поле XAB$W_VOL в блоке XAB
                     !
 
 
 
       4. СПЕЦИФИКАЦИИ ФАЙЛОВ И ИХ ИСПОЛЬЗОВАНИЕ В СУД-32
 
 
 
        При создании или открытии существующего файла задается
 
   его спецификация. Обычно спецификация файла задается в опе-
 
   раторе OPEN.
 
        Полная спецификация файла включает 6 атрибутов. Однако
 
   задание всех атрибутов спецификации при обращении  к  файлу
 
   не всегда оправдано. Как правило отдельные  атрибуты  опус-
 
   каются и воспринимаются их значения по умолчанию.
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 162 -
 
                         00152-01 92 01
 
 
        4.1. Понятие спецификации файла
 
 
 
        Формат:
 
 
   узел::устройство:[каталог]имя-файла.тип;версия
 
 
        В табл.11  перечисляются  символы,  которые  разделяют
 
   начало или конец каждого атрибута в спецификации файла.
 
                                                   Таблица 11
 
   ----------------------------------------------------------
     Атрибут       !            Разделитель
   ----------------------------------------------------------
                   !
     Узел          !   Два знака двоеточия (::)
                   !
     Устройство    !   Одно двоеточие (:)
                   !
     Каталог       !   Квадратные  ([])  или   угловые скобки
                   ! (<>). Внутри может быть задан символ то-
                   ! чки (.),  который  разделяет имя каждого
                   ! каталога и подкаталога
                   !
     Имя файла     !   Символ точки (.), разделяет  имя-файла
                   ! и тип файла
                   !
     Тип           !   Точка с запятой (;)
                   !
     Версия        !       -
                   !
 
        П р и м е р ы.
 
 
        DISK1:[MYDIR]FILE.DAT
 
        [MYDIR]FILE.DAT;2
 
        FILE.DAT;10
 
        NODE::DISK5:[REMOTE.ACCESS]FILE.DAT
 
 
        Максимальная длина строки спецификации  файла  состав-
 
   ляет  255  символов,  включая  все  символы-разделители.  В
 
   табл.12 приведены длины отдельных атрибутов в строке специ-
 
   фикации файла.
 
 
 
 
 
                            - 163 -
 
                         00152-01 92 01
 
 
                                                   Таблица 12
 
   ----------------------------------------------------------
      Атрибут      !               Длина
   ----------------------------------------------------------
                   !
      Узел         !   До 59 символов. Физическое имя узла -
                   ! до 6 символов, логическое  имя узла - до
                   ! 15 символов
                   !
      Устройство   !   До 15 символов  для физического  имени
                   ! устройства, до 255 символов для логичес-
                   ! ского имени устройства
                   !
      Каталог      !   До 39 символов в каждом имени каталога
                   ! и подкаталога
                   !
      Имя файла    !   До 39 символов
                   !
      Тип          !   До 39 символов
                   !
      Версия       !   До 5 цифр, перед которыми дополнитель-
                   ! но может присутствовать знак дефис (-)
                   !
 
 
        4.1.1. Форматы спецификации файла
 
 
        Для того, чтобы обнаружить некоторый файл  на  том  же
 
   самом узле пользователь не должен задавать имя узла в  спе-
 
   цификации файла. Имя в  компоненте  устройства  может  быть
 
   именем  некоторого  физического  устройства  или  некоторым
 
   логическим именем. Как для имени  устройства,  пользователь
 
   может закончить некоторое логическое имя символом двоеточие
 
   и поместить после него один или более компонентов  специфи-
 
   кации файла (имя каталога, имя файла, тип файла и версия).
 
        Для того,  чтобы  использовать  некоторое  устройство,
 
   ориентированное на запись, такое как терминал, должно  быть
 
   задано только имя устройства. Компоненты, составляющие  имя
 
   каталога, имя файла и  версию,  не  являются  необходимыми.
 
   Если, однако, заданы какие-либо из  этих  компонентов,  они
 
   должны быть заданы правильно.
 
        Имя логического  устройства  в  компоненте  устройства
 
 
 
                            - 164 -
 
                         00152-01 92 01
 
 
   может быть оттранслировано в другое логическое имя,  в  имя
 
   некоторого физического  устройства  или  в  имя  некоторого
 
   физического устройства с дополнительными компонентами  спе-
 
   цификации файла. Это логическое имя  может  быть  некоторым
 
   списком поиска,  который  задает  несколько  местоположений
 
   файла, где может быть найден файл (п.4.2.2).
 
        Логическое имя может также присутствовать  в  качестве
 
   компонента имени файла, если  это  единственный  компонент,
 
   заданный в данной спецификации файла (документ [5]).
 
        Для того, чтобы обнаружить файл в некотором  удаленном
 
   узле, надо чтобы имя данного удаленного узла присутствовало
 
   или как имя физического узла или как  некоторое  логическое
 
   имя,  трансляция  которого  содержит  имя  соответствующего
 
   узла. Логическое имя узла может также содержать управляющую
 
   информацию доступа, используемую при входе в данную удален-
 
   ную систему. Форматы для обнаружения локального  и  удален-
 
   ного файла показаны ниже.
 
 
 
        4.1.1.1. Локальный узел
 
 
        Если имя узла не задано, то данный файл  располагается
 
   в локальном узле.
 
 
        Устройство:[имя-каталога]имя-файла.тип; версия
 
 
        Это общий формат спецификации  файла  для  обнаружения
 
   некоторого файла в локальном узле.  Все  компоненты  данной
 
   спецификации файла, возможно, должны присутствовать, когда,
 
   например, данный файл создается или когда компоненты специ-
 
   фикации файла (такие как  компонент  устройства)  не  могут
 
   быть обеспечены значениями по умолчанию.
 
 
 
                            - 165 -
 
                         00152-01 92 01
 
 
        Устройство: [имя-каталога]"строка-в-коде-кои-8".; NN
 
 
        Это формат используется  только  для  томов  магнитной
 
   ленты со стандартными меками (формат ANSI).
 
 
 
        4.1.1.2. Удаленный узел
 
 
        Если имя узла задано, то файл располагается на  задан-
 
   ном удаленном узле.
 
 
        Узел::специф-файла
 
        Узел"строка-управления-доступом"::спецф-файла
 
 
        Эти два формата используются для того,  чтобы  обнару-
 
   жить файл на удаленных узлах. Если задана некоторая  строка
 
   управления доступом или если для этого процесса  на  другом
 
   удаленном узле существует доверенный учетный номер, то  для
 
   обнаружения данного файла используется  удаленный  процесс,
 
   заданный при помощи строки управления доступом,  или  дове-
 
   ренный учетный номер с использованием соответствующих  прав
 
   доступа. Если строка управления не  задана  или  на  данной
 
   удаленной системе не существует доверенного учетного  номе-
 
   ра, то для обнаружения данного файла  используется  учетный
 
   номер по умолчанию системы программного обеспечения распре-
 
   деленных сетей для СМ 1700 (СПО ТРАЛ).
 
 
        Узел::"чужая-специф-файла"
 
 
        Этот формат используется  для  обнаружения  файлов  на
 
   удаленных узлах. Система СУД-32 не  проверяет  спецификацию
 
   файла в этом формате, кроме трансляции какого-либо логичес-
 
   кого имени узла, если таковое существует. Этот формат  осо-
 
   бенно полезен, когда система не является ЭВМ СМ 1700 с опе-
 
 
                            - 166 -
 
                         00152-01 92 01
 
 
   рационной системой МОС ВП и спецификация файла не  удовлет-
 
   воряет соглашениям о синтаксисе спецификации файла МОС ВП.
 
 
        Узел::"строка-спецификации-задачи"
 
 
        Этот формат явно не задает какой-либо файл,  наоборот,
 
   он задает некоторую задачу на данной удаленной системе.
 
        Для получения дополнительной конкретной  информации  о
 
   задании логического имени или использования форматов  файла
 
   и соответствующих синтаксических правилах следует обратить-
 
   ся к документу [5].
 
        Поля имени файла и типа могут содержать до  39  симво-
 
   лов, включая буквы, цифры, знак подчеркивания и  знак  "$".
 
   Поскольку каталог сам является некоторым файлом,  он  также
 
   может иметь некоторое  имя  файла  до  39  символов  уровня
 
   каталога/подкаталога.
 
 
 
        4.1.2. Использование значений по умолчанию для
 
               спецификации файла
 
 
        Когда спецификация содержит не все компоненты (за иск-
 
   лючением имени узла), система СУД-32 пытается  предоставить
 
   значения для пропущенных компонентов, используя значения по
 
   умолчанию. Спецификация файла, к которой сперва применяются
 
   значения по умолчанию, называется  первичной  спецификацией
 
   файла. Значения по умолчанию могут быть заданы в  программе
 
   пользователя и предоставляться процессом, который выполняет
 
   данную программу. Значениями по  умолчанию,  которые  может
 
   задать программа пользователя, являются спецификация  файла
 
   по умолчанию и спецификация связанного файла.  Если  компо-
 
   ненты устройства и каталога опущены после  того,  как  были
 
 
 
                            - 167 -
 
                         00152-01 92 01
 
 
   применены все значения по умолчанию, заданные программой, к
 
   этим компонентам применяются значения по умолчанию  процес-
 
   са.
 
        Система СУД-32 выполняет трансляцию любого  имеющегося
 
   логического имени прежде, чем она использует некоторую спе-
 
   цификацию  файла  для  применения  значений  по  умолчанию.
 
   Используя оттранслированную первичную  спецификацию  файла,
 
   система СУД-32 сперва применяет спецификацию файла по умол-
 
   чанию, затем  спецификацию  связанного  файла  и,  наконец,
 
   используется устройство  и  каталог  данного  процесса  для
 
   того, чтобы создать полностью укомплектованную спецификацию
 
   файла. Система СУД-32  затем  использует  данную  полностью
 
   укомплектованную спецификацию файла для  обнаружения  этого
 
   файла. Если присутствует блок  имени  и  заданы  конкретные
 
   поля блока имени, то результирующая спецификация файла дос-
 
   тупна программе после того,  как  будут  вызваны  некоторые
 
   сервисные возможности системы СУД-32 (для получения  допол-
 
   нительной информации о  применении  значений  по  умолчанию
 
   следует обратиться к подразделу 5.1.).
 
        Система СУД-32 применяет значения по умолчанию процес-
 
   са к компонентам устройства и каталога, когда в  специфика-
 
   ции файла эти компоненты  не  заданы,  например,  FILE.DAT.
 
   Таким образом, для того, чтобы получить доступ к некоторому
 
   файлу на другом устройстве и (или) в каталоге, в специфика-
 
   ции файла должно присутствовать  необходимое  устройство  и
 
   (или) каталог,  например,  DISK1:[MYDIR]FILE.DAT.  Первона-
 
   чально, когда происходит  вход  в  систему,  местоположение
 
   устройства каталога устанавливается равным  значению  логи-
 
   ческого имени SYS$LOGIN, определенного в  системе.  Система
 
   СУД-32 получает текущее устройство  при  помощи  трансляции
 
 
                            - 168 -
 
                         00152-01 92 01
 
 
   логического имени  SYS$DISK.  Система  СУД-32  поддерживает
 
   текущий каталог в контексте программы пользователя.
 
        Аналогично устройству и каталогу  пользователь  должен
 
   задать некоторое имя узла, когда  ему  необходимо  получить
 
   доступ к некоторому удаленному файлу, используя СПО ТРАЛ.
 
 
 
        4.2. Логические   имена   и   синтаксический
 
             анализ
 
 
        Пользователь может использовать в  спецификации  файла
 
   логические имена. Система  СУД-32  транслирует  любое  при-
 
   сутствующее в спецификации файла логическое  имя  в  момент
 
   исполнения программы. Использование логических  имен  может
 
   быть желательным по нескольким причинам, включающим упроще-
 
   ние программы, независимость от устройств, независимость от
 
   файлов и простота использования.
 
        Для того, чтобы получить спецификацию файла, пользова-
 
   тель может задать ее  во  время  компиляции  программы  или
 
   сформировать в программе обращение  к  пользователю  терми-
 
   нала  для получения  спецификации  в  момент  использования
 
   программы. Задавая  логическое  имя  во  время  компиляции,
 
   пользователь может исключить запрос на ввод с терминала  из
 
   программы, сохраняя при этом гибкость задания  спецификации
 
   файла, который будет определен  непосредственно  к  моменту
 
   исполнения программы.
 
        Если  для  компонента  имени  устройства  используется
 
   логическое имя, то некоторое альтернативное устройство (на-
 
   пример, содержащее недавнюю копию диска) может быть подста-
 
   влено просто при помощи изменения определения данного логи-
 
   ческого имени. Это  может  уменьшить  или  исключить  время
 
 
 
                            - 169 -
 
                         00152-01 92 01
 
 
   простоя, вызванное сбоем носителя или запланированным  тех-
 
   ническим обслуживанием (независимость от устройств).
 
        Аналогичным образом,  если  текущая  копия  некоторого
 
   файла не доступна, может быть использован некоторый альтер-
 
   нативный файл. Для того, чтобы искать  несколько  файлов  в
 
   некотором определенном порядке поиска,  пользователь  может
 
   использовать список поиска. Для обнаружения нескольких фай-
 
   лов могут также использоваться символы обобщения, используя
 
   одну спецификацию файла, но это не  позволяет  пользователю
 
   задать определенный порядок поиска.
 
        Использование  логического  имени  для   представления
 
   длинной спецификации файла или компонента спецификации фай-
 
   ла уменьшает  количество  нажатий  клавиш,  которые  должен
 
   выполнить пользователь,  что  экономит  время  и  уменьшает
 
   вероятность ошибки. Например, пользователь мог  бы  опреде-
 
   лить некоторое логическое имя узла, которое транслируется в
 
   некоторое реальное имя узла и  строку  управления  доступом
 
   для использования при обнаружении удаленных файлов (в  этом
 
   конкретном случае логическое  имя  должно  быть  определено
 
   интерактивно, а не  в  некоторой  командной  процедуре  для
 
   того, чтобы держать пароль в секрете).
 
 
 
        4.2.1. Пример использования логических имен
 
 
        Вне зависимости от используемого языка  программирова-
 
   ния, можно использовать логическое имя для задания  одного,
 
   нескольких или всех атрибутов спецификации файла. Ниже при-
 
   веден пример доступа к удаленному файлу, который отличается
 
   от доступа к локальному файлу за счет задания имени узла  в
 
   спецификации файла. Перед обращением к файлу  следует  сде-
 
 
 
                            - 170 -
 
                         00152-01 92 01
 
 
   лать соответствующее назначение логического  имени.  Напри-
 
   мер:
 
 
        $ DEFINE SCR KIEV::USER:[PETROV]INVENTORY.DAT
 
        $ DEFINE DST LVOV::LPA0:
 
        $ RUN TRANSFER
 
 
        Данная последовательность  команд  вызывает  программу
 
   TRANSFER, составленную на языке ФОРТРАН,  которая  передает
 
   удаленный файл из узла KIEV на  устройство  печати  в  узле
 
   LVOV, используя логические имена SRC и DST, которые  назна-
 
   чаются соответствующими спецификациями для данного процесса
 
   до того, как будет работать эта программа  (команда  DEFINE
 
   языка DCL). Текст программы на  языке  ФОРТРАН  приведен  в
 
   примере данного пункта.
 
        В примере  стандартные  вызовы  операций  ввода-вывода
 
   передают записи файла с одного устройства на  другое.  Сле-
 
   дует отметить, что используется стандарт спецификации файла
 
   МОС ВП с именем удаленного узла. Стандартные вызовы получе-
 
   ния и занесения записей  копируют  данные  последовательно,
 
   запись за записью. После открытия файлов и копирования всех
 
   записей программа закрывает каналы,  тем  самым  заканчивая
 
   работу с сетью. Эти операции характерны для программ, напи-
 
   санных на всех языках программирования МОС ВП.
 
 
        П р и м е р.
 
 
           PROGRAMM TRANSFER
 
   C
   C       Эта   программа  создает    последовательный  файл
   C       с записями переменной длины по некоторому вводному
   C       последовательному файлу. Вводной и выводной  файлы
   C       идентифицируются   логическими   именами SRC и DST
   с       соответственно
   C
 
 
                            - 171 -
 
                         00152-01 92 01
 
 
           CHARACTER BUFFER*132
   C
   100     FORMAT (Q,A)
   200     FORMAT (A)
   C
   C       Открытие вводного и выводного файлов
   C
           OPEN (UNIT=1,NAME='SRC',TYPE='OLD',ACCESS=
         1      'SEQUENTIAL',FORMATTED')
           OPEN (UNIT=2,NAME='DST',TYPE='NEW',ACCESS=
         1      'SEQUENTIAL',FORM='FORMATTED',
         2      CARRIAGECONTROL='LIST',RECORDTYPE='VARIABLE')
   C
   C       Передача записей до тех пор, пока не будет обнару-
   C       жен конец файла или не возникнет ошибка.
   C
   10      READ (1,100,END=20,ERR=20) NCHAR,BUFFER(:NCHAR)
           WRITE (2,200) BUFFER(:NCHAR)
           GOTO 10
   C
   C       Закрытие вводного и выводного файлов
   C
   20      CLOSE (UNIT=2)
           CLOSE (UNIT=1)
           END
 
 
        4.2.2. Типы логических имен
 
 
        Когда определяется некоторое логическое имя, пользова-
 
   тель может задать  некоторые  его  атрибуты.  По  умолчанию
 
   логическое имя является не скрытым и не терминальным. Логи-
 
   ческое имя, назначенное спецификации файла  или  ее  части,
 
   может быть скрытым и терминальным, если использован  квали-
 
   фикатор /TRANSLATOR_ATRIBUTES для команд DEFINE или  ASSIGN
 
   языка DCL.
 
        Если логическое имя определено  как  скрытое,  то  при
 
   выполнении команд DCL, для которых в  спецификациях  файлов
 
   задаются такие имена, отображение эквивалентных этим именам
 
   строк не производится, т.е. в спецификациях фигурируют сами
 
   скрытые имена.
 
        Если логическое имя определено  как  терминальное,  то
 
   трансляция эквивалентного ему имени  не  выполняется,  т.е.
 
   соответствующая ему эквивалентная строка должна быть  физи-
 
 
                            - 172 -
 
                         00152-01 92 01
 
 
   ческим именем устройства.
 
        Типичное использование списка поиска состоит в провер-
 
   ке нескольких возможных  мест  расположения  файла.  СУД-32
 
   пытается обнаружить данный файл до тех пор,  пока  файл  не
 
   будет найден или не исчерпается список поиска. Как и другие
 
   логические  имена,  список  поиска  обычно  определяется  с
 
   использованием команд ASSIGN или DEFINE, причем в  логичес-
 
   ком имени списка поиска спецификации  файла  (эквивалентные
 
   имена) должны быть разделены запятыми.
 
        Любое из эквивалентных имен в списке поиска может быть
 
   задано отдельно как терминальное или скрытое.
 
        Использование списков поиска и символов обобщения  при
 
   обработке нескольких файлов  и  выполнении  синтаксического
 
   анализа, описано в подразделе 5.2.
 
        Более подробно использование логических имен приведено
 
   в документе [5].
 
 
 
        4.2.3. Синтаксический   анализ    спецификации
 
               файла
 
 
        Установка в качестве значений по умолчанию не  ограни-
 
   чивается заданием имени устройства и каталога.  В  качестве
 
   значения по умолчанию может быть задана любая часть  специ-
 
   фикации файла, в которой может также  присутствовать  логи-
 
   ческое имя.
 
        Генерация полной спецификации для обеспечения  доступа
 
   к требуемому  файлу  является  результатом  синтаксического
 
   анализа значений по умолчанию и заданной  части  специфика-
 
   ции. СУД-32 об'единяет различные строки значений по умолча-
 
   нию (после трансляции логических имен), чтобы  сформировать
 
 
 
                            - 173 -
 
                         00152-01 92 01
 
 
   полную спецификацию файла.
 
        Одна из функций синтаксического анализа состоит в том,
 
   чтобы проверить, присутствуют ли какие-либо логические име-
 
   на, и определить, описывает ли  данная  спецификация  файла
 
   некоторый файл в данном локальном узле. Если в спецификации
 
   файла не задано имя узла (файл расположен в данной  локаль-
 
   ной системе), то СУД-32 сначала транслирует логические име-
 
   на, применяет значения по умолчанию к любым опущенным атри-
 
   бутам спецификации и затем  пытается  обнаружить  требуемый
 
   файл.
 
        Если задано имя узла, то СУД-32 не обрабатывает специ-
 
   фикацию файла на  данном  локальном  узле.  В  спецификацию
 
   подставляются значения по умолчанию, заданные в  программе,
 
   после чего она передается программе  удаленного  доступа  к
 
   файлам (FAL). Дальнейшая трансляция спецификации проводится
 
   на данном удаленном узле.
 
        Если в спецификации файла встречается символ обобщения
 
   или список поиска, прикладной программе, возможно,  понадо-
 
   бится предварительно обработать данную спецификацию  файла,
 
   прежде чем попытаться обнаружить требуемый файл.
 
        Стандартные возможности СУД-32 при выполнении операций
 
   создания или открытия файла позволяют  выполнять  следующие
 
   функции синтаксического анализа файла:
 
        1) проверка спецификации файла на достоверность;
 
        2) трансляция любых присутствующих логических имен;
 
        3) применение значений по умолчанию;
 
        4) попытка обнаружить файл.
 
        При проведении  синтаксического  анализа  спецификации
 
   может быть обеспечена:
 
 
 
 
                            - 174 -
 
                         00152-01 92 01
 
 
        1) передача в прикладную программу полной спецификации
 
   файла, используемой для получения доступа к данному  файлу,
 
   и соответствующего идентификатора файла;
 
        2) передача длины каждого  компонента  в  спецификации
 
   файла, а также другой информации о данной спецификации фай-
 
   ла.
 
        Некоторые операции СУД-32, например, открытие и созда-
 
   ние файла не могут обрабатывать спецификацию файла, которая
 
   содержит символы обобщения. Перед выполнением таких  опера-
 
   ций должна быть выполнена специальная операция  синтаксиче-
 
   кого анализа, которая может  быть  использована  для  того,
 
   чтобы определить, заданы ли символы  обобщения  или  списки
 
   поиска. Эта операция инициализирует поля  управляющих  бло-
 
   ков,  которые  необходимы  для  поиска  нескольких  файлов,
 
   используя специальную операцию поиска. Для проведения поис-
 
   ка файла, необходимо при  вызове  операции  синтаксического
 
   анализа задать блок имени файла.
 
        Отдельная операция сканирования строки позволяет  про-
 
   верить корректность задания спецификации файла  и  получить
 
   длины ее отдельных атрибутов, не транслируя логические име-
 
   на и не применяя значения по умолчанию.
 
        Для вызова операций синтаксического анализа и сканиро-
 
   вания строки в исполнительной библиотеке МОС ВП  предусмот-
 
   рены две программы - LIB$FIND_FILE и LIB$FILE_SCAN.
 
        Подробно синтаксический анализ спецификации файла при-
 
   веден в подразделе 5.2. В подразделе 5.3 описано  использо-
 
   вание спецификаций каталога, включая  и  соглашения  о  его
 
   синтаксисе.
 
 
 
 
 
 
                            - 175 -
 
                         00152-01 92 01
 
 
        4.3. Использование одной спецификации  файла
 
             для поиска нескольких файлов
 
 
        Создание корректной и полной спецификации файла  обес-
 
   печивается следующими операциями СУД-32: CREATE (создание),
 
   OPEN (открытие),  ERASE  (очистка),  PARSE  (синтаксический
 
   анализ) и RENAME (переименование). Одна  из  этих  операций
 
   должна предшествовать  выполнению  любой  другой  операции,
 
   связанной с обработкой файла.
 
        Если спецификация файла содержит один или более симво-
 
   лов Oбобщения, то эта спецификация  должна  быть  предвари-
 
   тельно обработана операциями PARSE (синтаксический  анализ)
 
   и SEARCH (поиск).
 
        Операция PARSE устанавливает некоторые значения разря-
 
   дов в блоке имени файла NAM, в поле называемым полем разря-
 
   дов состояния имени файла (NAM$L_FNB), которое  может  быть
 
   протестировано для того, чтобы определить, задано ли  логи-
 
   ческое имя символом обобщения или списком поиска.
 
        Операция SEARCH обнаруживает файл  и  выдает  его  имя
 
   (без символов обобщения). Если  заданы  символы  обобщения,
 
   то, прежде чем обрабатывать (открывать или создавать)  дан-
 
   ный файл, необходимо вызвать операцию SEARCH. Если  символы
 
   обобщения не заданы, то данный файл  может  быть  обработан
 
   без вызова операции SEARCH.
 
        Для того, чтобы обработать один файл, необходимо  выз-
 
   вать операцию SEARCH только один раз. Для того, чтобы обра-
 
   ботать несколько файлов, следует  вызвать  операцию  SEARCH
 
   столько раз, сколько  необходимо  для  получения  полностью
 
   сформированной спецификации файла. Если файлов,  удовлетво-
 
   ряющих данной спецификации файла больше  нет,  то  операция
 
 
 
                            - 176 -
 
                         00152-01 92 01
 
 
   SEARCH  сообщает  о  том,  что  файлов  больше  не  найдено
 
   (RMS$_NMF).
 
        Таким образом операции PARSE и  SEARCH  работают  сов-
 
   местно для того, чтобы создать некоторую полностью  сформи-
 
   рованную  спецификацию  файла,  которую   операция   SEARCH
 
   использует для того, чтобы обнаружить данный файл.
 
        Если  спецификация  файла  содержит  некоторый  список
 
   поиска, но не содержит  символов  обобщения,  то  программа
 
   может обработать один файл, не  используя  операцию  SEARCH
 
   (если данный список поиска не содержит символов обобщения).
 
   Если какая-либо  из  спецификаций  файла  в  списке  поиска
 
   содержит символы обобщения, то должна быть выполнена опера-
 
   ция SEARCH для того, чтобы предотвратить  ошибку  состояния
 
   завершения по неверному символу обобщения, даже если  будет
 
   обрабатываться только один файл. Таким образом, если  будет
 
   задан символ обобщения или список поиска,  то,  прежде  чем
 
   обрабатывать данный файл, надо выполнить  операцию  SEARCH.
 
   Если символ обобщения задан во второй или последующей  спе-
 
   цификациях файлов в списке поиска, то СУД-32 не  устанавли-
 
   вает разряд символа обобщения  в  поле  разрядов  состояния
 
   имени файла.
 
        Если операции PARSE и SEARCH будут предшествовать опе-
 
   рации открытия файла, то операция "открытие по блоку имени"
 
   должна быть выполнена при  помощи  задания  адреса  данного
 
   блока в поле адреса блока имени файла (FAB$L_NAM)  и  уста-
 
   новки разряда режима "открытие по блоку имени"  (FAB$V_NAM)
 
   в поле обработки файла (FAB$L_FOP).
 
        Символы обобщения не могут присутствовать в специфика-
 
   ции файла, когда вызывается операция CREATE.  Имеются  слу-
 
   чаи, когда операции PARSE и SEARCH могли бы  предшествовать
 
 
                            - 177 -
 
                         00152-01 92 01
 
 
   операции   CREATE.   Если   установлены   разряды   режимов
 
   "создать-если" (FAB$V_CIF) и "заменить" (FAB$V_SUP) в  поле
 
   обработки файла  (FAB$L_FOP),  то  рекомендуется  выполнить
 
   операцию PARSE для того, чтобы проверить  наличие  символов
 
   обобщения (или списков поиска) в данной спецификации файла.
 
   Если найден список поиска или символы обобщения,  то  прог-
 
   рамма должна выполнить операцию SEARCH прежде чем выполнять
 
   операцию CREATE. При режиме "создать-если" делается попытка
 
   открыть некоторый файл, если он может быть найден  в  любом
 
   элементе списка поиска. Если такой файл не  найден,  то  он
 
   создается с использованием  первой  спецификации  файла  из
 
   данного списка. Если эти режимы заданы и присутствует неко-
 
   торый символ обобщения, когда вызывается  операция  CREATE,
 
   то данная спецификация  файла  неверна.  Если  присутствует
 
   некоторый список поиска, то данный файл создается с исполь-
 
   зованием первой спецификации файла из данного списка  поис-
 
   ка.
 
        Перечисленные операции можно  вызвать  непосредственно
 
   из программы на языке макро, путем задания  соответствующей
 
   макрокоманды, из программы на языке программирования  высо-
 
   кого  уровня   (как   часть   подпрограммы   USEROPEN   или
 
   USER_ACTION), либо путем  их  вызова  через  CALL-интерфейс
 
   СУД-32. Операции PARSE и SEARCH требуют, чтобы  присутство-
 
   вал некоторый блок имени.  Если  язык  программирования  не
 
   обеспечивает средства установки значений в блоке  имени  (и
 
   других управляющих блоках) и вызова операций  СУД-32,  сле-
 
   дует использовать некоторую процедуру составленную на языке
 
   макро. Язык описания файлов не  обеспечивает  использование
 
   блока имени.
 
 
 
 
                            - 178 -
 
                         00152-01 92 01
 
 
        В дополнение к блоку имени обычно  необходимо  указать
 
   блок доступа к файлу (FAB) и блок доступа к записям  (RAB).
 
   Для выполнения операций по  обработке  файлов  должен  при-
 
   сутствовать блок доступа к файлу (FAB), и, если необходимо,
 
   блоки дополнительных атрибутов (XAB). Для выполнения опера-
 
   ций по обработке записей должен присутствовать блок доступа
 
   к записям (RAB).
 
        В программе из примера  данного  подраздела  показано,
 
   как использовать подпрограмму LIB$FIND_FILE для того, чтобы
 
   обнаружить файл, спецификация которого вводится с  термина-
 
   ла. Поскольку LIB$FIND_FILE используется с заданными  аргу-
 
   ментами, то данная  спецификация  может  содержать  символы
 
   обобщения, список поиска, а также некоторый список  поиска,
 
   который предполагает, что данная программа будет  позволять
 
   использовать значения по умолчанию, как при  синтаксическом
 
   анализе командной строки DCL. Данная  подпрограмма,  напри-
 
   мер, может быть вызвана путем указания USEROPEN в операторе
 
   OPEN для программы на языке БЕЙСИК:
 
 
   100 MAP (REC.1) SURNAME$ = 20%, REST$ = 60%
   110 OPEN " " FOR OUTPUT AS FILE #1%, ORGANIZATION
           RELATIVE, & MAP  REC.1, USEROPEN LOCATE
   120 CLOSE #1%
   130 END
 
        Программа на  языке  БЕЙСИК  распределяет  управляющие
 
   блоки до того, как  управление  передается  в  подпрограмму
        
   USEROPEN. Программа на языке БЕЙСИК  передает  также  адрес
 
   блока доступа к файлу (FAB) в качестве первого аргумента, а
 
   адрес блока доступа к  записям  (RAB)  в  качестве  второго
 
   аргумента. Эти аргументы обеспечивают возможность доступа к
 
   указанным блокам из программы  на  языке  макро,  поскольку
 
   указатель аргументов указывает на  длинное  слово  счетчика
 
 
 
                            - 179 -
 
                         00152-01 92 01
 
 
   аргументов, за которым следуют аргументы размером в длинное
 
   слово. Здесь следует учитывать, что, поскольку макрокоманды
 
   $FAB и $NAM, используемые для задания  блока  FAB  и  блока
 
   имени в данном случае не используются, то доступ к  отдель-
 
   ным полям блоков  с  помощью  символических  имен  смещений
 
   недопустим. Поэтому  необходимо  использовать  макрокоманды
 
   $FABDEF, $NAMDEF (и $RABDEF), чтобы определить эти  символы
 
   в подпрограмме USEROPEN. Помимо поиска файла в соответствии
 
   с заданной спецификацией, вызываемая подпрограмма связывает
 
   с данным файлом  необходимые  15  глобальных  буферов  (или
 
   столько буферов, сколько возможно). Подпрограмма  на  языке
 
   МАКРО компонуется с программой на языке  БЕЙСИК  для  того,
 
   чтобы сформировать выполняемый образ. В примере 1 приведена
 
   подпрограмма на языке макро, соответствующая  вышеприведен-
 
   ной подпрограмме на языке БЕЙСИК (подпрограмма  USEROPEN  с
 
   именем LOCATE).
 
 
        П р и м е р 1.
 
 
                    Подпрограмма на языке макро
 
           .TITLE LOCATE
           .PSECT DATA,WRT,NOEXE
           .EXTERNAL LIB$SIGNAL,LIB$STOP,LIB$GET_INPUT
           .EXTERNAL LIB$PUT_OUTPUT,STR$GET1_DX
 
           $FABDEF         ;определить символические сме-
                           ;щения в блоке доступа к файлу
           $RABDEF         ;определить символические сме-
                           ;щения в блоке доступа к записи
   ;
   IFILE:  .BLKB 80        ;спецификация вводного файла
   IFILED  .LONG 80        ;дескриптор спецификации файла
           .LONG IFILE
   ;
   OFILED: .WORD 255       ;дескриптор спецификации файла
           .BYTE 14        ;задание символьного текста
           .BYTE 2         ;задание класса дескриптора
   OFILE:  .LONG 0         ;адрес заполняется при помощи
                           ;STR$GET1_DX
   DFILED: .ASCID /.DAT/   ;дескриптор спецификации
                           ;файла по умолчанию
 
 
                            - 180 -
 
                         00152-01 92 01
 
 
   ;
   PROMPT: .ASCID /введите спецификацию файла:/ ;запрос ввода
   LOC_P:  .ASCID /*** замечание: глобальные буфера не
                   доступны ***/
   NULL_P  .ASCID //       ;пустая строка запроса ввода
 
   ARGS:   .LONG 7         ;7 аргументов
           .ADDRESS IFILED ;спецификация вводного файла
           .ADDRESS OFILED ;спецификация выводного файла
           .ADDRESS CTEXT  ;контекст
           .ADDRESS NULL   ;нет спецификации связанного файла
           .ADDRESS STV_L  ;поле STV
           .ADDRESS UFLAGS ;флаги пользователя
 
   ;
   CTEXT   .LONG 0         ;рабочая область контекста
   NULL:   .LONG 0         ;нет спецификации связанного файла
   STV_L   .BLKL 1         ;область возврата состояния STV
   UFLAGS: .BLKL 1         ;флаги пользователя
   LEN:    .BLKL 255
   ;
           .PSECT CODE,NOWRT,EXE
           .ENTRY LOCATE,^M<>
   ;
           MOVL  4(AP),R6  ;поместить адрес блока доступа к
                           ;файлу в регистр R6
           MOVL  8(AP),R7  ;поместить адрес блока доступа
                           ;к записям в регистр R7
           BISL2 #2,UFLAGS ;установить флаг для "неприятных"
                           ;значений по умолчанию
   ;
   TERR:   PUSHAL IFILED   ;длина вводного сообщения
           PUSHAL PROMPT   ;вводное сообщение
           PUSHAL IFILED   ;дескриптор ввода
           CALLS #3,G^LIB$GET_INPUT ;ввод сообщения
           BLBC  R0,TERR   ;повторение по ошибке
 
           PUSHAL OFILED   ;адрес дескриптора
           PUSHAL LEN      ;и длина
           CALLS #2,G^STR$GET1_DX  ;распределить динамическую
                           ;строку
           BLBC R0,ERR     ;переход по ошибке
 
           CALLS ARGS,G^LIB$FIND_FILE ;обращение к
                           ;подпрограмме поиска файла в
                           ;исполнительной библиотеке
           BLBC R0,ERR     ;переход по ошибке
           BRW OPEN        ;переход по успешному выполнению
 
   ERR:    PUSHL STV_L     ;сигнализировать о кодах состояния
           PUSHL R0        ;ошибки
           CALLS #2,G^LIB$SIGNAL   ;отобразить ошибку
           BRW TERR        ;повторно ввести спецификацию
                           ;файла в случае ошибки
 
   OPEN:
           PUSHAL OFILED   ;отобразить спецификацию файла
           CALLS #1,G^LIB$PUT_OUTPUT ;на экране
 
 
 
                            - 181 -
 
                         00152-01 92 01
 
 
           MOVL OFILE,R10  ;поместить адрес спецификации
                           ;файла в регистр R10
           $FAB_STORE FAB=R6,FNA=(R10),FAC=GET,-
            FNS=OFILED,SHR=<GET,MSE>  ;установить глобальные
                           ;буфера с разделением по чтению
           $OPEN FAB=R6    ;открыть данный файл
           BLBS R0,CONNECT ;переход по успешному выполнению
           PUSHL FAB$L_STV(R6) ; STV и STS в
           PUSHL FAB$L_STS(R6) ;обратном порядке в стек для
           CALLS #2,G^LIB$STOP ;того, чтобы сигнализировать
                               ;об ошибке и выйти из ПП
 
   ;
   ;этот блок пытается установить связь с глобальными буфера-
   ;ми, если это возможно, и использует локальные буфера, ес-
   ;ли ресурсы глобальных буферов недоступны.  Поскольку зна-
   ;чение глобального  буфера  устанавливается  между  OPEN и
   ;CONNECT, то все значения по умолчанию перезаписываются
   ;
   CONNECT:
           MOVL #15,R9     ;R9 содержит счетчик глобальных
                           ;буферов
           BRB  RETRY      ;обойти обработку локального
                           ;буфера
 
   LOCAL:  MOVL #0,R9      ;возвратить глобальные буфера
           $RAB_STORE RAB=R7,MBF=#6 ;запросить 6 локальных
                           ;буферов
           PUSHAL LOC_P    ;информировать пользователя, что
           CALLS #1,G^LIB$PUT_OUTPUT ; нет глобальных
                           ;буферов
 
   RETRY:  $FAB_STORE FAB=R6,GBC=R9 ;перекрыть глобальные
                           ;буфера по умолчанию
           $CONNECT FAB=R7 ;присоединение потока доступа к
                           ;записям
           BLBC  R0,RERR   ;переход по ошибке
           BRW   DONE      ;возврат по успешному выполнению
 
   RERR:   CMPL  R0,#RMS$_CRMP ;проверить, не слишком ли
                           ;много глобальных буферов
           BNEQ  CERR      ;завершить, если другая ошибка
           BLSS  LOCAL     ;использовать локальные буфера
           SUBL2 #3,R9     ;уменьшить регистр R9 на 3
           BRW   RETRY     ;попытаться выполнить присое-
                           ;динение снова
 
   CERR:
           PUSHAL RAB$L_STV(R7)  ;вытолкнуть STV и STS в
           PUSHAL RAB$L_STS(R7)  ;обратном порядке в стек
           CALLS #2,G^LIB$STOP   ;для того, чтобы сигнали-
                                 ;зировать и окончить по
                                 ;ошибке возврат в основную
   DONE:   RET                   ;программу
           .END    LOCATE
 
        В примере  1  показана  реакция  программы  на  ошибки
 
   СУД-32. Оба поля, STV и STS, в блоке доступа к файлу и бло-
 
 
                            - 182 -
 
                         00152-01 92 01
 
 
   ке доступа к записям используются  так,  что  информация  о
 
   вторичном завершении отображается в соответствующем  случае
 
   при помощи программ LIB$SIGNAL и LIB$STOP. Более  подробная
 
   информация об использовании библиотечных программ приведена
 
   в документе [6].
 
        Программа WILDFILE  из  примера  2  вызывает  операцию
 
   PARSE, определяет, задан ли  в  спецификации  файла  символ
 
   обобщения или список поиска и передает управление по  усло-
 
   вию на некоторую последовательность команд,  которые  вызы-
 
   вают операции SEARCH и OPEN. Результирующая строка  отобра-
 
   жается после того, как будет открыт данный файл.
 
 
        П р и м е р 2.
 
 
           .TITLE WILDFILE
   ;
   ; секция данных программы * * * * * * * * * * * * * * * *
   ;
           .PSECT DATA,NOEXE,WRT
   MY_NAM: $NAM RSA=RES_STR,- ;адрес результирующего буфера
              RSS=255,-      ;размер результирующего буфера
              ESA=EXP_STR,-  ;адрес расширенного буфера
              ESS=255        ;размер расширенного буфера
   ;
   MY_FAB: $FAB FOP=NAM,-    ;используется блок NAM
                NAM=MY_NAM   ;указатель на блок NAM
                FNA=INP_STR  ;адрес строки с именем файла
   EXP_STR:                  ;буфер расширенной строки
 
           .BLKB 255
   RES_STR:                  ;буфер результирующей строки
           .BLKB 255
   RES_STR_D:                ;дескриптор результирующей стро-
                             ;ки
           .BLKL 1
           .LONG RES_STR
   INP_STR:                  ;буфер вводной строки
           .BLKB 255
   INP_STR_D:                ;дескриптор вводной строки
           .LONG 255
           .LONG INP_STR
   INP_STR_LEN:              ;длина вводной строки
           .BLKL 1
 
   PROMPT_D:                 ;запрос
           .ASCID /пожалуйста введите спецификацию файла:/
   ;
 
 
                            - 183 -
 
                         00152-01 92 01
 
 
   ;  секция инструкций программы * * * * * * * * * * * *
   ;
           .PSECT CODE,EXE,NOWRT
           .ENTRY WILDFILE, ^M<> ;регистры не сохраняются
           PUSHAB INP_STR_LEN ;адрес длины строки
           PUSHAB PROMPT_D  ;дескриптор запроса
           PUSHAB INT_STR_D ;дескриптор буфера строки
           CALLS #3,G^LIB$GET_INPUT ;получить значение строки
                                    ;ввода
           BLBS R0,MOVE    ;переход по успешному вводу
           BRW EXIT        ;закончить по ошибке
   ;
   ; запоминается вводная строка и выполняется
   ; синтаксический анализ
   ;
   MOVE:   MOVB INP_STR_LEN,- ;установить размер строки
                   MY_FAB+FAB$B_FNS
   PAR:    $PARSE FAB=MY_FAB  ;синтаксический анализ
                              ;спецификации файла в MY_FAB
 
           BLBC R0,F_ERR      ;переход по ошибке
           BBS #NAM$V_WILDCARD,-
               NAM$L_FNB+MY_NAM,WILD ;переход, если разряд
                                     ;установлен
           BBS #NAM$V_SEARCH_LIST,-  ;переход если разряд
                NAM$L_FNB+MY_NAM,WILD;установлен
           BRB OPEN  ;все в порядке - на открытие файла
   WILD:   $SEARCH FAB=MY_FAB ;поиск следующего файла
           BLBC R0,F_ERR      ;переход по ошибке
   OPEN:   $OPEN FAB=MY_FAB   ;открытие файла
           BLBC R0,F_ERR      ;переход по ошибке
 
           MOVZвL MY_NAM+NAM$B_RSL,- ;переместить  длину ре-
                  RES_STR_D          ;зультирующей строки в
                                     ;дескриптор
           PUSHAB RES_STR_D          ;в дескриптор буфера
                                     ;строки
           CALLS #1,G^LIB$PUT_OUTPUT ;отобразить результи-
                                     ;рующую спецификацию
                                     ;файла, выполнить при-
                                     ;соединение и обработать
                                     ;файл
                                     ; .
                                     ; .
                                     ; ... и
           $CLOSE FAB=MY_FAB         ;закрыть файл
           BLBC R0,EXIT              ;переход по успешному
                                     ;выполнению
 
   F_ERR:  PUSHL MY_FAB+FAB$L_STV ;вытолкнуть STV и STS в
           PUSHL MY_FAB+FAB$L_STS ;стек в обратном порядке
           CALLS #2,G^LIB$SIGNAL  ;сигнализировать об ошибке
   EXIT:   RET                    ;выход по регистру R0
           .END WILDFILE
 
        В программе WILDFILE использованы макрокоманды $FAB  и
 
   $NAM, определяющие соответствующие управляющие блоки СУД-32
 
 
 
                            - 184 -
 
                         00152-01 92 01
 
 
   и задающие аргументы для  вызова  операций  PARSE,  SEARCH,
 
   OPEN и CLOSE. Этот пример  показывает,  как  предварительно
 
   обработать некоторую спецификацию файла, используя операции
 
   PARSE и SEARCH. Для того, чтобы обработать  несколько  фай-
 
   лов, можно дополнить инструкцию безусловного перехода перед
 
   меткой F_ERR для того, чтобы организовать переход на макро-
 
   команду $SEARCH с меткой WILD.
 
        Более подробная информация по программированию на язы-
 
   ке МАКРО приведена в документе [7], по использованию макро-
 
   команд СУД-32 в документе [2].
 
        Прикладной  программе,  возможно,  также   понадобится
 
   обрабатывать один или несколько файлов,  в  зависимости  от
 
   той спецификации файла, которая будет введена  с  терминала
 
   или в соответствии с заданным логическим именем.
 
 
 
                                            
        4.3.1. Обработка одного файла
 
 
        Когда необходимо обработать только один файл,  но  при
 
   этом поиск данного файла требует выполнения анализа  место-
 
   положения нескольких файлов, в спецификации  файла  следует
 
   задать список поиска.
 
        Например, рассмотрим некоторый каталог, который содер-
 
   жит файлы PAY.DAT и его копию с  именем  PAY_BUP.DAT.  Одна
 
   возможность для поиска требуемого файла - указание специфи-
 
   кации файла символом обобщения, например, PAY*.DAT, и вызов
 
   операций PARSE и SEARCH для того, чтобы обнаружить любой из
 
   этих двух файлов. Файл PAY.DAT  будет  обнаружен  до  файла
 
   PAY_BUP.DAT. Однако,  если  файл  PAY.DAT  был  удален  или
 
   переименован и имеется другой файл, начинающийся на  PAY  и
 
   предшествующий файлу PAY_BUP.DAT, например, PAY_ACC.DAT, то
 
 
 
                            - 185 -
 
                         00152-01 92 01
 
 
   может быть найден именно этот файл,  а  не  требуемый  файл
 
   PAY_BUP.DAT.
 
        Для предотвращения такой ситуации следует задать логи-
 
   ческое имя и связать с ним список поиска, указывающий необ-
 
   ходимость поиска файла PAY.DAT или его  копии  PAY_BUP.DAT.
 
   Например, список поиска файлов в  каталоге  [USER]  мог  бы
 
   быть определен следующим образом:
 
 
        $DEFINE SEARCH [USER]PAY.DAT,[USER]PAY_BUP.DAT
 
 
        Для поиска одного из требуемых файлов, в  спецификации
 
   достаточно указать только логическое имя SEARCH.
 
        Если файлы, для которых должен  осуществляться  поиск,
 
   располагаются в разных каталогах,  в  поле  каталога  можно
 
   задать символ обобщения  -  "многоточие"  для  того,  чтобы
 
   организовать поиск по всем подкаталогам (если искомый  файл
 
   располагается в том же самом дереве каталога). В  противном
 
   случае, можно определить некоторый список поиска, по  кото-
 
   рому организуется поиск файла  PAY.DAT  в  одном  каталоге,
 
   файла с тем же самым именем в некотором подкаталоге и затем
 
   файла PAY_BUP.DAT в любом каталоге данного дерева при помо-
 
   щи следующей команды DEFINE:
 
 
     $DEFINE SEARCH [USER]PAY,[USER.PAY]PAY,[USER...]PAY_BUP
 
 
        Для поиска требуемого  файла  достаточно  использовать
 
   спецификацию файла SEARCH.DAT. Символы обобщения могут быть
 
   использованы в списке поиска точно так же, как в любых дру-
 
   гих логических именах  и  спецификациях  файлов,  если  они
 
   необходимы. Однако, для того,  чтобы  обнаружить  требуемый
 
   файл дложны быть использованы операции PARSE и SEARCH.
 
 
 
 
                            - 186 -
 
                         00152-01 92 01
 
 
        Когда необходимо найти файлы в разных деревьях катало-
 
   га (или каталогах верхнего уровня), следует  задать  полные
 
   спецификации каталога при определении списка поиска.  Можно
 
   также использовать списки поиска для того, чтобы обнаружить
 
   файлы на различных устройствах. Например, для  того,  чтобы
 
   найти файл TEST_DATA.DAT,  задавая  такие  комбинации  уст-
 
   ройств  и  каталогов  как   DISK1:[USER],DISK2:[USER]   или
 
   DISK3:[USER], необходимо определить список поиска TST  сле-
 
   дующим образом:
 
 
        $DEFINE TST DISK1:[USER],DISK2:[USER],DISK3:[USER]
 
 
        Для того, чтобы обнаружить этот файл, необходимо  ука-
 
   зать TST:TEST_DATA.DAT.
 
        Другой случай состоит в том, чтобы найти то  же  самое
 
   имя каталога и то же самое имя файла на различных устройст-
 
   вах. В этом случае можно определить TST следующим образом:
 
 
        $DEFINE TST DISK1:,DISK2:,DISK3:
 
 
        Для    поиска    данного    файла     можно     задать
 
   TST:[USER]TEST_DATA.DAT. В  этом  примере  для  обнаружения
 
   файлов использован один список поиска, который, в противном
 
   случае, потребовал бы нескольких спецификаций файла,  даже,
 
   если бы использовались символы обобщения.
 
 
 
        4.3.2. Обработка нескольких файлов
 
 
        Для обработки нескольких файлов, используя одну специ-
 
   фикацию файла, необходимо  использовать  операции  PARSE  и
 
   SEARCH для поиска этих файлов.
 
        Требования прикладной программы и местоположение  (или
 
 
 
                            - 187 -
 
                         00152-01 92 01
 
 
   местоположения) каталога для данного файла, в общем случае,
 
   определяют, будет ли использоваться  в  спецификации  файла
 
   один или более списков поиска, символы обобщения или списки
 
   поиска, содержащие символы обобщения. Когда к файлам должен
 
   быть осуществлен доступ без учета алфавитного порядка  сле-
 
   дования имен, то следует использовать список поиска.
 
        Для того, чтобы обрабатывать несколько файлов, исполь-
 
   зуя одну спецификацию файла, следует один раз вызвать  опе-
 
   рацию PARSE (или эквивалентную ей) для того,  чтобы  проин-
 
   терпретировать данную спецификацию файла  и  создать  образ
 
   спецификации файла, который необходимо найти. После анализа
 
   спецификации файла, следует вызвать  операцию  SEARCH,  для
 
   проверки соответствия файлов заданной спецификации. В неко-
 
   торых  случаях  можно  проверить  (или  отобразить)  строку
 
   результирующей спецификации файла,  возвращенную  операцией
 
   SEARCH для того, чтобы определить,  нужно  ли  обрабатывать
 
   (открывать) данный файл.
 
        При необходимости выдачи списка всех спецификаций фай-
 
   лов, которые удовлетворяют некоторой конкретной  специфика-
 
   ции файла, и обеспечения  возможности  выбора  с  терминала
 
   каждого файла, который необходимо  обработать,  могут  быть
 
   использованы символы обобщения, возможно в некотором списке
 
   поиска, который содержит  символы  обобщения  в  одной  или
 
   более своих спецификаций файла. Для того,  чтобы  уменьшить
 
   число файлов, среди которых может быть  осуществлен  выбор,
 
   следует использовать список поиска без  символов  обобщения
 
   или менее полагаться на символы  обобщения.  Например,  для
 
   того, чтобы обнаружить все файлы с типом файла DAT в  неко-
 
   тором дереве каталога на различных устройствах, можно опре-
 
   делить список поиска TREE следующим образом:
 
 
                            - 188 -
 
                         00152-01 92 01
 
 
        $DEFINE TREE DISK1:[MYDIR...],DISK2:[MYDIR...]
 
 
        Первичной спецификацией файла, которая бы  использова-
 
   лась для операции PARSE, была бы TREE:*.DAT. Большое  число
 
   файлов могло бы удовлетворять этому требованию.
 
        Для прикладных программ, которым необходимо обнаружить
 
   некоторые файлы, возможно понадобились бы списки  поиска  с
 
   более ограниченным использованием символов обобщения. Расс-
 
   мотрим некоторый файл, который содержит  некоторый  префикс
 
   RESULTS, за которым следует дата ввода данных.  Можно  было 
 
   бы   использовать   имя   файла RESULTS*JUN*.DAT для  того,
 
   чтобы    обнаружить    некоторую   запись,   которая   была  
 
   введена   в   июне    месяце    при    помощи    выполнения
 
   операций   SEARCH,   и   затем   OPEN   для   каждого файла,
 
   читая все записи до тех пор, пока не будет найдена  требуе-
 
   мая запись, и вызывая операцию CLOSE после обработки каждо-
 
   го файла.
 
        Список поиска должен использоваться тогда, когда неко-
 
   торая заранее определенная  группа  файлов,  обрабатывается
 
   прикладной программой, которая не будет работать в интерак-
 
   тивном режиме. Использование списка поиска  особенно  жела-
 
   тельно, если файлы имеют имена, не связанные друг с другом,
 
   или если они расположены в разных каталогах или  на  разных
 
   устройствах. Другая  причина  использования  списка  поиска
 
   состоит в том, чтобы  минимизировать  время  обработки  при
 
   помощи поиска некоторой определенной группы файлов.
 
 
 
        4.3.3. Обработка одного или нескольких файлов
 
 
        Для прикладных программ общего назначения, когда  вво-
 
   дится некоторая спецификация файла, она может указывать  на
 
 
                            - 189 -
 
                         00152-01 92 01
 
 
   один или несколько файлов. В этом случае имеется  специаль-
 
   ное средство проверки, должен ли быть  обработан  один  или
 
   несколько файлов. Если должен быть  обработан  только  один
 
   файл, надо явно запретить использование символов обобщения.
 
   Для того, чтобы  выполнить  проверку  на  наличие  символов
 
   обобщения и (или) списков  поиска,  надо  вызвать  операцию
 
   PARSE и проверить соответствующие разряды в поле NAM$L_FNB.
 
        Присутствие символов обобщения  обычно  означает,  что
 
   должно быть обработано несколько файлов, в  зависимости  от
 
   соглашений в программе. Если присутствует список поиска, он
 
   может указывать (а может и не указывать) на то, что  должен
 
   быть обработан только один файл, и для  пользователей  этой
 
   программы необходимо некоторое соглашение.  Таким  образом,
 
   проверяя, имеется ли символ обобщения, программа может  или
 
   вызвать один раз операцию PARSE и повторно вызвать операцию
 
   SEARCH для каждого файла, который должен быть  открыт,  или
 
   запретить использование символов обобщения, выдавая  запрос
 
   о повторном вводе спецификации файла. В  некоторых  случаях
 
   программе  возможно  потребуется  запретить   использование
 
   списка поиска или разрешить доступ к одному или  нескольким
 
   файлам, причем все это зависит от соглашений в данной прик-
 
   ладной программе.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 190 -
 
                         00152-01 92 01
 
 
        5. УСЛОЖНЕННОЕ ИСПОЛЬЗОВАНИЕ СПЕЦИФИКАЦИЙ ФАЙЛА
 
 
 
        Этот раздел предназначен  для  пользователей,  которым
 
   необходимо понимание внутренних механизмов  формирования  и
 
   синтаксического анализа спецификаций  файлов,  структуры  и
 
   обработки каталогов.
 
 
 
        5.1. Применение значений по умолчанию
 
 
        Различается три вида спецификаций файлов -  первичная,
 
   спецификация файла по умолчанию и  спецификация  связанного
 
   файла. Обязательным является задание первичной спецификации
 
   файла. Спецификация  файла  по  умолчанию  может  содержать
 
   некоторое значение по  умолчанию  для  отдельного  атрибута
 
   (например - тип .DAT для того, чтобы задать некоторый  файл
 
   данных). Значение по умолчанию может быть задано для одного
 
   или более атрибутов спецификации файла.  Спецификация  свя-
 
   занного файла может  быть  использована  тогда,  когда  для
 
   выполнения  требуемой  операции  необходимо  взаимодействие
 
   двух файлов, например, при копировании или об'единении фай-
 
   лов. В этом случае спецификация входного файла  связана  со
 
   спецификацией выходного файла. Последнее применяемое значе-
 
   ние по умолчанию гарантирует, при отсутствии в спецификации
 
   имени устройства и каталога, использование  соответствующих
 
   значений по умолчанию для  процесса.  В  табл.13  приведены
 
   значения по умолчанию, используемые СУД-32 для формирования
 
   полной спецификации файла.
 
 
 
 
 
 
 
 
 
                            - 191 -
 
                         00152-01 92 01
 
 
                                                   Таблица 13
          
          Значения по умолчанию для спецификации файла
 
   ----------------------------------------------------------
   Спецификация !                Описание
   файла        !
   ----------------------------------------------------------
                !
   Первичная    !   Если атрибут "устройство"  является логи-
                ! ческим именем, оно будет повторно  трансли-
                ! роваться  при  формировании   промежуточных
                ! спецификаций.  Результирующее значение это-
                ! го атрибута  должно  быть физическим именем
                ! усторойства,  именем файла, постоянного для
                ! процесса,  или  скрытым  логическим  именем
                ! устройства
                !
   По умолчанию !   Если  атрибут "устройство" является логи-
                ! ческим  именем,   оно  будет  полностью от-
                ! транслировано (как в  первичной  специфика-
                ! ции файла).  Если  опущены любые из атрибу-
                ! тов  в   спецификации  файла  на предыдущем
                ! шаге, то они будут  заменены  на  соответс-
                ! твующие атрибуты в  оттранслированной  спе-
                ! цификации файла по умолчанию
                !
   Связанная    !   Если атрибут "устройство" является  неко-
                ! торым логическим  именем,  оно  будет  пол-
                ! ностью  оттранслировано  (как  в  первичной
                ! спецификации файла). Когда данная  специфи-
                ! кация  используется  как спецификация неко-
                ! торого входного  файла,  то  атрибуты, опу-
                ! щенные в данной спецификации файла (от пре-
                ! дыдущего шага) будут  заменены на соответс-
                ! твующие атрибуты в спецификации  связанного
                ! файла.
                !
                !   Если атрибуты содержат символы обобщения,
                ! то данные символы обобщения остаются в этих
                ! атрибутах.  Когда  данная  спецификация ис-
                ! пользуется  как  спецификация выходного фа-
                ! йла,  то  имя  файла  и  тип будут заменены
                ! на  соответствующие  атрибуты  спецификации
                ! связанного файла.
                !   для получения более  подробной информации
                ! по  использованию  этой   спецификации,   а
                ! также по использованию нескольких  специфи-
                ! каций  связанного  файла   необходимо обра-
                ! титься к п.5.2.3
                !
   Устройство   !   Если имя устройства не задано, то  вместо
   и каталог    ! него  по  умолчанию используется логическое
                ! имя SYS$DISK.  Если логическое имя SYS$DISK
                ! не может быть оттранслировано  в соответст-
                ! вующее физическое имя устройства, то возни-
                ! кает ошибка. Если в спецификации файла  от-
                ! сутствует и каталог, то по умолчанию подра-
                ! зумевается  текущий каталог. Таким образом,
 
 
                            - 192 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 13
   ----------------------------------------------------------
   Спецификация !                Описание
   файла        !
   ----------------------------------------------------------
                !
                ! В результате обработки  заданной специфика-
                ! ции  будет создана полная спецификация фай-
                ! ла
                !
 
        Первичная спецификация файла,  спецификация  файла  по
 
   умолчанию и спецификация связанного файла  могут  использо-
 
   вать логические имена, которые сперва транслируются в соот-
 
   ветствующие атрибуты спецификации файла до того, как данная
 
   спецификация файла будет использоваться в качестве  некото-
 
   рой спецификации по умолчанию или, как в  случае  первичной
 
   спецификации файла, до того, как к  ней  будут  применяться
 
   значения по умолчанию. Если опущены какие-либо атрибуты пе-
 
   рвичной спецификации файла, то применяется спецификация фа-
 
   йла по умолчанию, и значение опущенного атрибута (если  оно 
 
   присутствует  в спецификации файла по умолчанию) становится
 
   частью новой строки первичной спецификации файла. Аналогич-
 
   ным образом, если в спецификации файла, которая создана при
 
   помощи применения спецификации файла по умолчанию  все  еще
 
   отсутствуют какие-либо компоненты, то тогда в качестве зна-
 
   чения по умолчанию применяется спецификация связанного фай-
 
   ла и значение опущенного атрибута (если оно присутствует  в
 
   спецификации связанного файла) становится частью новой спе-
 
   цификации файла, к которому применены значения  по  умолча-
 
   нию. Если в этой новой спецификации  файла  с  примененными
 
   значениями по умолчанию имя устройства или каталога все еще
 
   отсутствуют, то частью спецификации файла становится значе-
 
   ние по умолчанию для устройства и каталога процесса,  обра-
 
   зуя полную спецификацию файла.
 
 
 
                            - 193 -
 
                         00152-01 92 01
 
 
        В табл.14 показана последовательность, в которой  при-
 
   меняются значения по умолчанию  к  отсутствующим  атрибутам
 
   спецификации файла, и строка, которая получается в  резуль-
 
   тате каждого такого применения. В  табл.14  предполагается,
 
   что программа задает первичную спецификацию  файла  в  виде
 
   FILE, а спецификация файла по умолчанию  задает  тип  файла
 
   .DAT. Для процесса, в контексте  которого  выполняется  эта
 
   программа, имя - SYS$DISK связано с устройством  DISK1:,  а
 
   каталог по умолчанию - [INV_C].
 
 
 
 
                                                   Таблица 14
 
             Пример применения значений по умолчанию
 
   ----------------------------------------------------------
                          ! Применя-!    Новая строка
   Название строки        ! емая    !
                          ! строка  !
   ----------------------------------------------------------
                          !         !
   Первичная спецификация ! FILE    ! FILE
   файла                  !         !
                          !         !
   Спецификация файла     ! .DAT    ! FILE.DAT;
   по умолчанию           !         !
                          !         !
   Спецификация связанно- ! Нет     ! FILE.DAT;
   го файла               !         !
                          !         !
   Устройство по умолча-  ! DISK1:  ! DISK1:FILE.DAT;
   нию (SYS$DISK)         !         !
                          !         !
   Каталог по умолчанию   ! [INV_C] ! DISK1:[INV_C]FILE.DAT;
                          !         !
   Результирующая строка  !         ! DISK1:[INV_C]FILE.DAT;1
                          !         !
 
        Спецификация файла с полностью применяемыми значениями
 
   по умолчанию используется для поиска данного  файла.  Номер
 
   версии добавляется к спецификации файла с полностью  приме-
 
   ненными значениями атрибутов по умолчанию и полностью  отт-
 
   ранслированной (т.е. Расширенной строкой спецификации  фай-
 
   ла), после чего спецификация файла становится  результирую-
 
 
                            - 194 -
 
                         00152-01 92 01
 
 
   щей строкой.
 
        Когда в прикладной программе необходимо задать  инфор-
 
   мацию о спецификации файла, следует использовать соответст-
 
   вующее ключевое слово данного языка в операторе  OPEN  (или
 
   CREATE),  задавать   характеристики   спецификации   файла,
 
   используя редактор языка описания файла, и  вызывать  подп-
 
   рограммы FDL$CREATE  (для  того,  чтобы  создать  некоторый
 
   файл) или FDL$PARSE и FDL$RELEASE (для того, чтобы  открыть
 
   некоторый  файл),  или  задавать  значения  соответствующих
 
   полей управляющих блоков и вызывать непосредственно  опера-
 
   ции СУД-32, возможно, используя подпрограммы  USEROPEN  или
 
   USER_ACTION, находящиеся в исполнительной библиотеке.
 
        Рассмотрим программу, в которой явно не задается  уст-
 
   ройство и каталог в любой из своих спецификаций файла и  не
 
   задается никакой спецификации связанного файла.  Устройство
 
   по умолчанию для процесса SYS$DISK и текущий каталог  будут
 
   использованы в спецификации файла с полностью  примененными
 
   значениями по умолчанию. Однако если требуемый файл  данных
 
   не находится в текущем каталоге процесса, в рамках которого
 
   выполняется данная программа или не находится на устройстве
 
   SYS$DISK вообще, то данный файл не будет  найден.  В  таких
 
   случаях желательно задание устройства и каталога в  первич-
 
   ной спецификации файла, в спецификации файла  по  умолчанию
 
   или спецификации связанного файла.
 
        Спецификации файла могут быть заданы  программе  одним
 
   из способов, перечисленных в табл.15.
 
 
 
 
 
 
 
 
 
 
                            - 195 -
 
                         00152-01 92 01
 
 
                                                   Таблица 15
 
   ----------------------------------------------------------
   Строка        !         Способ задания строки
   ----------------------------------------------------------
                 !
   Первичная     !   Следует  использовать атрибут языка опи-
                 ! сания  файла  FILE  NAME, использовать имя
                 ! файла или имя, следующее за ключевыми сло-
                 ! вами FILE, FILE_ID или FILENAME в операто-
                 ! ре OPEN в программах  на  языках  высокого
                 ! уровня или использовать строку, на которую
                 ! указывает поле FAB$L_FNA управляющего бло-
                 ! ка FAB
                 !
   По умолчанию  !   Следует использовать атрибут языка  опи-
                 ! сания  файла  FILE DEFAULT_NAME, использо-
                 ! вать спецификацию файла  по  умолчанию или
                 ! имя,   следующее   за   ключевыми  словами
                 ! DEFAULTNAME или DEFAULT_FILE_ID в операто-
                 ! ре  OPEN языков программирования  высокого
                 ! уровня  или использовать строку, на  кото-
                 ! рую указывает поле  FAB$L_DNA
                 !
   Связанная     !   Следует использовать имя блока, на кото-
                 ! рое указывает поле NAM$L_RLF. Блок связан-
                 ! ного имени должен задавать  местоположение
                 ! спецификации файла, на которую должно ука-
                 ! зывать поле  NAM$L_RSA
                 !
 
        Более подробная информация об использовании специфика-
 
   ций файлов в языках программирования высокого уровня содер-
 
   жится в соответствующих руководствах. Информация об исполь-
 
   зовании редактора языка FDL, обслуживающих программ СУД-32,
 
   о подпрограммах FDL$PARSE и FDL$RELEASE приведена  в  доку-
 
   менте [3]. Для получения подробной информации об  управляю-
 
   щих блоках и операциях СУД-32 следует обратиться к докумен-
 
   ту [2].
 
        Задание всех необходимых атрибутов  явно  в  первичной
 
   спецификации файла  уменьшает  вероятность  ошибки.  Однако
 
   значения по умолчанию могут  быть  также  очень  полезными,
 
   особенно для применений общего назначения и  применений,  в
 
   которых спецификация файла  вводится  с  терминала.  Другим
 
   возможным решением является использование логических имен.
 
 
 
                            - 196 -
 
                         00152-01 92 01
 
 
        5.2. Особенности синтаксического  анализа  в
 
             СУД-32
 
 
        Далее под расширенной строкой  понимается строка,  за-
 
   данная пользователем, на которую  указывает содержимое поля
 
   адреса расширенной  строки (NAM$L_ESA) блока имени.  Термин
 
   "эквивалентная   строка"  относится  к внутренней  области,
 
   используемой операционной системой МОС ВП, в которую  поме-
 
   щается результат трансляции некоторого логического имени.
 
        В процессе своей работы каждая программа задает специ-
 
   фикацию файла, а СУД-32  транслирует  данную  спецификацию,
 
   определяя ее атрибуты. Любой заданный атрибут в  трех  воз-
 
   можных спецификациях файла по умолчанию затем применяется к
 
   первичной спецификации файла для того,  чтобы  сформировать
 
   полную спецификацию файла  со  всеми  заданными  значениями
 
   атрибутов по умолчанию. Эта строка полной спецификации фай-
 
   ла может быть представлена как  образ,  который  использует
 
   СУД-32 для того, чтобы обнаружить данный файл.  Если  задан
 
   блок имени и были заданы адрес и размер расширенной строки,
 
   то полная спецификация файла копируется в расширенную стро-
 
   ку. Данная расширенная строка затем используется для  того,
 
   чтобы сохранить результат каждого шага применения  значений
 
   по умолчанию, и она  содержит  текущий  образ  спецификации
 
   файла.
 
        Операция PARSE в этом  плане  отличается  от  операций
 
   CREATE, DISPLAY, ERASE, OPEN и SEARCH. При выполнении  опе-
 
   рации PARSE расширенная строка будет содержать  любые  при-
 
   сутствующие символы обобщения в спецификации файла. Резуль-
 
   тирующая строка не генерируется до вызова другой  операции,
 
   которая обычно использует в  качестве  входной  расширенную
 
 
 
                            - 197 -
 
                         00152-01 92 01
 
 
   строку, полученную в результате операции PARSE.
 
        Когда используется список поиска,  расширенная  строка
 
   содержит спецификацию первого искомого файла. СУД-32 сохра-
 
   няет эквивалентные строки  спецификаций  остальных  файлов,
 
   заданных в списке. Когда проверена  очередная  спецификация
 
   файла, СУД-32 корректирует  расширенную  строку  для  того,
 
   чтобы описать следующую спецификацию. Результирующая строка
 
   содержит реальную спецификацию файла для того файла,  кото-
 
   рый найден.
 
        При выполнении операций CREATE, DISPLAY, ERASE, OPEN и
 
   SEARCH расширенная строка является той строкой,  к  которой
 
   применяются значения по умолчанию для того,  чтобы  выбрать
 
   действительно  используемый  файл.  Результирующая   строка
 
   может быть использована программой для того, чтобы  указать
 
   на то, какой файл был обнаружен. Когда файл обнаружен, най-
 
   денный (или созданный) номер версии добавляется к результи-
 
   рующей строке спецификации файла (но не к расширенной стро-
 
   ке спецификации файла). Когда используется  список  поиска,
 
   результирующая строка содержит ту спецификацию  файла,  для
 
   которой в действительности был найден файл.
 
        Хотя существуют исключения,  приведенные  в  следующих
 
   разделах, которые относятся  к  усложненному  использованию
 
   спецификации файла, СУД-32 создает полную спецификацию фай-
 
   ла, проходя следующие шаги по мере того, как она  проверяет
 
   первичную спецификацию файла.
 
 
 
        5.2.1. Проверка на открытие при  помощи  блока
 
               имени
 
 
        Если был задан режим "открытие-по-блоку-имени"  (уста-
 
 
 
                            - 198 -
 
                         00152-01 92 01
 
 
   новлен режим FAB$_V_NAM в поле FAB$L_FOP), СУД-32 проверяет
 
   данный блок имени на соответствие  спецификации  устройства
 
   (поле NAM$T_DVI),  проводит  идентификацию  каталога  (поле
 
   NAM$W_DID) и идентификацию  файла  (поле  NAM$W_FID).  Если
 
   эти поля заданы, то СУД-32 использует их  для  того,  чтобы
 
   обнаружить данный файл. Все другие  атрибуты  игнорируются,
 
   поскольку они не нужны. Если открытие по блоку имени  прой-
 
   дет успешно, то не создаются ни результируюшая  строка,  ни
 
   расширенная строка.
 
        Если эти поля не заданы в блоке имени или если не было
 
   задано открытие по блоку имени (например,  перед  операцией
 
   OPEN было задано обращение к операции PARSE), СУД-32 выпол-
 
   няет трансляцию и применяет  значения  по  умолчанию.  Файл
 
   может быть также создан путем использования поля  идентифи-
 
   кации устройства и каталога в блоке  имени,  но  СУД-32  не
 
   использует идентификацию файла.
 
        Если открытие по блоку имени было запрошено  для  уда-
 
   ленного доступа к файлу с использованием спо трал, то иден-
 
   тификация устройства, идентификация каталога и  идентифика-
 
   ция файла не проверяются для того, чтобы определить,  может
 
   ли быть выполнена запрашиваемая операция открытия по  блоку
 
   имени. Вместо этого проверяется результирующая строка. Если
 
   не существует полностью сформированной результирующей стро-
 
   ки, то открытие по блоку имени  не  выполняется,  и  СУД-32
 
   транслирует логические имена и применяет значения по  умол-
 
   чанию так, как если бы операция открытия по блоку имени  не
 
   была запрошена.
 
 
 
 
 
 
 
 
                            - 199 -
 
                         00152-01 92 01
 
 
        5.2.2. Форматы спецификации файла и трансляции
 
               логических имен
 
 
        Для того, чтобы сформировать полностью оттранслирован-
 
   ную спецификацию файла с полностью примененными  значениями
 
   по умолчанию, СУД-32 проверяет и  пытается  оттранслировать
 
   каждую задаваемую программой спецификацию файла, начиная со
 
   строки первичной спецификации файла  (указанной  содержимым
 
   полей FAB$L_FNA и FAB$B_FNS).
 
        Спецификация файла может иметь один из трех форматов:
 
 
        1) первая спецификация файла задается в следующем фор-
 
   мате:
 
        Узел::"чужая-специф-файла"
 
        Узел::"строка-специф-задачи"
 
 
        СУД-32 пытается оттранслировать  имя  узла  для  того,
 
   чтобы определить, имеется ли некоторое логическое имя узла.
 
   Если трансляция успешная, то допускается только  логическое
 
   или физическое имя узла (включая и некоторую строку  управ-
 
   ления доступом, если она задана). Если  найдено  логическое
 
   имя узла, то трансляция повторяется, а когда трансляция  не
 
   может быть выполнена, спецификация файла копируется прямо в
 
   расширенную строку. Строка в кавычках не подвергается  син-
 
   таксическому анализу за исключением того, чтобы определить,
 
   ссылается ли она на некоторый файл или некоторую  задачу  в
 
   удаленной системе. Для получения дополнительной  информации
 
   по использованию этих форматов следует обратиться  к  доку-
 
   менту [5];
 
        2) если спецификация файла содержит  только  некоторое
 
   имя (без заключающей точки или двоеточия),  система  СУД-32
 
 
 
                            - 200 -
 
                         00152-01 92 01
 
 
   пытается оттранслировать его как  логическое.  Если  имя  в
 
   поле атрибута имени файла оттранслировано успешно,  то  вся
 
   операция трансляции перезапускается, используя  в  качестве
 
   ввода эквивалентную строку. Если данное имя не оттранслиро-
 
   вано, то оно используется как компонент имени файла, и  эта
 
   спецификация файла готова для применения значений по  умол-
 
   чанию (например, имя файла FILE);
 
        3) если спецификация файла не задана  ни  в  одном  из
 
   приведенных форматов,  то  предполагается,  что  она  будет
 
   задана в формате полной спецификации файла:
 
 
        Узел::устройство[каталог]имя.тип;версия
 
 
        СУД-32 выделяет различные атрибуты,  проверяет  их  на
 
   соответствующий синтаксис и копирует в расширенную  строку.
 
   Если задано имя узла, то  СУД-32  пытается  оттранслировать
 
   данное имя узла как некоторое логическое имя узла так,  как
 
   это делается на шаге 1. Если  задан  атрибут  устройство  и
 
   отсутствует имя узла, то  СУД-32  пытается  оттранслировать
 
   данное имя устройства как некоторое логическое  имя.  После
 
   повторной трансляции логического  имени  СУД-32  проверяет,
 
   чтобы определить, содержит  ли  результат  этой  трансляции
 
   какой-либо атрибут, уже присутствующий для этой  специфика-
 
   ции файла. Если транслируется первичная спецификация файла,
 
   то СУД-32 выдает сигнал об ошибке, если обнаружен некоторый
 
   повторяющийся атрибут. Для спецификации файла по  умолчанию
 
   и спецификации связанной строки СУД-32 игнорирует (отбрасы-
 
   вает) повторяющийся атрибут, созданный во время трансляции.
 
        Если имя узла не задано и атрибут устройство не транс-
 
   лируется, то этот атрибут  трактуется  как  физическое  имя
 
   устройства, и эта спецификация файла готова для  применения
 
 
                            - 201 -
 
                         00152-01 92 01
 
 
   значений по умолчанию.
 
        Если логическое имя транслируется успешно,  то  СУД-32
 
   выполняет одно из следующих действий:
 
        1) проверяет  эквивалентную  строку  для  того,  чтобы
 
   определить, ссылается ли она на некоторый файл,  постоянный
 
   для данного процесса. Если имеется такая ссылка, то  СУД-32
 
   копирует данное  логическое  имя  в  расширенную  строку  и
 
   заканчивает обработку этой спецификации (значения по  умол-
 
   чанию не нужны). Использование файлов, постоянных для  про-
 
   цесса, описано в подразделе 5.4.;
 
        2) проверяет эквивалентную  стороку  для  того,  чтобы
 
   определить, является ли данное логическое имя скрытым логи-
 
   ческим именем устройства. Если является, то исходная строка
 
   используется как имя устройства;
 
        3) если эквивалентная строка  не  ссылается  на  файл,
 
   постоянный для процесса, и не является именем скрытого уст-
 
   ройства, то СУД-32 повторно запускает операцию  трансляции,
 
   используя эквивалентную строку в качестве входной.
 
        Если имя узла задано, то СУД-32 передает всю  специфи-
 
   кацию файла (без имени узла) в данный  удаленный  узел  для
 
   интерпретации, используя протокол доступа  к  данным  (пдд)
 
   спо трал для того, чтобы организовать  связь  с  программой
 
   удаленного доступа к файлам (FAL) на данном удаленном узле.
 
        Процедура трансляции логического  имени  следует  двум
 
   соглашениям. Во-первых, если спецификация файла была  пред-
 
   варительно подвергнута синтаксическому анализу в результате
 
   выполнения  соответствующей  операции  СУД-32,  то  следует
 
   использовать режим "открытие-по-блоку-имени" для того, что-
 
   бы сэкономить время обработки. Во-вторых, в начале специфи-
 
   кации файла должно быть помещено логическое имя устройства,
 
 
                            - 202 -
 
                         00152-01 92 01
 
 
   если только перед ним не задано имя узла, в котором  данное
 
   логическое имя должно быть оттранслировано.
 
 
 
        5.2.3. Специальные       соглашения        для
 
               синтаксического анализа
 
 
        Имеются дополнительные соглашения для  синтаксического
 
   анализа,  относящиеся  к  использованию  таких  усложненных
 
   свойств спецификации файла, как список поиска, спецификации
 
   связанных файлов и  того  способа,  которым  обрабатываются
 
   спецификации каталога.
 
 
 
        5.2.3.1. Соглашения синтаксического анализа  для
 
                 списка поиска
 
 
        СУД-32 использует несколько соглашений  при  обработке
 
   логического имени списка поиска:
 
        1) когда встречается список поиска, СУД-32  организует
 
   внутренний поиск данного  файла,  используя  предварительно
 
   заданные спецификации файла списка поиска. СУД-32  трактует
 
   каждую спецификацию файла в  списке  поиска  как  некоторую
 
   новую спецификацию файла. Компоненты в  отдельном  элементе
 
   спецификации файла в списке поиска не используются как зна-
 
   чения по умолчанию для последующих элементов в этом  списке
 
   поиска;
 
        2) когда используется список поиска, СУД-32 игнорирует
 
   следующие ошибки во время поиска подходящего файла:
 
          - неверное имя устройства (RMS$_DEV);
 
          - устройство   не   готово   или   не   смонтировано
 
            (RMS$_DNR);
 
          - каталог не найден (RMS$_DNF);
 
 
                            - 203 -
 
                         00152-01 92 01
 
 
          - файл не найден (RMS$_FNF);
 
          - нарушение привелегий (RMS$_PRV).
 
 
        Все другие ошибки, такие как ошибка синтаксиса  специ-
 
   фикации файла (RMS$_SYN) не игнорируются и приводят к тому,
 
   что обработка списка поиска заканчивается;
 
        3) когда спецификация файла в списке  поиска  содержит
 
   другой (вложенный) список поиска, то спецификации файлов во
 
   вложенном списке поиска используются до следующей  специфи-
 
   кации файла в списке поиска высшего уровня. Таким  образом,
 
   итерационная подстановка допускается так же, как и для дру-
 
   гих логических имен. Например, рассмотрим два списка поиска
 
   X и Y:
 
 
        $ DEFINE X DISK1:[RED],DISK2:[WHITE]
 
        $ DEFINE Y X,DISK1:[BLUE]
 
 
        Когда используется список поиска Y, порядок поиска для
 
   устройства и каталога следующий:
 
        DISK1:[RED];
 
        DISK2:[WHITE];
 
        DISK1:[BLUE];
 
        4) все возможности  исчерпываются,  когда  открывается
 
   некоторый файл до того, как возвращается некоторое  состоя-
 
   ние завершения по ошибке. Последняя использованная специфи-
 
   кация файла списка поиска будет  сопровождать  сообщение  о
 
   завершении по ошибке, если отображается некоторая  специфи-
 
   кация файла;
 
        5) если список поиска встречается в более,  чем  одной
 
   спецификации файла, заданной в программе, то элементы спис-
 
   ка поиска первичной спецификациии файла  всегда  изменяются
 
 
 
                            - 204 -
 
                         00152-01 92 01
 
 
   наиболее часто. Если спецификация файла по умолчанию содер-
 
   жит список поиска, то она изменяется менее часто, чем  спи-
 
   сок поиска спецификации файла, но более часто,  чем  список
 
   поиска спецификации связанного файла. Список поиска  специ-
 
   фикации связанного файла, если он задан, изменяется  наиме-
 
   нее часто. В следующем примере списка  поиска  в  первичной
 
   спецификации файла и другого списка в спецификации файла по
 
   умолчанию показано,  что  список  поиска  первичной  строки
 
   изменяется наиболее часто:
 
 
        $ DEFINE PRIM DISK1,DISK2
 
        $ DEFINE DEF [BIG],[BEST]
 
 
        Если, например, первичная спецификация файла  содержит
 
   PRIM:TEST (PRIM является списком  поиска),  а  спецификация
 
   файла по умолчанию содержит DEF:.DAT (DEF является  списком
 
   поиска), то организуется поиск, показанный в  табл.16  пол-
 
   ностью оттранслированных  спецификаций  файла  с  полностью
 
   примененными значениями по умолчанию.
 
                                                   Таблица 16
 
   ----------------------------------------------------------
   Первичная спе- ! Спецификация фай- ! Расширенная
   цификация файла! ла по умолчанию   ! строка
   (PRIM:TEST)    ! (DEF:.DAT)        !
   ----------------------------------------------------------
                  !                   !
        DISK1     !      [BIG]        ! DISK1:[BIG]TEST.DAT;
                  !                   !
        DISK2     !      [BIG]        ! DISK2:[BIG]TEST.DAT;
                  !                   !
        DISK1     !      [BEST]       ! DISK1:[BEST]TEST.DAT;
                  !                   !
        DISK2     !      [BEST]       ! DISK2:[BEST]TEST.DAT;
                  !                   !
 
        6) Когда список  поиска  используется  в  спецификации
 
   связанного файла  для  синтаксического  анализа  некоторого
 
   входного файла, то  необходима  специальная  обработка  для
 
 
 
                            - 205 -
 
                         00152-01 92 01
 
 
   того, чтобы использовать возможности DCL, связанные  с  так
 
   называемыми временными значениями по умолчанию.
 
 
 
        5.2.3.2. Соглашения синтаксического анализа  для
 
                 спецификации связанного файла
 
 
 
        Спецификация связанного файла  предоставляет  значения
 
   по умолчанию, когда задан некоторый блок  имени  связанного
 
   файла. Для того, чтобы использовать спецификацию связанного
 
   файла, в блоке доступа к файлу FAB должен быть задан  адрес
 
   блока имени первичного файла (в  поле  FAB$L_NAM),  и  этот
 
   блок имени должен задавать  адрес  блока  имени  связанного
 
   файла (в поле NAM$L_RLF). Блок имени связанного файла  дол-
 
   жен задавать адрес правильной спецификации файла в  резуль-
 
   тирующей строке (поля NAM$L_RSA и NAM$B_RSS). Обычно каждая
 
   операция СУД-32, отличная от операции PARSE, помещает такую
 
   спецификацию файла в результирующую строку. К таким  опера-
 
   циям относятся CREATE, DISPLAY, ENTER, OPEN и SEARCH.
 
        Пользователь  может  задать  использование  связанного
 
   файла в качестве спецификации входного файла или специфика-
 
   ции выходного файла при  помощи  установки  (синтаксический
 
   анализ спецификации выходного файла) или очистки (синтакси-
 
   ческий анализ входного файла) разряда режима синтаксическо-
 
   го анализа выходного файла (FAB$V_OFP) в поле режимов обра-
 
   ботки файла (FAB$L_FOP).
 
        Когда выполняется синтаксический  анализ  спецификации
 
   входного файла, можно иметь несколько блоков имен связанных
 
   файлов при помощи задания адреса второго блока  имени  свя-
 
   занного файла в поле NAM$L_RLF первого блока имени  связан-
 
   ного файла, адреса третьего блока имени связанного файла  в
 
 
                            - 206 -
 
                         00152-01 92 01
 
 
   поле NAM$L_RLF второго блока имени и так далее. Использова-
 
   ние  нескольких  блоков  имени  связанного  файла  особенно
 
   полезно для списков поиска. Один блок имени связанного фай-
 
   ла мог бы содержать некоторый тип файла  для  использования
 
   любой спецификацией файла в списке  файла,  другой  мог  бы
 
   содержать полную спецификацию файла, которая  была  создана
 
   при помощи первой спецификации файла  в  списке  поиска,  а
 
   третья могла бы содержать полную спецификацию  файла,  соз-
 
   данную при помощи второй спецификации файла в списке  поис-
 
   ка. Этот метод позволяет задавать "неприятные" значения  по
 
   умолчанию для спецификаций файла в некотором списке  поиска
 
   - характеристика,  связанная  с  командными  строками  DCL,
 
   которые содержат несколько спецификаций файлов.
 
        Термин "неприятное значение по умолчанию" просто озна-
 
   чает, что атрибуты спецификации файла из первой  специфика-
 
   ции файла применяются как значения по умолчанию для атрибу-
 
   тов следующей спецификации файлов, исключая  необходимость,
 
   например, в задании атрибута устройство для каждой специфи-
 
   кации файла, когда все файлы расположены на одном и том  же
 
   устройстве.
 
        Для того, чтобы некоторый список поиска  был  применен
 
   как спецификация связанного файла, данная спецификация свя-
 
   занного файла должна быть не действительной  результирующей
 
   строкой, а должна включать логическое  имя  данного  списка
 
   поиска. Спецификация связанного файла в этом случае  должна
 
   описывать первоначальную спецификацию файла. Например, сле-
 
   дующее определение списка поиска:
 
 
        $ DEFINE WORK DISK1:[MINE],DISK2:[GROUP]
 
 
 
 
 
                            - 207 -
 
                         00152-01 92 01
 
 
        Если прикладная программа  хочет  обрабатывать  списки
 
   входных файлов, такие как, например, WORK:A, B, то  следует
 
   задать строку WORK:A как спецификацию связанного  файла,  а
 
   не DISK2:[GROUP]а.DAT. Для того, чтобы выполнить  эту  спе-
 
   циальную обработку  имеются  подпрограммы  LIB$FIND_FILE  и
 
   LIB$FILE_SCAN. Подробная информация по данному вопросу при-
 
   ведена в документе [6].  Пример  обращения  к  подпрограмме
 
   LIB$FIND_FILE приведен в подразделе 4.3.
 
 
 
        5.2.3.3. Синтаксический   анализ    спецификации
 
                 входного файла
 
 
        Когда разряд синтаксического анализа  выходного  файла
 
   (FAB$V_OFP) в поле режимов обработки файла (FAB$L_FOP) очи-
 
   щен и не задано имя узла, то СУД-32 обрабатывает специфика-
 
   цию связанного файла как спецификацию  некоторого  входного
 
   файла (см. табл.17). Единственным допустимым символом обоб-
 
   щения является один знак звездочки.
 
                                                   Таблица 17
 
   ----------------------------------------------------------
   Атрибут      ! Спецификация пустого ! Спецификация поля
   спецификации ! поля                 ! символа обобщения
   файла        !                      ! (*)
   ----------------------------------------------------------
                !                      !
   Узел         !   Используется специ-!    Запрещена
                ! фикация связанного   !
                ! файла                !
                !                      !
   Устройство   !   Используется специ-!    Запрещена
                ! фикация связанного   !
                ! файла                !
                !                      !
   Каталог      !   Используется специ-!    Остается символом
                ! фикация связанного   !  обобщения
                ! файла                !
                !                      !
   Имя файла    !   Используется специ-!    Остается символом
                ! фикация связанного   !  обобщения
                ! файла                !
                !                      !
 
 
                            - 208 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 17
   ----------------------------------------------------------
   Атрибут      ! Спецификация пустого ! Спецификация поля
   спецификации ! поля                 ! символа обобщения
   файла        !                      ! (*)
   ----------------------------------------------------------
                !                      !
   Тип          !   Используется специ-!    Остается символом
                ! фикация связанного   !  обобщения
                ! файла                !
                !                      !
   Версия       !   Остается пустой    !    Остается символом
                !                      !  обобщения
                !                      !
 
        Когда разряд FAB$V_OFP в поле FAB$L_FOP очищен и зада-
 
   но имя узла, СУД-32  обрабатывает  спецификацию  связанного
 
   файла как спецификацию входного файла (см. табл.18).
 
                                                   Таблица 18
 
   ----------------------------------------------------------
   Атрибут      ! Спецификация пустого ! Спецификация поля
   спецификации ! поля                 ! символа обобщения
   файла        !                      ! (*)
   ----------------------------------------------------------
                !                      !
   Устройство   !   Остается пустой    !    Запрещена
                !                      !
   Каталог      !   Остается пустой    !    Остается символом
                !                      !  обобщения
                !                      !
   Имя файла    !   Используется специ-!    Остается символом
                ! фикация связанного   !  обобщения
                ! файла                !
                !                      !
   Тип          !   Используется специ-!    Остается символом
                ! фикация связанного   !  обобщения
                ! файла                !
                !                      !
   Версия       !   Остается пустой    !    Остается символом
                !                      !  обобщения
                !                      !
 
 
        5.2.3.4. Синтаксический   анализ    спецификации
 
                 выходного файла
 
 
        Когда разряд FAB$V_OFP в поле FAB$L_FOP  установлен  и
 
   не задано имя узла, СУД-32 обрабатывает  спецификацию  свя-
 
   занного  файла  как  спецификацию  выходного   файла   (см.
 
   табл.19).
 
 
                            - 209 -
 
                         00152-01 92 01
 
 
                                                   Таблица 19
 
   ----------------------------------------------------------
   Атрибут      ! Спецификация пустого ! Спецификация поля
   спецификации ! поля                 ! символа обобщения
   файла        !                      ! (*)
   ----------------------------------------------------------
                !                      !
   Узел         !   Остается пустой    !   Запрещена
                !                      !
   Устройство   !   Остается пустой    !   Запрещена
                !                      !
   Каталог      !   Остается пустой    !   Подстановка  из
                !                      ! спецификации связан-
                !                      ! ного файла с ограни-
                !                      ! чениями
                !                      !
   Имя файла    !   Используется специ-!   Подстановка   из
                ! фикация связанного   ! спецификации связан-
                ! файла                ! ного файла
                !                      !
   Тип          !   Используется специ-!   Подстановка   из
                ! фикация связанного   ! спецификации связан-
                ! файла                ! ного файла
                !                      !
   Версия       !   Остается пустой    !   Подстановка   из
                !                      ! спецификации связан-
                !                      ! ного  файла
                !                      !
 
        Когда разряд FAB$V_OFP в поле FAB$L_FOP  установлен  и
 
   имя узла задано, СУД-32 обрабатывает спецификацию связанно-
 
   го файла как спецификацию выходного файла (см. табл.20).
 
                                                   Таблица 20
 
   ----------------------------------------------------------
   Атрибут      ! Спецификация пустого ! Спецификация поля
   спецификации ! поля                 ! символа обобщения
   файла        !                      ! (*)
   ----------------------------------------------------------
                !                      !
   Устройство   !   Остается пустой    !   Запрещена
                !                      !
   Каталог      !   Остается пустой    !   Подстановка   из
                !                      ! спецификации связан-
                !                      ! ного файла с ограни-
                !                      ! чениями
                !                      !
   Имя файла    !   Используется специ-!   Подстановка   из
                ! фикация связанного   ! спецификации связан-
                ! файла                ! ного файла
                !                      !
   Тип          !   Используется специ-!   Подстановка   из
                ! фикация связанного   ! спецификации связан-
                ! файла                ! ного файла
                !                      !
 
 
                            - 210 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 20
   ----------------------------------------------------------
   Атрибут      ! Спецификация пустого ! Спецификация поля
   спецификации ! поля                 ! символа обобщения
   файла        !                      ! (*)
   ----------------------------------------------------------
                !                      !
   Версия       !   Остается пустой    !   Подстановка   из
                !                      ! спецификации связан-
                !                      ! ного файла
                !                      !
 
        Как уже указывалось, символ обобщения в некоторой спе-
 
   цификации выходного файла подвержен некоторым  синтаксичес-
 
   ким ограничениям:
 
        1) в спецификации выходного файла  допускаются  только
 
   символ звездочки и многоточие. Эти два символа обобщения не
 
   могут оба присутствовать в одной и той же спецификации свя-
 
   занного файла при задании выходного каталога за исключением
 
   того случая, когда задается спецификация каталога [*...];
 
        2) за спецификацией подкаталога, которая содержит сим-
 
   волы обобщения, не может следовать спецификация  подкатало-
 
   га, которая не содержит символ обобщения;
 
        3) при задании каталога в формате кода  идентификации,
 
   можно получать значения по умолчанию только от каталогов  в
 
   формате каталога кода идентификации пользователя;
 
        4) если каталог задан не в формате кода идентификации,
 
   значения по умолчанию можно получить только  от  каталогов,
 
   заданных не в формате кода идентификации пользователя;
 
        5) спецификации, в которых каталог задан не в  формате
 
   кода идентификации  пользователя,  состоящие  полностью  из
 
   символов обобщения, могут получать значения по умолчанию из
 
   спецификации связанного файла  с  каталогами,  заданными  в
 
   формате кода идентификации пользователя или  не  в  формате
 
   кода идентификации пользователя.
 
 
 
 
                            - 211 -
 
                         00152-01 92 01
 
 
        СУД-32 обрабатывает символы обобщения  в  спецификации
 
   выходного каталога следующим образом:
 
        1) если задается  выходной  каталог  с  использованием
 
   спецификации, которая состоит полностью из символов обобще-
 
   ния (допускаются только [*]  и  [*...]),  то  СУД-32  будет
 
   подставлять первый "маскированный" подкаталог из специфика-
 
   ции связанного файла. Эта подстановка позволяет  перемещать
 
   файлы из одного дерева каталога в другое  дерево  каталога,
 
   которое не является таким глубоким как первое дерево;
 
        2) если задается  выходной  каталог  с  заключительным
 
   многоточием (например, [A.B...]), то СУД-32 будет  подстав-
 
   лять весь "маскированный" подкаталог из  спецификации  свя-
 
   занного файла. Эта подстановка позволяет  перемещать  целые
 
   деревья подкаталога;
 
        3) блок связанного имени  должен  иметь  установленные
 
   разряды состояния соответствующего имени файла  в  разрядах
 
   поля состояния имени  файла  (NAM$L_FNB),  установленных  в
 
   соответствии с результирующей строкой для того, чтобы  поз-
 
   волить  системе  СУД-32  идентифицировать   "маскированную"
 
   часть данной результирующей строки.
 
 
 
        5.3. Соглашения  по  синтаксису  каталога  и
 
             конкатенация каталогов
 
 
        Одним из компонентов явно в спецификации файла являет-
 
   ся спецификация каталога. СУД-32 поддерживает два  соглаше-
 
   ния  или  типа  спецификаций  каталогов,  один  из  которых
 
   используется более часто, чем другой.
 
        Когда СУД-32 применяет значения по умолчанию с некото-
 
   рой спецификацией каталога в некоторой спецификации  файла,
 
 
 
                            - 212 -
 
                         00152-01 92 01
 
 
   то правила различаются в зависимости  от  того,  какой  тип
 
   спецификации каталога задан.  Для  доступа  к  каталогам  в
 
   наличии имеется два соглашения о синтаксисе каталога - нор-
 
   мальный  и  корневой.  Доступом  к  каталогу  по  умолчанию
 
   является нормальный синтаксис, то есть, можно задать  необ-
 
   ходимый каталог, используя синтаксис каталога, описанный  в
 
   документе [5].
 
 
 
        5.3.1. Использование  нормального   синтаксиса
 
               каталога
 
 
        На каждом дисковом томе имеется главный каталог файлов
 
   (MFD). Внутри каждого главного  каталога  файлов  создаются
 
   каталоги   верхнего   уровня   при   помощи   команды   DCL
 
   CREATE/DIRECTORY или эквивалентной системной  функции.  Под
 
   каждым каталогом верхнего уровня можно создать подкаталоги,
 
   на которые ссылаются из каталога верхнего уровня.
 
        Когда подкаталоги созданы, можно создать  подкаталоги,
 
   на которые будут ссылаться из  каждого  подкаталога.  Можно
 
   создать максимум семь  уровней  подкаталогов  под  заданным
 
   каталогом  верхнего  уровня.  Подкаталоги  ниже  некоторого
 
   каталога и подкаталоги внутри данных  подкаталогов  (и  так
 
   далее) все вместе называются деревом каталога.
 
        Базовая точка доступа по нормальному синтаксису  ката-
 
   лога может быть относительной к текущему положению в дереве
 
   каталога или некоторой абсолютной ссылкой, которая явно или
 
   по умолчанию устанавливает любые каталоги  верхнего  уровня
 
   или подкаталоги, необходимые для  идентификации  соответст-
 
   вующего каталога  или  подкаталога.  Абсолютная  ссылка  на
 
   каталог начинается с имени каталога.  Относительная  ссылка
 
 
 
                            - 213 -
 
                         00152-01 92 01
 
 
   на каталог начинается с дефиса (-) или точки (.) в качестве
 
   начальной части спецификации  каталога.  Абсолютная  ссылка
 
   может включать имя каталога верхнего уровня  и  одного  или
 
   более подкаталогов. Относительная ссылка на каталог состоит
 
   в использовании значений каталога и устройства по умолчанию
 
   для данного процесса, которые  устанавливаются  при  помощи
 
   использования команды SET DEFAULT языка DCL. Для  получения
 
   дополнительной информации по организации каталогов  следует
 
   обратиться к документу [5]. Относительная ссылка на каталог
 
   может быть в одной из нескольких  форм.  Например,  текущим
 
   положением в каталоге (каталоге по умолчанию  данного  про-
 
   цесса) является [MYFIL.MYDAT]. В этом случае:
 
        1) можно задать нижний уровень в данном дереве катало-
 
   га при помощи точки (.) для того, чтобы указать, что  теку-
 
   щее положение в каталоге ([MYFIL.MYDAT]) является префиксом
 
   к задаваемому каталогу. Например, когда задается каталог:
 
 
        [.DATA]
 
 
   то эта спецификация каталога комбинируется с текущим  поло-
 
   жением в каталоге для образования [MYFIL.MYDAT.DATA];
 
        2) можно задать более высокий или параллельный уровень
 
   в дереве каталога при помощи задания в начале  спецификации
 
   каталога дефиса (-) для того, чтобы  указать,  что  текущее
 
   положение в каталоге ([MYFIL.MYDAT]) является  префиксом  к
 
   заданному каталогу после увеличения на один уровень катало-
 
   га для каждого заданного дефиса. Например, указание
 
 
        [-]
 
 
   ссылается на каталог [MYFIL] поскольку один дефис  запраши-
 
   вает задание некоторого каталога на один уровень выше,  чем
 
 
                            - 214 -
 
                         00152-01 92 01
 
 
   текущее положение в каталоге.
 
        Следующая спецификация каталога ссылается  на  каталог
 
   [MYDAT.DAT1]:
 
 
        [-.DAT1]
 
 
        В этом случае осуществляется доступ к некоторому  под-
 
   каталогу [MYFIL.DAT1] каталога [MYFIL],  который  находится
 
   на одном и том же уровне  (параллельном)  в  данном  дереве
 
   каталога, что и текущее положение в каталоге по  умолчанию.
 
   Комбинация из дефиса (увеличение) и точки (уменьшение) дают
 
   возможность пересекать дерево каталога.  Могут  быть  также
 
   использованы два последовательных дефиса:
 
 
        [--.DAT2.DATA]
 
 
        В этом случае положение в  каталоге  увеличивается  на
 
   два уровня каталога и затем  спускается  на  два  уровня  к
 
   каталогу  [DAT2.DATA]  из  текущего  положения  в  каталоге
 
   [MYFIL.MYDAT];
 
        3) можно ссылаться на  текущее  положение  в  каталоге
 
   явно, задавая пустую спецификацию каталога:
 
 
        [ ]
 
 
        Эта спецификация  ссылается  на  текущее  положение  в
 
   каталоге [MYFIL.MYDAT].
 
        Имя каталога, которое является начальной частью  атри-
 
   бута Kаталог, всегда идентифицирует каталог верхнего уровня
 
   или рассматривается  как  некоторая  абсолютная  ссылка  на
 
   каталог. Например, атрибут [DATB]  ссылается  на  некоторый
 
   каталог верхнего уровня [DATB] вне зависимости от  текущего
 
   положения в каталоге по умолчанию.
 
 
                            - 215 -
 
                         00152-01 92 01
 
 
        В отличие от этого точка  или  дефис,  заданные  перед
 
   именем каталога, всегда ассоциируются с  некоторой  относи-
 
   тельной ссылкой на каталог.
 
        Обычно, если атрибут каталог в спецификации  файла  не
 
   задается, то используется текущий каталог по умолчанию  для
 
   данного процесса (что может быть изменено при помощи коман-
 
   ды SET DEFAULT языка DCL или операции  СУД-32  SYS$SETDIR).
 
   Аналогичным образом отсутствие имени устройства  указывает,
 
   что будет использовано текущее устройство по умолчанию  для
 
   данного процесса (SYS$DISK).
 
 
 
        5.3.2. Применение     корневого     синтаксиса
 
               каталога
 
 
        Соглашение о корневом синтаксисе каталога для  доступа
 
   к  каталогам  является  возможным  благодаря  использованию
 
   скрытых логических имен устройства. Использование корневого
 
   синтаксиса каталога позволяет программам  (или  процедурам)
 
   ссылаться на деревья каталога как на логические  устройства
 
   и каталоги верхнего уровня.  Ссылка  на  некоторый  каталог
 
   верхнего уровня  в  действительности  организует  доступ  к
 
   существующим подкаталогам без модификации программы.  Таким
 
   образом, корневой синтаксис  каталога  расширяет  гибкость,
 
   связанную  с  логическими  именами.  Аналогичным   образом,
 
   использование корневого синтаксиса каталога может уменьшить
 
   число каталогов верхнего уровня, необходимых для некоторого
 
   дискового тома. Другим важным использованием корневого син-
 
   таксиса каталога является  возможность  существования  нес-
 
   кольких деревьев на одном системном томе.
 
        Корневой синтаксис каталога задается с  использованием
 
 
 
                            - 216 -
 
                         00152-01 92 01
 
 
   конкретного типа логического имени или некоторой специфика-
 
   ции файла, заданной в программе, или атрибутами  устройство
 
   и/или каталог в команде SET DEFAULT языка DCL.  Если  прог-
 
   рамма задает некоторое логическое имя устройства в специфи-
 
   кации файла, то данное логическое имя может быть  переопре-
 
   делено для того, чтобы задать некоторое логическое имя кор-
 
   невого каталога, что изменяет каталог (и файл или файлы), к
 
   которому (которым) осуществляется доступ  в  программе  без
 
   модификации программы.
 
        Если программа не задает логическое имя  устройства  в
 
   спецификации файла, то с терминала или в командной процеду-
 
   ре можно ввести команду DEFINE и  команду  SET  DEFAULT  до
 
   запуска данной программы, с целью указания на использование
 
   корневого синтаксиса каталога и задания устройства и  ката-
 
   лога по умолчанию для процесса. Такое использование команды
 
   SET DEFAULT изменяет каталог, к которому осуществляет  дос-
 
   туп данная программа. При этом, после того,  как  программа
 
   завершит работу, следует использовать команду  SET  DEFAULT
 
   для задания новых устройств и  каталога  по  умолчанию  для
 
   процесса и возобновить использование нормального синтаксиса
 
   каталога (если это необходимо).
 
        Исключая необходимость модификации программы, ее  пов-
 
   торная компиляция, компоновка и отладка не нужны.
 
 
 
        5.3.3. Использование   корневого    синтаксиса
 
               каталога
 
 
        Корневой синтаксис каталога определяет использование в
 
   качестве каталога для процесса собственно главного каталога
 
   тома MFD, а не конкретно  заданного  каталога.  Подкаталоги
 
 
 
                            - 217 -
 
                         00152-01 92 01
 
 
   корневого  каталога  являются  каталогами  низшего   уровня
 
   (каталоги файлов пользователя) для данного логического дис-
 
   кового тома.
 
        Каталог, заданный  во  время  определения  логического
 
   имени, выполняет функцию некоторой базы, относительно кото-
 
   рой осуществляется доступ к каталогам вниз по дереву  ката-
 
   лога, и этот каталог называется корневым каталогом. Скрытое
 
   логическое имя, которое определяет не  только  скрытое  имя
 
   устройства, но и скрытый корневой каталог, называется логи-
 
   ческим именем корневого устройства.
 
        При определении скрытого логического  имени  корневого
 
   устройства для последующего использования в программе или в
 
   команде SET DEFAULT, в соответствующей команде DCL  (ASSIGN
 
   или         DEFINE)          задается          квалификатор
 
   /TRANSLATION_ATTRIBUTES=CONCEALED. Для того, чтобы  опреде-
 
   лить скрытое логическое имя устройства  как  имя  корневого
 
   устройства, корневой  каталог  должен  содержать  последним
 
   символом точку (.), например,  DUA22:[ROOT.].  Спецификация
 
   каталога с последним символом точка допускается только  для
 
   корневого каталога.
 
        Если был определен корневой каталог,  все  последующие
 
   ссылки на каталог будут указывать на этот заданный корневой
 
   каталог или на любой из каталогов в данном дереве  каталога
 
   ниже корневого каталога. Как часть соглашений по синтаксису
 
   корневого каталога нормальная  ссылка  на  каталог  высшего
 
   уровня вместо этого ссылается  на  некоторый  подкаталог  в
 
   заданном корневом каталоге,  когда  используется  синтаксис
 
   корневого каталога. Это согласуется с тем фактом, что  кор-
 
   невой каталог представляется как  главный  каталог  файлов.
 
   Ссылка на каталог [000000],  при  использовании  синтаксиса
 
 
                            - 218 -
 
                         00152-01 92 01
 
 
   корневого каталога, указывает на корневой  каталог.  Анало-
 
   гичным образом, корневой каталог отображается  как  каталог
 
   [000000] по команде SHOW DEFAULT и другим командам. Следует
 
   отметить, что спецификация каталога [0,0] не является  вер-
 
   ным эквивалентом, когда  используется  синтаксис  корневого
 
   каталога. К реальному имени корневого каталога доступ  осу-
 
   ществить нельзя.
 
        Пусть, например, каталог верхнего  уровня  [ROOT1]  на
 
   диске DUA7 содержит некоторый подкаталог [ROOT1.SUB]. Ката-
 
   лог [ROOT1] определяется как корневой  каталог,  ассоцииро-
 
   ванный с логическим именем BASE, следующим образом:
 
 
        DUA7:[ROOT1.]
 
 
        Можно ссылаться на каталог [ROOT1.SUB], используя син-
 
   таксис BASE:[SUB]. В табл.21 приводится реальный  доступ  к
 
   каталогу и эквивалентный синтаксис корневого каталога, при-
 
   менимый к этому примеру.
 
                                                   Таблица 21
 
   ----------------------------------------------------------
   Реальный каталог ! Корневой синтаксис !    Комментарий
   ----------------------------------------------------------
                    !                    !
   DUA7:[ROOT1]     ! BASE:[000000]      !   Каталог  [ROOT1]
                    !                    ! представляется как
                    !                    ! главный    каталог
                    !                    ! файлов
                    !                    !
   DUA7:[ROOT1.SUB] ! BASE:[SUB]         !   Каталог
                    !                    ! [ROOT1.SUB] предс-
                    !                    ! тавляется как  не-
                    !                    ! который    каталог
                    !                    ! верхнего   уровня
                    !                    !
 
        В следующем примере показано, как  в  действительности
 
   определить корневое логическое имя и как осуществить доступ
 
   к некоторому  подкаталогу  в  заданном  корневом  каталоге.
 
   Отметим, что имя устройства должно  быть  некоторым  именем
 
 
                            - 219 -
 
                         00152-01 92 01
 
 
   физического устройства, и что  конечный  символ  "точка"  в
 
   конце имени каталога [ROOT1.] указывает на задание  некото-
 
   рого корневого каталога.
 
 
        П р и м е р.
 
 
   $ DEFINE/TRANSLATION_ATTR=CONCEALED BASE DUA7:[ROOT1.]
   $ SET DEFAULT BASE:[SUB]
   $ DIRECTORY *.DIR.[-]*.DIR
 
       BASE:[SUB]
       SUBSUB.DIR
       BASE:[000000]
       SUB.DIR
 
        В этом примере команда SET DEFAULT определяет  каталог
 
   [ROOT1.SUB] как каталог по умолчанию для процесса,  исполь-
 
   зуя логическое имя  корневого  устройства  BASE.  Следующая
 
   команда DIRECTORY ищет файлы каталога (с типом  файла  DIR)
 
   внутри текущего каталога ([ROOT1.SUB]) и затем в  следующем
 
   каталоге   более   высокого   уровня   ([ROOT1]).   Каталог
 
   [ROOT1.SUB] выводится (при помощи  команды  DIRECTORY)  как
 
   некоторый каталог высшего уровня (BASE:[SUB]),  а  корневой
 
   каталог выводится, используя  синтаксис  главного  каталога
 
   файлов, как BASE:[000000]. Логическое имя BASE отображается
 
   потому, что оно является скрытым.
 
 
 
        5.3.4. Конкатенация   спецификаций    корневых
 
               каталогов
 
 
        Синтаксические  правила,  которые  использует  СУД-32,
 
   когда выполняется конкатенация спецификаций  каталогов  для
 
   синтаксиса корневого каталога, отличаются от правил,  кото-
 
   рые использует СУД-32 при нормальном  синтаксисе  каталога.
 
   Одно различие между двумя соглашениями связано  с  заключи-
 
   тельным символом точки в  определении  корневого  каталога.
 
 
                            - 220 -
 
                         00152-01 92 01
 
 
   например, рассмотрим, как обрабатывается  некоторая  ссылка
 
   на каталог верхнего уровня.  При  использовании  синтаксиса
 
   корневого каталога заключительная точка в корневом каталоге
 
   означает начальную точку в последующих ссылках на  корневой
 
   каталог.
 
        Конкатенация каталогов внутри одной и той же  специфи-
 
   кации файла происходит только с  использованием  некоторого
 
   логического имени корневого устройства. Нормальная конкате-
 
   нация каталогов происходит  только  посредством  применения
 
   значений  по  умолчанию.  Конкатенация  корневых  каталогов
 
   может произойти внутри одной и той же спецификации файла  и
 
   через применение значений по  умолчанию.  Логические  имена
 
   корневых устройств связаны с именами устройства и корневого
 
   каталога. СУД-32 транслирует логическое имя корневого  уст-
 
   ройства образуя атрибуты устройство и корневой  каталог  до
 
   того, как она об'единяет любые другие части некоторой  спе-
 
   цификации файла (если они заданы) в эквивалентную  специфи-
 
   кацию файла.
 
        Когда некоторое логическое  имя  корневого  устройства
 
   используется в комбинации с некоторой спецификацией катало-
 
   га, то применяются следующие правила:
 
        1) можно ссылаться на сам корневой каталог.  Синтаксис
 
   [000000] и некоторые относительные ссылки на каталог указы-
 
   вают на корневой каталог, когда используется синтаксис кор-
 
   невого каталога.
 
        Ссылаться на некоторый каталог, уровень которого  выше
 
   уровня заданного  корневого  каталога,  когда  используется
 
   синтаксис корневого каталога, нельзя. Таким образом, корне-
 
   вой каталог представляется как главный каталог файлов  тог-
 
   да, когда используется некоторая  последующая  спецификация
 
 
                            - 221 -
 
                         00152-01 92 01
 
 
   каталога. Например, когда каталог по умолчанию для процесса
 
   пользователя является корневым  каталогом  (пример  1),  то
 
   ссылка [-] дает в результате ошибку.
 
 
        П р и м е р 1.
 
 
   $ DEFINE/TRANSLATION=CONCEALED BASE DUA7:[ROOT1.]
   $ SET DEFAULT BASE
   $ DIRECTORY *.DIR
 
   BASE:[000000]
 
   NO FILES FOUND
 
   $ DIRECTORY [-]*.DIR
   %DIRECT-E-OPENING, ERROR OPENING
   -RMS-E-DIR, ERROR IN DIRECTORY NAME
 
        2) можно ссылаться на некоторый конкретный  подкаталог
 
   корневого каталога, аналогично ссылке на  каталог  верхнего
 
   уровня, используя нормальный синтаксис каталога (пример 2).
 
 
        П р и м е р 2.
 
 
   $ DеFINE/TRANSLATION_ATTR=CONCEALED BASE DUA7:[ROOT1.]
   $ SET DEFAULT BASE:[SUBDIR]
 
        3) можно ссылаться на любой подкаталог в данном дереве
 
   каталога ниже корневого каталога.  Для  пересечения  дерева
 
   каталога применяются символы Oбобщения. Можно ссылаться  на
 
   все каталоги ниже корневого каталога [*...], на все катало-
 
   ги на один уровень ниже  корневого  каталога  [*],  на  все
 
   каталоги на два уровня  ниже  корневого  каталога  [*.*]  и
 
   использовать другие комбинации (пример 3).
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 222 -
 
                         00152-01 92 01
 
 
        П р и м е р 3.
 
 
   $ DEFINE/TRANSLATION_ATTR=CONCEALED BASE DUA7:[ROOT1.]
   $ DIR BASE:[*...]*.DIR
 
   BASE:[SUBDIR]
       SUBSUBDIR.DIR
   BASE:[SUBDIR.SUBSUBDIR]
       SUBSUBSUBDIR.DIR
   BASE:[OTHERSUB]
       OTHERSUBSUB.DIR
 
        Устройство и каталог по умолчанию для процесса исполь-
 
   зуются неявно как значения по умолчанию. Расширенное  логи-
 
   ческое имя корневого устройства для устройства и  корневого
 
   каталога используется до значений  по  умолчанию  для  уст-
 
   ройства и каталога процесса. Можно использовать такой отно-
 
   сительный синтаксис каталога, как дефис  (-)  и  лидирующая
 
   точка (.имя). Когда атрибут каталог опущен, СУД-32 пытается
 
   использовать каталог по умолчанию для процесса.
 
        Например, логическое имя корневого устройства X, кото-
 
   рое определяется следующим образом:
 
 
        $ DEFINE/TRANSLATION_ATTR=CONCEALED X DJB3:[USER.]
 
 
        Когда логическое имя корневого  устройства  X  исполь-
 
   зуется в комбинации с некоторой спецификацией каталога,  то
 
   все ссылки на каталог являются относительными по  отношению
 
   к   корневому   каталогу   [USER].   Большинство   символов
 
   Oбобщения, которые применяются для  нормального  синтаксиса
 
   каталога, также применяются и к синтаксису корневого  ката-
 
   лога. В табл.22 приведены комбинации логического имени кор-
 
   невого устройства X и различных имен  каталогов  с  текущим
 
   каталогом по умолчанию для процесса  DJB3:[USER], осущеСТВ-
 
   ляющего доступ к каталогам.
 
 
 
 
 
                            - 223 -
 
                         00152-01 92 01
 
 
                                                   Таблица 22
 
   ----------------------------------------------------------
   Спецификация ! Реальные каталоги, к которым осуществляется
   файла        ! доступ
   ----------------------------------------------------------
                !
   X:           ! [USER.USER1]
                !
   X:[0000000]  ! Корневой каталог [USER]
                !
   X:[]         ! [USER.USER1]
                !
   X:[-]        ! Корневой каталог [USER], распечатываемый
                ! как X:[000000]
                !
   X:[_]        ! Запрещено (ошибка) - подчеркивание вместо
                ! дефиса
                !
   X:[имя]      ! [USER.имя]
                !
   X:[.имя]     ! [USER.USER1.имя]
                !
   X:[имя.*...] ! Все каталоги во всех деревьях каталогов
                ! ниже каталога [USER.имя]
                !
   X:[*]        ! Все каталоги на один уровень ниже каталога
                ! [USER]
                !
   X:[*...]     ! Все каталоги во всех деревьях каталога ниже
                ! каталога [USER]
                !
   X:[...]      ! Все каталоги во всех деревьях каталога ниже
                ! каталога [USER.USER1]
                !
 
        Следует отметить, что каталог по умолчанию для процес-
 
   са используется тогда, когда заданный каталог явлется неко-
 
   торой относительной  ссылкой  на  каталог.  Это  происходит
 
   из-за того, что заданное имя каталога содержит ведущую точ-
 
   ку или дефис.
 
 
 
        5.3.5. Пример использования корневого каталога
 
 
        Рассмотрим систему, состоящую из нескольких  программ,
 
   которые ссылаются на один и тот же файл, используя специфи-
 
   кацию файла IN:[INVENTORY]FILE.DAT. Перед  этим  логическое
 
   имя IN было определено как DUA29.
 
 
 
                            - 224 -
 
                         00152-01 92 01
 
 
        Каждая из этих программ была предварительно вызвана  с
 
   использованием некоторой командной процедуры, которая пере-
 
   назначает логическое имя IN на DISK1, как  это  показано  в
 
   примере 1.
 
 
        П р и м е р 1.
 
 
   $     ON CONTROL_Y THEN GOTO ENDIT
   $     DEFINE IN DUA29:
   $     RUN XYZPROG
   $ ENDIT:
   $     EXIT
 
        Предположим, что данные программы используются многими
 
   пользователями для отображения текущего  уровня  запасов  и
 
   текущего состояния  на  складе  по  некоторому  конкретному
 
   изделию. По мере роста числа изделий на складе и соответст-
 
   вующего  роста  числа  записей  об  этих  изделиях,  размер
 
   используемого файла увеличивается, что сказывается на  вре-
 
   мени доступа к нему. Поскольку имеется естественное разбие-
 
   ние изделий по типам, примерно на четыре  части,  то  имеет
 
   смысл разделить данный  файл.  Для  этой  цели  разработана
 
   программа, которая читает каждую запись  в  большом  файле,
 
   определяет ее тип и заносит запись в  соответствующий  файл
 
   на соответствующем устройстве.  Каждый  выходной  файл  был
 
   назван FILE.DAT, но размещен в отдельном каталоге  верхнего
 
   уровня, связанным  с  соответствующей  категорией  изделий.
 
   Например, файлы с запасными частями для эвм каталогизируют-
 
   ся в каталоге [COMPUTER.INVENTORY].
 
        Командная процедура  модифицирована  для  того,  чтобы
 
   запрашивать тип необходимых частей, что условно  определяет
 
   значение IN, как некоторое логическое  имя  корневого  уст-
 
   ройства с соответствующим корневым каталогом верхнего уров-
 
   ня. Например,  если  с  терминала  запрашивается  некоторая
 
 
                            - 225 -
 
                         00152-01 92 01
 
 
   запасная часть эвм, то внутри  данной  командной  процедуры
 
   выполняется следующая команда DCL:
 
 
      $ DEFINE/TRANSLATION_ATTR=CONCEALED IN DU29:[COMPUTER.]
 
 
        Таким образом, данная программа осушествляет доступ  к
 
   файлу IN:[INVENTORY]FILE.DAT, как  и  раньше,  но  указание
 
   логического имени IN приводит к  тому,  что  осуществляется
 
   доступ к файлу DUA29:[COMPUTER.INVENTORY]FILE.DAT, а  не  к
 
   DUA29:[INVENTORY]FILE.DAT. Данный набор программ никогда не
 
   придется изменять,  повторно  компилировать  и  копировать.
 
   Усложняется только командная процедура, которая показана  в
 
   примере 2 синтаксиса корневого каталога.
 
 
        П р и м е р 2.
 
 
   $ ON CONTROL_Y THEN GOTO END
   $    GOTO ASK
   $ RETRY:
   $    WRITE SYS$OUTPUT "ввести число в диапазоне от 1 до 4
        Для типа"
 
   $ ASK:
   $    WRITE SUS$OUTPUT -
        "ввести тип: 1-эвм 2-телевизоры 3-радиоприемники
        4-другие 5-выход"
   $    INQUIRE ANS
 
   $ IF ANS .GT. 5 .OR. ANS .LT. 1 THEN GOTO RETRY
   $ IF ANS .EQ. 5 THEN EXIT
   $ IF ANS .EQ. 1 THEN DEFINE/TRANS=CONCEAL IN -
                                            DUA29:[COMPUTER.]
   $ IF ANS .EQ. 2 THEN DEFINE/TRANS=CONCEAL IN -
                                          DUA29:[TYPEWRITER.]
   $ IF ANS .EQ. 3 THEN DEFINE/TRANS=CONCEAL IN DUA29:[DESK.]
   $ IF ANS .EQ. 4 THEN DEFINE/TRANS=CONCEAL IN -
                                               DUA29:[OTHER.]
   $ RUN XYZPROG
   $ END:
   $ EXIT
 
 
 
 
 
 
 
 
 
                            - 226 -
 
                         00152-01 92 01
 
 
        5.4. Использование  файлов,  постоянных  для
 
             процесса
 
 
        Файл, постоянный для процесса, является таким  файлом,
 
   который открыт или создан  посредством  СУД-32  программой,
 
   работающей в режиме "супервизор" или "управляющая  програм-
 
   ма",  когда   разряд   постоянного   для   процесса   файла
 
   (FAB$V_PPF) установлен  в  поле  режимов  обработки  файлов
 
   (FAB$L_FOP). Это приводит к тому, что внутренние  структуры
 
   данных, поддерживаемые СУД-32, будут распределяться в неко-
 
   торой области памяти в управляющей области данного  процес-
 
   са  и  будут   оставаться   распределенными  в течении все-
 
   го времени существования данного процесса.  Таким  образом,
 
   файлы, постоянные для процесса, могут оставаться  открытыми
 
   при запуске в контексте процесса  различных  образов.  Так,
 
   все файлы SYS$COMMAND, SYS$INPUT,  SYS$OUTPUT  и  SYS$ERROR
 
   открыты  этим  способом  при   помощи   системного   образа
 
   LOGINOUT.
 
        Файлы, открытые для обработки посредством  использова-
 
   ния команды OPEN языка DCL, также являются  открытыми  этим
 
   же способом. Непосредственно осуществлять доступ к  файлам,
 
   постоянным для процесса, из программы, работающей в  режиме
 
   "пользователь" нельзя. Можно, однако, осуществлять доступ к
 
   ним косвенно. СУД-32 предоставляет  некоторое  подмножество
 
   общих доступных операций для косвенного доступа.
 
        Косвенный доступ к файлам,  постоянным  для  процесса,
 
   осуществляется через  механизм  логических  имен  следующим
 
   образом:
 
        1) командный образ LOGINOUT  (или  в  некоторый  более
 
   поздний момент интерпретатор команд) открывает или  создает
 
 
 
                            - 227 -
 
                         00152-01 92 01
 
 
   некоторый файл, соответствующий  потокам  команд  процесса,
 
   входных сообщений,  выходных  сообщений  или  сообщений  об
 
   ошибках. Логические имена создаются  в  таблице  логических
 
   имен  данного  процесса  соответственно  для   SYS$COMMAND,
 
   SYS$INPUT, SYS$OUTPUT и SYS$ERROR. Эквивалентная строка для
 
   данного логического имени имеет некоторый специальный  фор-
 
   мат, который указывает на соответствие между  данным  логи-
 
   ческим именем и связанным файлом, постоянным для  процесса.
 
   Для получения более подробной информации, касающейся форма-
 
   та эквивалентных строк для логических имен,  следует  обра-
 
   титься к документу [5]. Например, для интерактивного  поль-
 
   зователя эти единственные файлы, постоянные  для  процесса,
 
   открываются для данного терминала;
 
        2) когда при косвенном доступе  открывается  или  соз-
 
   дается некоторый файл, задающий  логическое  имя,  которому
 
   соответствует одна из этих специальных эквивалентных строк,
 
   то СУД-32 распознает это и, следовательно, не открывает или
 
   не создает новый файл. Вместо этого, возвращенное  значение
 
   для данного внутреннего идентификатора файла  (и,  позднее,
 
   значение внутреннего идентификатора потока  при  выполнении
 
   операции CONNECT) устанавливается для того, чтобы  указать,
 
   что доступ к соответствующему файлу, постоянному  для  про-
 
   цесса, осуществляется при  помощи  косвенного  подмножества
 
   допустимых функций.
 
        Характерные черты косвенного доступа следующие:
 
        1) операция CREATE (создание) для  файла,  постоянного
 
   для процесса, становится операцией OPEN (открытие). Поля  в
 
   блоке доступа к файлу заполняются в соответствии  с  описа-
 
   нием операции OPEN , а не CREATE;
 
 
 
 
                            - 228 -
 
                         00152-01 92 01
 
 
        2) операция OPEN или CREATE не требует никаких  опера-
 
   ций ввода-вывода;
 
        3) допускается любое число косвенных операций  OPEN  и
 
   CREATE;
 
        4) имеется только один  контекст  местонахождения  для
 
   данного файла. Каждая последовательность операций OPEN  или
 
   CREATE осуществляет доступ к одному и тому же потоку , а не
 
   к независимым потокам;
 
        5) если файл, постоянный для  процесса,  был  первона-
 
   чально      открыт      с      установленным       разрядом
 
   "только-последовательная-обработка"  (FAB$V_SQO)   в   поле
 
   FAB$L_FOP, то не разрешается ни прямой доступ, ни  операция
 
   REWIND (перемотка).  Этот  случай  применяется  для  файлов
 
   SYS$COMMAND, SYS$INPUT, SYS$OUTPUT и SYS$ERROR;
 
        6) некоторые режимы для различных операций приводят  к
 
   ошибкам. Например, нельзя установить для  операций  OPEN  и
 
   CREATE  в  поле  FAB$L_FOP  разряды  "не-файловая-структура
 
   (FAB$V_NES),   "открыт-файл-пользователя"      (FAB$V_UFO),
 
   "файл-постоянный-для-процесса"        (FAB$V_PPF)         и
 
   "неструктурированный-файл" (FAB$V_NFS) для операции OPEN  и
 
   CREATE.  Другие  режимы,  например,  задаваемые   разрядами
 
   "спул"  (FAB$V_SPL),  "файл-запуска-команд"  (FAB$V_SCF)  и
 
   "удаление" (FAB$V_DLT) в поле FAB$L_FOP для операции CLOSE,
 
   разрядом "асинхронный" (RAB$V_ASY) в поле RAB$L_FOP и поля-
 
   ми мультиблочного и мультибуферного коэффицента  (RAB$B_мBC
 
   и RAB$B_MBF), игнорируются;
 
        7) если используется блок имени файла,  и  выдана  или
 
   расширенная или результирующая строка  спецификации  файла,
 
   то данная строка состоит только из логического  имени  про-
 
   цесса,  за  которым  следует   двоеточие   (как,  например,
 
 
                            - 229 -
 
                         00152-01 92 01
 
 
   SYS$INPUT:);
 
        8) поле доступа к файлу (FAB$B_FAC)  игнорируется  при
 
   выполнении операции OPEN. Тип операции проверяется несмотря
 
   на поле FAB$B_FAC,  заданное  для  первоначальной  операции
 
   OPEN или CREATE;
 
        9) информация из поля атрибутов записи сохраняется при
 
   каждом обращении к операции CONNECT в значениях,  возможных
 
   в полях внутреннего идентификатора  потока.  Если  выходной
 
   файл является файлом для печати (переменный формат  с  пос-
 
   тоянной управляющей частью и разряд FAB$V_PRN установлен  в
 
   поле атрибутов записи), то при каждом обращении к  операции
 
   PUT формат  управления  кареткой,  заданный  пользователем,
 
   преобразуется в формат управления  кареткой  файла  печати.
 
   Таким образом, все различные типы управления  кареткой  при
 
   различных косвенных обращениях  к  операции  OPEN  работают
 
   условно;
 
        10) выполняется  проверка  на  $DECK,  $EOD  и  другие
 
   команды со знаком "($)"  в  потоке  SYS$INPUT,  если  поток
 
   SYS$INPUT организован  из  некоторого  файла.  Проверка  не
 
   выполняется, если SYS$INPUT приходит с некоторого устройст-
 
   ва, ориентированного на записи, такого,  как  терминал  или
 
   почтовый ящик;
 
        11) в момент завершения образа управляющая подпрограм-
 
   ма завершения СУД-32 гарантирует, что косвенный  ввод-вывод
 
   для файлов, постоянных для процесса, закончился, однако эти
 
   файлы не закрываются;
 
        12) файлы, независимо от их  организации,  могут  быть
 
   открыты как файлы, постоянные для процесса (например,  пос-
 
   редством команды OPEN языка DCL), но косвенный доступ может
 
   быть осуществлен только к тем файлам, которые имели  после-
 
 
                            - 230 -
 
                         00152-01 92 01
 
 
   довательную организацию.
 
 
 
 
               6. РАЗДЕЛЕНИЕ ФАЙЛОВ И БУФЕРИЗАЦИЯ
 
 
 
        В  этом  разделе  описаны  режимы  работы   программы,
 
   использующей СУД-32, которые доступны, при открытии некото-
 
   рого файла, создании потоков доступа к записям (обычно, как
 
   часть оператора OPEN  в  языках  программирования  высокого
 
   уровня), закрытии файла и связанные с использованием разде-
 
   ляемых файлов. Эти режимы также применяются,  при  создании
 
   файла, поскольку операция CREATE включает операцию открытия
 
   файла, которая использует данные режимы в момент выполнения
 
   программы или явно или по умолчанию.
 
        Чтобы открыть файл, пользователь запустивший на выпол-
 
   нение программу должен иметь необходимые  права  доступа  к
 
   файлу. Права доступа операционной системы МОС ВП описаны  в
 
   документе [4].
 
        Разделение файла предусматривает указание типа доступа
 
   к файлу, возможность захвата записи и локальную или  разде-
 
   ляемую буферизацию. На рис.16 приведена схема использования
 
   разделяемого файла.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 231 -
 
                         00152-01 92 01
 
 
                Использование разделяемого файла
 
 
      ---------------   ---------------  ---------------
      ! Программа 1 !   ! Программа 2 !  ! Программа 3 !
      ---------------   ---------------  ---------------
                  \            !            /
                   \           !           /
                    \          !          /
                     \         !         /
                      \        !        /
                       \       !       /
                        \      !      /
                         \     !     /
                        ---------------
                        !   Файл а    !
                        ---------------
 
 
 
                            Рис. 16
 
 
 
 
        6.1. Разделение файла
 
 
        Разделение файлов в СУД-32 позволяет нескольким  поль-
 
   зователям осуществлять Oдновременный доступ к одному и тому
 
   же файлу. Одновременный  доступ  к  файлам  иногда  требует
 
   выполнения операций чтения-записи  над  файлом  несколькими
 
   программами. Возможность разделения файла  зависит  от  его
 
   устройства, организации и явного указания о разделении фай-
 
   ла, заданного в программах, осуществляющих доступ к файлу.
 
        Разделение обеспечивается только для дисковых файлов.
 
        Ограничений на разделение  относительных  и  индексных
 
   файлов, при любой комбинации операций  "чтения-записи"  над
 
   файлами не имеется. Кроме того, допускается разделение пос-
 
   ледовательных файлов с записями фиксированной длины, разме-
 
   ром по 512 байтов. Разделение для других  типов  последова-
 
   тельных файлов, однако,  разрешается  только  с  некоторыми
 
   ограничениями.
 
 
 
 
                            - 232 -
 
                         00152-01 92 01
 
 
        Хотя возможность  разделения  файла  определяется  его
 
   организацией, для практического выполнения разделения прик-
 
   ладная программа должна  задать  соответствующее  указание.
 
   Степень разделения файла контролируется  при  помощи  явной
 
   спецификации разделения, которая задается  для  СУД-32  при
 
   создании или открытии файла.  Эта  спецификация  указывает,
 
   какие типы операций могут  быть  выполнены  пользователями,
 
   разделяющими данный файл.
 
        В прикладной программе,  выполняющей  открытие  файла,
 
   необходимо сделать некоторые указания.  Во-первых,  необхо-
 
   димоу становить типы операций  СУД-32,  которые  необходимо 
 
   выполнить в данной программе, например, чтение, запись  или  
 
   корректировка. При этом производится проверка  на  допуСТИ-
 
   мость выполнения этих операций с учетом кода защиты данного 
 
   файла. Во-вторых, необходимо задать типы операций,  которые
 
   могут выполнять для данного файла одновременно другие прик-
 
   ладные программы. Комбинация этих указаний позволяет СУД-32
 
   определить, какие программы могут иметь  доступ  к  данному
 
   файлу. Когда спецификация разделения файлов одной программы
 
   совместима со спецификацией разделения другой программы, то
 
   обе программы могут получить одновременный доступ к данному
 
   файлу. Для того, чтобы гарантировать  получение  доступа  к
 
   файлу несколькими программами одновременно,  может  понадо-
 
   биться некоторое планирование.
 
 
 
        6.1.1. Типы разделения файла и потоки  доступа
 
               к записям
 
 
        Процесс одного пользователя может осуществить доступ к
 
   одному и тому же файлу, используя различные методы  доступа
 
 
 
                            - 233 -
 
                         00152-01 92 01
 
 
   к записям, т.е. организовать так называемые потоки  доступа
 
   к записям. Каждый поток доступа к записям  ассоциируется  с
 
   некоторым блоком управления записями (RAB), который опреде-
 
   ляет и поддерживает информацию, используемую для доступа  к
 
   записям в рамках данного потока.
 
        При проектировании прикладной программы следует  расс-
 
   мотреть, будет ли данный файл поддерживаться в  интерактив-
 
   ном режиме или как  некоторый  главный  файл,  периодически
 
   обновляемый файлами одной или нескольких транзакций. Значи-
 
   тельным  преимуществом  использования   последнего   метода
 
   является доступ к главному файлу в разделяемом режиме  мно-
 
   гих пользователей, что улучшает производительность системы.
 
   Если все пользователи только читают  данный  файл,  то  нет
 
   необходимости в захвате записей.  Исключение  необходимости
 
   захвата записей улучшает производительность,  особенно  для
 
   тех применений, в  которых  несколько  пользователей  будут
 
   осуществлять доступ к данному файлу. Для применений с режи-
 
   мом доступа к файлу только по  чтению  следует  рассмотреть
 
   возможность использования глобальных буферов, если их  поз-
 
   воляют использовать ресурсы системы.
 
        При необходимости доступа к записям с учетом последних
 
   по времени изменений, проведенных в них, операции модифика-
 
   ции и добавления записей должны выполняться как можно быст-
 
   рее для обеспечения возможности скорейшего  доступа  других
 
   программ к новой информации, содержащейся в таких записях и
 
   минимизации их захвата. Например, при интерактивной коррек-
 
   тировке записей с терминала выгодно минимизировать время, в
 
   течение которого данные записи остаются захваченными,  раз-
 
   решая другим программам доступ к этим  записям  только  "по
 
   чтению".
 
 
                            - 234 -
 
                         00152-01 92 01
 
 
        Двумя важными режимами, доступными в тот момент откры-
 
   тия файла, являются режимы доступа  к  файлу  и  разделение
 
   файла. Эти режимы задают тип доступа к записям для  данного
 
   процесса и тип доступа к записям для других процессов.  Они
 
   задаются при помощи атрибутов языка описания файла ACCESS и
 
   SHARING и полей блока FAB, идентифицируемых  символическими
 
   смещениями FAB$B_FAC и FAB$B_SHR. При создании или открытии
 
   файла, СУД-32 сравнивает значения этих полей для того, что-
 
   бы определить, может ли быть предоставлен  доступ  к  этому
 
   файлу для вызывающего процесса.
 
        Первый процесс, который осуществляет доступ  к  файлу,
 
   указывает, какие операции могут выполнять для  этого  файла
 
   другие процессы, что на практике определяет, разрешается ли
 
   последующим пользователям получить доступ к этому файлу или
 
   нет. Например, если процесс запрашивает конкретный тип дос-
 
   тупа, который другой процесс,  получивший  доступ  к  этому
 
   файлу, ранее не разрешил, то новый процесс доступ к данному
 
   файлу не получает.
 
        Определяя тип доступа к файлу для  других  пользовате-
 
   лей, можно  задать  тип  разделения  файла,  который  будет
 
   использоваться, указывая, могут ли другие  потоки  получить
 
   доступ к данному файлу в одно и то же время или нет.
 
        Каждый поток представляется некоторым блоком доступа к
 
   записям. Независимые потоки связываются с одним  единствен-
 
   ным файлом одним из следующих трех способов:
 
        1) для одного или нескольких процессов несколько  бло-
 
   ков доступа к файлу могут быть связаны с одним  разделяемым
 
   файлом. Один или более потоков могут  быть  присоединены  к
 
   каждому блоку доступа к файлу. Эта форма  разделения  файла
 
   носит название "блокируемое межпроцессное  разделение  фай-
 
 
                            - 235 -
 
                         00152-01 92 01
 
 
   ла", операции "чтения-записи" выполняются на  уровне  запи-
 
   сей, а не блоков;
 
        2) для одного и того  же  процесса  несколько  потоков
 
   могут быть связаны с одним единственным  блоком  доступа  к
 
   файлу для выполнения  операций  "чтения-записи"  на  уровне
 
   записей, а не блоков. Эта форма разделения файла называется
 
   "многопоточной";
 
        3) для одного или нескольких процессов несколько  бло-
 
   ков доступа к файлу могут быть связаны с одним файлом. Один
 
   поток (блок RAB) связывается с каждым блоком доступа к фай-
 
   лу, и процессы обеспечивают свою собственную  синхронизацию
 
   вне системы СУД-32. Эта форма разделения файла носит назва-
 
   ние  "блокируемое  пользователем  межпроцессное  разделение
 
   файла". Она обычно применяется только при выполнении опера-
 
   ций ввода-вывода на уровне блоков и при  обработке  записей
 
   последовательных файлов, располагающихся на  дисковых  уст-
 
   ройствах.
 
        Доступ к одному и тому же файлу может быть осуществлен
 
   от процессов при помощи блокируемого межпроцессного  разде-
 
   ления файлов  и  многопоточного  метода.  Не  рекомендуется
 
   одновременное  использование  блокируемого   межпроцессного
 
   разделения файла и блокируемого пользователем межпроцессно-
 
   го разделения файла, применительно к одному и тому же  фай-
 
   лу, если пользователь, который запрашивает блокируемое раз-
 
   деление файла, будет модифицировать  данный  файл.  Причина
 
   этого в том, что захват записи не будет сделан  или  он  не
 
   будет проверен для процесса (или процессов),  использующего
 
   блокируемое пользователем межпроцессное разделение файла.
 
        В зависимости от типа операций над  записями,  которые
 
   будут выполняться в контексте процесса, необходимо  опреде-
 
 
                            - 236 -
 
                         00152-01 92 01
 
 
   лить тип доступа, который процесс будет осуществлять к дан-
 
   ному файлу. Данные операции и соответствующие режимы  языка
 
   FDL и системы СУД-32 приводятся в табл.23.
 
                                                   Таблица 23
 
                      операции над записями
 
   ----------------------------------------------------------
    Операция СУД-32    ! Указания FDL и в блоке FAB
   ----------------------------------------------------------
                       !
   Получение (чтение) )!   Задано ACCESS GET  или  установлен
   записи (GET)        ! разряд  FAB$V_GET  в  поле FAB$B_FAC
                       !
   Поиск записи (FIND) !   Задано ACCESS GET  или  установлен
                       ! разряд  FAB$V_GET  в  поле FAB$B_FAC
                       !
   Исключение (удале-  !   Задано ACCESS DELETE или  установ-
   ние) записи (DELETE)! лен разряд FAB$V_DEL в поле FAB$в_FA
                       !
   Занесение (добавле- !   Задано ACCESS PUT  или  установлен
   ние) записи (PUT)   ! разряд  FAB$V_PUT  в  поле FAB$B_FAC
                       !
   Отсечение части     !   Задано ACCESS TRUNCATE  или разряд
   файла (TRUNCATE)    ! FAB$V_TRN  в  поле  FAB$B_FAC
                       !
   Замена (модификация)!   Задано ACCESS UPDATE или  установ-
   записи (UPDATE)     ! лен разряд FAB$V_UPD в поле FAB$B_FA
                       !
   Доступ к блокам     !   Задано ACCESS BLOCK_IO или   уста-
                       ! новлен  разряд  FAB$V_BIO    в  поле
                       ! FAB$B_FAC;
                       ! при некоторых условиях ACCESS
                       ! RECORD_IO или установлен разряд
                       ! FAB$V_BRO в поле FAB$B_FAC
                       !
 
        Перед выполнением  операций  над  записями  проводится
 
   проверка кода защиты файла.
 
        При выполнении операций поиска и чтения записей  необ-
 
   ходим доступ к файлу  по-чтению.  При  выполнении  операций
 
   занесения, иключения, отсечения и замены записей  необходим
 
   доступ по-записи. Доступ к  файлу  по-записи  автоматически
 
   определяет право доступа к файлу также и по-чтению.
 
        Для того, чтобы получить доступ  к  данным  на  уровне
 
   блоков, можно использовать операции  READ  (чтение),  SPACE
 
   (пропуск) и WRITE (записывание). Этот режим обычно  исполь-
 
 
                            - 237 -
 
                         00152-01 92 01
 
 
   зуется только прикладными программами, написанными на языке
 
   MAKрO. Отметим, что когда задан ACCESS BLOCK_IO, необходимо
 
   также  задать  или  SHARING  USER_INTERLOCK   или   SHARING
 
   PROHIBIT.
 
        Различные типы операций над записями могут быть заданы
 
   для того, чтобы определить тип доступа, который разрешается
 
   для других процессов, как это показано в табл.24.
 
                                                   Таблица 24
 
           Операции над записями при разделении файла
 
   ----------------------------------------------------------
    Операция СУД-32     ! Указания в FDL и в блоке FAB
   ----------------------------------------------------------
                        !
   Получение (чтение)   !   Задано SHARING GET или установлен
   записи (GET)         ! разряд   FAB$V_SHRGET   в   поле
                        ! FAB$B_SHR
                        !
   Поиск записи (FIND)  !   Установлено SHARING GET или уста-
                        ! новлен  разряд  FAB$V_SHRGET в поле
                        ! FAB$B_SHR
                        !
   Исключение (удаление)!   Задано SHARING DELETE  или  уста-
   записи (DELETE)      ! новлен разряд  FAB$V_SHRDEL в  поле
                        ! FAB$B_SHR
                        !
   Занесение (добавле-  !   Задано SHARING PUT или установлен
   ние) записей (PUT)   ! разряд  FAB$V_SHRPUT  в   поле
                        ! FAB$B_SHR
                        !
   Замена (модификация) !   Задано SHARING  UPDAтE или  уста-
   записи (UPDATE)      ! новлен  разряд FAB$V_SHRUPD в  поле
                        ! FAB$B_FAC
                        !
   Нет доступа          !   Задано SHARING PRоHIBIT или уста-
                        ! установлен  разряд FAB$V_NIL в поле
                        ! FAB$B_SHR
                        !
   Блокируемый пользо-  !   Задано SHARING USER_INTERLOCK или
   вателем              ! установлен  разряд FAB$V_UPI в поле
                        ! FAB$B_SHR
                        !
   Многопоточность      !   Задано   SHARING MULTISTREAM  или
                        ! установлен   разряд   FAB$V_MSE   в
                        ! поле FAB$B_SHR
                        !
 
        Если другим процессам разрешены только операции чтения
 
   или поиска записей, то модификация или  добавление  записей
 
 
 
                            - 238 -
 
                         00152-01 92 01
 
 
   запрещены и проверка захвата записей выполняться не  будет.
 
   Если другим  процессам  разрешено  удалять,  добавлять  или
 
   модифицировать   записи,  то  они  могут  также читать  за-   
 
   писи,   однако   будет    происходить    проверка   захвата
 
   записей. Все функции доступа к записям используют блокируе-
 
   мое межпроцессное разделение файла.
 
        Режим "нет доступа" отвергает доступ к файлу для  всех
 
   процессов, за исключением  того  процесса,  который  задает
 
   этот режим. Режим "нет доступа" мог бы использоваться  тог-
 
   да, когда некоторый файл разделяется не часто или для того,
 
   чтобы выполнить некоторую важную корректировку файла. Когда
 
   используется этот режим, следует быстро закрыть этот  файл,
 
   если другим процессам может понадобиться доступ  к  данному
 
   файлу. Когда используется доступ по блокам, следует выбрать
 
   этот режим или режим блокировки пользователем. Для  обеспе-
 
   чения  поблочного  ввода-вывода  средствами  МОС  ВП,  надо
 
   задать атрибут FILE USER_FILE_OPEN (или  установить  разряд
 
   FAB$V_UPF в поле FAB$L_FOP). Режим "нет доступа" не  допус-
 
   кает разделения файла и требует, чтобы процесс пользователя
 
   имел доступ к файлу с кодом защиты,  разрешающем  запись  в
 
   файл.
 
        Режим "блокировка пользователем"  позволяет  поддержи-
 
   вать защиту файла  самому  процессу,  при  помощи  захватов
 
   (включая и анализ признака конца файла). Для  любой  другой
 
   формы разделения файла СУД-32 управляет чтением  и  записью
 
   буферов ввода-вывода для того, чтобы гарантировать  целост-
 
   ность структур файла и записей. Этот режим полезен для пос-
 
   ледовательных файлов, которые не могут быть разделены  дру-
 
   гим способом  и  для  обеспечения  поблочного  ввода-вывода
 
   средствами СУД-32 или средствами МОС ВП.
 
 
                            - 239 -
 
                         00152-01 92 01
 
 
        Режим "многопоточность" позволяет процессу пользовате-
 
   ля осуществлять доступ к одному и тому же файлу,  используя
 
   более чем один поток доступа к записям и  позволяет  другим
 
   пользователям осуществлять доступ к данному файлу,  исполь-
 
   зуя  блокированное  межпроцессное  разделение  файла  (если
 
   только не задано SHARING  PROHIBIT).  Когда  задается  этот
 
   режим, должны быть также  заданы  соответствующие  операции
 
   над записями, такие как SHARING GET. Когда к файлу  присое-
 
   диняются  несколько  потоков,  распределенные  для  каждого
 
   потока буферы становятся частью некоторого  буферного  кэша 
 
   для всего процесса. Буферный кэш является общим разделяемым
 
   буферным пулом, который может исключить  выполнение  собст-
 
   венно операции ввода-вывода, если  запрошенная  запись  уже
 
   находится в этом буферном кэше. Одна операция над записью в
 
   одном потоке может использовать кэш,  использованный  пред-
 
   шествующей операцией  некоторого  другого  потока,  который
 
   ссылался на те же самые бакеты данных.
 
        Прикладная программа должна задавать и доступ к  файлу
 
   и необходимое разделение файла, при его открытии или созда-
 
   нии. Некоторые комбинации  допускаются  для  использования,
 
   другие комбинации приводят к ошибкам. Например, допускается
 
   комбинация чтение записей файла и разрешение читать  записи
 
   другим процессам (ACCESS GET и SHARING GET). Эта комбинация
 
   является значением по умолчанию,  когда  используются  язык
 
   описания файла или обращение к СУД-32 предусмотрено в языке
 
   программирования, для того, чтобы открыть  некоторый  файл.
 
   Чтение записей и разрешение другим  процессам  добавлять  и
 
   модифицировать  записи  тоже  допускается,  но  обычно   не
 
   является значением по умолчанию (ACCESS GET C SHARING PUT и
 
   SHARING UPDATE). Допускаются также добавление,  удаление  и
 
 
                            - 240 -
 
                         00152-01 92 01
 
 
   модификация  записей  одновременно  несколькими  процессами
 
   (ACCESS UPDATE C SHARING PUT и SHARING DELETE).
 
        При создании файла с использованием  программы  CREATE
 
   значением по умолчанию для языка описания файла, собственно
 
   СУД-32 и некоторых языков программирования является  разре-
 
   шение записи в файл данному процессу и не допускается  дос-
 
   туп к данному файлу для  других  процессов  (ACCESS  PUT  и
 
   SHARING   NONE).   При   создании   файла    с    указанием
 
   "создать-если", задать корректные значения доступа и разде-
 
   ления особенно  важно.  Например,  если  создаваемый  таким
 
   образом файл уже существует и он открыт  другим  процессом,
 
   то данному процессу в доступе будет отказано, поскольку его
 
   запрос предусматривает монопольный доступ к файлу  (SHARING
 
   NONE). Перекрыть это значение по умолчанию можно,  допустив
 
   большинство  или  все  операции  для  других  пользователей
 
   (SHARING  GET,  SHARING  PUT,  SHARING  UPDATE  и   SHARING
 
   DELETE).
 
        Комбинации доступа к файлу и разделения файла, которые
 
   задают некоторую смесь блокированного межпроцессного досту-
 
   па к файлу и  блокированного  пользователем  межпроцессного
 
   разделения файла позволяют получить доступ к данному  файлу
 
   без защиты с помошью захвата записей. Такие  комбинации  не
 
   рекомендуются для общего  использования.  Они  должны  быть
 
   использованы только при необходимости получения  доступа  к
 
   файлу по чтению. Другие комбинации могут привести к ошибке,
 
   например, ACCESS  BLOCK_IO без  задания  SHARING  NONE  или
 
   USER_INTERLOCK.
 
 
 
 
 
 
 
 
                            - 241 -
 
                         00152-01 92 01
 
 
        6.1.2. Блокированное межпроцессное  разделение
 
               файла
 
 
        Блокированная  межпроцессная  форма  разделения  файла
 
   используется наиболее часто. Этот метод позволяет присоеди-
 
   нение к файлу одного или более потоков доступа к записям  в
 
   рамках одного единственного процесса или нескольких процес-
 
   сов. Когда используется эта форма разделения файла, то ком-
 
   бинация значений, заданных для разделения файла и доступа к
 
   файлу, специфицированных процессом, осуществляющим первона-
 
   чальный доступ к данному файлу, определяет  тип  доступа  к
 
   файлу, который будет разрешен для  последующих  пользовате-
 
   лей.
 
        Процесс, осуществивший первоначальный доступ к  файлу,
 
   должен быть уверен в ограничениях, которые дает в результа-
 
   те комбинация значений, заданных для доступа к файлу и раз-
 
   деления файла. Типичным примером является тот случай, когда
 
   процесс, осуществивший первоначальный доступ к файлу, отри-
 
   цает любой вид доступа по записи для последующих  пользова-
 
   телей. Такое ограничение может  произойти,  когда  процесс,
 
   осуществивший первоначальный доступ к файлу, задает  доступ
 
   по записи, не задавая доступа по записи для разделения фай-
 
   ла.
 
        Если процесс, осуществивший  первоначальный  доступ  к
 
   файлу, задает доступ к файлу только по чтению и  разделение
 
   файла,   то   последующие   пользователи    смогут   только
 
   читать данный файл. Если  соответствующий  тип  доступа  по
 
   записи  не  задан,  то  тогда  последующие  пользователи не 
 
   смогут  выполнять  соответствующие  операции   записи   для
 
   данного файла.
 
 
 
                            - 242 -
 
                         00152-01 92 01
 
 
        Если процесс, осуществивший  первоначальный  доступ  к
 
   файлу, задает одно или более значений для разделения файла,
 
   то последующие пользователи  могут  осуществлять  доступ  к
 
   данному файлу при условии, что они задают подходящее значе-
 
   ние для доступа к файлу. Таким образом, если процесс,  осу-
 
   ществивший первоначальный доступ к  файлу,  задает  SHARING
 
   GET и SHARING PUT, то тогда последующие пользователи  могут
 
   задавать ACCESS GET и ACCESS PUT для того, чтобы иметь дос-
 
   туп к данному файлу по чтению и записи  или  только  ACCESS
 
   GET для того, чтобы только читать данный файл,  или  ACCESS
 
   PUT для того, чтобы читать и писать в данный  файл  (доступ
 
   по записи подразумевает и доступ по чтению).
 
        В табл.25 представлены значения, которые процесс, осу-
 
   ществивший первоначальный доступ к некоторому файлу,  может
 
   задать для разделения файла для того, чтобы разрешить  дос-
 
   туп для последующих пользователей.
 
                                                   Таблица 25
 
     Первоначальное разделение файла и последующий доступ к
                              файлу
 
   ----------------------------------------------------------
   Разделение файла процессом, ! Доступ к файлу последующего
   осуществившим первоначальный! процесса
   доступ к файлу              !
   ----------------------------------------------------------
                               !
    SHARING PROHIBIT           ! Доступ не разрешается
              1)               !          1)
    SHARING GET                ! ACCESS GET
                               !
    SHARING DELETE             ! ACCESS DELETE
                               !
    SHARING PUT                ! ACCESS PUT
                               !
    SHARING UPDATE             ! ACCESS UPDATE
                               !
 
   -------------------
   1)
     Может быть подразумеваемым.
 
 
 
 
                            - 243 -
 
                         00152-01 92 01
 
 
        Поскольку процесс, осуществивший первоначальный доступ
 
   к файлу, может задать несколько значений  SHARING,  то  по-
 
   следующий   доступ   разрешается   такому   процессу,   чьи
 
   значения  ACCESS  подходят   одному,   некоторым  или  всем
 
   значениям SHARING процесса,  осуществившего  первоначальный
 
   доступ к  файлу.  Однако,  когда   процесс,  осуществляющий
 
   доступ,   задает   некоторое   значение   ACCESS,  которому
 
   процесс,     осуществивший    первоначальный    доступ    к
 
   файлу, не задал соответствующее значение SHARING  (исключе-
 
   ние составляет SHARING GET,  которое  подразумевается),  то
 
   доступ будет отвергнут для процесса, осуществляющего после-
 
   дующий доступ.
 
        В дополнение к  сравнению  значений  доступа  к  файлу
 
   (которые задает процесс, осуществляющий последующий доступ)
 
   со значениями разделения файла (заданными  процессом,  осу-
 
   ществившим первоначальный доступ к файлу), значения, задан-
 
   ные для разделения файла процессами, осуществляющими после-
 
   дующий доступ, должны быть совместимы со значениями, задан-
 
   ными для доступа к файлу процессом, осуществившим  первона-
 
   чальный доступ к файлу. В табл.26 показаны значения  разде-
 
   ления файла, которые процессы,  осуществляющие  последующий
 
   доступ, должны задать для того,  чтобы  получить  доступ  к
 
   данному файлу.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 244 -
 
                         00152-01 92 01
 
 
                                                   Таблица 26
                                  
     Первоначальный доступ к файлу и последующее разделение
                              файла
 
   ----------------------------------------------------------
   Доступ процесса осуществив- ! Разделение файла процессом,
   шего первоначальный доступ  ! осуществляющим последующий
   к файлу                     ! доступ
   ----------------------------------------------------------
               1)              !           1)
      ACCESS GET               ! SHARING GET
                               !
      ACCESS DELETE            ! SHARING DELETE
                               !
      ACCESS PUT               ! SHARING PUT
                               !
      ACCESS UPDATE            ! SHARING UPDATE
                               !
      ACCESS TRUNCATE          ! Доступ не разрешается
                               !
 
   --------------------
   1)
     Может быть подразумеваемым.
 
        Поскольку процесс, осуществивший первоначальный доступ
 
   к файлу, может задать несколько  значений  ACCESS,  то  для
 
   некоторого процесса,  осуществляющего  последующий  доступ,
 
   чьи значения SHARING соответствуют  всем  значениям  ACCESS
 
   процесса, осуществившего  первоначальный  доступ  к  файлу,
 
   доступ разрешается. Однако, когда  процесс,  осуществляющий
 
   последующий  доступ,  задает  некоторое  значение  SHARING,
 
   которое процесс, осуществивший первоначальный доступ к фай-
 
   лу, не задал в качестве некоторого значения ACCESS  (исклю-
 
   чение составляет ACCESS GET, которое  подразумевается),  то
 
   доступ отвергается.
 
        Отметим, что задание ACCESS TRUNCATE блокирует  разде-
 
   ление файла.
 
 
 
 
 
 
 
 
 
 
                            - 245 -
 
                         00152-01 92 01
 
 
        6.1.3. Межпроцессное     разделение     файла,
 
               блокированное пользователем
 
 
        Межпроцессное разделение файла, блокированное  пользо-
 
   вателем, позволяет одному или  более  процессам  записывать
 
   записи в последовательный файл, располагающийся  на  диске,
 
   или  в  файл  на  диске,  который  открыт  для   выполнения
 
   ввода-вывода на уровне блоков. Этот  режим  не  может  быть
 
   задан для относительных и индексных файлов, открытых в дан-
 
   ный момент для доступа к записям. Для доступа к  записям  в
 
   относительных и индексных  файлах  СУД-32  функционирует  в
 
   прозрачном для пользователя режиме, обеспечивая  управление
 
   чтением и записью буферов, всегда распознает конец файла.
 
        К последовательным файлам,  которые  располагаются  на
 
   дисках, обеспечивается разделяемый доступ при помощи захва-
 
   тов. Для того, чтобы использовать это свойство,  необходимо
 
   задать режим SHARING USER_INTERLOCK (или разряд FAB$V_UPI в
 
   поле FAB$B_SHR).  Отметим,  что  когда  этот  режим  задан,
 
   СУД-32 не пытается  управлять  чтением  и  записью  буферов
 
   ввода-вывода для  нескольких  процессов,  и  не  распознает
 
   конец файла. Таким образом, необходимо использовать сервис-
 
   ную функцию FLUSH (или эквивалентную  возможность  в  языке
 
   программирования,  если  такая  имеется)  для  того,  чтобы
 
   вывести в файл модифицированные буфера ввода-вывода и чтобы
 
   повторно записать атрибуты записей  (включая  информацию  о
 
   конце файла) в заголовок данного файла.  Процессы,  которые
 
   открывают данный файл после этого действия, будут  получать
 
   новую информацию о конце файла. Атрибуты записей  перезапи-
 
   сываются всякий раз, когда файл закрывается.  Последним  по
 
   времени доступа к  файлу  процессом  должен  быть  процесс,
 
 
 
                            - 246 -
 
                         00152-01 92 01
 
 
   который проводил расширение файла. Этот же процесс, имеющий
 
   право доступа к файлу по  записи,  закрывает  данный  файл.
 
   Если это не так, то информация о конце файла будет записана
 
   другим процессом, имеющим право доступа по записи. Процессы
 
   с доступом по чтению к разделяемому последовательному файлу
 
   могут корректировать внутренний контекст конца файла,  зак-
 
   рывая и повторно открывая данный файл.
 
        Для этого  типа  разделения  файла  не  обеспечивается
 
   никакая форма захвата записей. Хотя захват записей не  про-
 
   веряется  при  использовании  блокированного  пользователем
 
   межпроцессного разделения файла,  блокировка  файла  прове-
 
   ряется. Например, если один или другой пользователь  задают
 
   SHARING NONE, то вероятно, что кому-то из них в  доступе  к
 
   файлу будет отказано.
 
 
 
        6.2. Захват записей
 
 
        СУД-32 обеспечивает возможность  захвата  записей  для
 
   относительных файлов, индексных файлов  и  последовательных
 
   файлов с записями фиксированной длины, размером в 512  бай-
 
   тов. Эта возможность  обеспечивает  управление  операциями,
 
   когда два или более потока или процесса выполняют доступ  к
 
   файлу одновременно. Захват записей гарантирует,  что  когда
 
   некоторая программа  добавляет,  удаляет  или  модифицирует
 
   некоторую запись в заданном потоке,  то  другой  поток  или
 
   процесс не может получить доступ к той же самой записи.
 
        СУД-32 может захватить записи в разделяемых файлах для
 
   того, чтобы синхронизировать доступ к  отдельным  элементам
 
   данных от различных процессов или потоков,  таким  образом,
 
   гарантируя целостность этих данных. Эта возможность захвата
 
 
 
                            - 247 -
 
                         00152-01 92 01
 
 
   записей гарантирует, что программа может добавить,  удалить
 
   или модифицировать некоторую  запись  в  одном  потоке  без
 
   необходимости проверки  одновременного  доступа  к  той  же
 
   самой записи из другого потока или процесса. Например, ког-
 
   да программа открывает некоторый файл для записи  или  кор-
 
   ректировки записей несколькими потоками, то СУД-32 захваты-
 
   вает каждую запись по мере того, как к  ней  осуществляется
 
   доступ из программы. Этот  захват  предотвращает  доступ  к
 
   этой же самой записи из другого потока или процесса до  тех
 
   пор, пока первый поток или процесс не освободит ее.
 
        СУД-32 обрабатывает также автоматический захват целого
 
   бакета, который содержит данную запись, на короткий период,
 
   необходимый для того, чтобы получить первоначальный  доступ
 
   к этой записи. Этот автоматический захват происходит  также
 
   позже, когда содержимое данного  бакета  модифицируется.  В
 
   промежутке между этими  событиями  данная  запись  остается
 
   захваченной, но к другим записям в этом бакете  может  быть
 
   осуществлен доступ, и  они  могут  быть  при  необходимости
 
   изменены.
 
        Пользователь может запросить обработку захвата  записи
 
   и ее освобождение  самой  системой  СУД-32  или  обеспечить
 
   управление захватом и освобождением записей самостоятельно.
 
        СУД-32 не обеспечивает захват записей последовательных
 
   файлов с записями постоянной длины, имеющими размер  больше
 
   чем 512 байтов. Однако пользователь может обеспечить  необ-
 
   ходимую логику  синхронизации  для  того,  чтобы  допустить
 
   одновременное чтение и запись в этих файлах.
 
        Возможность захвата записей в файле зависит от доступа
 
   к файлу и способа его разделения заданным  процессом,  осу-
 
   ществившим первоначальный доступ к файлу, а также от успеш-
 
 
                            - 248 -
 
                         00152-01 92 01
 
 
   ного открытия данного файла с разделяемым доступом  другими
 
   процессами.
 
        При блокированном  межпроцессорном  разделении  файла,
 
   для обеспечения возможности захвата записей, следует учиты-
 
   вать следующие типы доступа и разделения файла:
 
        1) процесс, осуществивший первоначальный доступ к фай-
 
   лу, задает атрибут ACCESS, который указывает на модификацию
 
   записей, такой как ACCESS DELETE,  ACCESS  PUT  или  ACCESS
 
   UPDATE в комбинации  с  любым  атрибутом  SHARING,  который
 
   задает блокированное межпроцессорное разделение, такое  как
 
   SHARING GET, SHARING DELETE, SHARING  PUT,  SHARING  UPDATE
 
   и/или SHARING MULTISTREаMING (но не  SHARING  PROHIBIT  или
 
   SHARING USER_INTERLOCK);
 
        2) процесс, осуществивший первоначальный доступ к фай-
 
   лу, задает ACCESS GET и некоторый атрибут SHARING,  который
 
   указывает, что может происходить обновление записей,  такой
 
   как SHARING DELETE, SHARING PUT или  SHARING  UPDATE.  Даже
 
   если все другие процессы откроют данный файл только с  дос-
 
   тупом по чтению (ACCESS GET), то будет активизирован захват
 
   записей.
 
        В заданном потоке захват записей может  быть  запрещен
 
   для    отдельных    операций    (см.     п.6.2.3,     режим
 
   "не-захватывать-запись"). Захват записей может также  прои-
 
   зойти в файле, открытом только с доступом по чтению,  когда
 
   установлен режим "захват-записи-для-чтения".
 
        Записи могут быть захвачены автоматически или вручную.
 
   СУД-32 обрабатывает автоматический захват записи в прозрач-
 
   ном для пользователя режиме. Его следует использовать, если
 
   предполагается захват одной единственной  записи  в  каждый
 
   момент времени. Ручной захват записей требует  дополнитель-
 
 
                            - 249 -
 
                         00152-01 92 01
 
 
   ных усилий со стороны пользователя. Он  используется,  если
 
   необходимо обеспечить захват нескольких записей одновремен-
 
   но.
 
        Запись может быть в одном из трех состояний: не захва-
 
   чена, захвачена автоматически и  захвачена  вручную.  Когда
 
   некоторая запись в первый раз захвачена,  она  находится  в
 
   состоянии или  ручного  или  автоматического  захвата.  Она
 
   останется в этом состоянии до тех пор, пока  данный  захват
 
   не будет отменен. Запись не может  переместиться  прямо  из
 
   состояния автоматического захвата в состояние ручного  зах-
 
   вата или наоборот. Следовательно, необходимо сделать  неко-
 
   торый первоначальный выбор: использовать автоматический или
 
   ручной захват для некоторой  заданной  записи.  Данный  тип
 
   захвата остается в силе до его отмены.
 
 
 
        6.2.1. Автоматический захват записей
 
 
        Когда используется автоматический захват  записей,  то
 
   захватывается каждая модифицируемая запись  или  запись,  к
 
   которой осуществляется доступ при помощи операций  GET  или
 
   FIND     (если     только     не      установлен      режим
 
   "нет-захвата-записи"). Данный захват  продолжается  до  тех
 
   пор, пока в рамках данного потока не  выполнится  следующая
 
   операция. Tо есть, захват отменяется при доступе к  следую-
 
   щей записи, ее замене или удалении, прекращении связи пото-
 
   ка с файлом, закрытии файла или когда операция СУД-32  при-
 
   водит к появлению ошибки.  Освобождение  записи  происходит
 
   при выполнении одной из следующих операций:
 
 
      FIND        - поиск  записи;
 
      GET         - получение  (чтение)  записи;
 
 
                            - 250 -
 
                         00152-01 92 01
 
 
      PUT         - занесение  (добавление)  в  файл  новой
 
                    записи;
 
      UPDATE      - замена  (модификация)  существующей  за-
 
                    писи;
 
      DELETE      - исключение  (удаление)  существующей за-
 
                    писи;
 
      REWIND      - позиционирование  файла  на  начало;
 
      DISCONNECT  - прекращение  потока  доступа  к записям;
 
      CLOSE       - закрытие файла для всех потоков доступа;
 
      FREE        - освобождение  записей  для  текущего по-
 
                    тока;
 
      RELEASE     - освобождение  текущей  записи.
 
 
        Операции FREE и RELEASE позволяют явно отменить захват
 
   записи.
 
        Если проводится занесение записи в пустую ячейку отно-
 
   сительного файла с использованием операции PUT,  то  данная
 
   ячейка захватывается на все время работы операции PUT. Зах-
 
   ват отменяется, когда данная операция завершается.
 
        Имеется одно исключение для автоматической отмены зах-
 
   вата: запись остается автоматически захваченной для  опера-
 
   ции GET, следующей сразу же за операцией FIND, которая при-
 
   вела к захвату записи. Схема автоматического захвата записи
 
   обычно  позволяет  выполнить  требуемую  последовательность
 
   действий. Например, для того, чтобы отредактировать некото-
 
   рую существующую запись, могла бы быть использована следую-
 
   щая последовательность операций:
 
        1) получить данную запись (операция GET);
 
        2) модифицировать буфер с записью (используя операторы
 
   языка программирования);
 
 
 
                            - 251 -
 
                         00152-01 92 01
 
 
        3) заменить данную запись (операция UPDATE).
 
        Операция GET определяет запись в  качестве  текущей  и
 
   захватывает ее в подготовке к операции UPDATE.
 
        Затем программа обрабатывает  данную  запись  в  соот-
 
   ветствии с заданным алгоритмом. Когда данная запись наконец
 
   заменена, то захват данной  записи  отменяется.  В  течение
 
   времени, которое проходит между операциями  GET  и  UPDATE,
 
   другие потоки, пытающиеся получить доступ к  той  же  самой
 
   записи, получат ошибку по захвату  записи  (RMS$_RLK).  Это
 
   будет предотвращать ситуацию, когда к уже выбранной  записи
 
   осуществляется доступ  другого  потока,  который  может  ее
 
   модифицировать до того, как данный поток закончил ее  обра-
 
   батывать. Когда захват записи отменяется при помощи  опера-
 
   ции UPDATE, к модифицированной  записи  могут  осуществлять
 
   доступ другие потоки.
 
 
 
        6.2.2. Ручное освобождение записи
 
 
        Когда освобождение записи осуществляется  вручную,  то
 
   управление этим процессом обеспечивается  выполнением  спе-
 
   циальных операций СУД-32, вызываемых прикладной  программой
 
   явным образом.
 
        Для ручного освобождения записей необходимо при вызове
 
   операции  GET,  FIND  или  PUT   задать   атрибут   CONNECT
 
   MANUAL_UNLOCKING (разряд RAB$V_ULK в поле RAB$L_ROP). Любая
 
   из этих операций освобождает  любую  запись,  которая  была
 
   перед этим захвачена автоматически. Кроме того,  освобожде-
 
   ние записи выполняется операцией FREE или RELEASE, либо при
 
   помощи операций DISCONNECT  или  CLOSE,  завершающих  поток
 
   доступа к записям. Другие операции над записями  или  пото-
 
 
 
                            - 252 -
 
                         00152-01 92 01
 
 
   ком, включая и те операции, которые дают  в  результате  их
 
   выполнения ошибки, не влекут за собой освобождение записей.
 
        Ручное управление освобождением записей полезно тогда,
 
   когда несколько записей должны быть модифицированы в рамках
 
   выполнения одной транзакции. В качестве примера можно  при-
 
   вести взаимосвязанную корректировку двух записей. Доступ  к
 
   первой записи невозможен для другого  потока  до  тех  пор,
 
   пока модификация второй  записи  не  завершится.  Программа
 
   пытается откорректировать первую запись, но в то  же  самое
 
   время сохраняет ее захват. Таким образом, в случае  некото-
 
   рого сбоя при корректировке  второй  записи  первоначальное
 
   содержимое первой записи может быть  восстановлено.  Ручное
 
   снятие захвата задается тогда, когда осуществляется  доступ
 
   к первой записи. Это будет предотвращать ту ситуацию, когда
 
   захват этой записи будет снят автоматически после  операции
 
   UPDATE. Данная запись освобождается при помощи  использова-
 
   ния операции FREE после того, как будет  успешно  выполнена
 
   корректировка второй записи (нормальный случай)  или  после
 
   того, как  будет  восстановлено  первоначальное  содержимое
 
   первой записи (в случае ошибки). Операция FREE  освобождает
 
   все записи для данного потока одновременно. В  этот  момент
 
   обе откорректированные записи станут доступными для  других
 
   потоков.
 
        Операцию RELEASE можно использовать  для  того,  чтобы
 
   выборочно освободить захваченные записи, используя значение
 
   адреса записи в файле для соответствующей записи.
 
 
 
 
 
 
 
 
 
 
                            - 253 -
 
                         00152-01 92 01
 
 
        6.2.3. Управление захватом  записи  и  снятием
 
               захвата
 
 
        СУД-32 обеспечивает несколько режимов, которые  обычно
 
   используются для того, чтобы управлять захватом  записей  и
 
   снятием захвата.  В  табл.27  перечислены  режимы,  которые
 
   могут быть заданы в качестве входных для каждой из операций
 
   FIND, GET и PUT.
 
                                                   Таблица 27
 
                     Режимы захвата записей
 
   ----------------------------------------------------------
     Режим        !              Описание
   ----------------------------------------------------------
                  !
   Не захватывать !   Данная запись не захватывается.
   (DO NOT LOCK)  !
                  !   Язык описания файла:  CONNECT    NOLOCK
                  !
                  !   Прикладная программа:  разряд RAB$V_NLK
                  !                         в  поле RAB$L_ROP
                  !
   Захват несу-   !   Захватывается некоторая  несуществующая
   ществующей     ! запись  (не  применяется  для   индексных
   (LOCK NONEXIS- ! файлов).
    TENT)         !
                  !   Язык описания файла:            CONNECT
                  !                        NONEXISTENT_RECORD
                  !   Прикладная программа:  разряд RAB$V_NXR
                  !                         в  поле RAB$L_ROP
                  !
   Захват для     !   Данная запись захватывается  для чтения
   чтения         ! и допускается ее чтение другими потоками.
   (LOCK FOR READ)!
                  !   Язык описания файла:            CONNECT
                  !                              LOCK_ON_READ
                  !   Прикладная программа:  разряд RAB$V_REA
                  !                          в поле RAB$L_ROP
                  !
   Захват для     !   Данная  запись захватывается для записи
   записи         ! и допускается ее чтение другими потоками.
   (LOCK FOR      !
    WRITE)        !   Язык описания файла:            CONNECT
                  !                             LOCк_ON_WRITE
                  !   Прикладная программа:  разряд RAB$V_RLK
                  !                          в поле RAB$L_ROP
                  !
   Ручное снятие  !   Указывает, что управление освобождением
   захвата        ! записи  осуществляется   прикладной прог-
   (мANUAL        ! раммой.  Если  этот  режим не  задан,  то
    UNLOCKING)    ! СУД-32     осуществляет     освобождение
 
 
                            - 254 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 27
   ----------------------------------------------------------
     Режим        !              Описание
   ----------------------------------------------------------
                  !
                  ! Записи для данного  потока  автоматически
                  ! (если   только   не   установлен    режим
                  ! "не-захватывать-записи").
                  !
                  !   Язык описания файла:            CONNECT
                  !                          MANUAL_UNLOсKING
                  !   Прикладная программа:  разряд RAB$V_ULK
                  !                          в поле RAB$L_ROP
                  !
   Чтение несмотря!    Данная запись читается,  несмотря   на
   на захват      !  любой захват.
   (READ          !
    REGARDLESS)   !    Язык описания файла:           CONNECT
                  !                           READ_REGARDLESS
                  !    Прикладная программа: разряд RAB$V_RRL
                  !                          в поле RAB$L_ROP
                  !
   Ждать, если    !    Если данная запись захвачена, то ждать
   захвачена      !  до тех пор,  пока  она не станет доступ-
   (WAIT IF       !  ной.
    LOCKED)       !
                  !   Язык описания файла:            CONNECT
                  !                           WAIT_FOR_RECORD
                  !   Прикладная программа:  разряд RAB$V_WAT
                  !                          в поле RAB$L_ROP
                  !
   Ждать период   !   Этот режим может быть задан в  соедине-
   тайм-аута      ! Нии с  режимом "ждать-если-захвачена" для
   (WAIT TIMEOUT  ! того, чтобы задать период тайм-аута, пос-
    PERIOD)       ! ле которого  выдается  некоторая  ошибка.
                  ! заданное  значение  указывает на заданное
                  ! число секунд, которое  надо  ждать прежде
                  ! чем   выдавать  ошибку  для  того,  чтобы
                  ! избежать  потенциальной  взаимоблокировки
                  ! записей  т.E.  Тупиковой  ситуации.
                  !
                  !   Язык описания файла:            CONNECT
                  !                            TIMEOUT_PERIOD
                  !   Прикладная программа:  разряд RAB$V_TMO
                  !       в поле RAB$L_ROP и разряд RAB$B_тмо
                  !
 
        Для получения дополнительной информации о ручном  сня-
 
   тии захвата записи см. п.6.2.2.
 
 
        Основные свойства режимов захвата:
 
        1)  режим  "не-захватывать-запись"  определяет  запрет
 
   захвата записи, к которой осуществляется доступ при  помощи
 
   операции GET или FIND. Если доступ к файлу возможен  только
 
 
                            - 255 -
 
                         00152-01 92 01
 
 
   через операцию GET, то захват записей также не  производит-
 
   ся. В любом случае, если целевая  запись  захвачена  другим
 
   потоком, то при попытке обращения к данной  записи  текущим
 
   потоком, выдается ошибка захвата записи (RMS$_RLK). Единст-
 
   венным исключением этого будет  случай,  если  поток,  осу-
 
   ществляющий захват записи, разрешает ее читать (см.  режимы
 
   "захват-для-записи" и "захват-для-чтения"). Записи, к кото-
 
   рым осуществляется доступ для целей, отличных от обновления
 
   (например, удаления или занесения),  не  подлежат  захвату.
 
   Это уменьшит вероятность  того,  что  другие  потоки  будут
 
   получать ошибки захвата записи. Попытки удалить  или  заме-
 
   нить запись, которая не была захвачена,  закончатся  неуда-
 
   чей. Режим "не-захватывать-запись"  имеет  приоритет  перед
 
   режимом "ручное-снятие-захвата";
 
        2)  режим  "захват-несуществующей-записи"  применяется
 
   только для относительных файлов (или последовательных  фай-
 
   лов с записями постоянной длины по 512 байтов). Он  исполь-
 
   зуется для захвата записей, доступ к которым осуществляется
 
   в режиме прямого доступа и которые не существуют  в  данном
 
   файле в момент осуществления доступа. Этот режим  препятст-
 
   вует помещению другими потоками новых записей в  соответст-
 
   вующие ячейки до тех пор, пока поток, который захватил  ее,
 
   или сам не поместит туда новые записи или не отменит захват
 
   записей. Пусть, например, файл содержит записи с 1  по  10.
 
   Прикладная программа, пытающаяся в режиме  прямого  доступа
 
   осуществить доступ к записи  15,  получила  бы  обычно  или
 
   ошибку "запись-не-найдена"  (RMS$_RNF),  если  данный  файл
 
   является относительным  файлом,  или  ошибку  "конец-файла"
 
   (RMS$_EOF), если файл, содержащий данную  запись,  является
 
   последовательным  файлом.   Если,   однако,   задан   режим
 
 
                            - 256 -
 
                         00152-01 92 01
 
 
   "захват-несуществующей-записи", то будет выдано подтвержде-
 
   ние успешного выполнения операции доступа к  несуществующей
 
   записи (RMS$_OK_RNF). Любой другой поток, пытающийся  полу-
 
   чить доступ к записи 15 или поместить в  ячейку  с  относи-
 
   тельным номером 15 новую  запись,  получит  ошибку  захвата
 
   записи (RMS$_RLK). Если тот поток, который захватил  данную
 
   несуществующую запись, затем попытается поместить  в  соот-
 
   ветствующую ячейку новую запись, то данная  операция  будет
 
   выполнена   успешно   и    будет    выдано    подтверждение
 
   (RMS$_OK_ALK).
 
        Кроме того, этот режим может быть  использован  тогда,
 
   когда необходимо получить прямой доступ  по  относительному
 
   номеру записи к содержимому некоторой ячейки относительного
 
   файла, из  которой  была  удалена  запись.  В  этом  случае
 
   выдается сообщение "запись-не-найдена" (RMS$_RNF).  Однако,
 
   если бы был задан режим "захват-несуществующей-записи",  то
 
   эта удаленная запись была бы выдана вместе с подтверждением
 
   успешного выполнения операции (RMS$_OK_DEL). Указание "DEL"
 
   означает, что данная запись была ранее удалена  из  относи-
 
   тельного файла.
 
        Данная операция основана на физическом сохранении уда-
 
   ляемой записи в ячейке относительного  файла  до  тех  пор,
 
   пока в эту ячейку не будет помещена новая запись;
 
        3) режим "захват-для-чтения" задает возможность досту-
 
   па к записи Tолько по-чтению для других процессов или пото-
 
   ков.
 
        Если задан этот режим, то  тогда  потоку  записей  для
 
   разделенного файла, открытого только на чтение, разрешается
 
   захватывать записи,  блокируя  их  от  модификации  другими
 
   программами или потоками. Когда другой поток,  не  захваты-
 
 
                            - 257 -
 
                         00152-01 92 01
 
 
   вающий запись (уже захваченную указанным способом), пытает-
 
   ся ее читать, то вырабатывается  код  успешного  завершения
 
   RMS$OK_RLK, указывающий, что целевая запись была захвачена,
 
   но что при этом разрешается ее читать. Другой поток, пытаю-
 
   щийся захватить данную запись, однако, получит ошибку  зах-
 
   вата записи (RMS$_RLK);
 
        4) режим  "захват-для-записи"  указывает,  что  захват
 
   записи осуществляется с целью ее модификации и  что  другие
 
   потоки или процессы могут  получить  к  захваченной  записи
 
   доступ только по чтению. При чтении  данной  записи  другие
 
   потоки получают подтверждение  (RMS$_OK_RLK),  указывающее,
 
   что целевая запись была в  действительности  захвачена,  но
 
   тем не менее ее чтение возможно. Поток,  пытающийся  захва-
 
   тить данную запись, однако, получит ошибку  захвата  записи
 
   (RMS$_RLK);
 
        5) режим "чтение-несмотря-на-захват" позволяет  читать
 
   некоторую запись несмотря на то, что  она  захвачена.  Этот
 
   режим позволяет читающему эту запись процессу  иметь  конт-
 
   роль над доступом к записи. Если некоторая запись захвачена
 
   с запретом всех видов доступа к ней и если операция PUT или
 
   GET обнаруживает захват этой записи, то задав  этот  режим,
 
   можно получить данную запись в любом случае с  альтернатив-
 
   ным состоянием RMS$_OK_RRL;
 
        6)  режим  "ждать-если-захвачена"  задает  возможность
 
   ожидания освобождения захваченной записи. Когда запрошенная
 
   запись станет доступной, она будет передана в  программу  с
 
   подтверждением RMS$_OK_WAT.
 
        Если      разные      процессы      задают      режимы
 
   "ждать-если-захвачена" и "ручное-снятие-захвата" соответст-
 
   венно, и оба процесса пытаются осуществить доступ к одним и
 
 
                            - 258 -
 
                         00152-01 92 01
 
 
   тем же записям в файле,  то  возможна  тупиковая  ситуация.
 
   Например, если процесс а и процесс B желают получить доступ
 
   к записям 1 и 2 в одно и то же время,  то  может  произойти
 
   следующая ситуация. Процесс а мог бы захватить запись  1  и
 
   задать режим ожидания записи 2. В то же самое время процесс
 
   B мог бы захватить запись 2 и задать режим ожидания  записи
 
   1. В этом случае СУД-32  вывдала бы ошибку   RMS$_DEADLOCK,
 
   сигнализирующую о взаимоблокировке и игнорировала  бы  один
 
   из запросов на ожидание.
 
        Период времени, по  истечении  которого  оба  процесса
 
   уведомят о взаимоблокировке, будет  зависеть  от  значения,
 
   заданного в системном параметре DEADLOCK_WAIT. Значение  по
 
   умолчанию для этого системного параметра равно 10 секундам.
 
   Для получения детальной информации об установке этого пара-
 
   метра, следует обратиться к документу [1];
 
        7) режим  "ждать-период-тайм-аута"  задает,  что  если
 
   установлен режим ожидания записи, то условие ожидания запи-
 
   си будет продолжаться только в  течение  заданного  периода
 
   тайм-аута в секундах. Если данный период тайм-аута  истечет
 
   раньше, чем будет  осуществлен  захват  записи,  то  СУД-32
 
   игнорирует данный  запрос  и  выдает  состояние  завершения
 
   RMS$_TMO. Этот период тайм-аута  устанавливается  по  числу
 
   секунд, заданных для атрибута CONNECT TIMEOUT_PERIOD, или в
 
   блоке RAB должен быть  установлен  разряд  RAB_TMO  в  поле
 
   RAB$L_ROP и в  поле  RAB$B_TMO  должно  быть  задано  число
 
   секунд ожидания.
 
 
 
 
 
 
 
 
 
 
                            - 259 -
 
                         00152-01 92 01
 
 
        6.2.4. Методы программирования для разделяемых
 
               файлов
 
 
        При проектировании прикладных программ, обрабатывающих
 
   разделяемые файлы, необходимо учитывать конфликты при  зах-
 
   вате записей, которые могут произойти тогда, когда два  или
 
   более потока записей пытаются осуществить доступ к одной  и
 
   той же записи. Когда происходит конфликт при захвате  запи-
 
   си, для потока выдается ошибка RMS$_RLK.
 
        Имеется два различных метода, которые можно  использо-
 
   вать в прикладной программе для  того,  чтобы  обрабатывать
 
   конфликты при захвате записи. Можно спроектировать приклад-
 
   ную программу так, чтобы ждать, пока данная запись не  ста-
 
   нет доступна, или попытаться снова получить доступ  к  этой
 
   записи.
 
        В данном разделе кратко описываются эти методы.
 
 
 
        6.2.4.1. Ожидание записей
 
 
        Для ожидания освобождения захваченных записей  необхо-
 
   димо задать режим "ждать-записи". Программа не  будет  про-
 
   должать работать до тех пор, пока она не получит  доступ  к
 
   данной записи, и СУД-32  не  передаст  программе  некоторую
 
   ошибку   захвата   записи.   В   комбинации    с    режимом
 
   "ждать-записи"             использование             режима
 
   "ждать-период-тайм-аута" может часто упростить задачу прог-
 
   раммирования.
 
        В некоторых случаях, возможно,  придется  позаботиться
 
   об избежании тупиковых  ситуаций.  Если  имеется  несколько
 
   потоков записей или несколько  записей,  захваченных  одним
 
   единственным потоком, то  нельзя  просто  попытаться  снова
 
 
                            - 260 -
 
                         00152-01 92 01
 
 
   получить доступ к требуемой записи  после  того,  как  была
 
   выдана ошибка взаимоблокировки. Если это будет сделано,  то
 
   взаимоблокировка будет продолжаться.  Прикладная  программа
 
   должна освободить все захваченные записи при помощи  опера-
 
   ции FREE или RELEASE, и затем повторно осуществить доступ к
 
   каждой записи, которая ей необходима.
 
        Описанная ниже логика  работы  программы  представляет
 
   этот метод для корректировки двух записей в некотором  раз-
 
   деляемом файле:
 
        1)       задаются        режимы        "ждать-записи",
 
   "ждать-период-тайм-аута"  и  "ручное-снятие-захвата-записи"
 
   (разряды RAB$V_TMO, RAB$V_WAT и RAB$V_ULK в поле  RAB$L_ROP
 
   и поле RAB$B_TMO блока RAB);
 
        2) найти первую запись; переход по ошибке (конец прог-
 
   раммы);
 
        3) найти вторую запись; переход по удачному выполнению
 
   операции (обработка записей);
 
        4)    проверяется    наличие    тупиковой     ситуации
 
   (RMS$_DEADLOCK);
 
        5) если ошибка не является ошибкой  RMS$_DEADLOCK,  то
 
   безусловный переход (конец программы);
 
        6) если ошибка является ошибкой RMS_DEADLOCK, но  надо
 
   использовать операцию FREE для того, чтобы  освободить  все
 
   захваты записей для этого потока записей;
 
        7) повторить шаги 1-6 до тех пор, пока не будет  обна-
 
   ружена взаимоблокировка.
 
 
 
 
 
 
 
 
 
 
                            - 261 -
 
                         00152-01 92 01
 
 
        6.2.4.2. Повторная попытка при  ошибках  захвата
 
                 записи
 
 
        Другим методом, который можно использовать  для  того,
 
   чтобы обрабатывать конфликты при захвате записей при  обра-
 
   ботке разделяемых файлов, состоит в том, чтобы  спроектиро-
 
   вать прикладную программу так, чтобы попытаться снова полу-
 
   чить доступ к данной записи.
 
        Если процесс, который захватил  запись,  закончился  и
 
   освободил  данную  запись  до  того,  как  программа  снова
 
   пытается получить доступ к данной записи, то эта  программа
 
   будет в состоянии получить доступ к этой записи и продолжит
 
   нормальную работу.
 
        С другой стороны, для того, чтобы закончить  обработку
 
   записи и освободить ее, процесс, захвативший запись, должен
 
   выполняться.  Другой,  конкурирующий  процесс,   непрерывно
 
   выполняя операцию GET или FIND  для  того,  чтобы  получить
 
   доступ к данной записи, может при некоторых  условиях  пот-
 
   реблять большинство или  все  системные  ресурсы  и,  таким
 
   образом,  затрудняет  выполнение   процесса,   захватившего
 
   запись. Это условие может в результате привести или к неко-
 
   торой взаимоблокировке при обработке записей  или  к  очень
 
   медленному выполнению процесса, захватившего запись. Следо-
 
   вательно, программы, которые спроектированы так, чтобы пов-
 
   торно пытаться получить доступ к записи при ошибке по  зах-
 
   вату записи, должны  предусматривать  перевод  в  состояние
 
   ожидания в течение заданного интервала времени до того, как
 
   пытаться получить доступ к требуемой записи при помощи опе-
 
   раций GET или FIND.
 
        Данное ожидание дает  возможность  процессу-инициатору
 
 
 
                            - 262 -
 
                         00152-01 92 01
 
 
   захвата  закончить  обработку  записи.  Проблема  обработки
 
   взаимоблокировки может быть особенно серьезной, если разде-
 
   ляемый файл, который обрабатывается, использует  глобальные
 
   буферы.
 
        Следующий пример содержит фрагмент программы, написан-
 
   ной на языке MAKРO, который демонстрирует один  из  методов
 
   реализации ожидания до того,  как  обратиться  к  требуемой
 
   записи.
 
        Данный пример использует флаг события для  синхрониза-
 
   ции задержки. Другие методы, такие как использование  явной
 
   директивы ожидания или  асинхронные  системные  прерывания,
 
   могут также использоваться.  Для  получения  дополнительной
 
   информации об этих  методах  управления  процессом  следует
 
   обратиться к документу [8].
 
 
        П р и м е р.
 
 
    ОNE_SECOND:
           .LONG  -10000000,-1   ; 1 секунда дельта времени
       .
       .
       .
   10$:    $GET RAB=INRAB        ; получить запись
           BLBS R0,GOT_RECORD    ; передача, если запись
                                 ; получена
           CMPL R0,#RMS$_RLK     ; ошибка захвата записи?
           BNEQ ERROR            ; закончить по другим
                                 ; ошибкам
 
           $SETIMR_S EFN=#1,-    ; установить флаг события
               DAYTIM=ONE_SECOND ; через 1 секунду
           BLBC RO,ERROR         ; закончить по ошибке
 
           $WAITFR_S EFN=#1      ; ждать флага события
       .                         ; к записи
       .
       .
 
 
 
 
 
 
 
 
 
                            - 263 -
 
                         00152-01 92 01
 
 
        6.3. Методы    локальной    и    разделяемой
 
             буферизации
 
 
        Один из ключевых факторов производительности относится
 
   к буферизации записей. Буферизация используется при переда-
 
   че записей между устройством и областью, доступной приклад-
 
   ной программе. Между устройством и буфером записи  в  прик-
 
   ладной  программе  располагается  дополнительная   буферная
 
   область,  поддерживаемая  системой  СУД-32.   Промежуточная
 
   буферная область, обычно, связана с каждым процессом. Можно
 
   также задать разделяемую буферную область, если  соответст-
 
   вующий файл будет об'явлен как разделяемый.
 
 
 
        6.3.1. Режимы передачи записей
 
 
        Для синхронных и  асинхронных  операций  над  записями
 
   СУД-32 предоставляет два  режима  передачи  записей:  режим
 
   пересылки и режим указания места.
 
        При режиме пересылки СУД-32 копирует запись из  своего
 
   буфера ввода-вывода в буфер прикладной программы. Для  опе-
 
   раций ввода данные сначала читаются  в  буфер  ввода-вывода
 
   СУД-32 поблочно и затем  пересылаются  в  буфер  прикладной
 
   программы  для  обработки.  Для  операций  вывода  выходная
 
   запись сначала формируется в буфере  прикладной  программы,
 
   после чего СУД-32 пересылает ее в "свой"  буфер  вывода.  В
 
   буфере ввода-вывода СУД-32 происходит накопление записей до
 
   тех пор, пока не будет сформирован блок,  который  и  выво-
 
   дится на выходное устройство.
 
        При режиме указания места СУД-32  позволяет  программе
 
   пользователя осуществлять доступ к записям  непосредственно
 
   в буфере ввода-вывода СУД-32.  При  вводе  записей  в  поле
 
 
                            - 264 -
 
                         00152-01 92 01
 
 
   RAB$L_RBF блока RAB прикладной программе  передается  адрес
 
   записи в буфере СУД-32. Этот режим уменьшает накладные рас-
 
   ходы памяти программы, потому что записи могут быть обрабо-
 
   таны непосредственно внутри буфера  ввода-вывода  СУД-32  и
 
   выделение собственного буфера прикладной программе не  тре-
 
   буется. Режим указания места доступен только  для  операций
 
   ввода. Поскольку использование режима указания  места  воз-
 
   можно не во всех ситуациях, рекомендуется задание буфера  в
 
   прикладной программе, на случай, если системе СУД-32 все же
 
   понадобится использование  режима  пересылки,  несмотря  на
 
   задание режима указания (например, если запись  размещается
 
   в нескольких блоках).
 
        Другие возможности СУД-32 позволяют  прикладным  прог-
 
   раммам  управлять  распределением  буферного   пространства
 
   ввода-вывода или возлагать эти функции на СУД-32. В следую-
 
   щих разделах кратко описываются  возможности  обработки  на
 
   уровне файла и на уровне записи, и различные режимы доступа
 
   к файлу, которые прикладная программа может использовать  в
 
   СУД-32.
 
 
 
        6.3.2. Понимание буферизации
 
 
        Обработка записей в СУД-32, с точки зрения  прикладной
 
   программы, представляется как обмен записями непосредствен-
 
   но между некоторым файлом и  самой  прикладной  программой.
 
   Фактически же производится обмен блоками  (бакетами)  между
 
   внешними  устройствами  (дисками)  и  буферными   областями
 
   СУД-32.
 
        Программа "не чувствует" того, что  СУД-32  использует
 
   буфер ввода-вывода при обмене записями между устройством  и
 
 
 
                            - 265 -
 
                         00152-01 92 01
 
 
   программой. Запись становиться  доступной  программе  после
 
   того,  как  СУД-32  передаст  эту  запись   между   буфером
 
   ввода-вывода и буфером записи пользователя.
 
        Единица  обмена  данными  между  файлом   и   буферами
 
   ввода-вывода СУД-32 зависит от организации  данного  файла.
 
   При последовательной  организации  файла  СУД-32  читает  и
 
   записывает блок или последовательность блоков. При  относи-
 
   тельной и индексной организации файла СУД-32 читает и запи-
 
   сывает бакеты.
 
        Взаимосвязь между прикладной программой и  внутренними
 
   буферами ввода-вывода СУД-32, показана на рис.17,  приклад-
 
   ная программа  размещается  в  соответствующем  виртуальном
 
   адресном пространстве  процесса  (в  районе  программы  р0)
 
   вместе со "своей" буферной областью, к которой имеет доступ
 
   СУД-32. Буферная область  СУД-32  и  системная  управляющая
 
   информация размещаются в пространстве P1 (управляющем райо-
 
   не).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 266 -
 
                         00152-01 92 01
 
 
           Взаимосвязь прикладной программы и буферов
 
                       ввода-вывода СУД-32
 
 
                    -----------------------\
                    ! Прикладная программа!!
                    !                     !!
                    !---------------------! > Пространство р0
              ----->!   Буфер записи в    !! (район програм-
              !     ! прикладной программе!!  мы)
              !     -----------------------/
           Записи   !                     !
              !     =                     =
              !     !                     !
              ----->-----------------------\
                    !        Буфер        !! Пространство P1
           -------->!        СУД-32       !!
           !        !                     ! >
           !        ! Системная управляю- !! (Управляющий
           !        !   щая информация    !!     район)
   Блоки или бакеты -----------------------/
           !
           V
      -----------
      !         !
      !  Диск   !
      !         !
      -----------
 
 
 
                            Рис. 17
 
 
        Тщательный выбор числа буферов необходим для повышения
 
   производительности системы. Значения по умолчанию, устанав-
 
   ливаемые СУД-32, являются небольшими по величине, что впол-
 
   не приемлимо для  некоторых  типов  доступа  при  работе  с
 
   небольшими файлами. В то же время допустимо задание большо-
 
   го числа буферов при обработке большого  индексного  файла,
 
   хотя СУД-32 по умолчанию обеспечивает только два буфера для
 
   индексных файлов. Число буферов задается при помощи атрибу-
 
   та языка описания файла  CONNECT  MULTIBUFFER_COUNT  или  в
 
   поле RAB$B_MBF  блока  RAB.  Однако,  чтобы   задать  число
 
   глобальных   буферов,   необходимо   задать другой  атрибут
 
   - FILE GLOBAL_BUFFER_COUNT или соответствующее  значение  в
 
 
 
                            - 267 -
 
                         00152-01 92 01
 
 
   поле FAB$W_GBC блока FAB.
 
        Одним из способов поиска наилучшей стратегии буфериза-
 
   ции для конкретного применения является  тестирование  раз-
 
   личных комбинаций числа буферов и их размеров. Один  подход
 
   состоит в том, чтобы хронометрировать каждую  комбинацию  и
 
   измерять число операций ввода-вывода, которые имели  место,
 
   и затем выбрать ту, которая максимально улучшает производи-
 
   тельность системы, принимая во внимание размер используемой
 
   памяти.
 
        Общая идея  использования  буферизации  для  улучшения
 
   производительности системы состоит в том,  чтобы  использо-
 
   вать некоторый размер буфера и  число  буферов,  улучшающих
 
   производительность системы, не исчерпывая ресурсы виртуаль-
 
   ной памяти процесса пользователя. Следует помнить о компро-
 
   миссе между производительностью и расходом памяти.  Буфера,
 
   используемые некоторым  процессом,  учитываются  в  рабочем
 
   наборе данного процесса. Следует избегать выделения слишком
 
   большого числа буферов, что приводит к избыточным  затратам
 
   времени на обмен страницами и рабочими наборами. Для приме-
 
   нений, критичных к производительности, следует  рассмотреть
 
   увеличение  размера  рабочего  набора  данного  процесса  и
 
   добавления дополнительной памяти.
 
        Администратору операционной системы следует следить за
 
   активностью обмена страницами и  обмена  рабочими  наборами
 
   процесса, использующего СУД-32 и других процессов,  с  тем,
 
   чтобы избежать увеличения производительности одного процес-
 
   са за счет других процессов. Информацию по управлению  опе-
 
   рационной системой можно найти в документе [8].
 
        Если существует большая вероятность  последовательного
 
   доступа к записям, следует использовать большой буфер  (или
 
 
                            - 268 -
 
                         00152-01 92 01
 
 
   буферы). Причина этого состоит в том, что физически  непре-
 
   рывные записи в файле передаются в память путем одновремен-
 
   ного чтения одного или более  блоков  для  последовательных
 
   файлов, либо одного или более бакетов для  относительных  и
 
   индексных файлов. Когда блоки или бакеты прочитаны в буфер-
 
   ную область СУД-32, последующий доступ к  соседним  записям
 
   означал бы доступ к записям в одном  и  том  же  блоке  или
 
   бакете, который уже находится в памяти, исключая тем  самым
 
   необходимость выполнения  операций  ввода-вывода  и,  таким
 
   образом,  улучшая  производительность.   Когда   необходима
 
   запись, которая не находится в текущей буферной области,  в
 
   одном из буферов замещаются блок (блоки) или бакет,  содер-
 
   жащие эту новую запись.
 
        Когда записи в  файле  будут  использоваться  повторно
 
   (например в индексе  индексного  файла),  то  использование
 
   более чем одного буфера способствует  сохранению  в  памяти
 
   записей, к которым был перед  этим  осуществлен  доступ,  в
 
   течение более длительного периода времени с целью  исключе-
 
   ния повторной операции ввода-вывода. Имеется также  некото-
 
   рый специальный режим буферизации для последовательных фай-
 
   лов, когда два буфера используются взаимозаменяемо, обеспе-
 
   чивая возможность использования одного буфера, в то  время,
 
   как другой буфер ожидает завершения ввода-вывода.
 
        СУД-32 для  каждого  процесса  создает  буферный  пул,
 
   содержащий буфера ввода-вывода, находящиеся под управлением
 
   СУД-32. В случае использования распределяемых  файлов  соз-
 
   дается буферный пул, общий для нескольких процессов, содер-
 
   жащий глобальные буфера ввода-вывода.
 
 
 
 
 
 
                            - 269 -
 
                         00152-01 92 01
 
 
        6.3.3. Буферизация для последовательных файлов
 
 
        Для последовательных файлов число буферов и их  размер
 
   могут быть заданы  в  момент  выполнения  программы.  Число
 
   буферов задается при помощи атрибута языка  описания  файла
 
   CONNECT MULTIBUFFER_COUNT или в поле RAB$B_MBF  блока  RAB.
 
   Размер буфера задается при помощи атрибута  языка  описания
 
   файла CONNECT MULTIBLOCK_COUNT или в поле  RAB$B_MBC  блока
 
   RAB.
 
        Для последовательных файлов допускается  использование
 
   двух взаимозаменяемых буферов, один из которых доступен для
 
   обработки, в то время как другой  буфер  является  об'ектом
 
   операции ввода-вывода. Этот метод  называется  обработкой с
 
   опережающим чтением и запаздывающей записью, он применяется
 
   для  последовательного  доступа  к последовательным файлам.
 
   Значение атрибута CONNECT MULTIBUFFER_COUNT в  этом  случае
 
   должно быть равно 2.
 
        Размер буферов для последовательных файлов определяет-
 
   ся при помощи атрибута CONNECT  MULTIBLOCK_COUNT  (мультиб-
 
   лочный коэффицент). Оптимальное число блоков в буфере зави-
 
   сит от размера записи  последовательного  файла.  Обычно  в
 
   качестве среднего значения выбирается 16.
 
        При доступе по адресу записи  последовательного  файла
 
   действуют соглашения, применяемые  к  относительному  файлу
 
   (см. п.6.3.4).
 
        Значение по умолчанию для числа буферов процесса опре-
 
   деляется по команде SHOW RMS_DEFAULT языка DCL.  Для  уста-
 
   новки значения числа буферов  по  умолчанию  для  процесса,
 
   следует          использовать          команду          SET
 
   RMS_DEFAULT/SEQUENTIAL/BUFFER_COUNT=N  языка  DCL,  где   N
 
 
 
                            - 270 -
 
                         00152-01 92 01
 
 
   является числом буферов.
 
 
 
        6.3.4. Буферизация для относительных файлов
 
 
        Для относительных файлов единицами обмена между диском
 
   и памятью  являются  бакеты,  а  не  блоки.  Размер  бакета
 
   задается при создании файла. Для существующего  файла  этот
 
   размер может быть изменен при его конвертировании (см. раз-
 
   дел 9).
 
        Размер бакета задается при помощи атрибута языка  опи-
 
   сания файла FILE BUCKET_SIZE, в поле  FAB$B_BKS  блока  FAB
 
   или в поле XAB$B_BKZ блока XAB. Когда выбирается это значе-
 
   ние, необходимо принимать во внимание тип доступа к  файлу.
 
   При прямом доступе выбирается небольшой размер бакета,  при
 
   последовательном доступе большой размер  бакета,  прямом  и
 
   последовательном - средний размер бакета, так как это  опи-
 
   сано в разделе 2.
 
        Число буферов (CONNECT MULTIBUFFER_COUNT)  задается  в
 
   поле RAB$B_MBF блока RAB в момент выполнения программы. Тип
 
   доступа  к  записям  определяет  оптимальное  использование
 
   буферов. Двумя крайними случаями доступа к записям являются
 
   те случаи, когда записи будут  обрабатываться  полностью  в
 
   прямом режиме или полностью в последовательном режиме. Кро-
 
   ме того, могут быть случаи, когда  доступ  к  записям  осу-
 
   ществляется в прямом режиме  и  возможен  повторный  доступ
 
   (прямой доступ с временной локальностью), и  случаи,  когда
 
   доступ к записям осуществляется в прямом режиме, но  весьма
 
   вероятно, что также будет осуществляться доступ к  соседним
 
   записям (прямой доступ с пространственной локальностью).
 
        Для полностью прямого доступа или для последовательно-
 
 
 
                            - 271 -
 
                         00152-01 92 01
 
 
   го доступа должен быть задан один единственный буфер. Когда
 
   записи обрабатываются в режиме прямого доступа, но  сущест-
 
   вует хотя бы минимальный шанс повторного доступа к одним  и
 
   тем же записям, рекомендуется использовать несколько  буфе-
 
   ров для того, чтобы сохранить в буфере  записи,  к  которым
 
   возможен повторный доступ. Когда доступ к записям осуществ-
 
   ляется в прямом режиме,  но  весьма  вероятно,  что  доступ
 
   будет осуществлен к соседним  записям,  должен  быть  задан
 
   один единственный буфер, если только не должны быть исполь-
 
   зованы маленькие размеры бакетов. В противном случае  необ-
 
   ходимо предусмотреть задание двух буферов. Если  существует
 
   вероятность доступа к файлу при помощи различных комбинаций
 
   вышеприведенных возможностей, рекомендуется некоторый комп-
 
   ромисс для числа буферов (и размеров бакетов).
 
        Когда в относительный файл добавляются записи, следует
 
   рассмотреть выбор режима отложенной  записи (атрибут  языка
 
   описания файла FILE DEFERRED_WRITE, или разряд FAB$V_DFW  в
 
   поле FEB$L_FOP блока FAB). При задании этого  режима  буфер
 
   (резидентный в памяти бакет),  в  который  были  перемещены
 
   записи, не записывается на диск до  тех  пор,  пока  данный
 
   буфер не понадобится для других целей или пока файл не зак-
 
   роется. Этот режим, однако,  может  привести  к  тому,  что
 
   будут потеряны записи, если произойдет аварийный отказ сис-
 
   темы до того, как данные записи будут записаны на диск.
 
        Для определения значения  текущего  числа  буферов  по
 
   умолчанию для  процесса,  необходимо  использовать  команду
 
   SHOW RMS_DEFAULT языка DCL. Для установки числа буферов  по
 
   умолчанию для процесса, следует  использовать  команду  SET
 
   RMS_DEFAULT/RELATIVE/BUFFER_COUNT=N  языка   DCL,   где   N
 
   является числом буферов.
 
 
                            - 272 -
 
                         00152-01 92 01
 
 
        6.3.5. Буферизация для индексных файлов
 
 
        Для индексных файлов единицами  обмена  данными  между
 
   диском и памятью являются бакеты (а не блоки). Размер баке-
 
   та задается при создании файла или для существующего  файла
 
   он может быть изменен при его конвертировании  (см.  раздел
 
   9).
 
        Размер бакета задается при помощи атрибута языка  опи-
 
   сания файла FILE BUCKET_SIZE, в поле  FAB$B_BKS  блока  FAB
 
   или в поле XAB$B_BKZ блока XAB, как это описано  в  разделе
 
   2.
 
        Когда осуществляется доступ  к  индексным  файлам,  то
 
   важно помнить, что индексная часть файла должна быть прочи-
 
   тана системой СУД-32 для того, чтобы обнаружить необходимую
 
   запись.  Алгоритм,  используемый  системой  СУД-32,  задает
 
   более высокий приоритет для бакетов индекса более  высокого
 
   уровня в буферном пуле, в то  время  как  буферы,  которые,
 
   возможно, содержат текущие бакеты данных и  бакеты  индекса
 
   нижнего уровня, повторно используются для размещения других
 
   бакетов. То-есть, буфера,  которые  используются  повторно,
 
   сначала содержат или бакеты данных или бакеты индекса  ниж-
 
   него уровня, и любая замена данных в  буферном  пуле  начи-
 
   нается с этих буферов.
 
        Число   буферов   (CONNECT   MULTIBUFFER_COUNT,   поле
 
   RAB$B_MBF в блоке RAB) задается в момент  выполнения  прог-
 
   раммы, и рекомендуемые значения  для  различных  применений
 
   могут сильно изменяться. В зависимости от  типа  доступа  к
 
   файлу следует учитывать следующие рекомендации:
 
        1) полностью прямой доступ. Рекомендуется использовать
 
   столько буферов, сколько  может  обеспечить  рабочий  набор
 
 
 
                            - 273 -
 
                         00152-01 92 01
 
 
   прикладной программы для того, чтобы кэшировать по  возмож-
 
   ности большее число индексных бакетов;
 
        2) последовательный доступ. Даже в случае  обнаружения
 
   первой записи  прямым  доступом,  использование  некоторого
 
   небольшого количества  буферов,  например,  двух,  является
 
   достаточным.
 
        Во многих применениях осуществляется доступ к  файлам,
 
   с использованием некоторой смеси обеих типов доступа:  пря-
 
   мого и последовательного. Для таких применений рекомендует-
 
   ся некоторый компромисс при выборе числа буферов.
 
        Когда в индексный  файл  добавляются  записи,  следует
 
   рассмотреть выбор режима отложенной  записи (атрибут  языка
 
   описания файла FILE DеFERRED_WRITE, разряд FAB$V_DFW в поле
 
   FAB$L_FOP блока FAB). При использовании этого режима буфер,
 
   в который были перемещены записи, не выводится на  диск  до
 
   тех пор, пока данный буфер не понадобится для других  целей
 
   или пока не закроется  данный  файл.  Этот  режим,  однако,
 
   может привести к тому, что некоторые записи будут  утеряны,
 
   если произойдет аварийный отказ системы до  того,  как  они
 
   будут записаны на диск.
 
        Значение текущего числа буферов по умолчанию для  про-
 
   цесса, определяется по команде SHOW RMS_DEFAULT языка  DCL.
 
   Для установки числа буферов  по  умолчанию  для  процессов,
 
   следует          использовать          команду          SET
 
   RMS_DEFAULт/INDEXED/BUFFER_COUNT=N языка DCL, где N являет-
 
   ся числом буферов.
 
 
 
 
 
 
 
 
 
 
                            - 274 -
 
                         00152-01 92 01
 
 
        6.3.6. Использование  глобальных  буферов  для
 
               разделяемых файлов
 
 
        СУД-32 поддерживает два типа  буферов  -  локальные  и
 
   глобальные.
 
        Локальные буферы размещаются в  адресном  пространстве
 
   процесса и не используются совместно с другими  процессами,
 
   даже если несколько процессов осуществляют доступ к  одному
 
   и тому же файлу и читают одни и те  же  записи.  Глобальные
 
   буферы, которые разделяются между процессами,  осуществляют
 
   доступ к одним и тем же файлам и, возможно, даже к одним  и
 
   тем же записям, не располагаются  в  адресном  пространстве
 
   процесса.
 
        Если несколько процессов разделяют  относительный  или
 
   индексный файл (или последовательный файл с записями фикси-
 
   рованной длины размером по 512 байтов), то следует указать,
 
   что данный файл будет использовать глобальные буферы.  Гло-
 
   бальный буфер является  буфером  ввода-вывода,  к  которому
 
   могут осуществлять доступ два или более процессов при  раз-
 
   делении файла. Если два  или  более  процессов  запрашивают
 
   одну и ту же информацию из файла, то каждый  процесс  может
 
   использовать глобальные буферы вместо  распределения  своих
 
   собственных локальных буферов. На рис.18 показано использо-
 
   вание глобальных буферов.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 275 -
 
                         00152-01 92 01
 
 
        Использование глобальных буферов для разделяемых
 
                             файлов
 
 
                       Системное адресное
                          пространство
                     !--------------------!
                     !                    !
                     !--------------------!
   -------------     !                    !     -------------
   ! Процесс 1 !<--->!                    !<--->! Процесс 3 !
   -------------     !     Глобальный     !     -------------
                     !       буфер        !
   -------------     !                    !     -------------
   ! Процесс 2 !<--->!                    !<--->! Процесс 4 !
   !------------     !                    !     -------------
                     !--------------------!
                     !         !          !
                     !--------------------!
                               !
                               !
                               !
                             Блоки
                           (бакеты)
                               !
                               !
                               V
                           ---------
                           ! Файлы !
                           ---------
 
 
 
                            Рис. 18
 
 
        Доступ к глобальным  буферам  может  быть  осуществлен
 
   несколькими процессами, организующими  доступ  к  одному  и
 
   тому же файлу. Когда некоторая запись, запрошенная  процес-
 
   сом, обнаружена в одном из глобальных  буферов,  то  данная
 
   запись может быть передана непосредственно из данного  гло-
 
   бального буфера в прикладную программу, без выполнения опе-
 
   рации ввода. Если запись, содержащаяся в глобальном буфере,
 
   была модифицирована некоторым процессом, отличным  от  про-
 
   цесса, запрашивающего данную запись, то  СУД-32  записывает
 
   содержимое соответствующего буфера на  диск  до  того,  как
 
   передать запрашивающему процессу эту запись, для того, что-
 
 
 
                            - 276 -
 
                         00152-01 92 01
 
 
   бы гарантировать, что модифицированный бакет в буфере соот-
 
   ветствует своему образу на диске.
 
        Имеются две ситуации, когда глобальные буферы для раз-
 
   деляемых файлов использоваться не могут.  Во-первых,  когда
 
   организуется доступ к  некоторому  файлу,  постоянному  для
 
   процесса, СУД-32 не будет пользовать глобальные буферы (при
 
   этом не выдается никакой ошибки). Во-вторых, когда  некото-
 
   рый  образ  скомпонован  с   использованием   квалификатора
 
   IOSEGMENT=NOP0BUFS в команде  LINK,  то  СУД-32  глобальные
 
   буферы использовать не будет.
 
        Даже если используются глобальные буферы, должно  быть
 
   запрошено некоторое минимальное  число  локальных  буферов,
 
   потому что при некоторых условиях системе СУД-32, возможно,
 
   понадобится их использование. При попытке доступа к  записи
 
   СУД-32 ищет данную запись  сначала  в  глобальном  буферном
 
   пуле, прежде чем анализировать локальные буферы. Если  тре-
 
   буемая запись  все  же  не  найдена,  выполняется  операция
 
   ввода-вывода. Когда используется отложенная  запись и  гло-
 
   бальные буферы разрешены, то число бакетов,  которое  может
 
   быть  буферизовано  без  ввода-вывода,  будет  равно  числу
 
   локальных  буферов.  Таким  образом,  пользователю  следует
 
   проанализировать возможность использования локальных  буфе-
 
   ров, число которых превышает минимально допустимое.
 
        Число используемых глобальных буферов  задается  одним
 
   из двух способов: при помощи использования некоторого зара-
 
   нее установленного значения  по  умолчанию  для  файла  или
 
   путем задания этого значения процессом, который  первый  по
 
   времени осуществляет доступ к файлу. Для того, чтобы  уста-
 
   новить значение по умолчанию для файла  (которое  поддержи-
 
   вается в заголовке  данного  файла),  следует  использовать
 
 
                            - 277 -
 
                         00152-01 92 01
 
 
   команду SET FILE/GLOBAL_BUFFERS=N языка DCL.
 
        Для того, чтобы установить данное  значение  в  момент
 
   выполнения программы,  необходимо  чтобы  процесс,  который
 
   первым присоединяется к данному файлу со значением атрибута
 
   FILE GLOBAL_BUFFER_COUNT или в поле FAB$W_GBC в  блоке  FAB
 
   большим чем 0, мог установить  это  значение.  Значение  по
 
   умолчанию, заданное в поле FAB$W_GBC, после выполнения опе-
 
   рации OPEN (или CREATE), может  быть  изменено,  до  вызова
 
   операции CONNECT. Если  попытки  открытия  и  присоединения
 
   файла были сделаны ранее или будут сделаны в дальнейшем, то
 
   число глобальных буферов определяет будет  или  нет  данный
 
   процесс использовать глобальные буферы. Если данное  значе-
 
   ние равно 0, то процесс будет использовать только локальные
 
   буферы. Если данное значение больше  0,  то  процесс  будет
 
   использовать глобальные буферы вместе с другими процессами.
 
   Для получения дополнительной  информации  по  использованию
 
   поля FAB$W_GBC и  операции  CONNECT  следует  обратиться  к
 
   документу [2]. Пример подпрограммы,  которая  устанавливает
 
   число глобальных буферов после открытия  файла  приведен  в
 
   разделе 4.
 
        Чтобы задать для глобального буферного пула доступ то-
 
   лько по  чтению, надо задать атрибуты SHARING GET и SHARING
 
   MULTISTREAMING (разряды FAB$V_SHRGET  и  FAB$V_MSE  в  поле
 
   FAB$B_SHR блока FAB). Это улучшит производительность сиСТЕ-
 
   мы за счет исключения некоторых внутренних операций,  таких
 
   как поддержка захватов бакетов в глобальном буферном пуле.
 
        Отметим, что когда  для  некоторого  индексного  файла
 
   используются глобальные буферы, то рекомендуется устанавли-
 
   вать их число больше, чем установленное число буферов, при-
 
   веденное ранее для числа локальных  буферов  (данное  число
 
 
                            - 278 -
 
                         00152-01 92 01
 
 
   зависит от организации файла и от типа доступа к  записям).
 
   Когда прикладная программа модифицируется для  того,  чтобы
 
   использовать глобальные буферы, при прямом доступе к  запи-
 
   сям можно  рассмотреть  возможность  экспериментирования  с
 
   большим числом глобальных буферов (и/или с большими  разме-
 
   рами бакетов). Для применений с несколькими пользователями,
 
   следует рассмотреть распределение глобальных буферов, число
 
   которых равно числу локальных буферов, умноженное  на  при-
 
   мерное среднее  число  пользователей  (если  это  позволяют
 
   ресурсы). Когда используется индексный файл, то, если  глу-
 
   бина индекса небольшая, а число пользователей велико,  сле-
 
   дует рассмотреть возможность выделения  достаточного  коли-
 
   чества глобальных буферов для того, чтобы держать в  памяти 
 
   всю структуру индекса.
 
 
 
 
                      7. ОБРАБОТКА ЗАПИСЕЙ
 
 
 
        В этом разделе описывается обработка записей,  включая
 
   операции над записями,  режимы  доступа  для  операций  над
 
   записями, асинхронное завершение операций  над  записями  и
 
   основные операции над записями.
 
        В дополнение к режимам, описываемым в этом разделе  (и
 
   кроме того в разделе 8), необходимо учитывать, что  текущее
 
   положение записи используется как некоторый подразумеваемый
 
   аргумент (входной) для операций UPDATE, DELETE,  RELEASE  и
 
   TRUNCATE. Можно использовать операции FIND и GET для  того,
 
   чтобы установить соответствие теущего контекста записи и ее
 
   правильного местоположения в файле.
 
 
 
 
 
                            - 279 -
 
                         00152-01 92 01
 
 
        7.1. Операции  над  записями  и  организация
 
             файла
 
 
        Организация файла определяет  типы  операций,  которые
 
   может выполнить прикладная программа:
 
        1) DELETE (исключение) - удаление существующей  записи
 
   из файла. Операция DELETE, которая может быть  использована
 
   только для относительных и индексных файлов,  соответствует
 
   оператору DELETE в языках бейсик, кобол, фортран,  паскаль,
 
   ПЛ/1;
 
        2) FIND (поиск) - поиск существующей записи  в  файле.
 
   Найденная запись в прикладную программу не передается,  она
 
   фиксируется как текущая для данного потока.  Операция  FIND
 
   соответствует оператору FIND в  языках  БЕЙСИК  и  фортран,
 
   оператору START в языке кобол, операторам FIND или LOCATE в
 
   языке паскаль и оператору READ с ключевым словом SET в язы-
 
   ке ПЛ/1;
 
        3) GET (получение) - передача существующей записи фай-
 
   ла в прикладную программу. Операция GET соответствует  опе-
 
   ратору GET в языке бейсик, оператору READ в  языках  кобол,
 
    ФОРТРАН и ПЛ/1 и оператору GET (и другим) в языке паскаль;
 
        4) PUT (занесение) - занесение новой  записи  в  файл.
 
   Операция PUT соответствует операторам PUT и PRINT  в  языке
 
   бейсик, оператору WRITE (и другим) в языке кобол, оператору
 
   WRITE в языках  ФОРТРАН и ПЛ/1 и операторам PUT и WRITELN  в
 
   языке паскаль;
 
        5) UPDATE (замена) - модификация записи, которая  была
 
   прочитана из файла в буферную  область.  СУД-32  записывает
 
   модифицированную запись в файл, замещая старую запись. Опе-
 
   рация UPDATE соответствует оператору UPDATE в языках бейсик
 
 
 
                            - 280 -
 
                         00152-01 92 01
 
 
   и паскаль и оператору REWRITE в  языках  кобол,   ФОРТРАН  и
 
   ПЛ/1.
 
        Один оператор языка программирования  высокого  уровня
 
   может соответствовать одному или  нескольким  обращениям  к
 
   операциям  обработки  записей  СУД-32.  Например,  оператор
 
   DELETE языка КОБОЛ использует операцию  DELETE  СУД-32  для
 
   последовательного доступа к  записям,  и  операции  FIND  и
 
   DELETE - для прямого доступа к записям.
 
        В табл.28 приведены основные операции, которые  допус-
 
   кает СУД-32 для каждой организации файла.
 
                                                   Таблица 28
 
           Операции над записями и организация файлов
 
   ----------------------------------------------------------
    Допустимая   !         Организация файла
    операция над !-------------------------------------------
    записью      !Последовательная! Относительная! Индексная
   ----------------------------------------------------------
                 !                !              !
    GET          !  Да            !  Да          !  Да
                 !    1)          !              !
    PUT          !  Да            !  Да          !  Да
                 !                !              !
    FIND         !  Да            !  Да          !  Да
                 !                !              !
    DELETE       !  Нет           !  Да          !  Да
         2)      !    3)          !              !
    UPDATE       !  Да            !  Да          !  Да
                 !                !              !
 
   -------------------
   1)
     Для последовательного файла СУД-32 обеспечивает добавле-
 
     ние записей только в конец файла. Записи могут  быть за-
 
     несены  в другие  места  файла, используя операцию PUT с
 
     режимом  "корректировать-если".
 
   2)
     Когда  выполняется операция UPDATE для последовательного
 
     файла,  то  длину  записи  изменить  нельзя.
 
   3)
     СУД-32 допускает  операции  UPDATE  только дисковых уст-
 
 
 
                            - 281 -
 
                         00152-01 92 01
 
 
     ройств.
 
        Режимы, которые применяются в основных  операциях  при
 
   обработке записей, обобщены в разделе 8.
 
        В дополнение к основным операциям обработки записей, в
 
   СУД-32 предусмотрены следующие дополнительные операции:
 
        1) CONNECT (присоединение) -  присоединение  к  одному
 
   потоку доступа к записям или к нескольким потокам;
 
        2) DISCONNECT (отсоединение) - отсоединение от  потока
 
   записей. Выполняется неявно, когда файл  закрывается,  если
 
   используются несколько потоков записей, можно отсоединиться
 
   от одного потока записей, но не от остальных;
 
        3) FLUSH (вывод на диск) - запись на диск  модифициро-
 
   ванных буферов вывода  и  информации  об  атрибутах  файла,
 
   находящейся в памяти;
 
        4) FREE (освобождение) -  освобождение  всех  записей,
 
   захваченных данным потоком;
 
        5) NEXT VOLUME (следующий том) - продолжение обработки
 
   следующего тома, входящего в набор томов на магнитной  лен-
 
   те. Эта операция применяется  только  для  последовательных
 
   файлов на ленте;
 
        6) RELEASE (освобождение текущей) - освобождение теку-
 
   щей записи;
 
        7) REWIND (позиционирование  на  начало)  -  установка
 
   указателя на первую запись для данного потока;
 
        8) TRUNCATE (отсечение) -  усечение  последовательного
 
   файла;
 
        9) WAIT (ожидание) - ожидание  завершения  асинхронной
 
   операции над записью (или операции CONNECT).
 
        Имеется также ряд операций по обработке  файлов,  под-
 
   робно перечисленные в документе [2].
 
 
                            - 282 -
 
                         00152-01 92 01
 
 
        7.1.1. Определение режима доступа к записям
 
 
        В СУД-32  предусмотрены  следующие  режимы  доступа  к
 
   записям:
 
        1) последовательный - этот режим доступен  для  файлов
 
   любой организации и указывает на то, что доступ  к  записям
 
   осуществляется в соответствии с их физическим следованием в
 
   последовательном  файле,  в  соответствии  с   возрастающим
 
   порядком следования номеров записей для относительных  фай-
 
   лов или в соответствии с возрастающим  порядком  следования
 
   значений заданного пользователем ключа для  индексных  фай-
 
   лов;
 
        2) прямой по ключу - допускается для индексных  файлов
 
   и означает поиск требуемой записи по заданному ключу.  Ключ
 
   размещается внутри записи;
 
        3) прямой по номеру записи - допускается  для  относи-
 
   тельных файлов и означает поиск требуемой записи по  задан-
 
   ному номеру. Номер записи не  обязательно  располагается  в
 
   ней. Этот режим может быть также использован для последова-
 
   тельных файлов с записями фиксированной длины  размером  по
 
   512 байтов;
 
        4) прямой по адресу записи в файле  -  указывает,  что
 
   заданный адрес записи в файле (RFA) используется для  того,
 
   чтобы обнаружить  необходимую  запись  в  последовательном,
 
   относительном или индексном файле. Этот режим, обычно, дос-
 
   тупен для программ, написанных на языке МАКРОАССЕМБЛЕРа.
 
        Тип доступа к записи может быть изменен без повторного
 
   открытия файла или повторного присоединения к данному пото-
 
   ку записей. Например, можно осуществлять доступ к индексно-
 
   му файлу, используя прямой доступ по ключу для того,  чтобы
 
 
 
                            - 283 -
 
                         00152-01 92 01
 
 
   установить необходимую начальную позицию в данном файле,  а
 
   затем обрабатывать записи файла последовательно по ключу до
 
   тех пор, пока  не  потребуется  некоторая  новая  начальная
 
   позиция в данном файле. При этом необходим доступ  к  соот-
 
   ветствующему управляющему блоку СУД-32 во время  выполнения
 
   программы.
 
        При добавлении записей в индексный файл, следует  учи-
 
   тывать упорядоченность  добавляемых  записей  по  значениям
 
   первичного ключа. Если добавляемые записи по значению  пер-
 
   вичного ключа не упорядочены, то следует задать режим  пря-
 
   мого доступа к записям. Если эти записи упорядочены по воз-
 
   растанию значений первичного ключа, то следует задать режим
 
   последовательного доступа к записям.
 
        Режим доступа к записи задается при помощи  соответст-
 
   вующих операторов языка  программирования  или  при  помощи
 
   установки значений полей управляющего блока доступа к запи-
 
   сям (RAB). Атрибуты языка описания файла  не  используются.
 
   Соответствующие значения поля RAB$B_RAC в блоке RAB следую-
 
   щие:
 
        1) последовательный доступ задается при помощи  значе-
 
   ния RAB$C_SEQ;
 
        2) прямой доступ по ключу или прямой доступ по относи-
 
   тельному номеру записи задается значением RAB$C_KEY;
 
        3) прямой доступ по адресу записи в файле задается при
 
   помощи значения RAB$C_RFA.
 
 
        При поиске записей по  значениям  ключей  в  индексных
 
   файлах, возможно, потребуется задание дополнительной инфор-
 
   мации, например, о типе ключей (первичный или  альтернатив-
 
   ный).
 
 
 
                            - 284 -
 
                         00152-01 92 01
 
 
        7.1.2. Обработка последовательных файлов
 
 
        При обработке последовательного файла  обычно  исполь-
 
   зуется режим последовательного доступа к записям. Если файл
 
   располагается на диске, то  может  быть  также  использован
 
   режим прямого доступа к записям по адресу записи  в  файле,
 
   а, если файл состоит из  записей  фиксированной  длины,  то
 
   допускается прямой доступ к записям по относительному номе-
 
   ру записи. Добавление записей осуществляется только в конец
 
   файла.
 
        При  помощи  операции  FIND  первая  найденная  запись
 
   об'является  текущей.  Текущая  запись  представляет  собой
 
   некоторую точку отсчета,  начиная  с  которой  производится
 
   обработка последующих записей. При последовательном доступе
 
   текущая запись может быть определена путем  пропуска  пред-
 
   ществующих ей записей. При  прямом  доступе  операция  FIND
 
   может сразу определить текущую запись, находящуюся,  напри-
 
   мер, в середине файла.
 
        Последовательная организация файла не позволяет выпол-
 
   нять удаление из него записей. Для дискового файла возможна
 
   замена записей, если, при этом, их длина не изменяется.
 
        Последовательная организация  файла  поддерживает  все
 
   режимы доступа к записям,  которые  обеспечиваются  СУД-32.
 
   Прямой доступ  по  относительному  номеру  записи,  однако,
 
   может быть использован  только  для  записей  фиксированной
 
   длины размером по 512 байтов, для дисковых файлов.  В  под-
 
   пунктах данного пункта описаны  последовательный  и  прямой
 
   режимы доступа для последовательных файлов.
 
 
 
 
 
 
 
                            - 285 -
 
                         00152-01 92 01
 
 
        7.1.2.1. Последовательный доступ
 
 
        Режим  последовательного  доступа  поддерживается  для
 
   всех устройств, включая  устройства с  нефайловой  структу-
 
   рой, такие как терминалы, почтовые ящики или магнитные лен-
 
   ты.
 
        Записи из последовательных файлов  извлекаются  в  том
 
   порядке, в котором они поступили в файл. Если все записи из
 
   последовательного файла уже извлечены, то любая  дальнейшая
 
   попытка прочитать следующую  запись  приводит  к  появлению
 
   условия "конец-файла".
 
        Новая запись всегда поступает в конец файла.
 
 
 
        7.1.2.2. Прямой доступ
 
 
        Прямой доступ по относительному  номеру  записи  может
 
   быть использован и для извлечения и  для  ввода  записей  в
 
   последовательные  дисковые  файлы  с  фиксированной  длиной
 
   записей, равной 512 байт. Записи нумеруются в  возрастающем
 
   порядке, начиная с 1.
 
        Ввод новой записи в середину файла, возможен, если  ее
 
   относительный номер меньше  или  равен  наибольшему  номеру
 
   записи в этом файле. При этом необходимо  установить  режим
 
   "корректировать-если" (атрибут языка описания файла CONNECT
 
   UPDATE_IF или разряд RAB$V_UIF в поле RAB$L_ROP управляюще-
 
   го блока RAB). Установка этого  режима  позволяет  заменить
 
   существующие записи новыми записями.
 
        Когда осуществляется прямой доступ  по  относительному
 
   номеру записи в последовательном  файле,  то  номер  записи
 
   должен располагаться в блоке RAB, в ячейке с  символическим
 
   смещением RAB$L_KBF. Длина ключа (в данном  случае  номера)
 
 
                            - 286 -
 
                         00152-01 92 01
 
 
   должна быть задана равной 4 в поле с  символическим  смеще-
 
   нием RAB$B_KBZ.
 
 
 
        7.1.3. Обработка относительных файлов
                        
 
        Относительная организация файла позволяет большую гиб-
 
   кость в выполнении операций над  записями,  чем  последова-
 
   тельная организация. Программа  может  читать  существующие
 
   записи из данного файла, используя  последовательный  режим
 
   доступа, прямой  режим  доступа  по  относительному  номеру
 
   записи (такой же режим как прямой доступ по ключу) или пря-
 
   мой режим доступа по адресу записи в  файле.  Новые  записи
 
   могут заноситься в файл или в последовательном или в прямом
 
   режимах в том случае, если ячейка,  в  которую  будет  осу-
 
   ществляться занесение записи является пустой. Возможно так-
 
   же удаление записи.
 
        Все режимы доступа к записям  в  относительных  файлах
 
   позволяют задавать положение записи в данном файле  (опера-
 
   ция FIND). Удаление записи возможно только после того,  как
 
   она найдена. После удаления записи  соответствующая  пустая
 
   ячейка становится доступной для  новой  записи.  Прикладная
 
   программа может корректировать записи в любом месте данного
 
   файла. Если записи  имеют  переменную  длину,  то  операция
 
   UPDATE может модифицировать длину данной записи  вплоть  до
 
   максимального размера записи, заданного при создании файла.
 
        При вводе новой записи в относительный файл она  поме-
 
   щается в фиксированную ячейку внутри данного файла.  Ячейка
 
   внутри  относительного  файла  может  содержать   некоторую
 
   запись, быть пустой или содержать удаленную запись.
 
 
 
 
 
                            - 287 -
 
                         00152-01 92 01
 
 
        7.1.3.1. Последовательный доступ
 
 
        Для относительных файлов последовательный режим досту-
 
   па может быть использован для того,  чтобы  последовательно
 
   извлекать записи из файла  в  возрастающем  порядке  номера
 
   записи. Пустые ячейки записей и  ячейки,  которые  содержат
 
   удаленные записи, автоматически пропускаются.
 
 
 
        7.1.3.2. Прямой доступ
 
 
        Для относительных файлов  возможен  прямой  доступ  по
 
   относительному номеру записи. Если  делается  попытка  осу-
 
   ществить доступ или к некоторой пустой ячейке или к некото-
 
   рой ячейке, содержащей удаленную запись,  то  будет  выдано
 
   сообщение об ошибке. Если необходимо задать положение пото-
 
   ка записей для конкретной ячейки, вне зависимости от  того,
 
   содержит ли она некоторую  запись,  то  это  можно  сделать
 
   задав режим "несуществующая запись" (атрибут языка описания
 
   файла CONNECT NONEXISTENT_RECORD  или  разряд  RAB$V_NXR  в
 
   поле RAB$L_ROP блока RAB). Два дополнительных режима  обра-
 
   ботки записей (RAB$L_ROP) могут быть использованы вместе  с
 
   прямым доступом (по относительному номеру записи) в относи-
 
   тельных файлах:
 
        1) при поиске в режиме "ключ больше или равен"  (атри-
 
   бут языка описания файла CONNECT KEY_GREATER_EQUAL или раз-
 
   ряд RAB$V_KGE в поле RAB$L_ROP блока RAB) запись  считается
 
   найденной, если ее номер точно совпадает с заданным  значе-
 
   нием ключа. Если точного совпадения нет, то первая  запись,
 
   номер которой больше заданного  значения  ключа,  считается
 
   найденной;
 
 
 
 
                            - 288 -
 
                         00152-01 92 01
 
 
        2) при поиске в режиме "ключ  больше"  (атрибут  языка
 
   описания  файла   CONNECT   KEY_GREATER_THAN   или   разряд
 
   RAB$V_KGT в поле  RAB$L_ROP  блока  RAB)  первой  найденной
 
   записью считается запись, у которой номер больше заданного.
 
        Режим прямого доступа может также  использоваться  для
 
   ввода новой записи в  относительный  файл.  Возможна  также
 
   замена записи в относительной ячейке, которая может  содер-
 
   жать некоторую запись. Для  этой  цели  следует  установить
 
   режим "корректировать-если".
 
        Когда доступ в относительном файле  осуществляется  по
 
   номеру записи, то данный номер должен располагаться в блоке
 
   RAB, в поле с символическим смещением RAB$L_KBF. При этом в
 
   поле RAB$B_KSZ задается длина ключа (в данном случае  номе-
 
   ра), равная 4.
 
 
 
        7.1.4. Обработка индексных файлов
 
 
        Индексная организация  файла  обеспечивает  наибольшую
 
   гибкость при выполнении операций  над  записями.  Программа
 
   может читать существующие записи из данного файла в  после-
 
   довательном режиме, в  режиме  прямого  доступа  по  адресу
 
   записи в файле или по ключу.
 
        СУД-32 обеспечивает ввод  новых  записей  в  индексный
 
   файл. Запрос на ввод новой записи отвергается только в  том
 
   случае, если значение ключа в новой записи нарушает некото-
 
   рую определенную характеристику ключа: запрет задания  дуб-
 
   лирующихся значений ключа.
 
        При поиске записей допускается  точное  или  приблизи-
 
   тельное совпадение значений ключа. В последнем случае необ-
 
   ходимо задать один из следующих режимов  обработки  записей
 
 
 
                            - 289 -
 
                         00152-01 92 01
 
 
   (RAB$L_ROP):
 
        1) режим "ключ больше или равен" (атрибут языка описа-
 
   ния файла CONNECT KEY_GREATER_EQUAL или разряд RAB$V_KGE  в
 
   поле RAB$L_ROP блока RAB) позволяет найти требуемую  запись
 
   по точному совпадению заданного значения ключа. Если запись
 
   по точному совпадению не найдена, то  будет  выдана  первая
 
   запись, значение ключа у которой больше заданного;
 
        2) режим "ключ больше" (атрибут языка  описания  файла
 
   CONNECT  KEY_GREATER_THAN  или  разряд  RAB$V_KGT  в   поле
 
   RAB$L_ROP блока RAB). Первая  запись,  у  которой  значение
 
   ключа больше заданного, считается найденной.
 
        Для ключей со строковым типом данных допускается груп-
 
   повое совпадение.  При  групповом  совпадении  сравнивается
 
   только заданное число начальных символов в ключе. Групповое
 
   совпадение может быть использовано вместе с режимами  приб-
 
   лизительного совпадения, описанными выше.
 
        Для поиска записей можно выполнить операцию FIND, ана-
 
   логичную операции GET, в последовательном режиме, в  режиме
 
   прямого доступа по адресу записи в файле или по ключу.  При
 
   поиске записей в режиме прямого доступа к записям по  ключу
 
   можно задать один из четырех типов совпадений ключа,  обес-
 
   печиваемых для операций чтения.
 
        В дополнение к операциям поиска,  чтения  и  занесения
 
   записей прикладная программа  может  удалять  или  заменять
 
   любую запись в индексном файле. Во время выполнения  опера-
 
   ции UPDATE модификация не может нарушить заданные  характе-
 
   ристики ключа. Например, если значение ключа не может  быть
 
   изменено, то операция UPDATE отвергается, если это  условие
 
   обнаруживается.
 
 
 
 
                            - 290 -
 
                         00152-01 92 01
 
 
        7.1.4.1. Последовательный доступ
 
 
 
        Извлечение записей осуществляется в порядке их  следо-
 
   вания, по возрастающему значению  рабочего  ключа.  Рабочий
 
   ключ (ключ ссылки) (например, первичный ключ,  первый  аль-
 
   тернативный ключ, второй альтернативный ключ и так  далее),
 
   устанавливается при использовании одной из следующих опера-
 
   ций:
 
        1) CONNECT;
 
        2) REWIND;
 
        3) FIND или GET, использующих прямой доступ.
 
        Операции GET или PUT, задающие прямой доступ по адресу
 
   записи в файле, всегда устанавливают в качестве ключа ссыл-
 
   ки первичный ключ.
 
        Когда в режиме последовательного доступа  используется
 
   операция    PUT    для    ввода     новых     записей     в
 
   индексно-последовательный файл, то  входные  записи  должны
 
   следовать в возрастающем порядке значений первичного ключа.
 
 
 
        7.1.4.2. Прямой доступ
 
 
        Одним из наиболее полезных  свойств  индексного  файла
 
   является то, что имеется возможность извлечения  записей  в
 
   режиме прямого доступа по значению ключа. Сам ключ (первич-
 
   ный или  альтернативный)  и  его  значение  задаются  перед
 
   выполнением соответствующей операции. Для поиска  требуемой
 
   записи СУД-32 просматривает соответствующий индекс.
 
        При поиске записи по  ключу  возможны  следующие  виды
 
   проверок:
 
        1) на точное совпадение значений ключа;
 
 
 
                            - 291 -
 
                         00152-01 92 01
 
 
        2) на приблизительное совпадение значений ключа;
 
        3) на групповое совпадение значений ключа;
 
        4) на приблизительное и групповое совпадение  значений
 
   ключа.
 
        Точное совпадение требует, чтобы значение данного клю-
 
   ча в извлекаемой записи точно совпадало со значением ключа,
 
   заданным в операции GET.
 
        Приблизительное совпадение ключа означает  возможность
 
   выбора записи у которой значение ключа  больше  или  равно,
 
   (либо строго больше) значения, заданного в операции GET.
 
        Преимущество приблизительного совпадения значений клю-
 
   ча состоит в том, что если запись с точным значением  ключа
 
   в файле отсутствует, то СУД-32  выдает  запись,  содержащую
 
   следующее большее значение ключа. Это позволяет  прикладной
 
   программе извлекать записи, не зная точного значения ключа.
 
        Групповое совпадение ключа означает,  что  в  операции
 
   GET необходимо задать только начальную часть значения  клю-
 
   ча, например,  его первые пять байтов (символов) из возмож-
 
   ных семи). СУД-32 передает в прикладную  программу   первую
 
   запись, у которой значение ключа начинается с  этих  симво-
 
   лов. Эта возможность полезна, когда делается попытка  найти
 
   некоторую запись по известной части значения  ключа  или  в
 
   тех случаях, когда должна быть извлечена некоторая последо-
 
   вательность записей, у которых идентичны  только  начальные
 
   части значений ключа. Групповое  совпадение  допустимо  для
 
   ключей со строковыми типами данных.
 
        Например, рассмотрим значение некоторого ключа  равное
 
   ABB для того, чтобы получить доступ к записям со значениями
 
   данного ключа - ABA, ABB  и  ABC.  При  поиске  по  условию
 
   "больше или равно" (или по условию "равно"), на длине  зна-
 
 
                            - 292 -
 
                         00152-01 92 01
 
 
   чения ключа, равной 3 байтам, выдается  запись,  содержащая
 
   ключ ABB. При поиске по условию "больше", на длине значения
 
   ключа, равной 3 байтам, выдается запись со значением  ключа
 
   ABC. При поиске по условию "равно" на длине значения ключа,
 
   равной 2 байтам, выдается запись с ключом ABA.
 
        Последний тип совпадения ключа  совмещает  возможности
 
   группового  и  приблизительного  совпадения.  В  прикладной
 
   программе задается только некоторая начальная часть  значе-
 
   ния данного ключа как и  при  групповом  совпадении.  Кроме
 
   того, задается, что значение ключа извлекаемой записи долж-
 
   но соответствовать одному из следующих условий:
 
        1) равно или больше заданного значения;
 
        2) больше заданного значения.
 
        Используя приведенный пример записей  с  ключами  ABA,
 
   ABB и ABC, отметим, что задание в операции GET ключа ABB  с
 
   групповым совпадением, на длине 2 байта и с условием "боль-
 
   ше или равно" приводит к выдаче записи ABA, на длине 2 бай-
 
   та и с условием "больше" приводит к  появлению  уведомления
 
   "запись не найдена " (предполагается, что в данном файле не
 
   существует других записей, кроме трех перечисленных).
 
        Если необходимо найти все записи, у которых  начальные
 
   символы значения ключа - AB, т.е. записи с ключами ABA, ABB
 
   и ABC, то в этом случае в прикладной  программе  необходимо
 
   задать начальное значение данного ключа и выполнить следую-
 
   щие действия:
 
        1) выполнить операцию GET (или FIND) для поиска первой
 
   записи (записи со значением ключа ABA);
 
        2) провести изменение режима доступа к записям на пос-
 
   ледовательный;
 
 
 
 
                            - 293 -
 
                         00152-01 92 01
 
 
        3) выполнить операцию GET для чтения следующей записи;
 
        4) выполнить  сравнение  первых  двух  символов  ключа
 
   выданной записи с первыми двумя символами заданного  значе-
 
   ния, т.е. с AB;
 
        5) если эти символы совпадают, то обработать найденную
 
   запись и снова перейти к шагу 3;
 
        6) если эти символы не совпадают, то данную запись  не
 
   обрабатывать и  перейти  к  выполнению  следующего  участка
 
   программы, не забыв изменить режим доступа к записям  снова
 
   на "прямой", если это необходимо.
 
        Приведенная процедура может  быть  использована  также
 
   для того, чтобы получить все  записи,  у  которых  значения
 
   ключа совпадают, в  случае,  если  разрешены  дублирующиеся
 
   значения ключа. Альтернативой проверке соответствующих сим-
 
   волов является задание некоторого конечного значения  ключа
 
   и установка режима предельного значения ключа, когда доступ
 
   к записям изменяется на последовательный.
 
        Когда доступ к некоторому индексному  файлу  осуществ-
 
   ляется по ключу, то значение ключа должно  располагаться  в
 
   блоке RAB, в поле с символическим смещением RAB$L_KBF. Если
 
   тип данного ключа "строковый", то  в  поле  с символическим
 
   смещением RAB$B_KSZ следует задать длину ключа.
 
 
 
        7.1.5. Доступ по адресу в файле
 
 
        Как было упомянуто  ранее,  прямой  доступ  по  адресу
 
   записи в файле поддерживается для  всех  организаций  файла
 
   при условии, что данный файл располагается на  диске.  Если
 
   требуемая запись при этом  успешно  найдена,  то  ее  адрес
 
   выдается в блоке RAB,  в  поле  с  символическим  смещением
 
 
 
                            - 294 -
 
                         00152-01 92 01
 
 
   RAB$W_RFA. СУД-32 может использовать данный адрес для того,
 
   чтобы извлечь эту запись (если это было специально оговоре-
 
   но путем указания режима доступа по адресу записи в файле).
 
        Например, для использования доступа по адресу записи в
 
   файле можно установить некоторую позицию записи для  после-
 
   дующего последовательного доступа  к  другим  записям.  Это
 
   также могло бы быть сделано путем  задания  других  режимов
 
   прямого доступа к записям (за исключением доступа к записям
 
   последовательных файлов). Рассмотрим, например,  последова-
 
   тельный файл с записями переменной длины, доступ к которому
 
   может быть осуществлен в режиме прямого доступа  только  по
 
   адресу записи в файле. Предположим, что для файла определен
 
   некоторый список транзакций, отсортированных предварительно
 
   по значению учетного номера. Поскольку для каждого учетного
 
   номера может быть определено  несколько  транзакций,  то  с
 
   каждым учетным номером может быть связано несколько записей
 
   файла, подлежащих обработке. Вместо того, чтобы читать весь
 
   файл до тех пор, пока не будет найдена  первая  запись  для
 
   необходимого учетного номера, можно использовать  некоторое
 
   предварительно сохраненное значение адреса записи  в  файле
 
   и, применяя прямой доступ по адресу записи в файле, устано-
 
   вить текущую позицию записи (например,  используя  операцию
 
   FIND для поиска  первой  записи,  соответствующей  учетному
 
   номеру). Затем можно переключиться в режим последовательно-
 
   го доступа к записям и читать все следующие, одна  за  дру-
 
   гой, записи для этого учетного номера до тех пор,  пока  не
 
   изменится учетный номер или не будет достигнут конец файла.
 
   На рис.19 показана схема доступа к файлу для учетного номе-
 
   ра C.
 
 
 
 
                            - 295 -
 
                         00152-01 92 01
 
 
                  Доступ по адресу записи файла
 
 
   ----------------------------------------    ----------
   !      Прикладная программа:           !    !        !
   ! 1. Чтение 1-й записи по ее адресу    !    !        !
   ! 2. Изменить режим на последовательный!--->! СУД-32 !
   ! 3. Читать остальные записи           !    !\       !
   !                                      !    ! \      !
   ----------------------------------------    ----------
                                               /
                                              /
                                             /
                                            /
                                           /
                                          /
                                         /
                                        !----------------
                                        !   !   !   !   !
   -------------------------------------V---V---V---V---V--
   !  а !  а !  а !  в !  в !  в !  в ! с ! с ! с ! с ! с !
   --------------------------------------------------------
   Записи
 
 
 
                            Рис. 19
 
 
 
 
        7.1.6. Блочный ввод-вывод
 
 
        Блочный ввод-вывод  обеспечивает  выполнение  операций
 
   ввода-вывода на уровне блоков. Таким образом, вместо  того,
 
   чтобы производить операции над записями с учетом  поддержи-
 
   ваемых режимов доступа к ним, можно обрабатывать  файл  как
 
   логическую структуру, состоящую только из некоторого  числа
 
   блоков.
 
        Блочный ввод-вывод является промежуточным звеном между
 
   логическим уровнем ввода-вывода СУД-32 и физическим уровнем
 
   МОС ВП на основе системного обслуживания очередей  запросов
 
   ввода-вывода  (QIO).  Использование  блочного  ввода-вывода
 
   позволяет  осуществлять  полный  контроль  над  данными   в
 
   отдельных блоках файла, и в то же время позволяет сохранить
 
   преимущества возможностей системы СУД-32 при открытии, зак-
 
 
                            - 296 -
 
                         00152-01 92 01
 
 
   рытии и расширении файлов.
 
        При блочном вводе-выводе прикладная  программа  вводит
 
   или  выводит  один  или  более  блоков,  задавая  некоторый
 
   начальный номер виртуального блока в данном файле  и  коли-
 
   чество байтов, подлежащих передаче. СУД-32 обеспечивает для
 
   пользователя доступ к идентифицированному блоку или  блокам
 
   вне зависимости от организации файла.
 
        Поскольку файлы, помимо  собственно  данных,  содержат
 
   внутреннюю  информацию,  необходимую  для  функционирования
 
   СУД-32, не рекомендуется модификация файла с использованием
 
   блочного ввода-вывода, если доступ к нему будет также  осу-
 
   ществляться на уровне записей (операции ввода-вывода блоков
 
   не выполняют обновления  внутренних  структур,  необходимых
 
   для выполнения операций ввода-вывода записей).  Возможности
 
   блочного  ввода-вывода,  однако,  обеспечивают  организацию
 
   файла, требуемую пользователю, которая должна поддерживать-
 
   ся при помощи специализированных, составленных  пользовате-
 
   лем программ и процедур. СУД-32 не может осуществлять  дос-
 
   туп к этим структурам при помощи ее режимов доступа к запи-
 
   сям.
 
        Для получения дополнительной информации об использова-
 
   нии блочного ввода-вывода следует  обратиться  к  документу
 
   [2].
 
 
 
        7.2. Текущий контекст записи
 
 
        Для каждого блока RAB, связанного с  некоторым  блоком
 
   FAB, СУД-32 поддерживает информацию  о  текущем  контексте,
 
   идентифицирующем на какой записи файла позиционирован  блок
 
   RAB в любой заданный момент.  СУД-32  модифицирует  текущий
 
 
 
                            - 297 -
 
                         00152-01 92 01
 
 
   контекст по мере того, как программа пользователя выполняет
 
   операции над записями.
 
        Текущий контекст  записи  представлен,  обычно,  двумя
 
   записями: текущей записью и следующей записью.
 
        Контекст этих двух  записей  является  внутренним  для
 
   СУД-32. Однако полезно знать, что представляет  собой  кон-
 
   текст для того, чтобы получить доступ к необходимой записи,
 
   применяя для этой цели наиболее  оптимальную  операцию  над
 
   записями, как это обобщено в табл.29.
 
                                                   Таблица 29
 
                Контекст потока доступа к записям
 
   ----------------------------------------------------------
   Операция над  ! Режим доступа    ! Текущая ! Следующая
   записями      ! к записи         ! запись  ! запись
   ----------------------------------------------------------
                 !                  !         !
   CONNECT       ! Не применяется   !   Нет   ! Первая запись
                 !                  !         !
   CONNECT с     ! Не применяется   !   Нет   ! Конец файла
   установленным !                  !         !
   разрядом      !                  !         !
   RAB$V_EOF в   !                  !         !
   поле          !                  !         !
   RAB$L_ROP     !                  !         !
                 !                  !         !
   GET, когда    ! Последовательный ! Старая  ! Новая текущая
   последней     !                  ! следую- ! запись+1
   операцией бы- !                  ! щая за- !
   ла не опера-  !                  ! пись    !
   ция FIND      !                  !         !
                 !                  !         !
   GET, когда    ! Последовательный ! Не из-  ! Текущая
   последней     !                  ! мени-   ! запись+1
   операцией бы- !                  ! лась    !
   ла операция   !                  !         !
   FIND          !                  !         !
                 !                  !         !
   GET           !     Прямой       !  Новая  ! Новая текущая
                 !                  !         ! запись+1
                 !                  !         !
   PUT, последо- ! Последовательный !   Нет   ! Конец файла
   вательный     !                  !         !
   файл          !                  !         !
                 !                  !         !
   PUT, относи-  ! Последовательный !   Нет   ! Следующая по-
   тельный файл  !                  !         ! зиция записи
                 !                  !         !
   PUT, индекс-  ! Последовательный !   Нет   ! Не определена
 
 
                            - 298 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 29
   ----------------------------------------------------------
   Операция над  ! Режим доступа    ! Текущая ! Следующая
   записями      ! к записи         ! запись  ! запись
   ----------------------------------------------------------
                 !                  !         !
   ный файл      !                  !         !
                 !                  !         !
   PUT           !     Прямой       !   Нет   ! Не изменилась
                 !                  !         !
   FIND          ! Последовательный ! Старая  ! Новая
                 !                  !следующая! текущая
                 !                  ! запись  ! запись+1
                 !                  !
   FIND          !     Прямой       !  Новая  ! Не изменялась
                 !                  !         !
   UPDATE        ! Не применяется   !   Нет   ! Не изменилась
                 !                  !         !
   DELETE        ! Не применяется   !   Нет   ! Не изменилась
                 !                  !         !
   TRUNCATE      ! Не применяется   !   Нет   ! Конец файла
                 !                  !         !
   REWIND        ! Не применяется   !   Нет   ! Первая запись
                 !                  !         !
   FREE          ! Не применяется   !   Нет   ! Не изменилась
                 !                  !         !
   RELEASE       ! Не применяется   !   Нет   ! Не изменилась
                 !                  !         !
 
 
        П р и м е ч а н и я:
 
 
        1. За исключением операции TRUNCATE, СУД-32 устанавли-
 
   вает текущую запись до того, как устанавливает идентичность
 
   следующей записи.
 
        2. Обозначение "+1" указывает на следующую  посдедова-
 
   тельную запись, как это определяется  организацией  данного
 
   файла.  Для  индексных  файлов  текущий  ключ,  на  который
 
   делается ссылка, является частью этого определения.
 
        3. Операция CONNECT для  индексного  файла  устанавли-
 
   вает, что следующей записью будет первая  запись  в  данном
 
   индексе, представленным полем ключа,  на  который  делается
 
   ссылка (RAB$B_KRF).
 
        4. Операция CONNECT оставляет следущую  запись в конце
 
   файла для файла на магнитной ленте, открытого для  операций
 
 
 
                            - 299 -
 
                         00152-01 92 01
 
 
   PUT (если только  не  установлен  режим  FAB$V_NEF  в  поле
 
   FAB$L_FOP).
 
 
 
        7.2.1. Текущая запись
 
 
        Текущая запись представляет собой целевую  запись  для
 
   операций UPDATE, DELETE, RELEASE и TRUNCATE. Текущая запись
 
   также обеспечивает последовательную обработку  на  дисковых
 
   устройствах для заданного потока.
 
        Когда блок RAB в первый раз присоединяется к некоторо-
 
   му блоку FAB, то текущая  запись  является  неопределенной.
 
   Текущая запись также является  неопределенной  после  любой
 
   неудачной операции над записями или после успешного  выпол-
 
   нения некоторой операции СУД-32, отличной от  операции  GET
 
   или FIND. Если текущая  запись  не  определена,  то  СУД-32
 
   отвергает  любую  операцию  UPDATE,   DELETE,   RELEASE   и
 
   TRUNCATE.
 
        Операция  GET,  использующая  режим  последовательного
 
   доступа к записям, перед которой непосредственно была выда-
 
   на операция FIND, обрабатывает запись,  являющуюся  текущей
 
   записью. Если данная операция FIND не захватила эту  запись
 
   (для относительных и индексных  файлов)  и  текущая  запись
 
   оказалась удаленной (в интервале между FIND и  GET  данного
 
   потока), то операция GET будет осуществлять доступ  к  сле-
 
   дующей существующей записи.
 
        Запись, для которой выполнялась операция GET или FIND,
 
   и для которой установлен  ее  адрес,  об'является  текущей.
 
   СУД-32 помещает этот адрес в поле RFA адреса записи в файле
 
   в блоке доступа к записям (RAB). Результаты при  этом  сле-
 
   дующие:
 
 
 
                            - 300 -
 
                         00152-01 92 01
 
 
        1) после инициализации адрес записи в  файле,  опреде-
 
   ленный в результате последней  успешной  операции  GET  или
 
   FIND указывает на текущую запись (если только не произойдет
 
   сбой или  не  будет  выполнена  некоторая  другая  операция
 
   СУД-32, отличная от операции GET или FIND);
 
        2) поле RAB$W_RFA, если только оно не было модифициро-
 
   вано, всегда содержит адрес целевой  текущей  записи  (если
 
   происходит сбой при выполнении операции, то адрес записи  в
 
   файле не определен).
 
        В табл.29 обобщается  то  влияние,  которое  оказывает
 
   каждая успешная операция над записями на  контекст  текущей
 
   записи.
 
 
 
        7.2.2. Следующая запись
 
 
        СУД-32  использует  следующую  запись  для   операций,
 
   выполняющихся в режиме последовательного доступа к записям.
 
   Когда режим доступа к записям указывает на последовательную
 
   обработку, то следующая запись представляет целевую  запись
 
   для следующей операции,  вызываемой  операциями  FIND  (или
 
   GET, если непосредственно предшествующей операцией не  была
 
   операция FIND) и PUT. Если ячейка следующей записи в  отно-
 
   сительном файле не содержит какую-либо запись,  то  целевой
 
   записью является следующая существующая запись.
 
        Эта  возможность  опережающего  просмотра  существенно
 
   уменьшает время  доступа  для  последовательной  обработки.
 
   СУД-32 использует свою внутреннюю информацию об организации
 
   файла и его структур для того, чтобы  определить  следующую
 
   запись для каждой операции над записями.
 
        Операция CONNECT  инициализирует  следующую  запись  в
 
 
 
                            - 301 -
 
                         00152-01 92 01
 
 
   одной из четырех ячеек:
 
        1) первая запись или ячейка в некотором  файле,  соот-
 
   ветственно с последовательной или  относительной  организа-
 
   цией;
 
        2) первая запись в отсортированной  последовательности
 
   заданного ключа, на который  делается  ссылка  в  индексном
 
   файле;
 
        3)  конец  файла  на  диске,  если  установлен   режим
 
   RAB$V_EOF в поле RAB$L_ROP;
 
        4) конец файла на магнитной ленте со стандартными мет-
 
   ками и доступом по записи, если только не установлен  режим
 
   RAB$V_NEF в поле FAB$L_FOP.
 
 
        Операция GET при любом режиме доступа к записям и опе-
 
   рация FIND при последовательном режиме  доступа  к  записям
 
   приводит к тому, что поле "следующая запись"  будет  указы-
 
   вать на следующую запись или ячейку в данном файле.
 
        Операция  TRUNCATE  приводит  к  тому,  что  следующая
 
   запись будет указывать на конец файла. Следовательно, после
 
   того, как проведено усечение файла, необходимо использовать
 
   только операцию PUT для того, чтобы расширить  его.  Допус-
 
   кается усечение только последовательных файлов.
 
        Операции FIND и PUT в режиме прямого доступа не оказы-
 
   вают никакого влияния на следующую запись с одним возможным
 
   исключением: когда за некоторой операцией  FIND  (или  GET)
 
   следует операция PUT и ключ или  номер  добавляемой  записи
 
   находятся между значениями ключа или номера записи  текущей
 
   записи и следующей записи (больше, чем у текущей записи, но
 
   меньше, чем у следующей записи), то  данная  запись  добав-
 
   ляется в файл после последней записи, изменяя текущий  кон-
 
 
 
                            - 302 -
 
                         00152-01 92 01
 
 
   текст записи на тот, который включает  добавленная  запись.
 
   Другими словами, записи добавляются после последней записи,
 
   но перед следующей записью.
 
        Операция PUT в режиме последовательного  доступа  ста-
 
   рается разместить следующую запись в одном из двух  следую-
 
   щих участков файла:
 
        1) в конце последовательного файла;
 
        2) в следующей ячейке относительного файла.
 
 
        Операция PUT  в  режиме  последовательного  доступа  к
 
   индексному файлу приводит  к  тому,  что  следующая  запись
 
   будет неопределена.
 
        Операции DELETE, UPDATE,  FREE  или  RELEASE  в  любом
 
   режиме доступа к записям не оказывают никакого  влияния  на
 
   следующую запись.
 
        Операция REWIND в любом режиме доступа к записям  при-
 
   водит к тому, что  следующая  запись  указывает  на  первую
 
   запись или ячейку в данном файле. Для индексных файлов сле-
 
   дующей записью после выполнения операции REWIND будет  пер-
 
   вая запись для текущего ключа ссылки.
 
        Любая неудачная операция  над  записями  не  оказывает
 
   никакого влияния на следующую запись.
 
        В табл.29 обобщено то влияние, которое оказывает  каж-
 
   дая успешная операция над записями на следующую запись.
 
 
 
        7.3. Синхронные и асинхронные операции
 
 
        Прикладная  программа  может  выполнять  операции  над
 
   записями одним из двух способов:  синхронно  и  асинхронно.
 
   При синхронной работе программа, выдающая запрос на  опера-
 
   цию над записью, получает управление  назад  только  тогда,
 
 
                            - 303 -
 
                         00152-01 92 01
 
 
   когда данный  запрос  полностью  удовлетворен.  Большинство
 
   языков программирования высокого уровня поддерживают только
 
   синхронные операции. При  асинхронных  операциях  программа
 
   может получить управление назад до того, как данный  запрос
 
   будет  полностью  удовлетворен.  Требуемый   режим   работы
 
   задается для каждого  потока.  Операции  на  уровне  файла,
 
   такие как открытие файла, всегда выполняются синхронно.
 
        Например, если  некоторая  запись  читается  из  файла
 
   синхронно, то программа получает  управление  назад  только
 
   после того, как данная запись будет передана в эту програм-
 
   му. Другими словами, данная программа  будет  находиться  в
 
   состоянии ожидания до тех пор, пока ей  не  будет  передана
 
   эта запись. Во время этого цикла чтения и  передачи  записи
 
   для этой программы не выполняется никакой другой обработки.
 
   С другой стороны, когда некоторая запись читается асинхрон-
 
   но, то программа могла бы быть в состоянии получить  управ-
 
   ление назад до того, как данная запись будет передана в эту
 
   программу. Таким образом, можно использовать время,  обычно
 
   необходимое для передачи записи между файлом и памятью  для
 
   того, чтобы выполнить некоторые другие  вычисления.  Другая
 
   операция над записями не может быть запущена  для  того  же
 
   самого потока до тех пор,  пока  не  завершится  предыдущая
 
   операция над записью. Однако операции над записями для дру-
 
   гих потоков могут быть инициированы.
 
        Возможность получения программой управления  назад  до
 
   того, как будет завершена операция над записью, зависит  от
 
   нескольких факторов. Например, требуемая запись  может  уже
 
   располагаться в буфере ввода-вывода, или операционная  сис-
 
   тема запускает новый процесс, обеспечивая возможность того,
 
   что необходимая операция ввода-вывода  будет  завершена  до
 
 
                            - 304 -
 
                         00152-01 92 01
 
 
   того, как текущий процесс будет запущен снова.
 
        Для асинхронных операций в прикладную программу  необ-
 
   ходимо включить отдельную подпрограмму завершения или  зап-
 
   рос на ожидание. Эта подпрограмма (или запрос на  ожидание)
 
   требуется для того, чтобы  определить  завершение  операции
 
   над записью, поскольку результаты данной операции недоступ-
 
   ны и следующая операция для данного потока  не  может  быть
 
   инициирована до тех пор, пока не закончится предыдущая опе-
 
   рация.
 
 
 
        7.3.1. Использование синхронных операций
 
 
        Для об'явления режима синхронных операций,  необходимо
 
   очистить подполе RAB$V_ASY в поле RAB$L_ROP блока RAB.  Его
 
   очистка предполагается по умолчанию. Однако, если это  под-
 
   поле было предварительно установлено в 1, то необходима его
 
   явная очистка.
 
        Обычно, для синхронных  операций  программы  обработки
 
   результатов операций (успешного  завершения  или  ошибочных
 
   ситуаций) не составляются.  Вместо  этого  проверяется  код
 
   завершения и, в  зависимости  от  результата,  производится
 
   передача управления на требуемую ветвь  программы.  Однако,
 
   если эти подпрограммы используются, то они будут выполнять-
 
   ся в режиме  асинхронных  прерываний  (AST)  до  того,  как
 
   СУД-32 вернет управление в прикладную программу (если толь-
 
   ко асинхронные прерывания не заблокированы).
 
        AST-подпрограммы в режиме  "пользователь"  могут  быть
 
   выполнены до того, как завершится некоторая синхронная опе-
 
   рация над записью (документ [9]).
 
        Если  некоторая  AST-подпрограмма  пытается  выполнить
 
 
 
                            - 305 -
 
                         00152-01 92 01
 
 
   операции над некоторым потоком записей, который  вызывается
 
   не с уровня асинхронных ситемных прерываний, то она  должна
 
   быть  подготовлена  для  того,  чтобы  обрабатывать  ошибки
 
   активности потока (RMS$_RSA или RMS$_BUSY).
 
 
 
        7.3.2. Использование асинхронных операций
 
 
        Для  об'явления  асинхронных  операций  над  записями,
 
   необходимо установить асинхронный режим (RAB$V_ASY) в  поле
 
   RAB$L_ROP. Во время  обработки  некоторого  потока  записей
 
   допускается переключение синхронных и асинхронных  операций
 
   при помощи установки или очистки подполя RAB$V_ASY  индиви-
 
   дуально для каждой операции.
 
        Допускается также задание AST-подпрограмм, на  которые
 
   МОС ВП передает управление при удачном завершении  операций
 
   СУД-32 или ошибочных ситуациях.  Внутри  таких  подпрограмм
 
   можно вызывать дополнительные операции СУД-32, но они также
 
   должны быть асинхронными. Если они не являются таковыми, то
 
   для всех других асинхронных  запросов  СУД-32,  активных  в
 
   прикладной программе в данный момент,  AST-подпрограммы  не
 
   могут быть выполнены до тех пор, пока не завершится  данная
 
   синхронная операция.
 
        Если некоторая асинхронная операция  еще  не  заверши-
 
   лась, то при продолжении выполнения  прикладной  программы,
 
   поле состояния завершения в блоке RAB будет равно 0, а  код
 
   успешного приема запроса СУД-32 (RMS$_PENDING), будет сфор-
 
   мирован в регистре R0. Этот код указывает на то, что данная
 
   операция была инициирована, но еще не завершилась.  Модифи-
 
   кация, до завершения  операции  СУД-32,  содержимого  блока
 
   доступа к записям (RAB), запрещена.
 
 
 
                            - 306 -
 
                         00152-01 92 01
 
 
        Если выдается некоторый второй запрос на операцию  над
 
   записями для того же самого потока до того, как был  завер-
 
   шен предыдущий запрос, то возвращается код ошибки  RMS$_RSA
 
   или RMS$BUSY, указывающий на то, что данный поток  все  еще
 
   активен. Это может также произойти тогда,  когда  некоторая
 
   подпрограмма,  функционирующая  на  уровне  AST-прерываний,
 
   пытается использовать  некоторый  активный  поток  записей.
 
   Первоначальный запрос на ввод-вывод может  быть  синхронным
 
   или асинхронным. При попытке выполнить некоторую  операцию,
 
   используя тот же самый поток записей (блок доступа к  запи-
 
   сям) из некоторой подпрограммы обработки ошибок или  успеш-
 
   ного  завершения,  может  появиться  дополнительная  ошибка
 
   (RMS$_BUSY), когда основная программа находится в  ожидании
 
   завершения первоначальной  операции.  Во  всех  случаях  на
 
   программиста возлагается задача распознания этой ситуации и
 
   предотвращения этой ошибки. Большинство проблем может  быть
 
   снято при  помощи  вызова  операции  WAIT.  Когда  операция
 
   завершится, прикладная программа получит управление в  точ-
 
   ке, следующей за операцией WAIT.
 
        Отметим, что операция  CONNECT  может  быть  выполнена
 
   асинхронно. Если установлен режим RAB$V_ASY, то  за  опера-
 
   цией CONNECT должна следовать операция WAIT для того, чтобы
 
   синхронизоваться с  завершением  операции  CONNECT.  Другой
 
   метод состоит в том, чтобы выполнить операцию CONNECT синх-
 
   ронно и установить  режим  RAB$V_ASY  в  момент  выполнения
 
   программы после того, как выполнится операция CONNECT.
 
 
 
 
 
 
 
 
 
 
                            - 307 -
 
                         00152-01 92 01
 
 
        7.4. Операции над записями
 
 
        В этом разделе кратко описываются  операции  поиска  и
 
   получения записей (FIND и GET), операция занесения  записей
 
   (PUT), операция модификации  записей  (UPDATE)  и  операция
 
   удаления записей (DELETE).
 
        Для получения информации  о других операциях над запи-
 
   сями следует обратиться к документу [2]. К  этим  операциям
 
   относятся: CONNECT, DISCONNECT, FLUSH, FREE,  NEхT  VOLUME,
 
   RELEASE, TRUNCATE и WAIT. Каждая из этих операций выполняет
 
   некоторую специализированную функцию, для  которой  имеется
 
   несколько режимов.
 
 
 
        7.4.1. Поиск и чтение записей
 
 
        Операции FIND и GET (или эквивалентные операторы языка
 
   программирования высокого уровня) используются для поиска и
 
   чтения записей. Операция FIND обеспечивает поиск  требуемой
 
   записи, но не передает ее в прикладную программу.  Операция
 
   GET обеспечивает поиск записи и ее  передачу  в  прикладную
 
   программу.
 
        В области данных программы необходимо выделить  буфер-
 
   ную область, необходимую  для  приема  записи,  проведя  ее
 
   предварительную структуризацию, в соответствии  с  требова-
 
   ниями обработки записи. Длина записи, передаваемой в  прик-
 
   ладную  программу,  формируется  системой  СУД-32  в   поле
 
   RAB$W_RSZ  блока  RAB,  адрес  полученной  записи  в   поле
 
   RAB$L_RBF. Если задан режим поиска, то СУД-32  не  передает
 
   запись в буфер прикладной программы.  Вместо  этого  СУД-32
 
   заносит  соответствующие  значения  в  поля   RAB$W_RSZ   и
 
   RAB$L_RSA для того, чтобы указать на  некоторый  внутренний
 
 
                            - 308 -
 
                         00152-01 92 01
 
 
   буфер СУД-32, в котором находится данная запись.
 
        Когда  используются  индексные  файлы,  то,  возможно,
 
   понадобится выделить некоторый буфер для необходимого ключа
 
   и задать длину этого ключа. Однако, когда используются язы-
 
   ки программирования высокого уровня, то компилятор   данно-
 
   го языка может автоматически обрабатывать данную специфика-
 
   цию распределения и размера буфера записи и буфера ключа.
 
        Имеются случаи, когда  следует  использовать  операцию
 
   FIND вместо операции GET для того, чтобы исключить ненужный
 
   ввод-вывод записей и улучшить  производительность  системы.
 
   Во многих случаях используется  операция  FIND  только  для
 
   того, чтобы установить новую позицию записи  для  одной  из
 
   последующих операций обработки записей, таких  как  UPDATE,
 
   DELETE, GET, RELEASE или TRUNCATE, без необходимости извле-
 
   чения самой записи из файла. Когда требуемая запись найдена
 
   или передана в программу, она может быть  откорректирована.
 
   Но предварительно эту запись следует захватить до тех  пор,
 
   пока данный процесс не завершит  ее  корректировку.  Захват
 
   необходим, если другие пользователи получают доступ к  дан-
 
   ному файлу. Имеются случаи, когда запись необходимо извлечь
 
   из файла (используя операцию GET вместо операции FIND).
 
        При последовательной  обработке  операцию  FIND  можно
 
   использовать, чтобы определить  позицию  начальной  записи,
 
   используя прямой доступ, а затем вызвать последующие опера-
 
   ции GET  в  последовательном  режиме.  Специальным  случаем
 
   использования операции FIND могло бы быть создание  некото-
 
   рой таблицы адресов записей в файле  для  ее  использования
 
   другой программой с  целью  быстрого  получения  доступа  к
 
   записям в том же самом файле.
 
 
 
 
                            - 309 -
 
                         00152-01 92 01
 
 
        Операции извлечения записей, обычно, используются  для
 
   того, чтобы  циклически  читать  записи,  обрабатывать  эти
 
   записи и затем продолжать чтение следующей записи. В  прик-
 
   ладной программе следует проверять условие конца файла пос-
 
   ле каждой операции FIND или GET (или эквивалентного  опера-
 
   тора языка программирования высокого уровня).
 
        Для получения дополнительной информации  об  операциях
 
   FIND и GET следует обратиться к документу [2].
 
 
 
        7.4.2. Занесение записей
 
 
        Операция PUT (или эквивалентный оператор  языка  прог-
 
   раммирования высокого уровня) обеспечивает занесение  новой
 
   записи в файл. В прикладной программе должен  быть  выделен
 
   буфер внутри области  данных  программы,  в  который  перед
 
   выполнением PUT должна  быть  помещена  запись,  подлежащая
 
   занесению в файл. Необходимо  задание  также  длины  записи
 
   (константы для записей фиксированной длины или  переменной,
 
   значение которой меняется от записи к записи  при  вводе  в
 
   файл записей переменной длины или переменной длины  с  пос-
 
   тоянной управляющей частью). При использовании языков прог-
 
   раммирования высокого  уровня,  соответствующий  компилятор
 
   может автоматически обрабатывать спецификацию размера бУФЕ-
 
   ра записи или представлять некоторый способ  для  упрощения
 
   этой спецификации.
 
        Текущее положение записи важно, когда записи заносятся
 
   в  последовательный  файл.  СУД-32  позиционирует   текущую
 
   запись на конец файла для любого  потока  записей,  который
 
   об'являет доступ к файлу  с  помощью  операции  PUT.  Когда
 
   записи добавляются к относительному или  индексному  файлу,
 
 
 
                            - 310 -
 
                         00152-01 92 01
 
 
   то должен быть установлен прямой режим  доступа  к  записям
 
   (по ключу или номеру записи), если только записи  не  будут
 
   добавляться в возрастающем порядке их первичных ключей (или
 
   относительных номеров записей).
 
        Режим "корректировать-если" позволяет, чтобы замещение
 
   некоторой существующей записи на новую  осуществлялось  при
 
   выполнении операции PUT  в  режиме  прямого  доступа.  Этот
 
   режим мог бы быть установлен при добавлении записи в  отно-
 
   сительный или индексный файл при ситуации, когда встречает-
 
   ся ошибка "запись уже существует" и новая  запись  замещает
 
   существующую запись. Режим "корректировать-если" также поз-
 
   воляет корректировку некоторой  записи  в  последовательном
 
   файле, если доступ к этому файлу  осуществляется  в  режиме
 
   прямого доступа по относительному номеру записи. Когда этот
 
   режим используется для разделяемого файла, то должна соблю-
 
   даться осторожность, при использовании автоматического зах-
 
   вата записи, поскольку операция PUT, в отличие от  операции
 
   UPDATE, будет на короткое  время  освобождать  запись  (что
 
   должно быть сделано при выполнении операции GET или FIND до
 
   операции UPDATE) до тех пор, пока она не превратится собст-
 
   венно в операцию UPDATE. Это  могло  бы  позволить  другому
 
   потоку записей удалить или откорректировать данную запись в
 
   промежутке времени между вызовом операции PUT и ее  превра-
 
   щением в операцию UPDATE. Для разделяемого  файла  в  таких
 
   случаях следует использовать операцию UPDATE вместо  опера-
 
   ции PUT с режимом "корректировать-если".
 
        Если файл содержит альтернативные  ключи,  с  запретом
 
   дублирующихся значений, то прикладная программа должна быть
 
   готова к обработке ошибки при повторении значений альтерна-
 
   тивных ключей.
 
 
                            - 311 -
 
                         00152-01 92 01
 
 
        Для получения дополнительной  информации  об  операции
 
   PUT следует обратиться к документу [2].
 
 
 
        7.4.3. Корректировка записей
 
 
        Операция  UPDATE  (или  эквивалентный  оператор  языка
 
   программирования  высокого  уровня)  заменяет  существующую
 
   запись в файле. Прикладная программа должна сначала локали-
 
   зовать положение  соответствующей  записи  и  дополнительно
 
   извлечь саму запись при помощи операции FIND и/или GET. Как
 
   и при операции PUT в прикладной программе должен быть выде-
 
   лен буфер внутри области данных,  который  будет  содержать
 
   новое содержимое записи.
 
        Задание длины записи осуществляется так же, как и  для
 
   операции PUT.
 
        Текущее положение записи может быть установлено до  ее
 
   корректировки. Если данный файл разделяется,  то  корректи-
 
   руемая запись всегда должна быть захвачена при помощи  опе-
 
   рации FIND или GET, которая  устанавливает  положение  этой
 
   записи.
 
        При корректировке записей индексного файла, в  котором
 
   значение ключа является частью самой записи, следует прояв-
 
   лять осторожность при изменении значений  ключа,  учитывая,
 
   что такие изменения могут быть запрещены.  К  таким  ключам
 
   относится первичный ключ, значения  которого  изменению  не
 
   подлежат. Для того, чтобы изменить значение первичного клю-
 
   ча, необходимо ввести запись с новым  значением  (операцией
 
   PUT) и, возможно, удалить старую запись  (операция  DELETE)
 
   вместо того, чтобы использовать операцию UPDATE. В  против-
 
   ном случае, следует рассмотреть использование операции  PUT
 
 
 
                            - 312 -
 
                         00152-01 92 01
 
 
   с  установленным  режимом   "корректировать-если"   (разряд
 
   RAB$V_UIF в поле RAB$L_ROP) для того, чтобы выполнить  опе-
 
   рацию UPDATE, если первичный ключ данной записи уже сущест-
 
   вует, или операцию PUT, если ключ данной записи уникален  в
 
   этом файле. Однако, это  предполагает,  что  удаление  этой
 
   записи или не является необходимым или будет сделано  прик-
 
   ладной программой.
 
        Когда корректируются записи в индексном файле, то  нет
 
   необходимости задавать ключ, на который происходит ссылка.
 
        Для получения дополнительной  информации  об  операции
 
   UPDATE следует обратиться к документу [2].
 
 
 
        7.4.4. Удаление записей
 
 
        Операция  DELETE  (или  эквивалентный  оператор  языка
 
   программирования высокого уровня) удаляет запись из  файла.
 
   Эта операция для последовательных файлов недопустима. Одна-
 
   ко последовательный файл может быть усечен с использованием
 
   операции TRUNCATE. Как  и  для  операции  UPDATE,  операции
 
   DELETE должна предшествовать  операция  FIND  или  GET  для
 
   того, чтобы установить текущее положение записи.
 
        Когда записи удаляются из  индексного  файла,  следует
 
   задать режим "быстрое-удаление" для того,  чтобы  уменьшить
 
   время, необходимое для удаления записи (или записей),  и  в
 
   этом случае нет необходимости  задавать  ключ,  на  который
 
   производится ссылка.
 
        Для получения дополнительной  информации  об  операции
 
   DELETE следует обратиться к документу [2].
 
 
 
 
 
 
 
                            - 313 -
 
                         00152-01 92 01
 
 
     8. ОСОБЕННОСТИ ВЫПОЛНЕНИЯ ПРОГРАММ,ИСПОЛЬЗУЮЩИХ СУД-32
 
 
 
        В данном разделе приводится  описаниE  режимов  работы
 
   СУД-32 и использование атрибутов языка FDL на этапе  выпол-
 
   нения прикладной программы. Задание режимов  работы  СУД-32
 
   существенно при открытии и закрытии  файлов,  при  создании
 
   потоков доступов к записям и при обработке записей.  Обычно
 
   задание режимов работы  СУД-32  производится  при  создании
 
   потока доступа к записям и открытии файлов. Некоторые режи-
 
   мы могут быть установлены также и после того, как файл отк-
 
   рыт и  поток  записей  создан,  для  каждой  операции   над
 
   записью.
 
 
 
        8.1. Задание режимов работы СУД-32
 
 
        В  данном  подразделе  описывается,  как  использовать
 
   редактор языка FDL для  того,  чтобы  задать  режимы  этапа
 
   выполнения, которые доступны программе  пользователя  через
 
   подпрограммы FDL$PARSE  и  FDL$RELEASE.  Описывается  также
 
   использование операторов языков программирования и  системы
 
   СУД-32 для того, чтобы задать значения управляющего блока.
 
        Задание режимов работы производится через  управляющие
 
   блоки СУД-32, которые резервируются внутри прикладной прог-
 
   раммы и которые заполняются соответствующими значениями.
 
        Требуемые значения, например, задаются при помощи клю-
 
   чевых слов (или умолчаний) оператора OPEN. Как  альтернати-
 
   ва, режимы, недоступные через ключевые слова языка програм-
 
   мирования, на котором написана программа, могут быть, обыч-
 
   но, заданы с использованием языка FDL.
 
        Предварительно определенные атрибуты языка  DCL  могут
 
 
 
                            - 314 -
 
                         00152-01 92 01
 
 
   быть заданы для программы пользователя на этапе  выполнения 
 
   программы с помощью подпрограммы FDL$PARSE, которая, помимо
 
   выполнения  этих  функций,  сообщает  прикладной  программе
 
   адрес блока доступа к записям RAB  для  того,  чтобы  впос-
 
   ледствии можно бы было изменять значения, сформированные  в
 
   RAB. Задание некоторых режимов в блоке  RAB  на  языке  FDL
 
   невозможно, они могут быть установлены  только  при  помощи
 
   непосредственного заполнения полей и подполей блока  RAB  в
 
   процессе выполнения программы. Для того,  чтобы  установить
 
   требуемые режимы после создания потока доступа  к  записям,
 
   необходим доступ к  полям  и  подполям  управляющих  блоков
 
   СУД-32 посредством  символических  смещений.  Символическим
 
   смещениям  соответствуют  определенные  числовые  значения,
 
   которые складываются с начальным (базовым)  адресом  блока,
 
   образуя таким образом, адрес требуемого поля (подполя).
 
 
 
        8.1.1. Использование редактора языка  описания
 
               файла
 
 
        Редактор языка описания  файла  (редактор  FDL)  можно
 
   использовать для того, чтобы задать атрибуты файла в момент
 
   выполнения программы. Можно также использовать  специальный
 
   атрибут CONNECT, для того, чтобы при  обращении  прикладной
 
   программы к подпрограммам  FDL$PARSе  и  FDL$RELEASE  можно
 
   было бы установить требуемое значение  управляющего  блока.
 
   Описанными выше способами устанавливаются значения,  управ-
 
   ляющих блоков, используемые при открытии файла и  при  при-
 
   соединении к файлу потока доступа к записям. Ниже приводит-
 
   ся файл FDL, созданный редактором FDL:
 
 
 
 
 
                            - 315 -
 
                         00152-01 92 01
 
 
   IDENT  "19-JUL-1984 14:57:37     редактор FDL"
   SYSTEM
         SOURCE                     M32/VOS
   FILE
         ORGANIZATION               INDEXED
   RECORD
         CARRIAGE_CONTROL           CARRIAGE_RETURN
         FORMAT                     VARIABLE
         SIZE                       0
   AREA 0
         ALLOCATION                 8283
         BEST_TRY_CONTIGUOUS        YES
         BUCKET_SIZE                18
         EXTENSION                  2070
   AREA 1
         ALLOCATION                 18
         BEST_TRY_CONTIGUOUS        YES
         BUCKET_SIZE                18
         EXTENSION                  18
   KEY 0
         CHANGES                    NO
         DATA_AREA                  0
         DATA_FILL                  100
         DATA_KEY_COMPRESSION       YES
         DATA_RECORD_COMPRESSION    YES
         DUPLICATES                 NO
 
         INDEX_AREA                 1
         INDEX_COMPRESSION          YES
         INDEX_FILL                 100
         LEVEL1_INDEX_AREA          1
         PROLOG                     3
         SEG0_LENGTH                9
         SEG0_POSITION              0
         TYPE                       STRING
 
        Редактор FDL в момент выполнения программы  не  форми-
 
   рует атрибуты по умолчанию, так что их необходимо добавлять
 
   к определению на языке описания файла. Задание в файле  FDL
 
   атрибутов, устанавливающих те  или  иные  режимы  в  момент
 
   выполнения программы, например, атрибутов ACCESS,  CONNECT,
 
   FILE и SHARING, осуществляются вручную, редактор FDL  их  в
 
   создаваемый файл FDL автоматически не включает. Если,  нап-
 
   ример, в файле FDL необходимо  добавить  вторичный  атрибут
 
   WRITE_BEHIND,  первичного  атрибута  CONNECT,  то   следует
 
   использовать команду ADD  редактора  FDL.  Ниже  приводится
 
   пример сеанса работы редактора FDL для  добавления  в  файл
 
   FDL вторичного атрибута WRITE_BEHIND:
 
 
                            - 316 -
 
                         00152-01 92 01
 
 
                            Редактор FDL
 
       ADD      вставка   одной   или   нескольких   строк  в
                FDL-файл
       DELEтE   удаление  одной  или   нескольких  строк   из
                FDL-файла
   (1) EXIT     выход  из  редактора  с  созданием  FDL-файла
       HELP     пояснения  о  возможностях  FDL-редактора
   (1) INVOKE   выбор сценария работы
       MODIFY   изменение существующего FDL-файла
       QUIT     выход из редактора, не создавая FDL-файл
       SET      установка характеристик редактора
       VIEW     вывод содержимого текущего FDL-файла
   (2) функция редактора [HELP]:ADD
 
                          Первичные атрибуты
 
       ACCESS   установка  режима  доступа  к   файлу
       AREA х   определение атрибутов области х файла
       CONNECT  установка атрибутов этапа выполнения
       DATE     установка  даты   создания  файла
       FILE     установка  атрибутов   всего   файла
   (3) JOURNAL  установка атрибутов ведения журнального файла
       KEY Y    определение  характеристик  ключа  Y
       RECORD   определение  атрибутов  записи
       SHARING  установка   режима   разделения файла
       SYSTEM   установка   атрибутов   системы
       TITLE    определение   заголовка   FDL-файла
 
   (4) первичный атрибут [FILE]: CONNECT
 
                    Секция CONNECT вторичные атрибуты
 
       ASYNCRONOUS       YES/NO  NOLOCK               YES/NO
       BLOCK_IO          YES/NO  NONEXISTENT_RECORD   YES/NO
       BUCKET_CODE       NUMBER  READ_AHEAD           YES/NO
       CONTEXT           NUMBER  READ_REGARDLESS      YES/NO
       END_OF_FILE       YES/NO  TIMEOUT_ENABLE       YES/NO
       FAST_DELETE       YES/NO  тIMEOUT_PERIOD       NUMBER
       FILL_BUCKETS      YES/NO  TRUNCATE_ON_PUT      YES/NO
       KEY_GREATER_EQUAL YES/NO  TT_CANCEL_CONTROL_0  YES/NO
   (5) KEY_CREATER_THAN  YES/NO  тт_PROMPT            YES/NO
       KEY_LIMIT         YES/NO  тт_PURGE_TYPE_AHEAD  YES/NO
       KEY_OF_REFERENCE  NUMBER  тт_READ_NOECHO       YES/NO
       LOCATE_MODE       YES/NO  тт_READ_NOFILTER     YES/NO
       LOCK_ON_READ      YES/NO  тт_UPCASE_INPUT      YES/NO
       LOCK_ON_WRITE     YES/NO  UPDATE_IF            YES/NO
       MANUAL_UNLOCKING  YES/NO  WAIT_FOR_RECORD      YES/NO
       MULTIBLOCK_COUNT  NUMBER  WRITE_BEHIND         YES/NO
       MULTIBUFFER_COUNT NUMBER
 
   (6) ввод  CONNECT атрибута    [-]:WRITE BEHIND
 
   (7) CONNECT
               WRITE BEHIND
 
   (8) введите значения для атрибута [YES/NO][-]: YES
 
   (9) созданная секция
 
 
                            - 317 -
 
                         00152-01 92 01
 
 
       CONNECT
               WRITE_BEHIND YES
 
   (10) <CR> - продолжение, <CTRL/Z> - возврат на меню
 
                    П о я с н е н и я:
 
 
        (1) меню основных функций редактора, содержит перечень
 
   команд редактора языка FDL;
 
        (2) по команде ADD выводится меню допустимых первичных
 
   атрибутов ADD;
 
        (3) меню допустимых первичных атрибутов ADD. По коман-
 
   де ADD в файл FDL можно ввести новый первичный атрибут, для
 
   которого, в свою очередь, можно ввести  вторичный  атрибут.
 
   Первичный атрибут FILE задается по умолчанию;
 
        (4)  указание  первичного  атрибута  CONNECT  вызывает
 
   появление меню вторичных атрибутов CONNECT. Однако,  указы-
 
   вая ACCESS, FILE или  SHARING  вместо  первичного  атрибута
 
   CONNECT, можно получить соответствующие меню  их  вторичных
 
   атрибутов;
 
        (5) меню вторичных атрибутов  CONNECT,  которые  можно
 
   ввести в файл FDL;
 
        (6) выбор соответствующего атрибута CONNECT (в  случае
 
   атрибута WRITE BEHIND);
 
        (7) вывод атрибута CONNECT с выбранным вторичным аТРИ-
 
   бутом для визуального контроля;
 
        (8) ввод значения вторичного атрибута (в данном случае
 
   YES);
 
        (9) вывод первичного, вторичного атрибутов и  значения
 
   вторичного атрибута для визуального анализа;
 
        (10) выбор другого вторичного атрибута CONNECT  (зада-
 
   ние или  <RETURN>)  или  выход  в  основное  меню  (задание
 
   CTRL/Z).
 
 
                            - 318 -
 
                         00152-01 92 01
 
 
        Ниже приводится файл FDL, содержащий первичный атрибут
 
   CONNECT со вторичным атрибутом WRITE_BEHIND.
 
 
   IDENT     "19-JUL-1984 14:57:37     редактор FDL"
   SYSTEM
             SOURCE                    M32/VOS
   FILE
             ORGANIZATION              INDEXED
   RECORD
             CARRIAGE_CONTROL          CARRIAGE_RETURN
             FORMAT                    VARIABLE
             SIZE                      0
   CONNECT
             WRITE_BEHIND              YES
   AREA 0
             ALLOCATION                8283
             BEST_TRY_CONTIGUOUS       YES
             BACKET_SIZE               18
             EXTENSION                 2070
   AREA 1
             ALLOCATION                18
             BEST_TRY_CONTIGUOUS       YES
             BUCKET_SIZE               18
             EXTENSION                 18
   KEY 0
             CHANGES                   NO
             DATA_AREA                 0
             DATA_FILL                 100
             DATA_KEY_COMPRESSION      YES
             DATA_RECORD_COMPRESSION   YES
             DUPLICATES                NO
             INDEX_AREA                1
             INDEX_COMPRESSION         YES
             INDEX_FILL                100
             LEVEL1_INDEX_AREA         1
             PROLOG                    3
             SEG0_LENGTH               9
             SEG0_POSITION             0
             TYPE                      STRING
 
 
        8.1.2. Использование   операторов   СУД-32   в
 
               языках программирования
 
 
        Обращение к СУД-32  обеспечивается  операторами  языка
 
   программирования (например, OPEN), которые могут  содержать
 
   ключевые слова, предложения или другие модификаторы,  соот-
 
   ветствующие атрибутам этапа выполнения программы, для  опе-
 
   раций открытия файла,  присоединения  к  потоку,  обработки
 
   записей и закрытия файла. Некоторые языки  программирования
 
 
                            - 319 -
 
                         00152-01 92 01
 
 
   для обращения к СУД-32 требуют вызов специальных  процедур,
 
   вместо задания соответствующих ключевых слов или  предложе-
 
   ний. В отдельных случаях для установки требуемых значений в
 
   блоке FAB при открытии файла необходимо обращение  к  подп-
 
   рограмме,   составленной   пользователем   (USEROPEN    или
 
   USERACTION), которая и проводит заполнение полей (подполей)
 
   блока FAB. Эта подпрограмма могла бы, например,  быть  сос-
 
   тавлена на языке МАКРОАССЕМБЛЕРа, для того, чтобы использо-
 
   вать преимущество некоторых макрокоманд СУД-32,  предназна-
 
   ченных для занесения данных в управляющий блок (см.  пример
 
   подпрограммы USEROPEN для языка БЕЙСИК в подразделе 4.3.).
 
        При составлении подпрограммы на языке МАКРОАССЕМБЛЕРа,
 
   заполнение управляющих блоков СУД-32  проводится  на  этапе
 
   трансляции соответствующих макрокоманд СУД-32 либо на этапе
 
   выполнения программы. Резервирование памяти для управляющих
 
   блоков проводится во время трансляции программы.
 
        При выполнении программы заполнение полей  управляющих
 
   блоков СУД-32 возможно также и без  применения  макрокоманд
 
   СУД-32, путем  использования  обычных  машинных  инструкций
 
   см-1700. Для  других  языков  программирования  управляющие
 
   блоки СУД-32 не обязательно  размещаются  в  теле  основной
 
   программы.
 
        Если прикладная программа имеет  доступ  к  начальному
 
   адресу управляющего блока (например, блока  RAB),  то  спе-
 
   циальная макрокоманда СУД-32 или  соответствующая  макроко-
 
   манда определения символа (DEF) во время  трансляции  прис-
 
   ваивают стандартным символическим  смещениям  СУД-32  соот-
 
   ветствующие числовые значения, благодаря чему  локализуются
 
   и идентифицируются различные поля в данном управляющем бло-
 
   ке. Доступ к полям управляющих блоков по символическим сме-
 
 
                            - 320 -
 
                         00152-01 92 01
 
 
   щениям возможен также и для некоторых языков программирова-
 
   ния.
 
        Для получения дополнительной информации об использова-
 
   нии макрокоманд управляющих блоков и полей управляющих бло-
 
   ков следует обратиться к документу [2].
 
 
 
        8.2. Режим,   относящийся   к   открытию   и
 
             закрытию файлов
 
 
        Прежде, чем получить доступ к записям в файле, необхо-
 
   димо сначала открыть этот файл и присоединить к нему  поток
 
   доступов к записям. По завершению обработки записей  данный
 
   файл следует закрыть.
 
        Режимы, доступные для операций открытия файла, присое-
 
   динения  потока  и  закрытия  файла,  составляют  несколько
 
   групп: а именно режимы доступа к файлу и разделения  файла,
 
   задания спецификации файла, управления  производительностью
 
   и доступом к записям, а также следующие режимы:
 
        1) добавления новых записей;
 
        2) действий над файлом после того, как он закрыт (дис-
 
   позиция файла);
 
        3) использования индексных файлов;
 
        4) использования магнитных лент;
 
        5) выполнения нестандартной обработки записей;
 
        6) обеспечения надежности данных.
 
 
 
        8.2.1. Режимы доступа  к  файлу  и  разделения
 
               файла
 
 
        Режимы доступа к файлу и разделения файла  об'являются
 
   до его открытия. При  открытии  файла  должны  быть  заданы
 
 
                            - 321 -
 
                         00152-01 92 01
 
 
   стратегии захвата записи и буферизации  данных.  В  табл.30
 
   приводится полный перечень этих режимов.
 
                                                   Таблица 30
 
                Режимы доступа и разделения файла
 
   ----------------------------------------------------------
   Режим              !             Описание
   ----------------------------------------------------------
                      !
   Доступ к файлу     !   Задает типы операций, которые будут
   (FILE ACCESS)      ! выполняться  над файлом - чтение  за-
                      ! писей,  удаление  записей, добавление
                      ! новых записей, корректировка записей,
                      ! осуществление   доступа  по   блокам
                      ! и/или  усечение данного файла
                      !
                      !   Режим доступа к файлу задается пер-
                      ! вичным атрибутом языка описания файла
                      ! ACCESS или в поле FAB$в_FAC управляю-
                      ! щего блока FAB
                      !
   Разделение файла   !   Задает  типы операций, которые дан-
   (FILE SHARING)     ! ный  процесс позволяет выполнять дру-
                      ! гим  процессам, осуществляющим доступ
                      ! к  данному  файлу: чтение записей, их
                      ! поиск,  удаление  записей, добавление
                      ! новых записей и/или корректировка за-
                      ! писей
                      !
                      !   При  разделении  файла  можно также
                      ! указать, что данный процесс будет ис-
                      ! пользовать несколько потоков записей,
                      ! использовать  глобальный буферный кэш
                      ! с доступом только по чтению, работать
                      ! с  данным  файлом без захвата записей
                      ! и/или  запретить для других процессов
                      ! доступ к данному файлу
                      !
                      !   Режим  разделения   файла  задается
                      ! атрибутом   языка   описания    файла
                      ! SHARING  или  в поле  FAB$B_SHR блока
                      ! FAB
                      !
   Захват записи      !   Обеспечивает  возможность   захвата
   (RECORD LOCKING)   ! записи  для   разделяемого  файла. По
                      ! умолчанию СУД-32  автоматически  зах-
                      ! ватывает записи, в зависимости от за-
                      ! данных значений режима доступа к фай-
                      ! лу и разделения файла
                      !
                      !   Возможность захвата записи задается
                      ! атрибутом    языка   описания   файла
                      ! CONNECT  или  в  поле RAB$L_ROP блока
                      ! RAB
                      !
 
 
 
                            - 322 -
 
                         00152-01 92 01
 
 
        8.2.2. Спецификация файла
 
 
        При открытии файла задается его спецификация.  Задание
 
   спецификации осуществляется явным образом или по умолчанию.
 
   В табл.31 приводятся три типа спецификаций файлов.
 
                                                   Таблица 31
 
                       Спецификация файла
 
   ----------------------------------------------------------
   Спецификация файла     !         Описание
   ----------------------------------------------------------
                          !
   Первичная (явная)      !   Включает все компоненты  специ-
   (PRIMARY)              ! цификации и используется  для по-
                          ! иска требуемого  файла  (или фай-
                          ! лов). Если  отдельные  компоненты
                          ! полной спецификации файла не  за-
                          ! даны, то СУД-32 формирует их зна-
                          ! чения по умолчанию.
                          !
                          !   Спецификация  первичного  файла
                          ! задается  всегда. Ее задание осу-
                          ! ществляется атрибутом  языка опи-
                          ! сания файла FILE NAME или в полях
                          ! FAB$L_FNA  и  FAB$B_FNS  в  блоке
                          ! FAB
                          !
   По умолчанию           !   Отдельные  компоненты, отсутст-
   (DEFAULT)              ! вующие в полной спецификации  за-
                          ! даются  значениями  по умолчанию.
                          ! если, после их подстановки в спе-
                          ! цификацию,  некоторые  компоненты
                          ! все  еще  отсутствуют,  то приме-
                          ! няются дополнительные значения по
                          ! умолчанию.
                          !
                          !   Значения по умолчанию  задаются
                          ! атрибутом  языка  описания  файла
                          ! FILE  DEFAULT_NAME  или  в   поле
                          ! FAB$L_DNA  и  FAB$B_DNS блока FAB
                          !
   Связанная              !   Используется  для  того,  чтобы
   (RELATED)              ! предоставить дополнительные  зна-
                          ! чения по умолчанию,  если исполь-
                          ! зуется некоторый вторичный  (свя-
                          ! занный) файл. Если значения  уст-
                          ! ройства и каталога после примене-
                          ! ния значений по умолчанию все еще
                          ! отсутствуют в данной спецификации
                          ! связанного файла (если они имеют-
                          ! ся), то в  спецификацию подстав-
                          ! ляется дополнительное значение по
                          ! умолчанию: устройство по  умолча-
                          ! чанию  для  процесса   (SYS$DISK)
 
 
                            - 323 -
 
                         00152-01 92 01
 
    
                                         Продолжение табл. 31
   ----------------------------------------------------------
   Спецификация файла     !         Описание
   ----------------------------------------------------------
                          !
                          ! и  текущий  каталог  по умолчанию
                          ! для процесса.
                          !
                          !   Связанная спецификация задается
                          ! в полях FAB$L_NAM  и FAB$L_RLF
                          ! блока FAB
                          !
 
 
        8.2.3. Производительность файла
 
 
        Ряд режимов открытия  файла  и  присоединении  к  нему
 
   потока доступов к записям  в  момент  выполнения  программы
 
   могут улучшить производительность прикладной  программы.  К
 
   ним относятся режимы буферизации, описанные в разделе 6.
 
        При добавлении записей в  файл  существенное  значение
 
   имеют размер расширения и размер блока указателей  извлече-
 
   ния (окна).
 
 
 
        8.2.3.1. Размер расширения
 
 
        Если в файл будут добавляться новые записи, то следует
 
   задать некоторый разумный размер расширения файла по  умол-
 
   чанию для того, чтобы уменьшить  число  возможных  операций
 
   расширения файла.
 
        Для вычисления относительного размера расширения файла
 
   рекомендуется использовать редактор FDL, который для вычис-
 
   ления значения атрибута FILE EXTENSION языка FDL использует
 
   информацию, задаваемую в ответах на вопросы  сценария.  При
 
   работе с несколькими  областями  редактор  FDL  присваивает
 
   также некоторые значения атрибутам AREA EXTENSION.
 
        Если вычисление размера расширения описанным выше спо-
 
   собом не  проводится,  то  СУД-32  вычисляет  автоматически
 
 
                            - 324 -
 
                         00152-01 92 01
 
 
   некоторый размер расширения, который, однако, может быть не
 
   оптимальным.
 
        Если файл FDL, содержащий  описание  индексного  файла
 
   данных не создается при помощи редактора FDL,  то  значение
 
   атрибута EXTENSION может  быть  вычислено  путем  умножения
 
   числа записей в бакете  на  число  записей,  которые  будут
 
   добавлены к данному файлу в  течение  некоторого  заданного
 
   периода времени.
 
        Для вывода текущего размера расширения  по  умолчанию,
 
   на терминал следует использовать команду  SHOW  RMS_DEFAULT
 
   языка DCL. Для того,  чтобы  установить  число  буферов  по
 
   умолчанию,     надо      использовать      команду      SET
 
   RMS_DEFAULT/EXTEND_QUANTITY=N языка  DCL,  где  N  является
 
   числом блоков для расширения. Установка  числа  буферов  из
 
   прикладной программы осуществляется путем  заполнения  поля
 
   FAB$B_DEQ в блоке FAB.
 
 
 
        8.2.3.2. Размер блока указателей извлечения
 
 
        Если расширение файла  проводится  слишком  часто,  то
 
   экстенты файла могут быть  разбросаны  по  всему  диску.  В
 
   заголовке файла формируются указатели извлечения на  каждый
 
   экстент. Если файл содержит большое число  экстентов  (нес-
 
   колько десятков или сотен), все  указатели  не  могут  быть
 
   считаны в оперативную память для получения доступа  к  экс-
 
   тентам. Для получения доступа к экстентам данные  указатели
 
   считываются в память в структуру, называемую блоком  указа-
 
   телей извлечения (окном). Размер окна по умолчанию  состав-
 
   ляет 7 указателей. При необходимости этот размер можно уве-
 
   личить до 127. Можно также установить  размер  окна  равный
 
 
 
                            - 325 -
 
                         00152-01 92 01
 
 
   минус единице (-1), что определяет его размер,  достаточный
 
   для отображения всего файла.
 
        Когда прикладная программа получает доступ к экстенту,
 
   указатель  извлечения  которого  не   находится  в  текущем
 
   окне, то системе приходится читать заголовок данного  файла
 
   и выбирать некоторое новое  окно.  Этот процесс  называется
 
   "сменой окна", и требует выполнения операции ввода-вывода.
 
        Размер окна устанавливается в момент выполнения  прог-
 
   раммы. Многие языки программирования высокого уровня  вклю-
 
   чают специальное предложение, которое устанавливает  размер
 
   окна во время выполнения операции открытия файла. Для прог-
 
   рамм на языке МАКРОАССЕМБЛЕРа размер окна устанавливается в
 
   поле FAB$B_RVT блока FAB или атрибутом языка описания файла
 
   FILE WINDOW_SIZE.
 
        Можно увеличить размер окна по умолчанию для некоторо-
 
   го конкретного тома на диске,  используя  команды  MOUNT  и
 
   INITIALIZE языка DCL. Однако  использование  дополнительных
 
   указателей окна увеличивает накладные расходы системы. Раз-
 
   мер окна учитывается в квоте пользователя,  задающей  число
 
   байтов буферизованного ввода-вывода. Неограниченное исполь-
 
   зование больших окон может или привести к  исчерпанию  этой
 
   квоты или к исчерпанию динамической памяти системы.
 
        Для сокращения числа экстентов файла  можно  использо-
 
   вать обслуживающую программу МОС ВП BACKUP.
 
        При восстановлении  файла  программа  BACKUP  пытается
 
   создать один непрерывный экстент,  если  на  диске  имеется
 
   достаточное  непрерывное  пространство.  В   любом   случае
 
   использование программы BACKUP  позволяет  сократить  число
 
   экстентов. Дополнительная  информация  о  программе  BACKUP
 
   приведена в документе [10].
 
 
                            - 326 -
 
                         00152-01 92 01
 
 
        Другой способ сокращения  числа  экстентов  -  попытка
 
   создания новой непрерывной копии файла при помощи  обслужи-
 
   вающей   программы   СУД-32   CONVERT   или   по    команде
 
   COPY/CONTIGUOUS языка DCL. Однако это не всегда возможно. В
 
   таких случаях  выделение  большого  размера  окна  является
 
   единственной возможностью для обеспечения расширения файла.
 
   Описание обслуживающих программ СУД-32 приведено в  разделе
 
   9.
 
 
 
        8.2.3.3. Обзор         режимов         повышения
 
                 производительности системы
 
 
        В табл.32 перечисляются режимы открытия файла  и  при-
 
   соединения потока в момент выполнения  программы,  влияющие
 
   на улучшение производительности системы.
 
                                                   Таблица 32
 
         Режимы открытия файлов и присоединения потоков
 
   ----------------------------------------------------------
   Режим                 !          Описание
   ----------------------------------------------------------
                         !
   Асинхронная обработка !   Задает возможность  асинхронного
          1)             ! ввода-вывода  записей  для данного
   записей               ! потока.
   (ASYNCHRONOUS RECORD  !
    PROCESSING)          !   Указывается при помощи  атрибута
                         ! языка   описания   файла   CONNECT
                         ! ASYNCHRONOUS или установкой разря-
                         ! да RAB$V_ASY в поле RAB$L_ROP бло-
                         ! ка RAB
                     1)  !
   Отложенная запись     !   Обеспечивает накопление  записей
   (DEFERRED WRITE)      ! в некотором буфере, который  выво-
                         ! дится на диск только по его запол-
                         ! нению или при закрытии файла.
                         !
                         ! Используется  только  для  относи-
                         ! тельных   и   индексных     файлов
                         ! (см. раздел 2).
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния файла FILE  DеFERRED_WRITE или
                         ! установкой   разряда  FAB$V_DFW  в
 
 
                            - 327 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 32
   ----------------------------------------------------------
   Режим                 !          Описание
   ----------------------------------------------------------
                         !
                         ! Поле FAB$L_FOP блока FAB
                         !
   Размер расширения     !   Задает число блоков, которые бу-
   по умолчанию          ! дут  выделены файлу, при необходи-
   (DEFAULT EXTENSION    ! мости дополнительного пространства
    QUANTITY)            ! для размещения в файле новых запи-
                         ! сей.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния  файла  FILE  EXTENSION  или в
                         ! поле FAB$W_DEQ блока FAB
                         !
   Быстрое удаление      !   Отсрочка   выполнения   удаления
   (FAST DELETE)         ! записей из  индексного  файла,  до
                         ! тех пор, пока к удаляемым  записям
                         ! не делается попытка нового  досту-
                         ! па. Этот режим приводит к ускорен-
                         ! ному удалению  записей,  но  может
                         ! повлиять   на   производительность
                         ! процессов, осуществляющих   чтение 
                         ! данного файла.
                         !
                         !   Задается атрибутом  языка описа-
                         ! ния файла CONNECT FAST_DELETE  или
                         ! установкой   разряда  RAB$V_FDL  в
                         ! поле RAB$L_ROP блока RAB
                         !
   Число   глобальных    !   Задает использование  глобальных
   буферов               ! буферов  и  их  число.   Последнее
   (GLOBAL BUFFER COUNT) ! задается только в том случае, если
                         ! данный  поток первым присоединился
                         ! к данному файлу.
                         !
                         !   Задается атрибутом языка описания
                         ! файла  CONNECT GLOBAL_BUFFER_COUNT
                         ! или в поле FAB$W_GBC блока FAB
                 1)      !
   Режим указания        !   Обеспечивает передачу в приклад-
   MEста                 ! ную программу указателей  на запи-
   (LOCATE MODE)         ! си, а не самих записей при их чте-
                         ! нии. Задается атрибутом языка опи-
                         ! сания  файла  CONNECT  LOCATE_MODE
                         ! или установкой  разряда  RAB$V_LOC
                         ! в поле RAB$L_ROP блока RAB
                         !
   Мультиблочный         !   Обеспечивает  передачу  в память
   коэффицент            ! сразу  нескольких  блоков  за одну
   (MULTIBLOCK COUNT)    ! операцию ввода-вывода. Применяется
                         ! только для  последовательных  фай-
                         ! лов.
                         !
                         !  Задается атрибутом языка описания
                         ! файла   CONNECT   MULTIBLOCK_COUNT
                         ! или в   поле  RAB$B_MBC  блока RAB
 
 
                            - 328 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 32
   ----------------------------------------------------------
   Режим                 !          Описание
   ----------------------------------------------------------
                         !
                         !
   Число буферов         ! Разрешает использование нескольких
   (NUMBER OF BUFFERS)   ! буферов ввода-вывода. Используется
                         ! для относительных и индексных фай-
                         ! лов для создания буферного  кэш  и
                         ! в последовательных файлах для  ре-
                         ! жимов опережающего чтения.
                         !
                         !   Задается   атрибутом  языка опи-
                         ! сания    файла     CONNECT
                         ! MULTIвUFFER_COUNT    или   в  поле
                         ! RAB$B_MBF блока RAB
                     1)  !
   Опережающее чтение    !   Взаимозаменяемое   использование
   (READ-AHEAD)          ! двух  буферов  при  вводе  данных.
                         ! применяется только для  последова-
                         ! тельных файлов.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния  файла  CONNECT READ_AHEAD или
                         ! установкой  разряда  RAB$V_RAH   в
                         ! поле RAB$L_ROP блока RAB
                         !
   Размер блока указате- !   Задает число элементов в памяти
   лей извлечения (окна) ! для окон, что соответсвует числу
   (RETIEVAL WINDOW SIZE)! экстентов файла.
                         !
                         !   Задается  атрибутом языка описа-
                         ! ния файла: FILE WINDOW_SIZE или  в
                         ! поле FAB$B_RTV блока FAB
                         !
   Только последова-     !   Указывает, что доступ к  данному
   тельный доступ        ! файлу будет  осуществляться только
   (SEQUENTIAL ACCESS    ! последовательно.  Применяется  то-
    MODE)                ! лько для  последовательных  фай-
                         ! лов.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния файла FILE SEQUENTIAL_ONLY или
                         ! установкой разряда FAB$V_SQO в по-
                         ! ле FAB$L_FOP блока FAB
                      1) !
   Запаздывающая запись  !   Взаимозаменяемое   использование
   (WRITE-BEHIND)        ! двух  буферов  при  выводе данных.
                         ! применяется только для  последова-
                         ! тельных файлов.
                         !
                         !   Задается  атрибутом языка описа-
                         ! ния файла CONNECT WRITE_BEHIND или
                         ! установкой  разряда  RAB$V_WBH   в
                         ! поле RAB$L_ROP блока RAB
                         !
 
 
 
 
                            - 329 -
 
                         00152-01 92 01
 
 
   -------------------
   1)
     Данные режимы должны быть заданы для каждой операции
 
     над записями.
 
 
        8.2.4. Режимы доступа к записям
 
 
        Для доступа к записям для каждого  потока  могут  быть
 
   заданы следующие режимы: прямой  по  ключу  или  по  номеру
 
   записи или прямой по адресу записи в файле  (см.  подраздел
 
   7.1.). Режим доступа к записям может быть изменен для  каж-
 
   дой операции обработки записи. Эти режимы могут быть  уста-
 
   новлены заданием значений RAB$C_SEQ, RAB$C_KEY и  RAB$C_RFA
 
   в поле RAB$B_RAC блока RAB.
 
 
 
        8.2.5. Режимы для добавления записей файла
 
 
        При добавлении записей в файл должны быть заданы неко-
 
   торые дополнительные режимы открытия файла и  присоединения
 
   к нему потока, указанные в табл.33.
 
                                                   Таблица 33
 
                    Режимы добавления записей
 
   ----------------------------------------------------------
   Режим                   !           Описание
   ----------------------------------------------------------
                           !
   Количество расширений   ! См. П.8.2.3.
   по умолчанию 1)         !
   (DEFAULT EXTENSION      !
    QUANTITY)              !
                           !
   Отложенная запись 1)    ! См. П.8.2.3.
   (DEFERRED WRITE)        !
                           !
   Конец файла             !   После  присоединения  к  файлу
   (END-OF-FILE)           ! потока указатель  текущей записи
                           ! позиционируется на конец  файла.
                           !
                           !   Задается атрибутом языка  опи-
                           ! сания файла CONNECT  END_OF_FILE
                           ! или установкой разряда RAB$V_EOF
                           ! в поле RAB$L_ROP блока RAB
 
 
                            - 330 -
 
                         00152-01 92 01
 
    
                                         Продолжение табл. 33
   ----------------------------------------------------------
   Режим                   !           Описание
   ----------------------------------------------------------
                           !
                           !
   Размер окна для указате-! См п.8.2.3
   лей извлечения 1)       !
   (RETRIEVAL WINDOW SIZE) !
                           !
   Дата ревизии            !   Дата,  время  и  номер ревизии
   (REVISION DATA)         ! файла  могут  быть  заданы  так,
                           ! чтобы отличались от  фактических
                           ! времени,  даты  ревизии и номера
                           ! ревизии при закрытии  файла. Эти
                           ! значения должны быть установлены
                           ! между  выполнением  операций от-
                           ! крытия  и закрытия файла, т.е. в
                           ! процессе  выполнения  программы.
                           ! языком FDL не поддерживается.
                           !
                           !   Задаются в блоке  хав  даты  и
                           ! времени
                           !
   Усечение при            !   Задается при  последовательном
   операции PUT 1)         ! доступе  к  записям  только  для
   (TRUNCATE ON PUT)       ! последовательных   файлов.   При
                           ! вводе  в   файл  новых  записей,
                           ! последняя   записываемая  запись
                           ! становится  последней  записью в
                           ! данном файле. Таким образом файл
                           ! усекается.
                           !
                           !   Задается  атрибутом языка опи-
                           ! сания   файла   CONNECT
                           ! TRUNCATE_ON_PUT  или  установкой
                           ! разряда   RAB$V_TPT   в     поле
                           ! RAB$L_ROP блока RAB
                           !
   "Корректировать-если"1) !   При добавлении в файл  записей
   (UPDATE-IF)             ! в режиме  прямого  доступа,  су-
                           ! ществующие записи модифицируются
                           ! (заменяются).  Когда  этот режим
                           ! используется  для индексных фай-
                           ! лов,  следует отметить, что дан-
                           ! ный файл  не   должен  допускать
                           ! дублирующихся  значений  первич-
                           ! ного  ключа.  Этот  режим должен
                           ! быть  использован с особой осто-
                           ! рожностью  при  работе  с разде-
                           ! ляемым   файлом  (см.  подраздел
                           ! 7.4.).
                           !
                           !   Задается атрибутом языка  опи-
                           ! описания файла CONNECT UPDATE_IF
                           ! или установкой разряда RAB$V_UIF
                           ! в поле RAB$L_ROP блока RAB
                           !
   Запаздывающая запись 1) ! См. подраздел 8.3
 
 
                            - 331 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 33
   ----------------------------------------------------------
   Режим                   !           Описание
   ----------------------------------------------------------
                           !
   (WRITE BEHIND)          !
                           !
 
   -------------------
   1)
     Указывает, что этот режим может быть  задан  для  каждой
 
     операции обработки записи. Для получения более подробной
 
     информации см. подраздел 8.3.
 
 
        8.2.6. Режимы   для   обеспечения   надежности
 
               данных
 
 
        В табл.34 приводятся режимы открытия  файла  в  момент
 
   выполнения программы, которые влияют на надежность данных.
 
                                                   Таблица 34
 
             Режимы для повышения надежности данных
 
   ----------------------------------------------------------
   Режим                 !           Описание
   ----------------------------------------------------------
                         !
   Проверка чтения       !   Выполнение операций ввода данных
   (READ-CHECK)          ! с диска осуществляется путем "чте-
                         ! ния со  сравнением", которое прак-
                         ! тически  удваивает  об'ем операций
                         ! ввода-вывода, выполняемых для дис-
                         ! ка.
                         !
                         !   Задается атрибутом  языка описа-
                         ! сания  файла  FILE  READ_CHECK или
                         ! установкой  разряда  FAB$V_RCK   в
                         ! поле FAB$L_FOP блока FAB
                         !
   Проверка записи       !   Выполнение операций вывода  дан-
   (WRITE-CHECK)         ! ных на  диск  осуществляется путем
                         ! "чтения со сравнением",  что прак-
                         ! тически  удваивает об'ем  операций
                         ! ввода-вывода, выполняемых для дис-
                         ! ка.
                         !
                         !   Задается  атрибутом   языка опи-
                         ! сания файла FILE  WRITE_CHECK  или
                         ! установкой разряда FAB$V_WCK в по-
                         ! ле FAB$L_FOP блока FAB
                         !
 
 
 
                            - 332 -
 
                         00152-01 92 01
 
 
        8.2.7. Режимы для диспозиций файла
 
 
        Некоторые режимы, задаваемые при открытии файла,  при-
 
   соединении потока или при закрытии файла, позволяют  задать
 
   возможность удаления файла  при  его  закрытии,  постановки
 
   файла в очередь для печати или его  запуска  как  командной
 
   процедуры.
 
        В табл.35 приводятся эти режимы, задаваемые  в  момент
 
   выполнения программы при открытии файла или между  выполне-
 
   нием операций открытия и закрытия файла.
 
                                                   Таблица 35
 
                   Режимы для диспозиции файла
 
   ----------------------------------------------------------
   Режим                 !            Описание
   ----------------------------------------------------------
                         !
   Удаление после        !   Данный файл удаляется при закры-
   закрытия              ! тии. Задается атрибутом языка опи-
   (DELETE ON CLOSE)     ! сания    файла     CONNECT
                         ! DELETE_ON_CLOSE или установкой ра-
                         ! зряда  FAB$V_DLT  в поле FAB$L_FOP
                         ! блока FAB
                         !
   Запуск командного     !   Данный файл запускается  как не-
   файла после закрытия  ! которая  пакетная командная проце-
   (SUBMIT COMMAND FILE) ! дура, путем его установки в очере-
                         ! дь SYS$BATCH, при открытии файла.
                         !
                         !   Задается   только   для   после-
                         ! довательных   файлов     атрибутом  
                         ! языка    описания    файла    FILE 
                         ! SUBMIT_ON_CLOSE или установкой ра-
                         ! зряда FAB$V_SCF в  поле  FAB$L_FOP
                         ! блока FAB
                         !
   В очередь для печати  !   Данный файл устанавливается  для
   после закрытия        ! печати в  очередь  SYS$PRINT,  при
   (SPOOL ON CLOSE)      ! его закрытии. Задается только  для
                         ! последовательных  файлов атрибутом
                         ! языка   описания   файла      FILE
                         ! PRINT_ON_CLOSE или установкой раз-
                         ! ряда FAB$V_SPL  в  поле  FAB$L_FOP
                         ! блока FAB
                         !
 
 
 
 
 
 
                            - 333 -
 
                         00152-01 92 01
 
 
        8.2.8. Режимы для индексных файлов
 
 
        В табл.36 приводится список режимов в момент  выполне-
 
   ния программы, которые применяются при обработке  индексных
 
   файлов.  Для  получения  более  подробной  информации   см.
 
   п.7.1.4.
 
                                                   Таблица 36
 
                   Режимы для индексных файлов
 
   ----------------------------------------------------------
   Режимы                !           Описание
   ----------------------------------------------------------
                         !
   Быстрое удаление      !   Откладывается  выполнение опера-
   (FAST DELETE)         ! ций удаления записей из индексного
                         ! файла  до  тех  пор, пока к данным
                         ! записям не будет повторное обраще-
                         ! ние. Это позволяет быстро  удалять
                         ! записи, но  может повлиять на про-
                         ! изводительность процессов,  осуще-
                         ! ствляющих впоследствии чтение дан-
                         ! ного файла.
                         !
                         !   Задается  атрибутом языка описа-
                         ! ния  файла CONNECT FAST_DELETE или
                         ! установкой разряда RAB$V_FDL в по-
                         ! ле RAB$L_ROP блока RAB
                         !
   Ключ больше           !   При  поиске  или чтении записей,
   или равен 1)          ! СУД-32  выдает первую запись,  чей
   (KEY GREATER OR       ! ключ больше  или  равен  заданному
    EQUAL TO)            ! ключу  записи.  Если  не  задан ни
                         ! этот  режим,  ни режим "ключ боль-
                         ! ше", то поиск записи осуществляет-
                         ! ся по совпадению, по условию "ключ
                         ! равен".
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния   файла    CONNECT
                         ! KEY_GREATER_EQUAL  или  установкой
                         ! разряда RAB$V_KGE в поле RAB$L_ROP
                         ! блока RAB
                         !
   Ключ больше 1)        !   При  поиске  или чтении записей,
   (KEY GREATER THAN)    ! СУД-32  выдает  первую запись, чей
                         ! ключ  больше,  чем  заданный  ключ
                         ! записи. Если не задан ни этот  ре-
                         ! жим, ни режим "ключ больше или ра-
                         ! вен", то поиск записи  осуществля-
                         ! ется  по  совпадению,  по  условию
                         ! "ключ равен".
                         !
                         !   Задается атрибутом языка  описа-
 
 
                            - 334 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 36
   ----------------------------------------------------------
   Режимы                !           Описание
   ----------------------------------------------------------
                         !
                         ! ния файла CONNECT KEY_GREATER_THAN
                         ! или установкой разряда RAB$V_KGT в
                         ! поле RAB$L_ROP блока RAB
                         !
   Ключ доступа          !   Для индексного файла с  несколь-
   (кEY OF REFERENCE)    ! лькими ключами задает ключ,  кото-
                         ! рый будет использоваться  для дан-
                         ! ного потока доступа к записям.
                         !
                         !   Задается  атрибутом языка описа-
                         ! ния файла CONNECT KEY_OF_REFERENCE
                         ! или в поле RAB$B_KRF блока RAB
                         !
   Буфер ключа 1)        !   При поиске или чтении  записей в
   (KEY BUFFER)          ! режиме  прямого доступа,  заданный
                         ! буфер  ключа   должен    содержать
                         ! значение ключа необходимой записи.
                         !
                         !   Задается в поле RAB$B_KBF  блока
                         ! RAB
                         !
   Размер ключа 1)       !   При поиске или чтении записей по
   (KEY SIZE)            ! ключу,  тип   данного  у  которого
                         ! строковый, можно задать для поиска
                         ! только часть значения данного клю-
                         ! ча.
                         !
                         !   Задается  в поле RAB$B_KSZ блока
                         ! RAB
                         !
   Предел ключа 1)       !   При поиске или  чтении записей в
   (LIMIT KEY)           ! последовательном  режиме  операция
                         ! СУД-32  считается  успешной,  если
                         ! найдена запись, у которой значение
                         ! ключа больше, чем заданное значе-
                         ! ние ключа.
                         !
                         !   Задается  атрибутом языка описа-
                         ! ния  файла  CONNECT  KEY_LIMIT или
                         ! или  установкой  разряда RAB$V_LIM
                         ! в  поле  RAB$L_ROP  блока  RAB
                         !
   Заполнение бакетов    !   При  добавлении  записей, СУД-32
   (LOAD BUCKETS)        ! использует   заданный  коэффициент
                         ! заполнения бакетов,  указанный при
                         ! создании файла до того, как  прои-
                         ! зошло расщепление некоторого баке-
                         ! та. Если  этот  режим не задан, то
                         ! бакеты будут заполняться полностью
                         ! до  тех  пор,  пока не  произойдет
                         ! расщепление некоторого бакета.
                         !
                         !   Задается атрибутом  языка описа-
                         ! ния   файла   CONNECT FILL_BUCKETS
   
 
                            - 335 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 36
   ----------------------------------------------------------
   Режимы                !           Описание
   ----------------------------------------------------------
                         !
                         ! Или установкой  разряда  RAB$V_LOA
                         ! RAB$V_LOA в поле  RAB$L_ROP  блока
                         ! RAB
                         !
 
   -------------------
   1)
     Указывает, что  этот  режим  может быть задан для каждой
 
     операции обработки записи (см. подраздел 8.3).
 
 
        8.2.9. Режимы   для   обработки   файлов    на
 
               магнитной ленте
 
 
        В табл.37 приводятся режимы открытия и закрытия  файла
 
   в момент  выполнения  программы,  которые  применяются  для
 
   обработки файлов на магнитной ленте.
 
                                                   Таблица 37
 
                Режимы обработки магнитной ленты
 
   ----------------------------------------------------------
   Режим                 !            Описание
   ----------------------------------------------------------
                         !
   Не конец файла        !   При  добавлении  записей (ACCESS
   (NOT END-OF-FILE)     ! PUT), позиционирование файла прои-
                         ! зводится  не  на  его  конец.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния  файла   FILE  MT_NOT_EOF  или
                         ! установкой разряда RAB$V_NEF в по-
                         ! ле RAB$L_FOP блока FAB
                         !
   Текущее положение     !   При  создании  данный файл будет
   (CURRENT POSITION)    ! позиционирован   после  последнего
                         ! закрытого файла.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния файла FILE MT_CURRENT_POSITION
                         ! или установкой разряда FAB$V_POS в
                         ! поле FAB$L_FOP блока FAB
                         !
   Перемотка при         ! Перемотка ленты в начало до откры-
   открытии              ! тия или  создания  файла. Перекры-
   (REWIND ON OPEN)      ! вает режим "текущее положение".
                         !
                         !   Задается атрибутом  языка описа-
 
 
                            - 336 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 37
   ----------------------------------------------------------
   Режим                 !            Описание
   ----------------------------------------------------------
                         !
                         ! ния файла  FILE мт_OPEN_REWIND или
                         ! установкой разряда FAB$V_RWо в по-
                         ! ле RAB$L_FOP блока RAB
                         !
   Перемотка при         !   Перемотка  ленты  в  начало при
   закрытии              ! закрытии файла.
   (REWIND ON CLOSE)     !
                         !   Задается  атрибутом языка описа-
                         ! ния файла FILE MT_CLOSE_REWIND или
                         ! установкой разряда FAB$V_RWC в по-
                         ! ле FAB$L_FOP блока FAB
                         !
 
 
        8.2.10. Режимы  для   нестандартной   обработки
 
                файла
 
 
        В табл.38 приводятся режимы открытия файла, устанавли-
 
   ваемые в момент выполнения программы,  которые  применяются
 
   для нестандартной обработки файла.
 
                                                   Таблица 38
 
            Режимы для нестандартной обработки файла
 
   ----------------------------------------------------------
   Режим                 !           Описание
   ----------------------------------------------------------
                         !
   Не-файловая           !   Данный  том  не  является  томом
   структура             ! файловой структуры  МОС  ВП.  Этот
   (NOT-FILE-STRUCTURED) ! режим  допускает  обработку томов,
                         ! созданных  в  других системах, от-
                         ! личных от МОС ВП.
                         !
                         !   Задается  атрибутом языка описа-
                         ! ния файла FILE NON_FILE_STRUCTURED
                         ! или установкой разряда FAB$V_NFB в
                         ! поле FAB$L_FOP блока FAB
                         !
   Открытие файла        !   СУД-32 обеспечивает  только  оT-
   пользователя          ! крытие данного файла. Для выполне-
   (USER FILE OPEN)      ! ния операций  ввода-вывода  должны
                         ! использоваться  системные  запросы
                         ! уровня   QIO.   Номер   канала
                         ! ввода-вывода для файла  выдается в
                         ! поле FAB$L_STV блока FAB.
                         !
                         !   Задается    атрибутом     FILE
                         ! USER_FILE_OPEN   или  установкой
 
 
                            - 337 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 38
   ----------------------------------------------------------
   Режим                 !           Описание
   ----------------------------------------------------------
                         !
                         ! Разряда FAB$V_UFO в поле FAB$L_FOP
                         !  блока FAB
                         !
 
 
        8.3. Обзор режимов операций над записями
 
 
        В данном подразделе кратко описываются режимы, связан-
 
   ные с операциями поиска и получения записей (FIND  и  GET),
 
   операцией ввода новых записей (PUT), операцией замены запи-
 
   сей (UPDATE) и операцией исключения записей (DELETE).
 
 
 
        8.3.1. Режимы поиска и чтения записей
 
 
        Операции FIND и GET (или эквивалентные операторы соот-
 
   ветствующего языка программирования) могут быть использова-
 
   ны для того, чтобы  найти  и  извлечь  из  файла  некоторую
 
   запись.
 
        В табл.39 приведены  режимы,  связанные  с  операциями
 
   FIND и GET. Эти режимы могут быть  установлены  для  каждой
 
   операции FIND и GET, если данная прикладная программа может
 
   получить доступ к соответствующим полям управляющего  блока
 
   доступа к записям (блока RAB). Поля блока RAB предваритель-
 
   но заполняются соответствующими значениями во время присое-
 
   динения потока, значениями по умолчанию либо  значениями  в
 
   результате выполнения предыдущих операций СУД-32.
 
 
 
 
 
 
 
 
 
 
 
 
                            - 338 -
 
                         00152-01 92 01
 
 
                                                   Таблица 39
 
                 Режимы поиска и чтения записей
 
   ----------------------------------------------------------
   Режим                 !           Описание
   ----------------------------------------------------------
                         !
   Асинхронная           !   Задает  асинхронный   ввод-вывод
   обработка записей     ! записей  для   данного  потока.
   (ASYNCHRONоUS RECORD  !
    PROCESSING)          !   Задается  атрибутом языка описа-
                         ! ния файла CONNECT ASYNCHRONOUS или
                         ! установкой  разряда  RAB$V_ASY   в
                         ! поле RAB$L_ROP блока RAB
                         !
   Не захватывать        !   Запрещает  захват  записи после-
   (DO NOT LOCK)         ! дующих операций.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния файла CONNECT NOLOCK или уста-
                         ! новкой  разряда  RAB$V_NLK  в поле
                         ! RAB$L_ROP блока RAB
                         !
   Буфер ключа           !   При  поиске или чтении записей в
   (KEY BUFFER)          ! режиме  прямого  доступа, заданный
                         ! буфер ключа должен содержать  зна-
                         ! чение ключа необходимой записи.
                         !
                         !   Задается  в поле RAB$L_KBL блока
                         ! RAB
                         !
   Ключ больше или       !   При  поиске  или  чтении записи,
   равен                 ! СУД-32  выдает  первую  запись,  у
   (KEY GREATER OR       ! которой  значение ключа больше или
    EQUAL TO)            ! равно заданному значению ключа.
                         !
                         !   Задается  атрибутом языка описа-
                         ! ния      файла    CONNECT
                         ! KEY_GREATER_EQUAL  или  установкой
                         ! разряда RAB$V_KGE в поле RAB$L_ROP
                         ! блока RAB
                         !
   Ключ больше           !   При  поиске  или  чтении записей
   (KEY GREATER THAN)    ! СУД-32  выдает  первую  запись,  у
                         ! которой значение ключа больше, чем
                         ! заданное значение ключа.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния файла CONNECT KEY_GREATER_THAN
                         ! или установкой разряда RAB$V_KGT в
                         ! поле RAB$L_ROP блока RAB
                         !
   Ключ доступа          !   Для  индексных файлов с несколь-
   (KEY OF REFERENCE)    ! кими ключами задается ключ,  кото-
                         ! рый будет использоваться  для дан-
                         ! ного потока.
                         !
                         !   Задается  атрибутом языка описа-
 
 
                            - 339 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 39
   ----------------------------------------------------------
   Режим                 !           Описание
   ----------------------------------------------------------
                         !
                         ! ния файла CONNECT KEY_OF_REFERENCE
                         ! или в поле RAB$B_KRF блока RAB
                         !
   Размер ключа          !   При поиске или чтении записи  по
   (KEY SIZE)            ! строковому  значению  ключа указы-
                         ! вается  возможность  задания части
                         ! значения данного ключа, по которой
                         ! проводится поиск записей.
                         !
                         !   Задается  в поле RAB$B_KSZ блока
                         ! RAB
                         !
   Предел ключа          !   При  поиске или чтении записей в
   (LIMIT KEY)           ! индексном файле в последовательном
                         ! режиме,  СУД-32  считает  операцию
                         ! успешной,   если  значение   ключа
                         ! найденной записи превышает  задан-
                         ! ное значение.
                         !
                         !   Задается  атрибутом языка описа-
                         ! ния файла  CONNECT  KEY_LIMIT  или
                         ! установкой разряда RAB$B_LIM в по-
                         ! ле RAB$L_ROP блока RAB
                         !
   Режим указания места  !   Определяет  выдачу  в прикладную
   (LOCATE MODE)         ! программу указателей  на записи, а
                         ! не самих записей. Применяется  то-
                         ! лько   к  операции  GET.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния   файла  CONNECT   LOCATE_MODE
                         ! или  установкой  разряда RAB$V_LOC
                         ! в поле RAB$L_ROP блока RAB
                         !
   Захват                !   Указывает на необходимость  зах-
   несуществующей        ! вата ячейки записи, вне зависимос-
   (LOCK NONEXISTENт)    ! ти того,  существует  ли некоторая
                         ! запись в этой ячейке.  Применяется
                         ! только для  относительных  файлов.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния     файла      CONNECT
                         ! NONEXISTENT_RECORD  или установкой
                         ! разряда RAB$V_NXR в поле RAB$L_ROP
                         ! блока RAB
                         !
   Захват для чтения     !   Захват записи  по  чтению с раз-
   (LOCK FOR READ)       ! решением  другим  процессам только
                         ! читать запись.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния файла CONNECт LOCK_ON_READ или
                         ! установкой  разряда  RAB$V_REA   в
                         ! поле RAB$L_ROP блока RAB
 
 
                            - 340 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 39
   ----------------------------------------------------------
   Режим                 !           Описание
   ----------------------------------------------------------
                         !
                         !
   Захват для записи     !   Захват  для   записи   с  разре-
   (LOCK FOR WRITE)      ! шением  другим  процессам   только
                         ! читать  запись.
                         !
                         !  Задается атрибутом языка описания
                         ! файла  CONNECT  LOCK_ON_WRITE  или
                         ! установкой  разряда  RAB$V_RLK   в
                         ! поле RAB$L_ROP блока RAB
                         !
   Ручной захват         !   Указывает, что захват и освобож-
   (MANUAL LOCKING)      ! дение записей осуществляется вруч-
                         ! ную, путем выполнения  специальных
                         ! операций СУД-32.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния  файла  CONNECT MANUAL_LOCKING
                         ! или установкой разряда RAB$V_ULK в
                         ! поле RAB$L_ROP блока RAB
                         !
   Опережающее чтение    !   Улучщает производительность сис-
   (READ-AHEAD)          ! темы  за  счет  выделения дополни-
                         ! тельной  памяти  для  буферов вво-
                         ! да-вывода.  Применяется только для
                         ! последовательного доступа к после-
                         ! довательным файлам.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния файла  CONNECT  READ_AHEAD или
                         ! установкой   разряда  RAB$V_RAM  в
                         ! поле RAB$L_ROP   блока  RAB
                         !
   Чтение, несмотря на   !   Обеспечивается чтение записи не-
   захват                ! зависимо  от  того,  захвачена она
   (READ REGARDLESS)     ! или нет.
                         !
                         !   Задается атрибутом  языка описа-
                         ! ания файла CONNECT READ_REGARDLESS
                         ! или установкой разряда RAB$V_RRL в
                         ! поле RAB$L_ROP блока RAB
                         !
   Доступ к записи       !   Задает способ доступа к записям:
   (RECORD ACCESS)       ! последовательный,  прямой по ключу
                         ! (индексные  файлы)  или  по номеру
                         ! записи  (относительные  файлы) или
                         ! прямой по  адресу записи  в файле.
                         !
                         !   Задается  значениями  RAB$C_SEQ,
                         ! RAB$C_KEY, RAB$C_RFA  в   поле
                         ! RAB$B_RAC блока RAB
                         !
   Адрес записи в        !   Задает  адрес  записи  в   файле
   файле                 ! (RFA) при  прямом доступе к записи
   (RECORD'S FILE ADRESS)! по  адресу (поле RAB$B_RAC в блоке
 
 
                            - 341 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 39
   ----------------------------------------------------------
   Режим                 !           Описание
   ----------------------------------------------------------
                         !
                         ! RAB содержит значение  RAB$C_RFA).
                         ! это  значение  выдается  также при
                         ! помощи  операций  FIND  и  GET вне
                         ! зависимости от типа доступа  к за-
                         ! сям.
                         !
                         !   Задается в поле RAB$W_RFA  блока
                         ! RAB
                         !
   Буфер заголовка       !   Определяет  длину  фиксированной
   записи                ! части для записей переменной длины
   (RECORD HEADER        ! с  постоянной  управляющей  частью
    BUFFER)              ! (VFC). Применяется только для опе-
                         ! рации GET.
                         !
                         !   Задается в поле RAB$L_RHB  блока
                         ! RAB
                         !
   Период тайм-аута      !   Если  задан  режим  "ждать-если-
   (TIMEOUT PERIOD)      ! захвачена", то данный  режим может
                         ! быть задан  для  того,  чтобы  за-
                         ! дать   некоторый  период  тайм-ау-
                         ! та,  в  течение которого ожидается
                         ! снятие захвата  записи.  Если сня-
                         ! тия  захвата  не произошло, то вы-
                         ! дается  ошибка.  Число  секунд за-
                         ! дается   при   помощи  предложения
                         ! CONNECT  TIMEOUT_PERIOD или в поле
                         ! RAB$B_TMO блока RAB для того, что-
                         ! бы исключить тупиковую ситуацию.
                         !
                         !   Задается  атрибутом языка описа-
                         ! ния файла  CONNECT  TIMEOUT_PERIOD
                         ! или установкой разрядов  RAB$V_TMO
                         ! и RAB$B_TMO в поле RAB$L_ROP блока
                         ! RAB
                         !
   Адрес буфера          !   Задает адрес буфера  пользовате-
   пользователя          ! ля, который будет принимать прочи-
   (USER BUFFER          ! танную  запись. Применяется только
    ADDRESS)             ! для операции GET.
                         !
                         !   Задается в поле RAB$L_UBF  блока
                         ! RAB
                         !
   Размер буфера         !   Задает максимальную длину буфера
   пользователя          ! записи  пользователя.  Применяется
   (USER BUFFER SIZE)    ! только для операции GEт.
                         !
                         !   Задается в поле RAB$L_USZ  блока
                         ! RAB
                         !
   Ждать если захвачена  !   Если данная запись захвачена, то
   (WAIT IF LOCKED)      ! ждать  до  тех  пор,  пока  она не
 
 
                            - 342 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 39
   ----------------------------------------------------------
   Режим                 !           Описание
   ----------------------------------------------------------
                         !
                         ! станет доступной. Позволяет  также
                         ! использовать режим задания периода
                         ! тайм-аута.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния файла CONNECT  WAIT_FOR_RECORD
                         ! или установкой разряда RAB$V_WAT в
                         ! поле RAB$L_ROP блока RAB
                         !
 
 
        8.3.2. Режимы занесения записей
 
 
        Операция PUT (или эквивалентный оператор  языка  прог-
 
   раммирования) добавляет в файл новую запись.
 
        В табл.40 приводятся  режимы,  связанные  с  операцией
 
   PUT. Эти режимы могут быть установлены для каждой  операции
 
   PUT, если данная прикладная  программа  может  осуществлять
 
   доступ к соответствующим  полям  блока  доступа  к  записям
 
   (блока RAB). Поля блока RAB заполняются  при  присоединении
 
   потока доступа к записям, по умолчанию, либо  в  результате
 
   выполнения предшествующих операций СУД-32.
 
                                                   Таблица 40
 
                    Режимы занесения записей
 
   ----------------------------------------------------------
   Режим                 !           Описание
   ----------------------------------------------------------
                         !
   Асинхронная           !   Задает  асинхронный режим выпол-
   обработка             ! нения  операций ввода-вывода запи-
   записей               ! сей.
   (ASYNCHRONOUS RECORD  !
    PROCESSING)          !   Задается атрибутом  языка описа-
                         ! ния файла CONNECT ASYNCHRONOUS или
                         ! установкой разряда RAB$V_ASY в по-
                         ! ле RAB$L_ROP блока RAB
                         !
   Отложенная запись     !   Обеспечивает накапливание  запи-
   (DEFERRED WRITE)      ! сей при выводе в буфере и вывод на
                         ! диск  содержимого  всего буфера по
                         ! его  заполнении  или  при закрытии
                         ! файла.  Применяется   только   для
 
 
                            - 343 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 40
   ----------------------------------------------------------
   Режим                 !           Описание
   ----------------------------------------------------------
                         !
                         ! Относительных  и индексных файлов.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния файла  FILE DеFERRED_WRITE или
                         ! установкой  разряда  FAB$V_DFW   в
                         ! поле FAB$L_FOP блока FAB
                         !
   Буфер ключа           !   При  добавлении  записи в режиме
   (KEY BUFFER)          ! прямого  доступа  в  относительный
                         ! файл, заданный буфер  ключа должен
                         ! содержать относительный  номер за-
                         ! писи.
                         !
                         !   Задается в поле RAB$L_KBF  блока
                         ! RAB
                         !
   Размер ключа          !   При вводе записей в  относитель-
   (KEY SIZE)            ! ный файл в режиме прямого доступа,
                         ! задается   длина  ключа  равная  4
                         ! (это  значение  является значением
                         ! по умолчанию).
                         !
                         !   Задается в поле RAB$B_KSZ  блока
                         ! RAB
                         !
   Заполнение бакетов    !   При  добавлении  записей  в файл
   (LOAD BUCKETS)        ! заполнение бакетов  производится с
                         ! учетом   коэффициента  заполнения,
                         ! заданного  при  создании файла, до
                         ! тех пор, пока не появится  необхо-
                         ! димость расщепления бакета.
                         !
                         !   Если этот режим не задан, то ба-
                         ! кеты будут  заполняться  полностью
                         ! до тех  пор,  пока  не  произойдет
                         ! расщепление бакета.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния файла CONNECT FILL_BUCKETS или
                         ! установкой  разряда  RAB$V_LOA   в
                         ! поле RAB$L_ROP блока RAB
                         !
   Чтение допускается    !   Допускается  чтение  захваченной
   (READ ALLOWED)        ! записи,  находящейся  в  состоянии
                         ! вывода в  файл.
                         !
                         !   Задается атрибутом  языка описа-
                         ! ния  файла  CONNECT  LOCK_ON_WRITE
                         ! или  установкой  разряда RAB$V_RLK
                         ! в  поле  RAB$L_ROP  блока  RAB
                         !
   Доступ к записи       !   Задает способ добавления записей
   (RECORD ACCESS)       ! в файл: последовательно, в соотве-
                         ! тствии  с  возрастающим  значением
 
 
                            - 344 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 40
   ----------------------------------------------------------
   Режим                 !           Описание
   ----------------------------------------------------------
                         !
                         ! ключа  или  относительного  номера
                         ! записи, прямой по ключу (индексные
                         ! файлы) или по относительному номе-
                         ! меру записи  (относительные  файлы
                         ! или  прямой  по  адресу  записи  в
                         ! файле.
                         !
                         !   Задается  значениями  RAB$C_SEQ,
                         ! RAB$C_KEY,   RAB$C_RFA   в   поле
                         ! RAB$B_RAC блока RAB
                         !
   Буфер заголовка       !   Определяет  длину  фиксированной
   записи                ! части  записей  переменной   длины
   (RECORD HEADER        ! с  постоянной  управляющей  частью
    BUFFER)              ! (VFC).
                         !
                         !   Задается в поле RAB$L_RHB
                         !
   Адрес буфера          !   Задает адрес буфера, содержащего
   записи                ! запись,  которая заносится в файл.
   (RECORD BUFFER ADRESS)!
                         !   Задается  в поле RAB$L_RBF блока
                         ! RAB
                         !
   Размер буфера         !   Задает  размер  выходной записи,
   записи                ! содержащейся в буфере.
   (RECORD BUFFER SIZE)  !
                         !   Задается в поле  RAB$W_RSZ блока
                         ! RAB
                         !
   Период тайм-аута      !   Если   задан   режим  "ждать-ес-
   (TIMEOUT PERIOD)      ! ли-захвачена",   то  данный  режим
                         ! может  быть  задан для того, чтобы
                         ! задать некоторый период тайм-аута,
                         ! по прошедствии которого  возвраща-
                         ! ется код ошибки.
                         !
                         !   Число   секунд   задается    при
                         ! помощи     предложения     CONNECT
                         ! TIMEOUT_PERIOD   или   в   поле
                         ! RAB$B_TMO блока RAB для того, что-
                         ! бы исключить тупиковую ситуацию.
                         !
                         !  Задается атрибутом  языка  описа-
                         ! ния файла  CONNECT  TIMEOUT_PERIOD
                         ! или установкой  разряда  RAB$V_TMO
                         ! в поле RAB$L_ROP  и поле RAB$V_TMO
                         ! блока RAB
                         !
   Усечение файла        !   Определяет необходимость  усече-
   после операции PUT    ! ния файла  после  операции  вывода
   (TRUNCATE ON PUT)     ! текущей записи. Требует последова-
                         ! тельного доступа к записям, и при-
                         ! меняется только к последовательным
 
 
                            - 345 -
 
                         00152-01 92 01
 
 
                                         Продолжение табл. 40
   ----------------------------------------------------------
   Режим                 !           Описание
   ----------------------------------------------------------
                         !
                         ! файлам.
                         !
                         !   Задается атрибутом языка  описа-
                         ! ния файла  CONNECT TRUNCATE_ON_PUT
                         ! или установкой разряда RAB$V_TPT в
                         ! поле RAB$L_ROP блока RAB
                         !
   Корректировать-если   !   Превращает операцию PUT в опера-
   (UPDATE-IF)           ! цию  замены  записи,  если  данная
                         ! запись   уже  существует  в файле,
                         ! следует соблюдать осторожность,
                         ! когда  этот  режим  используется с
                         ! разделяемыми файлами  и  автомати-
                         ! ческим  захватом записей  (см.под-
                         ! раздел 7.4).
                         !
                         !   Когда этот режим используется  с
                         ! индексными  файлами, следует отме-
                         ! тить, что в данном файле не должны
                         ! допускаться дублирующиеся значения
                         ! первичного ключа. Этот режим может
                         ! быть также  использован, когда был
                         ! задан прямой доступ к записям.
                         !
                         !   Задается  атрибутом языка описа-
                         ! ния  файла  CONNECT  UPDATE_IF или
                         ! установкой разряда RAB$V_UIF в по-
                         ! ле RAB$L_ROP блока RAB
                         !
   Запаздывающая         !   Улучшает производительность сис-
   запись                ! темы  за  счет  выделения дополни-
   (WRITE BEHIND)        ! тельной  памяти для буферов ввода-
                         ! вывода. Применяется только для по-
                         ! следовательного  доступа  к после-
                         ! довательным файлам.
                         !
                         !   Задается  атрибутом языка описа-
                         ! ния файла CONNECT WRITE_BEHIND или
                         ! установкой разряда RAB$V_WBH в по-
                         ! ле RAB$L_ROP блока RAB
                         !
 
 
        8.3.3. Режимы корректировки записей
 
 
        Операция  UPDATE  (или  эквивалентный  оператор  языка
 
   программирования) заменяет  существующую  запись  в  файле.
 
   Прикладная программа должна сначала  найти  соответствующую
 
   позицию записи в файле и извлечь  саму  данную  запись  при
 
 
 
                            - 346 -
 
                         00152-01 92 01
 
 
   помощи обращения к операции FIND или GET (или эквивалентно-
 
   му оператору языка программирования).
 
        Режимы, связанные с оператором  UPDATE,  приводятся  в
 
   табл.41. Эти режимы могут быть установлены для каждой  опе-
 
   рации UPDATE, если данная программа может осуществлять дос-
 
   туп к соответствующим полям блока доступа к записям  (блока
 
   RAB). Поля блока RAB предварительно  заполняются  в  момент
 
   присоединения потока, по умолчанию либо в результате  пред-
 
   шествующих операций СУД-32.
 
                                                   Таблица 41
 
                  Режимы корректировки записей
 
   ----------------------------------------------------------
   режим                 !           описание
   ----------------------------------------------------------
                         !
   Асинхронная           !   Задает асинхронный режим выпол-
   обработка записей     ! нения операций ввода-вывода запи-
   (ASYNCHRONOUS RECORD  ! сей для данного потока.
    PROCESSING)          !
                         !   Задается    атрибутом      языка
                         ! описания    файла    CONNECT
                         ! ASYNCHRONOUS  или  установкой раз-
                         ! ряда RAB$V_ASY  в  поле  RAB$L_ROP
                         ! блока RAB
                         !
   Буфер заголовка       !   Определяет  длину  фиксированной
   записи                ! части записей  переменной  длины с
   (RECORD HEADER        ! постоянной   управляющей    частью
    BUFFER)              ! (VFC).
                         !
                         !   Задается в поле RAB$L_RHB  блока
                         ! RAB
                         !
   Адрес буфера          !   Задает адрес буфера, содержащего
   записи                ! запись,  которая выводится в файл.
   (RECORD BUFFER        !
    ADDRESS)             !   Задается  в поле RAB$L_RBF блока
                         ! RAB
                         !
   Размер буфера         !   Задает  размер записей, содержа-
   записи                ! щихся в выходном  буфере.
   (RECORD BUFFER SIZE)  !
                         !   Задается в поле  RAB$L_RBZ блока
                         ! RAB
                         !
 
 
 
 
 
                            - 347 -
 
                         00152-01 92 01
 
 
        8.3.4. Режимы удаления записей
 
 
        Операция  DELETE  (или  эквивалентный  оператор  языка
 
   программирования)  исключает  (удаляет)  запись  из  файла.
 
   Использовать эту операцию для последовательных файлов нель-
 
   зя, однако последовательный файл может быть  усечен  опера-
 
   цией TRUNCATE. Как и для операции UPDATE,  перед  операцией
 
   DELETE должна быть задана операция FIND или GET  для  того,
 
   чтобы установить текущую позицию записи.
 
        В табл.42 приводятся  режимы,  связанные  с  операцией
 
   DELETE. Эти режимы могут быть установлены для каждой опера-
 
   ции DELETE, если данная программа может осуществлять доступ
 
   к соответствующим полям управляющего блока доступа к  запи-
 
   сям (блока RAB). Поля блока RAB предварительно  заполняются
 
   при присоединении потока, по умолчанию  либо  в  результате
 
   предшествующих операций СУД-32.
 
                                                    Таблица 42
 
                     Режимы удаления записей
 
   -----------------------------------------------------------
   Режим                 !           Описание
   -----------------------------------------------------------
                         !
   Асинхронная           !   Задает режим асинхронного ввода-
   обработка записей     ! вывода записей для данного потока.
   (ASYNCHRONOUS RECORD  !
    PROCESSING)          !   Задается  атрибутом языка описа-
                         ! описания    файла    CONNECT
                         ! ASYNCHRONOUS или установкой разря-
                         ! да RAB$V_ASY в поле RAB$L_ROP бло-
                         ! ка RAB
                         !
   Быстрое удаление      !   Удаленные записи в  файле  поме-
   (FAST DELETE)         ! чаются,  но   части  любого  ключа
                         ! альтернативного пути индекса  пол-
                         ! ностью  не  удаляются  до тех пор,
                         ! пока не последует новое  обращение
                         ! с использованием данного альтерна-
                         ! тивного ключа.
                         !
                         !   Это приводит к быстрому удалению
                         ! записи,  но  потребуется  дополни-
                         ! тельное время для выполнения  пос-
 
 
                            - 348 -
 
                         00152-01 92 01
 
 
                                          Продолжение табл. 42
   -----------------------------------------------------------
   Режим                 !           Описание
   -----------------------------------------------------------
                         !
                         ! ледующей операции FIND или GET.
                         !
                         !   Задается атрибутом языка описа-
                         ! ния файла CONNECT FAST_DELETE  или
                         ! установкой разряда RAB$V_FDL в по-
                         ! ле RAB$L_ROP блока RAB
                         !
 
 
        8.4. Пример  работы  с  полями  управляющего
 
             блока
 
 
        В примере данного подраздела показан вызов подпрограмм
 
   FDL$PARSE и FDL$RELEASE для редактирования полей  управляю-
 
   щего блока при помощи редактора языка описания файла.
 
 
        П р и м е р.
 
 
       Использование подпрограмм FDL$PARSE и FDL$RELEASE
   ;
   ; данная программа обращается к  обслуживающим подпрограм-
   ; мам  редактора FDL:  FDL$PARSE и   FDL$RELEASE.  Подпро-
   ! грамма  FDL$PARSE  выполняет  синтаксический анализ спе-
   ; цификации языка описания файла PART.FDL. Затем  осущест-
   ; вляется доступ к файлу, указанному в файле PART.FDL, при
   ; помощи использования первичного ключа. И, наконец, упра-
   ; вляющие  блоки, распределенные  подпрограммой FDL$PARSE,
   ; освобождаются подпрограммой FDL$RELEASE.
   ;
           .TITLE FDLEXAM
   ;       .PSECT DATA,WRT,NOEXE
   ;
   MY_FAB:   .LONG 0
   MY_RAB    .LONG 0
   FDL_FILE: .ASCID /PART.FDL/ ;спецификация файла FDL
   REC_SIZE=80
   LF=10
   ;
   REC_RESULT:  .LONG REC_SIZE
                .ADDRESS REC_BUFFER
   REC_BUFFER:  .BLKB REC_SIZE
   HEADING:     .ASCID /ID PART SUPPLIER COLOR /<LF>
   ;
                .PSECT CODE
   ;
   ; описание внешних программ
   ;
 
 
 
                            - 349 -
 
                         00152-01 92 01
 
 
    .EXTRN       FDL$PARSE,-
                 FDL$RELEASE
   ;
    .ENTRY FDLEXAM,^м<>     ;установка входной маски
           PUSHAL MY_RAB    ;установка адресов
           PUSHAL MY_FAB    ;для получения
           PUSHAL FDL_FILE  ;блоков RAB и FAB.
           CALLS  #3,G^FDL$PARSE ;FDL$PASE
           BLBS   р0, KEY0  ;нормальный переход
           BRW    ERROR     ;переход по ошибке
   ;
   KEY0:   MOVL   MY_FAB, R10 ;переслать адрес FAB в  регистр
                              ;R10
           MOVL   MY_RAB, R9  ;переслать адрес RAB  в регистр
                              ;R10
           MOVL   #REC_SIZE, RAB$W_USZ(R9)
           MOVAB  REC_BUFFER, RAB$L_UBF(R9)
   ;
           $OPEN  FAB=(R10)   ;открыть файл
           BLBC   R0, F_ERROR
   ;
           $CONNECT RAB=(R9)  ;присоединиться к RAB
           BLBC   R0, R_ERROR
           PUSHAQ HEADING     ;вывод заголовка
           CALLS #1, G^LIB$PUT_OUTPUT
           BLBC  R0, ERROR
           BRB   GET_REC      ;обход обработки ошибки
   ;
   F_ERROR: BRW  FAB_ERROR
   R_ERROR: BRW  RAB_ERROR
   ;
   GET_REC: $GET  RAB=(R9)   ;получить запись
          CMPL  #RMS$_EOF,R0 ;если не конец файла,
          BEQLU   CLEAN      ;то продолжить
          BLBC  R0, R_ERROR
   ;
          MOVZWL  RAB$W_RSZ(R9), REC_RESULT ;переслать
          PUSHAL  REC_RESULT ;запись в буфер
          CALLS #1,G^LIB$PUT_OUTPUT ;вывод данной записи
          BLBC    R0, ERROR
          BRB   GEт_REC ;получить другую запись
   ;
   CLEAN: $CLOSE  FAB=(R10) ;закрыть данный FAB
          BLBC  R0, FAB_ERROR
          PUSHAL MY_RAB ;адрес RAB --> стек
          PUSHAL MY_FAB ;адрес FAB --> стек
   ;
          CALLS #2,G^FDL$RELEASE ;освободить
                                 ; управляющие блоки
          BLBC  R0,ERROR
          BRB   FINI ;успешное окончание
   ;
   FAB_ERROR:
          PUSHL FAB$L_STV(R10) ;сигнализировать об
          PUSHL FAB$L_STS(R10) ;ошибке в файле
          BRB  RMS_ERR
   ;
   ERROR: PUSHL  R0  ;сигнализировать об ошибке
          CALLS #1,G^LIB$SIGNAL
 
 
                            - 350 -
 
                         00152-01 92 01
 
 
          $CLOSE FAB=(R10)
          BRW FINI   ;конец программы
   ;
   RAB_ERROR:  PUSHAL RAB$L_STV(R9) ;сигнализировать об
          PUSHAL RAB#L_STS(R9)      ;ошибке в записи
   ;
   RMS_ERR:  CALLS #2,G^LIB$SIGNAL
   ;
   FINI:  RET
          .END  FDLEXAM
 
 
 
                     9. ОБСЛУЖИВАНИЕ ФАЙЛОВ
 
 
 
        Проектирование и создание файлов пользователя и  опре-
 
   деление их записей является первым шагом в жизненном  цикле
 
   этих файлов.
 
        Пользователь должен в быть  в  состоянии  правильно  и
 
   эффективно использовать свои файлы для тех целей, для кото-
 
   рых они были спроектированы, и быть в состоянии защищать  и
 
   восстанавливать содержимое файлов. Другими словами, пользо-
 
   ватель должен быть в состоянии обслуживать свой файл.
 
        В данном разделе описываются различные аспекты  обслу-
 
   живания файлов, особое внимание уделяется настройке файла.
 
 
 
        9.1. Отображение характеристик файла
 
 
        Обслуживающая  программа  ANALYZE   (ANALYZE/RMS_FILE)
 
   позволяет  проводить  анализ  внутренней  структуры   файла
 
   СУД-32.
 
        Программа ANALYZE выявляет ошибки в  структуре  файла,
 
   если они имеются. При этом выдается статистический отчет об
 
   использовании файла и краткий отчет. Краткий отчет  иденти-
 
   чен отчету, который выдается при проверке структуры  файла,
 
   за исключением того, что при его выдаче  сама  проверка  не
 
   делается. Дополнительная информация о выдаче краткого отче-
 
 
                            - 351 -
 
                         00152-01 92 01
 
 
   та приведена в документе [3].
 
        При помощи программы ANALYZE можно исследовать  струк-
 
   туру файла в интерактивном  режиме.  В  результате  анализа
 
   можно проверить правильность проектирования файла и опреде-
 
   лить улучшения, которые можно сделать  в  описании  данного
 
   файла, заданного на языке описания файла.
 
        Кроме того, программа ANALYZE может создать  файл  FDL
 
   по существующему файлу данных. Файлы FDL можно использовать
 
   в  программе  создания  файла  (CREATE/FDL),  обслуживающей
 
   программе конвертирования (CONVERT) и в обслуживающей прог-
 
   рамме редактирования файла FDL (EDIT/FDL). Кроме того, фай-
 
   лы FDL, созданные программой ANALYZE  содержат  специальные
 
   секции анализа для каждого ключа и области,  которые  назы-
 
   ваются ANALYSIS_OF_AREA  и  ANALYSIS_OF_KEY.  Обслуживающая
 
   программа редактор FDL использует  эти  секции  в  сценарии
 
   "оптимизация" для того, чтобы построить структуру файла.
 
 
 
        9.1.1. Выполнение проверки на наличие ошибки
 
 
        Для того, чтобы проверить структуру файла  на  наличие
 
   ошибки, следует ввести с терминала команду DCL в формате:
 
 
        ANALYZE/RMS_FILE/CHECK вхф
 
 
   где вхф - спецификация анализируемого файла.
 
        По умолчанию для команды в  таком  формате  результаты
 
   проверки отображаются на терминале (SYS$OUTPUT).
 
        При получении сообщения об ошибках, следует учитывать,
 
   что структура  анализируемого  файла  может  быть  нарушена
 
   из-за серьезной ошибки, например, из-за  сбоя  питания  или
 
   позиционирования головок на диске. Другой причиной  наруше-
 
 
 
                            - 352 -
 
                         00152-01 92 01
 
 
   ния структуры файла может быть программная  ошибка  СУД-32.
 
   Следует отметить, однако, что задание  в  командной  строке
 
   ANALYZE квалификатора /CHECK не гарантирует выявление  всех
 
   причин нарушения структуры файла.
 
        В любом случае для устранения ошибок в  файле  следует
 
   попытаться провести преобразование файла при помощи  обслу-
 
   живающей программы CONVERT, задавая  спецификацию  преобра-
 
   зуемого файла в качестве входной и выходной. Преобразование
 
   файла состоит в копировании записей этого файла с  сохране-
 
   нием атрибутов. Если преобразование не может быть  выполне-
 
   но, то следует попытаься восстановить файл,  используя  его
 
   копию, созданную при помощи системной программы BACKUP.
 
        В примере приводится отчет о проверке файла с заданной
 
   спецификацией DISK$:[USER]CUSTDATA.DAT;2
 
 
        П р и м е р.
 
 
          Отчет о проверке файла программой ANALYZE
 
   CHECK RMS FILE INTEGRITY 14-JUN-1987 21:51:47.38
   DISK$:[HERBER]CUSTDATA.DAT;2
 
   FILE HEADER
 
    FILE SPEC:DISK$:[USER]CUSTDATA.DAT;2
    FILE ID:(10044,39,1)
    OWNER UIC:[011,310]
    PROTECTION: SYSTEM: RWED, OWNER:RWED, GROUP:RWE, WOLD:RWE
 
    CREATION DATE: 9-JUN-1987 22:30:24.78
    REVISION DATE: 9-JUN-1987 22:30:30.86, NUMBER:4
    EXPIRATION DATE: NONE SPECIFIED
    BACKUP DATE: NONE POSTED
 
    CONTIGUITY OPTIONS: NONE
    PERFOMANSE OPTIONS: NONE
    RELIABILITY OPTION: NONE
    JOURNALING ENABLED: NONE
 
   RMS FILE ATTRIBUTES
 
    FILE ORGANIZATION INDEXED
    RECORD FORMAT: VARIABLE
    RECORD ATTRIBUTES: CARRIAGE-RETURN
 
 
                            - 353 -
 
                         00152-01 92 01
 
 
    MAXIMUM RECORD SIZE: 80
 
    BLOCKS ALLOCATED: 30, DEFAULT EXTEND SIZE:2
    BUCKET SIZE: 1
    GLOBAL BUFFER COUNT: 0
 
   FIXED PROLOG
 
    NUMBER OF AREAS: 8, VBN OF FIRST DESCRIPTOR: 3
    PROLOG VERSION: 3
 
   AREA DESCRIPTOR #0 (VBN 3, OFFSET %X'0000')
 
    BUSKET SIZE: 1
    RECLAIMED BUCKED VBN: 0
    CURRENT EXTEND START: 1, BLOCKS: 9, USED: 4, NEXT: 5
    DEFAULT EXTEND QUANTITY: 2
    TOTAL ALLOCATION: 9
 
   AREA DESCRIPTOR #1 (VBN 3, OFFSET %X'0040')
 
    BUCKET SIZE: 1
    RECLAMED BUCKET VBN: 0
    CURRENT EXTENT START: 10, BLOCKS: 3, USED: 1, NEXT: 11
    TOTAL ALLOCATION: 3
 
   AREA DESCRIPTOR #2 (VBN 3, OFFSET %X'0080')
 
    BUсKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 13, BLOCKS: 3, USED: 1, NEXT: 14
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   AREA DESCRIPTOR #3 (VBN 3, OFFSET %X'00CO')
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 16, BLOCKS: 3, USED: 1, NEXT: 17
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   AREA DESCRIPTOR #4 (VBN 3, OFFSET %X'0100')
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 19, BLOCKS: 3, USED: 1, NEXT: 20
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   AREA DESCRIPTOR #5 (VBN 3, OFFSET %X'0140')
 
    BUсKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 22, BLOCKS: 3, USED: 1, NEXT: 23
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   AREA DESCRIPTOR #6 (VBN 3, OFFSET %X'0180')
 
 
                            - 354 -
 
                         00152-01 92 01
 
 
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 25 BLOCKS: 3, USED: 1, NEXT: 26
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   AREA DESCRIPTOR #7 (VBN 3, OFFSET %X'01CO')
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
   CURRENT EXTENT START: 28, BLOCKS: 3, USED: 1, NEXT: 29
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   KEY DESCRIPTOR #0 (VBN 1, OFFSET %X'0000')
 
    NEXT KEY DESCRIPTOR VBN: 2, OFFSET: %X'0000'
    INDEX AREA: 1, LEVEL 1 INDEX AREA: 1, DATA AREA: 0
    ROOT LEVEL: 1
 
    INDEX BUCKET SIZE: 1, DATA BUCKET SIZE: 1
    ROOT VBN: 10
    KEY FLAGS:
            (0) KEY$V_DUPKEYS    0
            (3) KEY$V_IDX_COMPR  0
            (4) KEY$V_INITIDX    0
            (6) KEY$V_KEY_COMPR  0
            (7) KEY$V_REC_COMPR  1
    KEY SEGMENTS: 1
    KEY SIZE: 4
 
    MINIMUM RECORD SIZE: 4
    INDEX FILL QUANTITY: 512, DATA FILL QUANTITY: 512
    SEGMENT POSITIONS: 0
    SEGMENT SIZE:      4
 
    DATA TYPE: STRING
    NAME: "PART_NUM"
    FIRST DATA BUCKET VBN: 4
 
   KEY DESCRIPTOR #1 (VBN 2, OFFSET %X'0000')
 
    NEXT KEY DESCRIPTOR VBN: 2, OFFSET: %X'0066'
    INDEX AREA: 3, LEVEL 1 INDEX AREA: 3, DATA AREA: 2
    ROOT LEVEL: 1
    INDEX BUCKET SIZE: 1, DATA BUCKET SIZE: 1
    ROOT VBN: 16
 
    KEY FLAGS:
            (0) KEY$V_DUPKEYS    1
            (1) KEY$V_CHGKEYS    0
            (2) KEY$V_NULKEYS    0
            (3) KEY$V_IDX_COMPR  0
            (4) KEY$V_INITIDX    0
            (6) KEY$V_KEY_COMPR  0
    KEY SEGMENTS: 1
    KEY SIZE: 5
 
 
 
                            - 355 -
 
                         00152-01 92 01
 
 
    MINIMUM RECORD SIZE:  9
    INDEX FILL QUANTITY: 512, DATA FILL QUANTITY: 512
    SEGMENT POSITIONS:    4
    SEGMENT SIZES:        5
 
    DATA TYPE: STRING
    NAME: "PART_NUM"
    FIRST DATA BUCKET VBN: 13
 
   KEY DESCRIPTOR #2 (VBN 2, OFFSET %X'0066')
 
    NEXT KEY DESCRIPTOR VBN: 2, OFFSET: %X'00CC'
    INDEX AREA: 5, LEVEL 1 INDEX AREA: 5, DATA AREA: 4
    ROOT LEVEL: 1
    INDEX BUCKET SIZE: 1, DATA BUCKET SIZE: 1
    ROOT VBN: 22
 
    KEY FLAGS:
            (0) KEY$V_DUPKEYS    1
            (1) KEY$V_CHGKEYS    0
            (2) KEY$V_NULKEYS    0
            (3) KEY$V_IDX_COMPR  1
            (4) KEY$V_INITIDX    0
            (6) KEY$V_KEY_COMPR  1
    KEY SEGMENTS: 1
    KEY SIZE: 10
 
    MINIMUM RECORD SIZE: 19
    INDEX FILL QUANTITY: 512, DATA FILL QUANTITY: 512
    SEGMENT POSITIONS: 9
    SEGMENT SIZES: 10
 
    DATA TYPE: STRING
    NAME: "SUPPLIER_NAME"
    FIRST DATA BUCKET VBN: 19
 
   KEY DESCRIPTOR #3 (VBN 2, OFFSET %X'00CC')
 
    INDEX AREA: 7, LEVEL 1 INDEX AREA: 7, DATA AREA: 6
    ROOT LEVEL: 1
    INDEX BUсKET SIZE: 1, DATA BUCKET SIZE: 1
    ROOT VBN: 28
 
    KEY FLAGS:
            (0) KEY$V_DUPKEYS    1
            (1) KEY$V_CHGKEYS    0
            (2) KEY$V_NULKEYS    0
            (3) KEY$V_IDX_COMPR  1
            (4) KEY$V_INITIDX    0
            (6) KEY$V_KEY_COMPR  1
    KEY SEGMENTS: 1
    KEY SIZE: 10
 
    MINIMUM RECORD SIZE: 29
    INDEX FILL QUATITY:  512, DATA FILL QUANTITY: 512
    SEGMENT POSITIONS:   19
    SEGMENT SIZES:       10
    DATA TYPE: STRING
    NAME: "COLOR"
 
 
                            - 356 -
 
                         00152-01 92 01
 
 
    FIRST DATA BUCKET VBN: 25
 
    THE ANALYSIS UNCOVERED NO ERRORS.
 
    ANALYZE/RMS_FILE/OUTPUT=CUSTDATA.ANL CUSTDATA.DAT
 
        Для того, чтобы поместить отчет о проверке в  заданный
 
   выходной файл, следует использовать команду DCL в формате:
 
 
        АNALYZE/RMS_FILE/CHECK/OUTPUT=выхф вхф
 
 
   где выхф - спецификация выходного файла - отчета;
 
       вхф  - спецификация входного анализируемого файла.
 
        По умолчанию тип выходного  файла  -  .ANL.  Например,
 
   следующая команда DCL вызывает проверку файла  PRLG2.IND  и
 
   размещение отчета о проверке в файле ERROR.ANL:
 
 
        $ANALYZE/RMS_FILE/CHECK/OUTPUT=ERROR PRLG2.IND
 
 
 
        9.1.2. Генерация статистического отчета
 
 
        Для индексных файлов статистический отчет  состоит  из
 
   отчета о проверке структуры файла плюс  некоторой  дополни-
 
   тельной информации об областях и ключах данного файла.  Для
 
   последовательных или  относительных  файлов  статистический
 
   отчет совпадает с отчетом о проверке.
 
        Для генерации статистического отчета при помощи  прог-
 
   раммы ANALYZE следует ввести команду DCL в формате:
 
 
        АNALYZE/RMS_FILE/STATISTICS вхф
 
 
   где вхф - спецификация анализируемого файла.
 
 
 
 
 
 
 
 
 
 
                            - 357 -
 
                         00152-01 92 01
 
 
        П р и м е р.
 
 
          Пример генерации статистического отчета
 
   RMS FILE STATISTICS 18-APR-1984 11:22:27.14
   DISK$: [TEST.PROGRAM]INDEX.DAT;1
 
   FILE HEADER
 
    FILE SPEC: DISK$:[TEST.PROGRAM]INDEX.DAT;1
    FILE ID: (15960,8,0)
    OWNER UIC:[011,310]
    PROTECTION: SYSTEM:RWED, OWNER:RWED, GROUP:RWE, WORLD:RWE
 
    CREATION DATE: 19-APR-1987 22:15:55.70
    REVISION DATA: 19-APR-1987 22:16:01.74, NUMBER: 4
    EXPIRATION DATE: NONE SPECIFIED
    BACKUP DATE: 18-APR-1987 00:57:54.24
 
    CONTIGUITY OPTIONS: CONTIGUOUS-BEST-TRY
    PERFOMANCE OPTIONS: NONE
    RELIABILITY OPTION: NONE
    JOURNALING ENABLED: NONE
 
   RMS FILE ATTRIBUTES
 
    FILE ORGANIZATION: INDEXED
    RECORD FORMAT: VARIABLE
    RECORD ATTRIBUTES: CARRIAGE-RETURN
    MAXIMUM RECORD SIZE: 80
    BLOCKS ALLOCATED: 30, DEFAULT EXTEND SIZE: 2
    BUCKET SIZE: 1
    GLOBAL BUFFER COUNT: 0
 
   FIXED PROLOG
 
    NUMBER OF AREAS: 8, VBN OF FIRST DESCRIPTOR: 3
    PROLOG VERSION: 3
 
   AREA DESCRIPTOR #0 (VBN 3, OFFSET %X'0000')
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 1 BLOCKS: 9, USED: 1, NEXT: 5
    DEFAULT EXTEND QUANTITY: 2
    TOTAL ALLOCATION: 9
 
   STATISTICS FOR AREA #0
 
    COUNT OF RECLAIMED BLOCKS:           0
 
   AREA DESCRIPTOR #1 (VBN 3, OFFSET %X'0040')
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 10 BLOCKS: 3, USED: 1, NEXT: 11
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
 
                            - 358 -
 
                         00152-01 92 01
 
 
 
   STATISTICS FOR AREA #1
 
    COUNT OF RECLAIMED BLOCKS:            0
 
   AREA DESCRIPTOR #2 (VBN 3, OFFSET %X'0080')
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 13 BLOCKS: 3, USED: 1, NEXT: 14
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   STATISTICS FOR AREA #2
 
    COUNT OF RECLAIMED BLOCKS:            0
 
   AREA DESCRIPTOR #3 (VBN 3, OFFSET %X'00C0')
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 16 BLOCKS: 3, USED: 1, NEXT: 14
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   AREA DESCRIPTOR #3 (VBN 3, OFFSET %X'00C0')
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 16 BLOCKS: 3, USED: 1, NEXT: 17
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   STATISTICS FOR AREA #3
 
    COUNT OF RECLAIMED BLOCKS:            0
 
   AREA DESCRIPTOR #4 (VBN 3, OFFSET %X'0100')
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTEND START: 19 BLOCKS: 3, USED: 1, NEXT: 20
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   STATISTICS  FOR AREA #4
 
    COUNT OF RECLAIMED BLOCKS:            0
 
   AREA DESCRIPTOR #5 (VRN 3, OFFSET %X'0140')
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 22 BLOCKS: 3, USED: 1, NEXT: 23
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   STATISTICS FOR AREA #5
 
 
 
                            - 359 -
 
                         00152-01 92 01
 
 
    COUNT OF RECLAIMED BLOCKS:            0
 
   AREA DESCRIPTOR #6 (VBN 3, OFFSET %X'0180')
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 25 BLOCKS: 3, USED: 1, NEXT: 26
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   STATISTICS FOR AREA #6
 
    COUNT OF RECLAIMED BLOCKS:             0
 
   AREA DESCRIPTOR #7 (VBN 3, OFFSET %X'01C0')
 
    BUCKET SIZE: 1
    RECLAIMED BUCKET VBN: 0
    CURRENT EXTENT START: 28 BLOCKS: 3, USED: 1, NEXT: 29
    DEFAULT EXTEND QUANTITY: 1
    TOTAL ALLOCATION: 3
 
   STATISTICS FOR AREA #7
 
    COUNT OF RECLAIMED BLOCKS:              0
 
   KEY DESCRIPTOR #0 (VBN 1, OFFSET %X'0000')
 
    NEXT KEY DESRIPTOR VBN: 2, OFFSET: %X'0000'
    INDEX AREA: 1, LEVEL 1 INDEX AREA: 1, DATA AREA: 0
    ROOT LEVEL: 1
    INDEX BUCKET SIZE: 1, DATA BUCKET SIZE: 1
    ROOT VBN: 10
 
   KEY FLAGS:
           (0) KEY$V_DUPKEYS    0
           (3) KEY$V_IDX_COMPR  0
           (4) KEY$V_INITIDX    0
           (6) KEY$V_KEY_COMPR  0
           (7) KEY$V_REC_COMPR  1
    KEY SEGMENTS: 1
    KEY SIZE: 4
 
    MINIMUM RECORD SIZE: 4
    INDEX FILL QUANTITY: 512, DATA FILL QUANTITY: 512
    SEGMENT POSITIONS:  0
    SEGMENT SIZES:      4
 
    DATA TYPE: STRING
    NAME: "ID_NUM"
    FIRST DATA BUCKET VBN: 4
 
   STATISTICS FOR KEY #0
 
    NUMBER OF INDEX LEVELS:        1
    COUNT OF LEVEL 1 RECORDS:      1
    MEAN  LENGTH OF INDEX ENTRY:   6
    COUNT OF INDEX BLOCKS:         1
    MEAN INDEX BUCKET FILL:        4%
 
 
                            - 360 -
 
                         00152-01 92 01
 
 
    MEAN INDEX ENTRY COMPRESSION:  0%
 
    COUNT OF DATA RECORDS:         10
    MEAN LENGTH OF DATA RECORD:    33
    COUNT OF DATA BLOCKS:          1
    MEAN DATA BUCKET FILL:         90%
    MEAN DATA KEY COMPRESSION:     0%
    MEAN DATA RECORD COMPRESSION:  2%
 
    OVERALL SPACE EFFICIENCY:      2%
 
   KEY DESCRIPTOR #1 (VBN 2, OFFSET %X'0000')
 
    NEXT KEY DESCRIPTOR VBN: 2, OFFSET: %X'0066'
    INDEX AREA: 3, LEVEL 1 INDEX AREA: 3, DATA AREA: 2
    ROOT LEVEL: 1
    INDEX BUCKET SIZE: 1, DATA BUCKET SIZE: 1
    ROOT VBN: 16
 
    KEY FLAGS:
            (0) KEY$V_DUPKEYS    1
            (1) KEY$V_CHGKEYS    0
            (2) KEY$V_NULKEYS    0
            (3) KEY$V_IDX_COMPR  0
            (4) KEY$V_INITIDX    0
            (6) KEY$V_KEY_COMPR  0
    KEY SEGMENTS: 1
    KEY SIZE: 5
 
    MINIMUM RECORD SIZE: 9
    INDEX FILL QUANTITY: 512, DATA FILL QUANTITY: 512
    SEGMENT POSITIONS:   4
    SEGMENT SIZES:       5
 
    DATA TYPE: STRING
    NAME: "ID_NAME"
    FIRST DATA BUCKET VBN: 13
 
   STATISTICS FOR KEY #1
 
    NUMBER OF  INDEX LEVELS:         1
    COUNT OF LEVEL 1 RECORDS:        1
    MEAN LENGTH OF INDEX ENTRY:      7
    COUNT OF INDEX BLOCKS:           1
    MEAN INDEX BUCKET FILL:          4%
    MEAN INDEX ENTRY COMPRESSION:    0%
 
    COUNT OF DATA RECORDS:           6
    MEAN DUPLICATES PER DATA RECORD: 0
    MEAN LENGTH OF DATA RECORD:      19
    COUNT OF DATA BLOCKS:            1
    MEAN DATA BUCKET FILL:           24%
    MEAN DATA KEY COMPRESSION:       0%
 
   KEY DESCRIPTOR #2 (VBN 2, OFFSET %X'0066')
 
    NEXT KEY DESCRIPTOR VBN: 2, OFFSET: %X'00CC'
    INDEX AREA: 5, LEVEL 1 INDEX AREA: 5, DATA AREA: 4
    ROOT LEVEL: 1
 
 
                            - 361 -
 
                         00152-01 92 01
 
 
    INDEX BUCKET SIZE: 1, DATA BUCKET SIZE: 1
    ROOT VBN: 22
 
    KEY FLAGS:
            (0) KEY$V_DUPKEYS   1
            (1) KEY$V_CHGKEYS   0
            (2) KEY$V_NULKEYS   0
            (3) KEY$V_IDX_COMPR 1
            (4) KEY$V_INITIDX   0
            (6) KEY$V_KEY_COMPR 1
    KEY SEGMENTS: 1
    KEY SIZE: 10
 
    MINIMUM RECORD SIZE: 19
    INDEX FILL QUANTITY: 512, DATA FILL QUANTITY: 512
    SEGMENT POSITIONS:   9
    SEGMENT SIZES:       10
 
    DATA TYPE: STRING
    NAME: "ADDRESS"
    FIRST DATA BUCKET VBN: 19
 
   STATISTICS FOR KEY #2
 
    NUMBER OF INDEX LEVELS:                1
    COUNT OF LEVEL I RECORDS:              1
    MEAN LENGTH OF INDEX ENTRY:            12
    COUNT OF INDEX BLOCKS:                 1
    MEAN INDEX BUCKET FILL:                4%
    MEAN INDEX ENTRY COMPRESSION:          58%
 
    COUNT OF DATA RECORDS:                 7
    MEAN DUPLICATES PER DATA RECORD:       0
    MEAN LENGTH OF DATA RECORD:            20
    COUNT OF DATA BLOCKS:                  1
    MEAN DATA BUCKET FILL:                 30%
    MEAN DATA KEY COMPRESSION:             21%
 
   KEY DESCRIPTOR #3 (VBN 2, OFFSET %X'00C0')
 
    INDEX AREA: 7, LEVEL 1 INDEX AREA: 7, DATA AREA: 6
    ROOT LEVEL: 1
    INDEX BUCKET SIZE: 1, DATA BUCKET SIZE: 1
    ROOT VBN: 28
 
    KEY FLAGS:
            (0) KEY$V_DUPKEYS   1
            (1) KEY$V_CHGKEYS   0
            (2) KEY$V_NULKEYS   0
            (3) KEY$V_IDX_COMPR 1
            (4) KEY$V_INITIDX   0
            (6) KEY$V_REC_COMPR 1
    KEY SEGMENTS: 1
    KEY SIZE: 10
 
    MINIMUM RECORD SIZE: 29
    INDEX FILL QUANTITY: 512, DATA FILL QUANTITY: 512
    SEGMENT POSITIONS:   19
    SEGMENT SIZES:       10
 
 
                            - 362 -
 
                         00152-01 92 01
 
 
 
    DATA TYPE: STRING
    NAME: "CHARGES"
    FIRST DATA BUCKET VBN: 25
 
   STATISTICS FOR KEY #3
 
    NUMBER OF INDEX LEVELS:        1
    COUNT OF LEVEL 1 RECORDS:      1
    MEAN LENGTH OF INDEX ENTRY:    12
    COUNT OF INDEX BLOCKS:         1
    MEAN INDEX BUSKET FILL:        4%
    MEAN INDEX ENTRY COMPRESSION:  58%
 
    COUNT OF DATA RECORDS:             5
    MEAN DUPLICATES PER DATA RECORD:   1
    MEAN LENGTH OF DATA RECORD:        23
    COUNT OF DATA BLOCKS:              1
    MEAN DATA BUCKET FILL:             25%
    MEAN DATA KEY COMPRESSION:         34%
 
   THE ANALYSIS UNCOVERED NO ERRORS.
 
   ANALYZE/RMS_FILE/OUTPIT=INDEX/STATISTICS INDEX.DAT
 
 
        9.1.3. Использование интерактивного режима
 
 
        Указанный  в  командной  строке  ANALYZE  квалификатор
 
   /INTERACTIVE позволяет провести проверку структуры файла  в
 
   интерактивном режиме.
 
        Программа ANALYZE внутренней структуре файла суд  ста-
 
   вит  в  соответствие  некоторую  иерархическую  древовидную
 
   структуру. Каждая структура данных в файле представляется в
 
   виде узла, с соответствующей ветвью для каждого указателя в
 
   структуре данных. Заголовок файла всегда является  корневым
 
   узлом. Каждому из трех способов организации файла (последо-
 
   вательному, относительному и индексному) ставится  в  соот-
 
   ветствие своя собственная структура.
 
        Для анализа файла необходимо ввести  команды  ANALYZE,
 
   которые перемещают текущее положение на конкретные структу-
 
   ры внутри данного дерева. В результате отображается текущая
 
   структура на экране.
 
 
 
                            - 363 -
 
                         00152-01 92 01
 
 
        В табл.43 приводятся команды программы ANALYZE.
 
                                                   Таблица 43
 
                    Kоманды программы ANALYZE
 
   ----------------------------------------------------------
   Команда        !             Функция
   ----------------------------------------------------------
                  !
   AGAIN          !   Снова отображает текущую структуру
                  !
   DоWN [ветвь]   !   Перемещает указатель структуры вниз  на
                  ! следующий   уровень.  Если  текущий  узел
                  ! имеет больше  одной ветви, то должно быть
                  ! задано    ключевое   слово   ветви.  Если
                  ! ключевое слово ветви не задано, то выдае-
                  ! тся меню, из которого  можно  осуществить
                  ! выбор требуемого ключевого слова
                  !
   DUMP N         !   Вывод шесTнадцатеричного дампа заданно-
                  ! го блока, N - номер блока
                  !
   EXIT           !   Оканчивает интерактивный сеанс
                  !
   FIRST          !   Перемещает указатель структуры на  пер-
                  ! вую структуру  текущего  уровня,  которая
                  ! отображается на терминале. Например, если
                  ! проверяются бакеты данных  и   необходимо
                  ! проверить первый  бакет,  то  эта команда
                  ! обеспечивает отображение на терминале за-
                  ! головка первого бакета
                  !
   HELP [ключевое !   Справка об интерактивных командах
         слово]   ! ANALYZE
                  !
   NEXT           !   Перемещает   указатель   структуры   на
                  ! следующую структуру текущего уровня. Дан-
                  ! ная структура отображается на  терминале.
                  ! нажатие клавиши <сR> эквивалентно команде
                  ! NEXT
                  !
   RESET          !   Перемещает  указатель  структуры  вдоль
                  ! остальных  структур  на  текущем уровне и
                  ! проводится отображение на терминале  каж-
                  ! дой из структур
                  !
   тоP            !   Перемещает указатель структуры вверх до
                  ! заголовка файла.  Данный  заголовок файла
                  ! отображается на терминале
                  !
   UP             !   Перемещает указатель структуры вверх на
                  ! следующий уровень. Структура этого  уров-
                  ! ня отображается на терминале
 
 
 
 
 
 
 
                            - 364 -
 
                         00152-01 92 01
 
 
        9.1.4. Исследование последовательного файла
 
 
        На рис.20 показана  древовидная  структура  последова-
 
   тельного файла.
 
 
 
          Древовидная структура последовательного файла
 
 
    --------------
    ! Заголовок  !
    --------------
          !
    --------------
    !  Атрибуты  !
    --------------
          !
   --------------   --------------           -------------
   ! 1-я запись !---! 2-я запись !--- ... ---! Последняя !
   --------------   --------------           !  запись   !
                                             -------------
 
 
 
                            Рис. 20
 
 
        Структура "заголовок  файла"  всегда  является  первой
 
   отображаемой  структурой.  От  структуры  "заголовок файла"
 
   команда DOWN перемещает текущую позицию на структуру "атри-
 
   буты файла". Команда DOWN  от  структуры  "атрибуты  файла"
 
   перемещает текущую позицию на первую запись в данном файле.
 
   От первой записи команда  RESEт  будет  перемещать  текущую
 
   позицию через записи в данном файле, отображая  по  очереди
 
   каждую запись. Последовательность команд NEXT  будет  также
 
   выполнять эту же самую операцию.
 
        В примере данного  пункта  приведен  результат  работы
 
   программы  ANALYZE  для  последовательного  файла  SEQ.DAT,
 
   содержащего три записи.
 
 
 
 
 
 
 
 
                            - 365 -
 
                         00152-01 92 01
 
 
        П р и м е р.
 
 
   $ ANALYZE/RMS_FILE/INTERACTIVE SEQ.DAT
 
   FILE HEADER
 
             FILE SPEC: SYS$SYSDEVICE:[USER.MIS]SEQ.DAT;2
             FILE ID: (704.29.0)
             OWNER UIC: [001.004]
             PROTECTION: SYSTEM: RWED, OWNER: RWED, GROUP:
             RE, WORLD:
             CREATION DATE: 23-APR-1987 17:29:47.91
             REVISION DATE: 23-APR-1987 17:29:50.06, NUMBER: 1
             EXPIRATION DATE: NONE SPECIFIED
             BACKUP DATE:     NONE POSTED
             CONTIGUITY OPTIONS:  NONE
             PERFORMANCE OPTIONS: NONE
             RELIABILITY OPTIONS: NONE
             JOURNALING ENABLED:  NONE
 
   ANALYZE> DOWN
 
   RMS FILE ATTRIBUTES
 
             FILE ORGANIZATION: SEQUENTIAL
             RECORD FORMAT: VARIABLE
             RECORD ATTRIBUTES:   CARRIAGE-RETURN
             MAXIMUM RECORD SIZE: 0
             LONGEST RECORD: 47
             BLOCKS ALLOCATED: 3, DEFAULT EXTEND SIZE: 0
             END-OF-FILE VBN: 1, OFFSET: %X'008C'
             GLOBAL BUFFER COUNT: 0
 
   ANALYZE> DOWN
 
             DATA BYTES (VBN 1, OFFSET %X'0000'):
 
                   7  6  5  4  3  2  1  0          01234567
                 -------------------------        ----------
                  30 30 30 30 30 30 00 2F!  0000  !/.000000!
                  4C 50 4D 41 58 45 20 31!  0008  !1 EXAMPL!
                  78 45 20 20 31 20 53 45!  0010  !ES 1  EX!
                  20 67 6E 69 6E 69 6D 61!  0018  !AMININS !
                  6E 65 75 71 65 53 20 61!  0020  !A SEQUEN!
                  6C 69 66 20 6C 61 69 74!  0028  !TIAL FIL!
                                    00 65!  0030  !E.      !
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 366 -
 
                         00152-01 92 01
 
 
   ANALYZE> NEXT
 
             DATA BYTES (VBN 1, OFFSET %B'0032'):
 
                   7  6  5  4  3  2  1  0          01234567
                 -------------------------        ----------
                  6C 61 6E 61 20 24 00 26!  0000  !&.& ANAL!
                  5F 73 6D 72 2F 65 7A 79!  0008  !YZE/RMS_!
                  74 6E 69 2F 65 6C 69 66!  0010  !FILE/INT!
                  65 76 69 74 63 65 72 65!  0018  !ERECTIVE!
                  74 61 64 2E 71 65 73 20!  0020  ! SEQ.DAT!
 
   ANALYZE> NEXT
 
             DATA BYTES (VBN 1, OFFSET %X'005A'):
 
                   7  6  5  4  3  2  1  0          01234567
                 -------------------------        ----------
                  30 30 30 30 30 30 00 2C!  0000  !,.000000!
                  4C 50 4D 41 58 45 20 32!  0008  !2 EXAMPL!
                  61 78 45 20 32 20 53 45!  0010  !ES 2 EXA!
                  61 20 67 6E 69 6E 69 6D!  0018  !MININS A!
                  76 69 74 61 6C 65 52 20!  0020  ! RELATIV!
                        65 6C 69 66 20 65!  0028  !E FILE  !
 
   ANALYZE> EXIT
   $
 
 
        9.1.5. Исследование относительного файла
 
 
        На рис.21 показана древовидная структура  для  относи-
 
   тельного файла.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 367 -
 
                         00152-01 92 01
 
 
           Древовидная структура относительных файлов
 
 
        -------------
        ! Заголовок !
        -------------
             !
        -------------
        ! Атрибуты  !
        -------------
             !
        -------------
        !  Пролог   !
        -------------
             !
       ----------------   --------------    -------------
       ! Первый бакет !   ! 2-й бакет  !    ! Последний !
       !   данных     !---!   данных   !....! бакет     !
       !              !   !            !    ! данных    !
       ----------------   --------------    -------------
            !                        \                \
            !                         \                \
   --------------       -------------- \ -------------  \
   ! 1-я запись !       ! Последняя  !  \! 1-я запись!   \
   ! 1-м бакете !--...--! запись в   !---! во 2-м    ! ...
   !            !       ! 1-м бакете !   ! бакете    !
   --------------       --------------   -------------
 
 
 
                            Рис. 21
 
 
        Древовидная структура для относительных  файлов  также
 
   начинается со структур "заголовок файла" и  "атрибуты  фай-
 
   ла". От структуры  "атрибуты  файла"  следующей  структурой
 
   вниз является "пролог". Первой структурой вниз от "пролога"
 
   является "первый бакет".  Структуры  "бакет  данных"  могут
 
   быть исследованы при помощи команды RESт или, одна структу-
 
   ра за другой, при помощи команды NEXT. Единственной  инфор-
 
   мацией на уровне "бакет данных" является номер виртуального
 
   блока соответствующего бакета данных.
 
        От первой структуры "бакет данных" следующей  структу-
 
   рой вниз является первая "ячейка и запись в первом бакете".
 
   Можно исследовать  записи  в  каждой  ячейке,  задавая  или
 
   команду REST или последовательность команд NEXT.
 
 
 
                            - 368 -
 
                         00152-01 92 01
 
 
        Если используется команда REST  на  уровне  "ячейка  и
 
   запись", то программа будет отображать все ячейки и  записи
 
   в данном файле, а не только ячейки и записи в текущем баке-
 
   те.
 
        В примере приведен  результат  интерактивной  проверки
 
   относительного файла с помощью программы ANALYZE.
 
 
        П р и м е р.
 
 
   $ ANALYZE/RMS_FILE/INTERACTIVE REL.DAT
 
   FILE HEADER
 
             FILE SPEC: SYS$SYSDEVICE:[USER.MIS]REL.DAT;1
             FILE ID: (3546,16,0)
             OWNER UIC: [001.004]
             PROTECTION: SYSTEM: RWED, OWNER: RWED, GROUP:
             RE, WORLD:
             CREATION DATE: 23-APR-1987 17:45:48.71
             REVISION DATE: 23-APR-1987 17:45:49.98, NUMBER: 1
             EXPIRATION DATE: NONE SPECIFIED
             BACKUP DATE:     NONE POSTED
             CONTISUITY OPTIONS:  CONTIGUOUS-BEST-TRY
             PERFORMANCE OPTIONS: NONE
             RELIABILITY OPTIONS: NONE
             JOURNALING ENABLED:  NONE
 
   ANALYZE> DOWN
 
   RMS FILE ATTRIBUTES
 
             FILE ORGANIZATION: RELATIVE
             RECORD FORMAT: VARIABLE
             RECORD ATTRIBUTES:   CARRIAGE-RETURN
             MAXIMUM RECORD SIZE: 75
             BLOCKS ALLOCATED: 9, DEFAULT EXTEND SIZE: 0
             BUCKET SIZE: 3
             GLOBAL BUFFER COUNT: 0
 
   ANALYZE> DOWN
 
   FIXED PROLOG
 
             PROLOG FLASS:
                    (0)  PLG$V_NOEXTEND   0
             FIRST DATA BUCKET VBN: 2
             MAXIMUM RECORD NUMBER: 214748364
             END-OF-FILE VBN: 10
             PROLOG VERSION: 1
 
   ANALYZE> DOWN
 
 
 
                            - 369 -
 
                         00152-01 92 01
 
 
   DATA BUCKET (VBN 2)
 
   ANALYZE> DOWN (VBN 2)
 
             RECORD CELL (VBN 2, OFFSET %X'0000'):
 
                    CELL CONTROL FLAGS:
                           (2)  DLC$V_DELETED    0
                           (3)  DLC$V_REC        1
                    RECORD BYTES:
 
                   7  6  5  4  3  2  1  0          01234567
                  ------------------------        ---------
                  30 30 30 30 30 30 00 2F!  0000  !/.000000!
                  4C 50 4D 41 58 45 20 31!  0008  !1 EXAMPL!
                  78 45 20 20 32 20 53 45!  0010  !ES 2  EX!
                  20 67 6E 69 6F 69 6D 61!  0018  !AMINING !
                  65 68 61 6C 65 52 20 61!  0020  !A RELATE!
                  6C 69 66 20 20 20 20 64!  0028  !D    FIL!
                                       65!  0030  !E       !
 
   ANALYZE> *EXIT*
   $
 
 
        9.1.6. Исследование индексного файла
 
 
        Структура индексного файла также начинается со  струк-
 
   тур "заголовок файла",  "атрибуты  файла"  и  "пролог".  От
 
   структуры "пролог" ветви структуры файла идут к  структурам
 
   "дескриптор области" и "дескриптор ключа". Для того,  чтобы
 
   перейти на ветвь "дескриптор области" следует задать коман-
 
   ду DOWN AREA. Для того, чтобы перейти на ветвь  "дескриптор
 
   ключа" следует дать команду DOWN KEY.
 
        Путь "дескриптор области" содержит структуры,  которые
 
   предоставляют информацию о различных областях данного  фай-
 
   ла. Путь "дескриптор ключа" содержит  структуры  первичного
 
   ключа (и записи данных) и любые структуры вторичного ключа.
 
        На рис.22 показана структура пути  "дескриптор  облас-
 
   ти".
 
 
 
 
 
 
 
 
                            - 370 -
 
                         00152-01 92 01
 
 
                    Путь "дескриптор области"
 
 
                         -------------
                         ! Заголовок !
                         -------------
                               !
                         -------------
                         ! Атрибуты  !
                         !  файла    !
                         -------------
                               !
                         -------------
                         !   Пролог  !
                         -------------
                          /        \
                         /          \
                 --------------      \
                 ! Дескриптор !
                 !  области   !
                 -------------- ...
                       !
                 --------------
                 ! Требуемый  !
                 !   бакет    !
                 -------------- ...
 
 
 
                            Рис. 22
 
 
 
        Рис.23  иллюстрирует  результат  проверки  дескриптора
 
   области командой DOWN AREA программы ANALYZE.
 
 
 
         Проверка дескриптора области программой ANALYZE
 
 
   ANALYZE> DOWN AREA
   AREA DESCRIPTOR #0 (VBN 3, OFFSET %X'0000')
      BUCKET SIZE: 1
      ALIGNMENT: AREA$S_NONE
      ALIGNMENT: FLAGS:
          (0) AREA$V_HARD    0
          (1) AREA$V_ONC     0
          (5) AREA$V_CBT     0
          (7) AREA$V_CTG     0
      CURRENT EXTEND START:  1, BLOCKS: 9, USED: 7, NEXT: 8
      DEFAULT EXTEND QUANTITY: 0
 
 
 
                            рис. 23
 
 
 
 
                            - 371 -
 
                         00152-01 92 01
 
 
                     Путь "дескриптор ключа"
 
 
   -------------
   ! Заголовок !
   -------------
         !
   -------------
   ! Атрибуты  !
   !   файла   !
   -------------
         !
   -------------
   !  Пролог   !
   -------------
            !
        --------------
        ! Дескриптор !
        !   ключа    !-----------------!
        --------------        --------------------
                !             ! Бакет корневого  !
                !             !    индекса       !
                !             --------------------
                !                       !
                !             --------------------
                !             ! Индексная запись !
                !             --------------------
                !   --------------------!
                !   !
         --------------
         !    Бакет   !
         !   данных   ! ...
         --------------
                !
      --------------------
      ! Первичная запись !
      !    или запись    !
      ! альтернативного  !
      !    индекса       !
      --------------------
 
 
 
                            Рис. 24
 
 
        Как показано на рис.24, можно перейти  непосредственно
 
   к структуре "бакет данных" или к структуре "бакет  индекса"
 
   для  того,  чтобы  начать  исследование  структуры  данного
 
   индекса, в конце концов, достигая структуры "бакет данных".
 
   В зависимости от того, исследуется ли структура  первичного
 
   индекса  или  одна  из  структур  альтернативного  индекса,
 
   имеется некоторое различие в содержимом структуры "запись".
 
 
                            - 372 -
 
                         00152-01 92 01
 
 
        Структура  первичной  записи  содержит  действительные
 
   записи данных. Структуры  альтернативных  записей  содержат
 
   записи данных вторичного индекса (SIDR).
 
        На рис.25 приведена структура первичной записи.
 
 
 
                   Структура первичной записи
 
 
                       --------------------
                       ! Первичная запись !
                       --------------------
                           /        \
                         /            \
                       /                \
        --------------------       -------------------
        ! Файлы собственно !       ! Указатель на    !
        !     данных       !       ! следующий бакет !
        --------------------       -------------------
 
 
 
                            Рис. 25
 
 
        Как видно из рис.25 при достижении собственно  первич-
 
   ной записи можно провести ее анализ, либо перейти к следую-
 
   щей записи, используя для этой цели указатель (RRV).
 
        Ниже приведен пример проверки первичной записи.
 
 
        П р и м е р.
 
 
   PRIMARY DATA RECORD (VBN 4. OFFSET %X'000E')
 
          RECORD CONTROL FLAGS:
                 (2)  IRC$V_DELETED  0
                 (3)  IRC$V_RRV      0
                 (4)  IRC$V_NOPTRSZ  0
 
          RECORD ID: 1
          RRV ID: 1, 4-BYTE BUCKET POINTER: 4
          KEY:
 
               7  6  5  4  3  2  1  0         01234567
             -------------------------       ----------
                    31 30 30 30 30 30!  0000 !000001  !
 
 
 
 
 
 
                            - 373 -
 
                         00152-01 92 01
 
 
   ANALYZE> DOWN BYTES
 
              7  6  5  4  3  2  1  0
            -------------------------
             30 30 30 30 30 30 00 2F!  0000  !I.000001!
             4C 50 4D 41 58 45 20 31!  0008  !1 EXAMPL!
             78 45 20 20 33 20 53 45!  0010  !ES 3  EX!
             20 67 6E 69 6F 69 6D 61!  0018  !AMINING !
                                  61!  0020  !AN INDEX!
             65 6C 69 66 20 20 64 65!  0028  !ED  FILE!
 
   ANALYZE> UP
 
          PRIMARY DATA RECORD (VBN 4, OFFSET %X'000E')
 
                 RECORD CONTROL FLAGS:
                        (2)  IRC$V_DELETED  0
                        (3)  IRC$V_RRV      0
                        (4)  IRC$V_NOPTRSZ  0
 
                 RECORD ID: 1
                 RRV ID: 1, 4-BYTE BUCKET POINTER: 4
                 KEY:
                    7  6  5  4  3  2  1  0         01234567
                  -------------------------       ----------
                         31 30 30 30 30 30!  0000 !000001  !
 
   ANALYZE> DOWN RRV
 
   BUCKET HEADER (VBN 4)
          CHECK CHARACTER: %X'00'
          AREA NUMBER: 0
          VBN SAMPLE: 4
          FREE SPACE OFFSET: %X'0104'
          FREE RECORD ID RANGE: 4 - 255
          NEXT BUCKET VBN: 4
          LEVEL: 0
          BUCKET HEADER FLAGS:
                 (0)  BKT$V_LASTBKT  1
                 (1)  BKT$V_ROOTBKT  0
 
        На рис.26 отображена структура альтернативных записей.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 374 -
 
                         00152-01 92 01
 
 
                Структура альтернативных записей
 
 
                    ------------------
                    ! Альтернативная ! ...
                    !    запись      !
                    ------------------
                            !
                            !
                    ------------------
                    !   Указатель    ! ...
                    ------------------
 
 
 
                            Рис. 26
 
 
 
        В  примере  приведен  пример  проверки  альтернативной
 
   записи.
 
 
        П р и м е р.
 
 
   ANALYZE> DOWN
 
   SIDR RECORD (VBN 6, OFFSET %X'000E')
          CONTROL FLAGS:
                 (4) IRC$V_NOPTRSZ  0
          RECORD ID: 1
          KEY:
               7  6  5  4  3  2  1  0          01234567
             -------------------------        ----------
                       31 36 30 33 30!  0000  !03061   !
 
   ANALYZE> DOWN
 
              SIDR POINTER CONTROL FLAGS:
                     (2)  IRC$V_DELETED    0
                     (5)  IRC$V_KEYDELETE  0
              SIDR POINTER RECORD ID: 1, 4-BYTE RECORD VBN: 4
 
 
        9.2. Создание  файла  FDL  по  существующему
 
             файлу данных
 
 
        Обслуживающая программа ANALYZE может быть использова-
 
   на для создания файла FDL, называемого файлом анализа. Фай-
 
   лы FDL, созданные программой ANALYZE, содержат статистику о
 
   каждой области и  ключе  в  первичных  секциях,  называемых
 
 
 
                            - 375 -
 
                         00152-01 92 01
 
 
   ANALYSIS_OF_AREA и ANALYSIS_OF_KEY.
 
        Эти секции анализа затем используются редактором FDL в
 
   сценарии "оптимизация". Статистические данные в  этих  сек-
 
   циях можно сравнить с требованиями, пред'являемыми к данно-
 
   му файлу. В структуре данного файла, можно найти соответст-
 
   вующие места, в которых возможно проведение заданной  наст-
 
   ройки файла.
 
        Для того, чтобы сгенерировать файл  FDL  по  заданному
 
   файлу данных, следует ввести команду DCL:
 
 
        ANALYZE/RMS_FILE/FDL вхф
 
 
   где вхф - спецификация существующего файла данных.
 
        При выполнении этой команды имя файла FDL будет  иден-
 
   тично имени файла данных. Если имя файла FDL  должно  отли-
 
   чаться от имени файла данных,  то  в  команде  DCL  следует
 
   использовать квалификатор /OUTPUT. По команде, которая при-
 
   водится  в  примере,  сгенерируется  файл  FDL   с   именем
 
   INDEXDEF.FDL по файлу данных CUSTFILE.DAT.
 
        В примере приводится файл FDL, вернее его секции KEY и
 
   ANALYSIS_OF_KEY для индексного файла данных с двумя  ключа-
 
   ми.
 
 
        П р и м е р.
 
 
   INDENT 2-JUN-1987 16:15:35 M32/VOS ANALYZE/RMS_FILE UTILITY
 
   SYSTEM
         SOURGE               M32/VOS
 
   FILE
 
         ALLOCATION           9
         BEST_TRY_CONTIGUOUS  NO
         BUCKET_SIZE          1
         CONTIGUOUS           NO
         EXTENSION            0
         GLOBAL_BUFFER_COUNT  0
 
 
                            - 376 -
 
                         00152-01 92 01
 
 
 
         NAME                 DISK$USERWORK:[WORK.RMS32]
                              CUSDATA.DAT;4
 
         ORGANIZATION         INDEXED
         OWNER                [520,50]
 
         PROTECTION           (SYSTEM:RWED, OWNER:RWED,
                              GROUP:RWED, WORLD:)
 
         READ_CHECK           NO
         WRITE_CHECK          NO
 
   RECORD
 
         BLOCK_SPAN           YES
         CARRIAGE_CONTROL     CARRIAGE-RETURN
         FORMAT               VARIABLE
         SIZE                 0
 
   AREA 0
 
         ALLOCATION           9
         BEST_TRY_CONTIGUоUS  NO
         BUCKET_SIZE          1
         CONTIGUOUS           NO
         EXTENSION            0
 
   KEY 0
 
         CHANGES              NO
         DATA_AREA            0
         DATA_FILL            100
         DUPLICATES           NO
 
         INDEX_AREA           0
         INDEX_FILL           100
         LEVEL1_INDEX_AREA    0
         NULL_KEY             NO
 
         PROLOG               1
         SEG0_LENGTH          6
         SEG0_POSITION        0
         TYPE                 STRING
 
   KEY 1
 
         CHANGES              NO
         DATA_AREA            0
         DATA_FILL            100
         DUPLICATES           YES
 
         IDEX_AREA            0
         INDEX_FILL           100
         LEVEL1_INDEX_AREA    0
         NULL_KEY             NO
 
         SEG0_LENGTH          5
         SEG0_POSITION        68
 
 
                            - 377 -
 
                         00152-01 92 01
 
 
         TYPE                 STRING
 
   ANALYSIS_OF_AREA 0
 
         RECLAIMED_SPACE      0
 
   ANALYSIS_OF_KEY  0
 
         DATA_FILL            50
         DATA_RECORD_COUNT    3
         DATA_SPACE_OCCUPIED  1
         DEPTH                1
 
         INDEX FILL           4
         INDEX_SPACE_OCCUPIED 1
         MEAN_DATA_LENGTH     73
         MEAN_INDEX_LENGTH    9
 
   ANALYSIS_OF_KEY  1
 
         DATA_FILL            14
         DATA_RECORD_COUNT    3
         DATA_SPACE_OCCUPIED  1
         DEPTH                1
 
         DUPLICATES_PER_SIDR  1
         INDEX_FILL           1
         INDEX_SPACE_OCCUPTIED 1
         MEAN_DATA_LENGTH     19
         MEAN_INDEX_LENGTH    8
 
 
        9.3. Оптимизация и повторное  проектирование
 
             характеристик файла
 
 
        Для эффективного  обслуживания  СУД-файлов  необходимо
 
   проводить их переодическую  настройку.  Настройка  включает
 
   установку характеристик данного файла таким образом,  чтобы
 
   данный файл обрабатывался быстрее  и  более  эффективно,  и
 
   затем копирование файла  с сохранением атрибутов для  того,
 
   чтобы зафиксировать эти изменения в структуре файла.
 
        Имеется два основных способа настройки  файлов.  Можно
 
   повторно выполнить проектирование файла FDL для того, чтобы
 
   изменить характеристики или параметры файла  данных.  Можно
 
   также изменить эти характеристики с помощью  интерактивного
 
   режима при помощи редактора FDL или используя редактор опе-
 
 
 
                            - 378 -
 
                         00152-01 92 01
 
 
   рационной системы, например EDT. Используя  описание  файла
 
   на языке FDL можно создать новый файл данных.
 
        Можно  также  оптимизировать  файл  данных,  используя
 
   программу ANALYZE с  квалификатором  /FDL.  Этот  метод,  в
 
   отличии от фактического повторного создания файла FDL  поз-
 
   воляет создать файл, содержащий статистику об использовании
 
   соответствующего файла данных, которую  можно  использовать
 
   для настройки существующего файла данных.
 
        На рис.27  показано,  как  использовать  обслуживающие
 
   программы СУД-32 для того, чтобы выполнить цикл настройки.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
             
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 379 -
 
                         00152-01 92 01
 
 
                     Цикл настройки в СУД-32
 
 
                         -------------------
                        /   Исходный      /
                       / индексный файл  /-------
                      -------------------       !
                               !                !
                               V                !
                       -----------------        !
                       !    ANALYZE    !        !
                       -----------------        !
                               !                !
                               V                !
                          --------------        !
                         /   Файл FDL  /        !
                        / (с секциями /         !
                       /   анализа   /          !
                      ---------------           !
                               !                !
                               V                !
     -------------        ------------          !
    / Исходный  /         ! EDIT/FDL !          !
   / файл FDL  / -------->!          !          !
   ------------           ------------          !
                               !                !
                               V                !
                       ------------------       !
                      /   Измененный    /       !
                     /    файл   FDL   /        !
                    -------------------         !
                               !                !
                               V                !
                         -------------          !
                         !  CONVERT  !<----------
                         -------------
                               !
                               V
                       -------------------
                      / Индексный файл   /
                     /  после настройки /
                    --------------------
 
 
 
                            Рис. 27
 
 
 
 
        9.3.1. Повторное проектирование файла FDL
 
 
        Имеется несколько способов  повторного  проектирования
 
   файла СУД-32, на основе модификации файла FDL, который опи-
 
   сывает соответствующий файл данных. Если необходимо сделать
 
 
 
                            - 380 -
 
                         00152-01 92 01
 
 
   небольшие изменения, то следует использовать  команды  ADD,
 
   DELETE и MODIFY на уровне основного меню редактора FDL (см.
 
   табл.44).
 
                                                   Таблица 44
 
   ----------------------------------------------------------
   Команда !                 Функция
   ----------------------------------------------------------
           !
   ADD     !   Позволяет добавить одну  или  несколько  новых
           ! строк в файл FDL. Когда  команда ADD задается на
           ! уровне основного  меню,  редактор FDL выдает до-
           ! полнительное  меню,  содержащее  все  допустимые
           ! первичные атрибуты.  Редактируемый  FDL-файл  не
           ! обязательно должен содержать все  эти  атрибуты.
           ! можно добавить некоторый новый первичный атрибут
           ! в данный  файл  или добавить некоторый вторичный
           ! атрибут.
           !
           !   Когда вводится первичный атрибут, редактор FDL
           ! выводит  все допустимые атрибуты с их возможными
           ! значениями.  Затем   можно   выбрать   вторичный
           ! атрибут, который  необходимо добавить в файл FDL
           ! и задать требуемое значение вторичного атрибута
           !
   DELETE  !   Позволяет  удалить одну или несколько строк из
           ! файла FDL.  Когда  команда  DELETE  задается  на
           ! уровне  основного  меню,  редактор  FDL   выдает
           ! дополнительное меню, отображающее текущие  аТРИ-
           ! буты файла FDL.
           !
           !   При  выборе  первичного  атрибута,  у которого
           ! следует удалить вторичные атрибуты, редактор FDL
           ! отображает все существующие вторичные атрибуты в
           ! данном файле FDL с их  текущими  значениями. При
           ! выборе вторичного атрибута, редактор FDL удаляет
           ! его  из  данного  файла  FDL. Кроме  того, когда
           ! удаляется последний вторичный  атрибут  конкрет-
           ! ного первичного  атрибута,  редактор FDL удаляет
           ! из файла FDL сам первичный атрибут
           !
   MODIFY  !   Позволяет  изменить  одну  или несколько строк
           ! файла FDL.  Когда  команда  MODIFY  выдается  на
           ! уровне  основного   меню,  редактор  FDL  выдает
           ! дополнительное меню, отображающее  текущие  пер-
           ! вичные атрибуты файла FDL.
           !
           !   Когда вводится первичный атрибут, редактор FDL
           ! отображает  все  существующие вторичные атрибуты
           ! заданного первичного  атрибута,  с  их  текущими
           ! значениями. Затем может  быть  выбран  вторичный
           ! атрибут, значение  которого необходимо изменить,
           ! и задать его новое значение
           !
 
 
 
 
                            - 381 -
 
                         00152-01 92 01
 
 
        Однако, если необходимо сделать существенные изменения
 
   в файле FDL, то следует вызвать сценарий TOUCHUP. Поскольку
 
   последовательные и относительные файлы просты в  проектиро-
 
   вании, то сценарий TOUCHUP работает только с  файлами  FDL,
 
   которые описывают индексные файлы. Если необходимо повторно
 
   выполнить проектирование последовательных  и  относительных
 
   файлов, то можно  использовать  команды,  приведенные  выше
 
   (ADD, DELETE или MODIFY), или следует  снова  пройти  через
 
   начальную фазу  проектирования,  используя  соответствующие
 
   сценарии.
 
        Для  того,  чтобы  полностью  повторно  спроектировать
 
   существующий файл FDL,  который  описывает  индексный  файл
 
   данных, следует задать команду DCL в формате:
 
 
        EDIT/FDL/SCRIPT=TOUCHUP вхф
 
 
   где вхф - спецификация файла FDL.
 
        Следующий за этим сценарий похож на сценарий INDEXED.
 
 
 
        9.3.2. Оптимизация файла данных
 
 
        Можно  оптимизировать  производительность   прикладной
 
   программы, использующей файлы данных СУД-32, в  интерактив-
 
   ном режиме или в пакетном режиме. В любом  случае,  однако,
 
   первый шаг состоит в том, чтобы создать некоторый файл  FDL
 
   по  существующему  файлу  данных,  используя  обслуживающую
 
   программу ANALYZE. В результате ее  выполнения  формируется
 
   файл  FDL,  который  включает  секции  ANALYSIS_OF_AREA   и
 
   ANALYSIS_OF_KEY.
 
        Если затем необходимо  оптимизировать  файл  данных  в
 
   интерактивном режиме при помощи сценария OPTIMIZE, то  сле-
 
 
 
                            - 382 -
 
                         00152-01 92 01
 
 
   дует задать команду DCL в формате:
 
 
        EDIT/FDL/ANALYZE=вхф/SCRIPT=OPTIMIZE выхф
 
 
        Спецификация файла вхф, которая задана в квалификаторе
 
   /ANALYZE, является спецификацией того  файла  FDL,  который
 
   был создан  программой  ANALYZE.  Спецификация  файла  выхф
 
   является спецификацией нового, оптимизированного файла FDL,
 
   который создается заново.
 
        Этот сценарий с данной точки зрения аналогичен  сцена-
 
   рию проектирования индексного, относительного и  последова-
 
   тельного файлов.
 
        Если необходимо оптимизировать существующий файл FDL и
 
   интерактивный режим работы не требуется,  то  можно  задать
 
   команду DCL в формате:
 
 
        EDIT/FDL/ANALYZE=вхф/NOINTERACTIVE выхф
 
 
        Окончательная стадия оптимизации состоит в том,  чтобы
 
   использовать обслуживающую программу CONVERT со старым фай-
 
   лом данных и новым файлом FDL, в результате чего  создается
 
   новый оптимизированный файл данных:
 
 
        CONVERT/FDL=вхф1 вхф2 выхф
 
 
   где вхф1 - спецификация файла FDL;
 
       вхф2 - спецификация "старого" файла данных;
 
       выхф - спецификация "нового" файла данных.
 
        В приложении данного документа описаны алгоритмы опти-
 
   мизации атрибутов проектируемого файла, используемые редак-
 
   тором FDL.
 
 
 
 
 
 
                            - 383 -
 
                         00152-01 92 01
 
 
        9.4. Обеспечение непрерывности файла
 
 
        Если файл данных используется  в  течение  длительного
 
   времени или если он сильно  изменяется,  то  многочисленные
 
   удаления и вставки новых записей могут привести к тому, что
 
   оптимальность файла будет нарушена. Например,  многочислен-
 
   ные расширения файла снижают его производительность,  вызы-
 
   вая операции со сменой окон. В  индексных  файлах  удаления
 
   могут привести к тому, что будут накапливаться  пустые,  но
 
   не используемые бакеты.
 
        Если добавления или вставки записей в файл данных при-
 
   водят к большему числу  расширений,  то  производительность
 
   данного файла также будет снижена. Для того, чтобы улучшить
 
   производительность, можно увеличить размер окна для данного
 
   файла, но это приводит к использованию дорогостоящего  сис-
 
   темного ресурса и, с некоторого момента, может  также  при-
 
   вести к  ухудшению  производительности  системы.  Наилучшим
 
   выходом из  создавшегося  положения,  является  обеспечение
 
   непрерывности файла.
 
        В данном подразделе описана технология "чистки" файла.
 
   Эта технология включает использование  обслуживающих  прог-
 
   рамм COPY, CONVERT и CONVERT/RECLAIM.
 
 
 
        9.4.1. Использование команды COPY языка DCL
 
 
        Можно  использовать  команду  COPY  с   квалификатором
 
   /CONTIGUOUS для того, чтобы скопировать данный файл, созда-
 
   вая его новую непрерывную версию. Квалификатор  /CONTIGUOUS
 
   может быть использован только для выходного файла.
 
        Для того, чтобы использовать команду COPY с квалифика-
 
   тором /CONTIGUOUS, нодо задать команду DCL в формате:
 
 
                            - 384 -
 
                         00152-01 92 01
 
 
        COPY вхф выхф/CONTIGUOUS
 
 
   где вхф  - спецификация входного файла данных;
 
       выхф - спецификация выходного непрерывного файла
 
              данных.
 
        Если  переименование  файла  не  требуется,  то  можно
 
   использовать одну и  ту  же  спецификацию  для  входного  и
 
   выходного файла.
 
        Квалификатор /CONTIGUOUS может  использоваться  только
 
   для копирования файлов на диске. Он не применяется к файлам
 
   на ленте. Подробно команда COPY описана в документе [5].
 
 
 
        9.4.2. Использование  обслуживающей  программы
 
               CONVERT
 
 
        Обслуживающая программа CONVERT  также  может  сделать
 
   файл данных непрерываемым, если непрерывность была установ-
 
   лена соответствующим атрибутом данного файла.
 
        Для обеспечения непрерывности файла при помощи  обслу-
 
   живающей программы CONVERT, следует ввести  команду  DCL  в
 
   формате:
 
 
        CONVERT вхф выхф
 
 
   где вхф  - спецификация входного файла данных;
 
       выхф - спецификация выходного, непрерывного файла
 
              данных.
 
        Если переименование файла не требуется, можно  исполь-
 
   зовать одну и ту  же  спецификацию  файла  для  входного  и
 
   выходного файла.
 
 
 
 
 
 
                            - 385 -
 
                         00152-01 92 01
 
 
        9.4.3. Возврат  назад  бакетов  в   файлах   с
 
               прологом 3
 
 
        Если удалено несколько записей  в  индексном  файле  с
 
   прологом 3, то вполне возможно, что  удалены  все  элементы
 
   данных в некотором конкретном бакете. СУД-32, однако,  пов-
 
   торно использовать такие пустые бакеты для размещения новых
 
   записей, как правило, не может.
 
        Для индексных файлов с  прологом  3  можно  обеспечить
 
   повторное использование таких бакетов, при помощи  обслужи-
 
   вающей программы CONVERT/RECLAIM, не  затрачивая  накладных
 
   расходов, связанных с копированием записей данного файла, с
 
   сохранением его атрибутов.
 
        Когда бакеты данных возвращаются назад,  указатели  на
 
   них в индексных бакетах удаляются. Если в результате  этого
 
   какие-либо индексные бакеты станут пустыми,  то  они  также
 
   возвращаются для повторного использования.
 
        Отметим, что доступ по адресу записи в файле при  этом
 
   сохраняется. Для того, чтобы использовать программу CONVERT
 
   для возврата бакетов следует задать команду DCL:
 
 
        CONVERT/RECLAIM вхф
 
 
   где вхф - спецификация индексного файла с прологом 3.
 
        Следует отметить, что данный файл не может быть открыт
 
   для разделяемого доступа в тот момент, когда задана команда
 
   CONVERT/RECLAIM.
 
 
 
        9.5. Копирование  записей  файла  данных   с
 
             сохранением атрибутов
 
 
 
 
 
                            - 386 -
 
                         00152-01 92 01
 
 
        Использование обслуживающей программы CONVERT является
 
   самым простым способом для копирования записей файла суд  с
 
   сохранением его атрибутов. В дополнение к этому,  программа
 
   CONVERT очищает расщепленные  бакеты  в  индексных  файлах.
 
   Кроме того, поскольку данный файл  полностью  копируется  с
 
   сохранением атрибутов, то бакеты, в  которых  были  удалены
 
   все записи, исчезают. Последняя процедура не  имеет  ничего
 
   общего с возвратом бакетов назад. В результате работы прог-
 
   раммы CONVERT файл данных как бы  создается  заново  и  его
 
   записи получают новые адреса.
 
        Для того , чтобы использовать обслуживающую  программу
 
   CONVERT для копирования записей  файла  с  сохранением  его
 
   атрибутов, следует ввести команду DCL в формате:
 
 
        CONVERT вхф выхф
 
 
   где вхф  - спецификация входного существующего файла суд;
 
       выхф - спецификация выходного нового файла суд.
 
 
 
        9.6. Создание архивных копий
 
 
        В целях сохранности файлов рекомендуется  создание  их
 
   архивных копий. С этих копий возможно  восстановление  фай-
 
   лов, если это необходимо,  например,  в  случае  разрушения
 
   оригиналов.
 
        Создание дублирующих копий файлов и каталогов, а также
 
   их восстановление обеспечивается программой МОС ВП  BACKUP.
 
   Дублирующие копии  организуются  в  так  называемые  наборы
 
   BACKUP, которые могут рассполагаться на диске или  на  маг-
 
   нитной ленте. Наборы организованы  на  носителе  в  формате
 
   BACKUP и доступны для обработки только этой программе.
 
 
 
                            - 387 -
 
                         00152-01 92 01
 
 
        В отличие от команды COPY языка DCL,  которая  создает
 
   новые копии файла с корректировкой их некоторых  атрибутов,
 
   например, даты ревизии, кодов защиты по  умолчанию  и  т.д.
 
   Программа BACKUP создает копии, которые полностью идентичны
 
   своим оригиналам.
 
        Для вызова BACKUP с целью  создания  архивного  набора
 
   для файла следует ввести команду DCL в формате:
 
 
        BACKUP вхф выхф [/SAVE_SET]
 
 
   где вхф  - спецификация входного файла - оригинала;
 
       выхф - спецификация выходного архивного набора BACKUP.
 
        Использовать квалификатор /SAVE_SET следует  только  в
              
   том случае, если выходной файл будет дублироваться на  дис-
 
   ке. Этот квалификатор можно опустить для магнитной ленты.
 
        Для получения дополнительной  информации  о  программе
 
   BACKUP следует обратиться к документу [10].
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 388 -
 
                         00152-01 92 01
 
 
                                                  Приложение 
 
 
 
 
 
 
 
 
 
 
 
          1. АЛГОРИТМЫ ОПТИМИЗАЦИИ РЕДАКТОРА ЯЗЫКА FDL
 
 
 
        В этом приложении приводятся  алгоритмы,  используемые
 
   обслуживающей программой EDIT/FDL для того, чтобы оптимизи-
 
   ровать значение атрибутов этого файла.
 
 
 
        1.1. Определение размера файла
 
 
        Для последовательных файлов с пересечением границ бло-
 
   ков редактор FDL распределяет достаточное число блоков  для
 
   того, чтобы разместить заданное число записей среднего раз-
 
   мера. Если пересечение границ блоков не разрешено, то  учи-
 
   тывается потенциальное неиспользуемое пространство в  конце
 
   каждого блока.
 
        Для  относительных  файлов  редактор  FDL  высчитывает
 
   общее число бакетов и затем распределяет достаточное  коли-
 
   чество для того, чтобы разместить требуемое число бакетов.
 
        Для индексных файлов распределение высчитывается после
 
   того, как сделано вычисление  глубины  индексных  ступеней,
 
   так что известны и действительный  размер  бакета  и  число
 
   бакетов на каждом уровне индекса. Редактор FDL распределяет
 
   достаточное число блоков для того, чтобы разместить требуе-
 
   мое число бакетов. Области уровня данных (уровень 0)  расп-
 
   ределяются раздельно от областей индексных уровней по  каж-
 
 
 
                            - 389 -
 
                         00152-01 92 01
 
 
   дому ключу.
 
        Во всех случаях количество блоков округляется и стано-
 
   вится кратным размеру бакета.
 
 
 
        1.2. Размер расширения
 
 
        Для всех типов организации файла редактор FDL устанав-
 
   ливает размер расширения равным одной десятой общего разме-
 
   ра файла.
 
 
 
        1.3. Размер бакета
 
 
        Для относительных  файлов  вычисление  размера  бакета
 
   зависит от  предполагаемого  использования  данного  файла.
 
   Если при работе редактору FDL указано, что  при  последова-
 
   тельных обращениях к файлу, осуществляется доступ к смежным
 
   записям, то размер бакета должен быть  достаточно  большим,
 
   чтобы вместить 16 записей. Во всех  других  случаях  размер
 
   бакета будет выбран таким, чтобы вместить 4 записи.  Макси-
 
   мальный размер бакета составляет 63 блока.
 
        Для индексных файлов редактор FDL оставляет за пользо-
 
   вателем окончательное решение относительно  выбора  размера
 
   бакета для заданного индекса. Для уровней данных и  индекса
 
   будут задаваться одни и те же размеры бакета. Можно исполь-
 
   зовать команду MODIFY для того, чтобы изменить  эти  значе-
 
   ния.
 
        Редактор FDL высчитывает размер бакета  по  умолчанию,
 
   находя сначала наиболее общую глубину индекса,  порожденную
 
   различными размерами бакетов. Если указано, что  необходимо
 
   иметь бакеты меньшего размера, а не меньшее число  уровней,
 
   то этот фактор принимается во внимание и размер  бакета  по
 
 
                            - 390 -
 
                         00152-01 92 01
 
 
   умолчанию становится наименьшим размером, который порождает
 
   наиболее общую глубину.  На  поверхностных  графиках  можно
 
   найти эти значения на самой левой границе  каждого  размера
 
   бакета.
 
 
 
        П р и м е ч а н и е. Если  задается  отдельный  размер
 
   бакета для индексного уровня 1, то этот размер должен соот-
 
   ветствовать размеру бакета,  приписанному  остальной  части
 
   индекса.
 
        Размер бакета в операционной системе МОС  ВП  является
 
   кратным  размеру  кластера  на  диске.  Первичный   атрибут
 
   ANALYSIS_OF_KEY программы ANALYZE имеет вторичный  атрибут,
 
   называемый LEVEL1_RECORD_COUNT. Этот  атрибут  представляет
 
   уровень индекса непосредственно  над  данными.  Это  делает
 
   алгоритм настройки более точным, когда  задаются  повторяю-
 
   щиеся значения ключа.
 
 
 
        1.4. Глобальные буферы
 
 
        Число  глобальных  буферов  является  числом   буферов
 
   ввода-вывода, к которым могут осуществлять доступ  два  или
 
   более процесса. В операционной системе  МОС  ВП  кэшируется
 
   или "отображается" весь индекс ключа 0 (по крайней мере  до
 
   некоторой точки) в память для более быстрого и более эффек-
 
   тивного доступа.
 
 
 
        1.5. Глубина индекса
 
 
        Подпрограммы проектирования индекса моделируют загруз-
 
   ку бакетов данных записями на основе данных пользователя  о
 
   размерах ключей, положении ключей, размерах записей  (сред-
 
 
                            - 391 -
 
                         00152-01 92 01
 
 
   ней и максимальной), значений  сжатия,  метода  загрузки  и
 
   коэффицентов его заполнения.
 
        Когда найдено число требуемых бакетов данных, то может
 
   быть определено действительное  число  записей  индекса  на
 
   следующем, более высоком уровне (каждая из  которых  указы-
 
   вает на некоторый бакет данных). Данный процесс повторяется
 
   до тех пор, пока  требуемые  записи  индекса  на  некотором
 
   уровне не смогут разместиться в  одном  бакете,  являющимся
 
   корневым. Допускается максимум 32 уровня. Если  это  число
 
   уровней превышается, то редактор FDL  выдает  сообщение  об
 
   ошибке.
 
        Для линейного  графика  вычисления  по  проектированию
 
   выполняются до 63 раз - один раз  для  каждого  допустимого
 
   размера бакета. Для  поверхностного  графика  каждая  линия
 
   графика эквивалентна некоторому линейному графику с различ-
 
   ным значением по оси Y.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 392 -
 
                         00152-01 92 01
 
 
                  ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ
 
 
 
   1. Операционная  система  МОС  ВП.  Подсистема  системного
 
      программиста. Программа генерации системы.  Руководство
 
      пользователя 00152-01 92 07
 
   2. Операционная система МОС ВП. Система управления данными
 
      СУД-32. Программирование на языке МАКРОАССЕМБЛЕР. Руко-
 
      водство программиста 00152-01 33 07
 
   3. Операционная система МОС ВП. Система управления данными
 
      СУД-32.  Обслуживающие  программы. Руководство  пользо-
 
      вателя 00152-01 92 02
 
   4. Операционная  система  МОС ВП.  Подсистема  управления.
 
      Права  доступа.  Руководство  программиста
 
      00152-01 33 01
 
   5. Операционная  система  МОС ВП.  Подсистема  управления.
 
      Диалоговый командный язык. Руководство пользователя
 
      00152-01 92 19
 
   6. Операционная система МОС ВП. Подсистема  исполнительной
 
      библиотеки. Программы исполнительной библиотеки.  Руко-
 
      водство программиста 00152-01 33 09
 
   7. Операционная система МОС ВП.  Система  программирования
 
      на языке МАКРОАССЕМБЛЕР. Описание языка
 
      00152-01 35 01
 
   8. Операционная  система  МОС ВП.   Подсистема  системного
 
      программиста. Управление системой. Справочный  материал
 
      00152-01 97 10
 
   9. Операционная  система  МОС ВП.  Подсистема   системного
 
      сервиса.  Управление  вводом-выводом. Руководство прог-
 
      раммиста 00152-01 33 03
 
   10.  Операционная система  МОС  ВП.  Подсистема системного
 
 
                            - 393 -
 
                         00152-01 92 01
 
 
        Сервиса. Системные соглашения. Справочный материал
 
        00152-01 97 05
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                                                   
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!