






      Mинистерство приборостроения, средств автоматизации

                      и систем управления


                  OПЕРАЦИОННАЯ СИСТЕМА МОС ВП


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

               Программы системного обслуживания

   		      Справочный материал

                       Лист утверждения

                    2б.00152-01 97 06-ЛУ

                    Представители предприятия-разработчика

                           Руководитель темы
                           Зам.директора

                           _______________ ХРУЩЕВ С.Н.
                           "___"__________ 1987 г.

                           Ответственный исполнитель темы
                           Зав. отделением

                           _______________ ОСТАПЕНКО Г.П.
                           "___"__________ 1987 г.

                           Зав. лабораторией

                           _______________ АКСЕНОВ А.В.
                           "___"__________ 1987 г.

                           М.н.с.

                           _______________ ПЕРОВ Г.П.
                           "___"__________ 1987 г.

                           Техник

                           _______________ СМИРНОВА Т.И.
                           "___"__________ 1987 г.

                           Нормоконтролер

                           --------------- СКВОРЦОВ В.А.
                           "___"__________ 1987 г.

                          1987
  Перв.примен.                                        Литера
  2б.00152-01


















  Утвержден


  2б.00152-01 97 06-ЛУ







                  ОПЕРАЦИОННАЯ СИСТЕМА МОС ВП



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



               Программы системного обслуживания

                      Справочный материал







                        00152-01 97 06

                          Листов 1188














                             1987

 Перв.примен.

  2б.00152-01                                        Литера










  Утвержден


  2б.00152-01 97 06-ЛУ








                  ОПЕРАЦИОННАЯ СИСТЕМА МОС ВП

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

               Программы системного обслуживания


                      Справочный материал

		      2б.00152-01 97 06


                        Листов 1195/5К









 
















                             1987

 Перв.примен.

 2б.00152-01                                        Литера 






                            - 2 -

                        00152-01 97 06






                           АННОТАЦИЯ




       Настоящий документ предназначен для программистов раз-

  рабатывающих программы на языках программирования  МАКРОАС-

  СЕМБЛЕР, БЕЙСИК, КОБОЛ, ФОРТРАН, ПАСКАЛЬ (в дальнейшем язы-

  ках МАКРОАССЕМБЛЕР, БЕЙСИК, КОБОЛ, ФОРТРАН, ПАСКАЛЬ).

       В документе представлена информация о работе и исполь-

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

       В разделе 1 приведены общие сведения о программах сис-

  темного обслуживания.

       В разделе 2 описаны форматы вызовов программ системно-

  го обслуживания.

       В разделе 3 приведена информация о программах  систем-

  ного обслуживания по обеспечению защиты.

       В разделе 4 приведена информация о служебных  програм-

  мах обслуживания флагов событий.

       В разделе 5 приведена информация о служебных  програм-

  мах обработки асинхронных системных прерываний.

       В разделе 6 приведена информация о служебных  програм-

  мах обслуживания логических имен.

       В разделе 7 приведена информация о служебных  програм-

  мах обслуживания ввода-вывода.

       В разделе 8 приведена информация о программах  систем-

  ного обслуживания управления процессами.





                            - 3 -

                        00152-01 97 06


       В разделе 9 приведена информация о программах  систем-

  ного обслуживания таймера и преобразования времени.

       В разделе 10 приведена информация о служебных програм-

  мах обработки кода состояния.

       В разделе 11 приведена информация о программах систем-

  ного обслуживания управления памятью.

       В разделе 12 приведена информация о программах систем-

  ного обслуживания управления захватом.

       В разделе 13 описаны все программы системного обслужи-

  вания.






































                            - 4 -

                        00152-01 97 06






                          СОДЕРЖАНИЕ





  1.  Введение в программы системного обслуживания         23


  1.1.    Формат    документирования     программ

          системного обслуживания                          28

  1.1.1.    Заголовок "формат"                             30

  1.1.2.    Заголовок "аргументы"                          34

  1.1.2.1.  Элемент "использование  в  операционной

            системе МОС ВП"                                34

  1.1.2.2.  Элемент "тип"                                  61

  1.1.2.3.  Элемент "доступ"                               64

  1.1.2.4.  Элемент "механизм"                             65

  1.1.2.5.  Элемент "пояснительный текст"                  68

  1.1.3.    Заголовок "возвращаемые значения  кодов

            состояния"                                     69

  1.1.4.    Заголовок  "значения  кодов  состояния,

            возвращаемые    в    блок     состояния

            ввода-вывода"                                  70


  2.  Вызов программ системного обслуживания               72


  2.1.    Программы  системного  обслуживания   и

          целостность системы                              73

  2.1.1.    Привилегии пользователей                       74

  2.1.2.    Квоты ресурсов                                 75



                            - 5 -

                        00152-01 97 06


  2.1.3.    Режим доступа                                  76

  2.2.    Задание   аргументов    для    программ

          системного обслуживания                          78

  2.3.    Получение  значений  для  символических

          кодов                                            80

  2.4.    Вызов программ системного  обслуживания

          из программ на языке макроассемблер              82

  2.4.1.    Использование      макрокоманд      для

            формирования списков аргументов                84

  2.4.1.1.  Соглашения  о  спецификации  аргументов

            для программ системного обслуживания           87

  2.4.1.2.  Определение  символических   имен   для

            смещений в списке  аргументов:  $имя  и

            $имяDEF                                        87

  2.4.2.    Использование  макрокоманд  для  вызова

            программ системного обслуживания               90

  2.4.2.1.  Макрокоманда $имя_S                            91

  2.4.2.2.  Макрокоманда $имя_G                            92

  2.5.    Завершение     программ      системного

          обслуживания                                     94

  2.5.1.    Синхронные  и   асинхронные   программы

            системного обслуживания                        95

  2.5.2.    Режим выполнения процессов                     97

  2.5.2.1.  Режим ожидания ресурса                         98

  2.5.2.2.  Режим исключительной ситуации по ошибке

            программы системного обслуживания              99

  2.6.    Значения кодов состояния,  возвращаемых




                            - 6 -

                        00152-01 97 06


          из программ системного обслуживания             101

  2.6.1.    Информация,   содержащаяся   в    кодах

            состояний                                     103

  2.6.2.    Проверка возвращаемых кодов состояний         104

  2.6.3.    Системные    сообщения,    генерируемые

            кодами состояния                              105

  2.7.    Вызовы программ системного обслуживания

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

          уровня                                          107

  2.7.1.    Проверка  значений  возвращаемых  кодов

            состояния  в  языках   программирования

            высокого уровня                               109


  3.  Программы системного обслуживания обеспечения защиты112


  3.1.    Обзор схемы защиты операционной системы

          МОС ВП                                          114

  3.2.    Идентификаторы                                  116

  3.2.1.    Форматы идентификаторов                       116

  3.2.2.    Имена идентификаторов                         117

  3.2.3.    Идентификаторы,            определенные

            операционной системой МОС ВП                  118

  3.2.4.    Общие идентификаторы                          119

  3.2.5.    Атрибуты идентификаторов                      120

  3.3.    Базы данных прав                                121

  3.3.1.    Инициализация базы данных прав                122

  3.3.2.    Использование    программ    системного

            обслуживания для работы с базой  данных




                            - 7 -

                        00152-01 97 06


            прав                                          124

  3.3.2.1.  Трансляция   имен   идентификаторов   и

            двоичных значений                             127

  3.3.2.2.  Добавление идентификаторов и держателей

            в базу данных прав                            128

  3.3.2.3.  Определение держателей идентификаторов        130

  3.3.2.4.  Определение                удерживаемых

            идентификаторов                               131

  3.3.2.5.  Модификация записи идентификатора             131

  3.3.2.6.  Модификация записи держателя                  132

  3.3.2.7.  Удаление идентификаторов  и  держателей

            из базы данных прав                           133

  3.3.3.    Операции поиска                               134

  3.4.    Создание,  трансляция  и  сопровождение

          элементов ACE                                   135

  3.4.1.    Формат элементов ACE                          136

  3.4.1.1.  Сигнальный элемент ACE                        137

  3.4.1.2.  Элемент ACE пользователя                      140

  3.4.1.3.  Элемент ACE защиты по умолчанию               143

  3.4.1.4.  Элемент ACE идентификатора                    146

  3.4.2.    Трансляция элементов ACE                      150

  3.4.3.    Создание и обслуживание элементов ACE         152

  3.5.    Модификация списка прав                         158

  3.6.    Контроль защиты доступа                         159

  3.7.    Дополнительные   программы   системного

          обеспечения защиты                              160


  4.  Программы обслуживания флагов событий               161



                            - 8 -

                        00152-01 97 06


  4.1.    Номера флагов событий и кластеры флагов

          событий                                         162

  4.1.1.    Спецификация номеров флагов  событий  и

            кластеров флагов событий                      164

  4.2.    Ожидания флагов событий                         166

  4.3.    Установка и сброс флагов событий                168

  4.4.    Кластеры общих флагов событий                   169

  4.5.    Отсоединение и удаление кластеров общих

          флагов событий                                  171

  4.6.    Кластеры   общих   флагов   событий   в

          разделяемой памяти                              172

  4.6.1.    Имя кластера                                  172


  5.  Служебные программы AST                             177


  5.1.    Режим доступа для выполнения AST                180

  5.2.    Прерывания  AST  и  состояния  ожидания

          процессов                                       180

  5.2.1.    Ожидание флагов событий                       181

  5.2.2.    Спячка                                        181

  5.2.3.    Ожидание ресурсов и страничные отказы         181

  5.3.    Об'явление прерываний AST                       182

  5.4.    Подпрограммы обслуживания AST                   182

  5.5.    Доставка AST                                    185


  6.  Программы обслуживания логических имен              188


  6.1.    Концепции логических имен                       188

  6.1.1.    Логические имена и эквивалентные имена        189




                            - 9 -

                        00152-01 97 06


  6.1.2.    Таблицы логических имен                       190

  6.1.2.1.  Каталоги таблиц логических имен               191

  6.1.2.2.  Таблицы логических  имен,  принятых  по

            умолчанию                                     192

  6.1.2.3.  Таблицы логических  имен,  определенные

            пользователем                                 198

  6.1.3.    Привилегии                                    199

  6.1.5.    Квоты таблиц логических имен                  203

  6.1.5.1.  Квоты каталогов таблиц                        204

  6.1.5.2.  Квоты    таблиц    логических     имен,

            принимаемых по умолчанию                      204

  6.1.5.3.  Квоты таблиц логических имен,  заданных

            пользователем                                 205

  6.1.6.    Соглашения о форматах логических имен и

            эквивалентных имен                            206

  6.1.7.    Спецификация поискового  списка  таблиц

            логических имен                               208

  6.2.    Создание логических имен - $CRELNM              211

  6.2.1.    Дублирование логических имен                  212

  6.2.1.1.  Замена логических имен                        216

  6.3.    Создание  таблиц  логических   имен   -

          $CRELNT                                         216

  6.3.1.    Разделяемые таблицы логических имен           216

  6.3.2.    Вызов программы системного обслуживания

            $CRELNT                                       217

  6.4.    Удаление логических имен - $DELLNM              218

  6.5.    Трансляция логических имен - $TRNLNM            219




                           - 10 -

                        00152-01 97 06


  7.  Программы обслуживания ввода-вывода                 224


  7.1.    Назначение каналов                              226

  7.2.    Постановка  в   очередь   запросов   на

          ввод-вывод                                      227

  7.3.    Синхронизация   завершения    служебной

          программы                                       228

  7.3.1.    Рекомендуемый   метод   для    проверки

            асинхронного завершения                       233

  7.4.    Синхронные формы программ  обслуживания

          ввода-вывода                                    235

  7.6.    Освобождение каналов ввода-вывода               238

  7.7.    Отмена запросов на ввод-вывод                   242

  7.8.    Распределение устройств                         243

  7.8.1.    Неявное распределение                         246

  7.8.2.    Освобождение устройства                       247

  7.9.    Монтирование и демонтирование томов             247

  7.9.1.    Вызов программы системного обслуживания

            $MOUNT                                        248

  7.9.2.    Вызов программы системного обслуживания

            $DISMOU                                       251

  7.10.   Логические  имена  и  имена  физических

          устройств                                       252

  7.10.1.   Имена устройств, принятые по умолчанию        254

  7.11.   Получение   информации   о   физических

          устройствах                                     255

  7.12.   Форматирование выходных строк                   257

  7.13.   Почтовые ящики                                  259



                           - 11 -

                        00152-01 97 06


  7.13.1.   Формат почтового ящика                        265

  7.13.2.   Системные почтовые ящики                      269

  7.13.3.   Почтовые   ящики   для   сообщений    о

            завершении процессов                          271

  7.13.4.   Почтовые ящики для системных процессов        271


  8.  Служебные программы управления процессом            272


  8.1.    Подпроцессы и отсоединенные процессы            273

  8.2.    Контекст выполнения процесса                    274

  8.3.    Создание процесса                               275

  8.3.1.    Определение  выполняемого  образа   для

            подпроцесса                                   275

  8.3.2.    Входные,  выходные  и   диагностические

            устройства для подпроцессов                   276

  8.3.3.    Принимаемые по умолчанию диск и каталог

            для создаваемых процессов                     281

  8.3.4.    Управление    ресурсами     создаваемых

            процессов                                     283

  8.3.5.    Отсоединенные процессы                        285

  8.4.    Межпроцессорные связи и управление              286

  8.4.1.    Ограничения на  создание  и  управление

            процессом                                     286

  8.4.2.    Идентификация процесса                        287

  8.4.2.1.  Присвоение имен процессам внутри групп        291

  8.4.2.2.  Получение информации о процессах              292

  8.4.2.3.  Средства межпроцессной связи                  292

  8.5.    Спячка и приостанов процесса                    295




                           - 12 -

                        00152-01 97 06


  8.5.1.    Спячка процесса                               297

  8.5.2.    Альтернативные средства спячки                299

  8.5.3.    Приостановка                                  300

  8.6.    Завершение выполнения образа                    301

  8.6.1.    Действия по свертыванию образа                302

  8.6.2.    Программа системного обслуживания $EXIT       303

  8.6.3.    Обработчики выхода                            304

  8.6.4.    Принудительный выход                          306

  8.7.    Удаление процесса                               308

  8.7.1.    Программа    системного    обслуживания

            $DELPRC                                       310

  8.7.2.    Почтовые ящики завершения                     311


  9.  Служебные программы таймера и преобразования времени312


  9.1.    Формат системного времени                       314

  9.2.    Получение текущей даты и времени                314

  9.3.    Получение   абсолютного    времени    в

          системном формате                               316

  9.4.    Получение  дельта-времени  в  системном

          формате                                         317

  9.5.    Запросы к таймеру                               319

  9.5.1.    Отмена запросов к таймеру                     324

  9.6.    Запланированные пробуждения от спячки           324

  9.6.1.    Отмена запланированных пробуждений            326

  9.7.    Числовое время и время в коде КОИ-8             327

  9.8.    Установка системного времени                    328


  10. Служебные программы обработки кода состояния        330



                           - 13 -

                        00152-01 97 06


  10.1.   Типы исключительных ситуаций                    331

  10.1.1.   Программа обработки изменения режима  и

            режима совместимости                          342

  10.2.   Задание обработчиков кода состояния             342

  10.3.   Диспетчер исключительных ситуаций               344

  10.4.   Список     аргументов,     передаваемых

          обработчику кода состояния                      347

  10.4.1.   Аргументы сигнального массива                 348

  10.4.2.   Аргументы массива механизма                   349

  10.5.   Возможные  действия  обработчика   кода

          состояния                                       351

  10.5.1.   Развертывание стека вызовов                   356

  10.6.   Множественные исключительные ситуации           360


  11. Служебные программы управления памятью              362


  11.1.   Виртуальное адресное пространство               363

  11.2.   Увеличение  и  уменьшение  виртуального

          адресного пространства                          365

  11.2.1.   Массивы  входных  адресов   и   массивы

            возвращаемых адресов                          369

  11.3.   Владение страницами и защита страниц            371

  11.4.   Обмен страниц рабочего набора                   372

  11.5.   Обмен процессов                                 374

  11.6.   Секции                                          376

  11.6.1.   Создание секций                               378

  11.6.2.   Открытие дискового файла                      378

  11.6.3.   Определение частей секции                     380




                           - 14 -

                        00152-01 97 06


  11.6.4.   Определение характеристик секции              381

  11.6.5.   Определение  характеристик   глобальной

            секции                                        383

  11.6.5.1. Имя глобальной секции                         384

  11.6.6.   Отображение секций                            388

  11.6.7.   Отображение глобальных секций                 392

  11.6.8.   Глобальные секции файла страниц               393

  11.6.9.   Страничный обмен секций                       394

  11.6.10.  Секции чтения и записи данных                 398

  11.6.11.  Освобождение и удаление секций                399

  11.6.12.  Перезапись секций                             400

  11.6.13.  Секции образов                                401

  11.6.14.  Секции физических страниц                     401


  12. Служебные программы управления захватом ресурсов    403


  12.1.   Концепции ресурсов и захватов                   404

  12.1.1.   Иерархичность захватов                        405

  12.1.2.   Имена ресурсов                                406

  12.1.3.   Выбор режима захвата                          408

  12.1.4.   Уровни захвата и совместимость                409

  12.1.5.   Очереди управления захватом                   411
                                                          
  12.1.6.   Концепции преобразования захвата              412

  12.1.7.   Обнаружение "мертвого захвата"                413

  12.2.   Постановка в очередь  простых  запросов

          на захват                                       415

  12.3.   Синхронизация захватов                          416

  12.3.1.   Извещение о синхронизации выполнения          417




                           - 15 -

                        00152-01 97 06


  12.3.2.   Блок состояния захвата                        418

  12.3.3.   AST по захвату                                418

  12.3.4.   Преобразование захвата                        419

  12.3.4.1. Постановка  в   очередь   запросов   на

            преобразование захвата                        421

  12.3.5.   Порождающие захваты                           422

  12.3.6.   Блоки значений захватов                       423

  12.4.   Удаление запросов на захват из очереди          426

  12.5.   Кэширование   локального   буфера   при

          помощи программ управления захватом             428

  12.5.1.   Использование блока значений захвата          429

  12.5.2.   Использование AST по захвату                  430

  12.5.2.1. Отложенная запись буфера                      431

  12.5.2.2. Кэширование буфера                            431

  12.5.3.   Выбор способа кэширования буферов             432


  13. Описание программ системного обслуживания           436


  13.1.   $ADD_HOLDER - добавить запись держателя

          прав в базу данных прав                         436

  13.2.   $ADD_IDENT - добавить  идентификатор  в

          базу данных прав                                439

  13.3.   $ADJSTK  -  выравнять  указатель  стека

          внешнего режима                                 443

  13.4.   $ADJWSL  -  изменить   лимит   рабочего

          набора                                          446

  13.5.   $ALLOC - распределить устройство                448

  13.6.   $ASCEFC -  подсоединить  кластер  общих




                           - 16 -

                        00152-01 97 06


          флагов событий                                  453

  13.7.   $ASCTIM  -   преобразовать   время   из

          системного  формата  в  строку  в  коде

          КОИ-8                                           459

  13.8.   $ASCTOID    -     транслировать     имя

          идентификатора в идентификатор                  463

  13.9.   $ASSIGN - назначить канал ввода-вывода          466

  13.10.  $BINTIM - преобразовать строку  в  коде

          КОИ-8 в двоичное значение времени               473

  13.11.  $BRKTHRU- разослать сообщение                   477

  13.12.  $BRKTHRUW - разослать сообщение и ждать         493

  13.13.  $CANCEL - отменить ввод-вывод в канале          494

  13.14.  $CANEXH - отменить обработчик выхода            497

  13.15.  $CANTIM - отменить запрос к таймеру             498

  13.16.  $CANWAK - отменить пробуждение                  500

  13.17.  $CHANGE_ACL    -    изменить     список

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

  13.18.  $CHKPRO - проверить защиту доступа              511

  13.19.  $CLREF - сбросить флаг события                  521

  13.20.  $CMEXEC  -  изменить  режим  на   режим

          управления                                      522

  13.21.  $CMKRNL - изменить режим на режим ядра          525

  13.22.  $CNTREG - уменьшить  область  программы

          или область управления                          527

  13.23.  $CRELNM - создать логическое имя                530

  13.24.  $CRELNT -  создать  таблицу  логических

          имен                                            540
                                                           



                           - 17 -

                        00152-01 97 06


  13.25.  $CREMBX  -  создать  почтовый  ящик   и

          назначить канал                                 552

  13.26.  $CREPRC - создать процесс                       562

  13.27.  $CREATE_RDB - создать базу данных прав          591

  13.28.  $CRETVA - создать виртуальное  адресное

          пространство                                    593

  13.29.  $CRMPSC - создать и отобразить секцию           597

  13.30.  $DACEFC  -  отсоединить  кластер  общих

          флагов событий                                  616

  13.31.  $DALLOC - освободить устройство                 617

  13.32.  SS$DASSGN    -     освободить     канал

          ввода-вывода                                    621

  13.33.  $DCLAST - об'явить AST                          622

  13.34.  $DCLCMH - об'явить обработчик изменения

          режима или режима совместимости                 624

  13.35.  $DCLEXH - об'явить обработчик выхода            627

  13.36.  $DELLNM - удалить логическое имя                629

  13.37.  $DELMBX - удалить почтовый ящик                 634

  13.38.  $DELPRC - удалить процесс                       636

  13.39.  $DELTVA - удалить виртуальное  адресное

          пространство                                    639

  13.40.  $DEQ - удалить  из  очереди  запрос  на

          захват                                          642

  13.41.  $DGBLSC - удалить глобальную секцию             648

  13.42.  $DISMOU - демонтировать том                     654

  13.43.  $DLCEFC - удалить кластер общих  флагов

          событий                                         659




                           - 18 -

                        00152-01 97 06


  13.44.  $ENQ - поставить в  очередь  запрос  на

          захват                                          661

  13.45.  $ENQW - поставить в очередь  запрос  на

          захват и ждать                                  680

  13.46.  $ERAPAT  -  получить  шаблон   стирания

          секретных данных                                681

  13.47.  $EXIT - выход                                   685

  13.48.  $EXPREG - расширить  область  программы

          или область управления                          686

  13.49.  $FAO - форматировать вход                       690

  13.50.  $FILESCAN  -  просмотреть  спецификацию

          файла                                           704

  13.51.  $FIND_HELD  -   найти   идентификаторы,

          удерживаемые пользователем                      711

  13.52.  $FIND_HOLDER    -    найти    дрежателя

          идентификатора                                  715

  13.53.  $FINISH_RDB - завершить  контекст  базы

          данных прав                                     719

  13.54.  $FORCEX - принудительный выход                  720

  13.55.  $FORMAT_ACL  -  форматировать   элемент

          списка управления доступом                      724

  13.56.  $GETDVI  -   получить   информацию   об

          устройстве/томе                                 740

  13.57.  $GETDVIW  -  получить   информацию   об          

          устройстве/томе и ждать                         764

  13.58.  $GETJPI - получить информацию о задании

          или процессе                                    765




                           - 19 -

                        00152-01 97 06


  13.59.  $GETJPIW  -   получить   информацию   о

          задании или процессе и ждать                    794

  13.60.  $GETLKI - получить информацию о захвате         795

  13.61.  $GETLKIW  -   получить   информацию   о

          захвате и ждать                                 813

  13.62.  $GETMSG - получить сообщение                    813

  13.63.  $GETQUI  -   получить   информацию   об

          очереди                                         820

  13.64.  $GETQUIW  -  получить   информацию   об

          очереди и ждать завершения                      877

  13.65.  $GETSYI - получить информацию о системе         878

  13.66.  $GETSYIW  -   получить   информацию   о

          системе и ждать                                 888

  13.67.  $GETTIM - получить время                        889

  13.68.  $GRANTID  -   назначить   идентификатор

          процессу                                        890

  13.69.  $HIBER - перевести в состояние спячки           897

  13.70.  $IDTOASC - транслировать  идентификатор

          в имя идентификатора                            898

  13.71.  $LCKPAG  -  зафиксировать  страницы   в

          памяти                                          903

  13.72.  $LKWSET  -   фиксировать   страницы   в

          рабочем наборе                                  906

  13.73.  $MGBLSC - отобразить глобальную секцию          910

  13.74.  $MOD_HOLDER  -  модифицировать   запись

          держателя в базе данных прав                    918

  13.75.  $MOD_IDENT модифицировать идентификатор




                           - 20 -

                        00152-01 97 06


          в базе данных прав                              922

  13.76.  $MOUNT - монтировать том                        926

  13.77.  $MTACCESS - доступность магнитной ленты         943

  13.78.  $NUMTIM - преобразовать двоичное  время

          в цифровое                                      947

  13.79.  $PARSE_ALL -  проанализировать  элемент

          списка управления доступом                      949

  13.80.  $PURGWS - очистить рабочий набор                952

  13.81.  $PUTMSG - вывести сообщение                     954

  13.82.  $QIO - поставить в  очередь  запрос  на

          ввод-вывод                                      964

  13.83.  $QIOW - поставить в очередь  запрос  на

          ввод-вывод и ждать                              975

  13.84.  $READEF - читать флаги событий                  976

  13.85.  $REM_HOLDER - удалить запись  держателя

          из базы данных прав                             977

  13.86.  $REM_IDENT - удалить  идентификатор  из

          базы данных прав                                980

  13.87.  $RESUME - возобновить процесс                   982

  13.88.  $REVOKID - исключить  идентификатор  из

          процесса                                        984

  13.89.  $SCHDWK - запланировать пробуждение             991

  13.90.  $SETAST - установить AST                        996

  13.91.  $SETEF - установить флаг события                997

  13.92.  $SETEXV     -     установить     вектор

          исключительной ситуации                         999

  13.93.  $SETIME - установить системное время           1000




                           - 21 -

                        00152-01 97 06


  13.94.  $SETIMR - установить таймер                    1000

  13.95.  $SETPRA - установить AST восстановления

          питания                                        1000

  13.96.  $SETPRI - установить приоритет                 1001

  13.97.  $SETPRN - установить имя процесса              1001

  13.98.  $SETPRT - установить защиту страниц            1001

  13.99.  $SETPRV - установить привилегии                1002

  13.100. $SETRWM  -  установить  режим  ожидания

          ресурса                                        1002

  13.101. $SETSFM     -     установить      режим

          исключительной   ситуации   по   ошибке

          программы системного обслуживания              1003

  13.102. $SETSSF -  установить  фильтр  программ

          системмого обслуживания                        1003

  13.103. $SETSTK - установить границы стека             1003

  13.104. $SETSWM  -  установить   режим   обмена

          процесса                                       1003

  13.105. $SNDERR - послать  сообщение  в  журнал

          регистрации ошибок                             1003

  13.106. $SNDJBC - сообщить диспетчеру заданий          1004

  13.107. $SNDJBCW - сообщить диспетчеру  заданий

          и ждать завершения                             1012

  13.108. $SNDOPR - послать сообщение оператору          1012

  13.109. SUSPND - приостановить процесс                 1014

  13.110. $SYNCH - синхронизировать                      1014

  13.111. $TRNLNM - транслировать логическое имя         1015

  13.112. $ULKPAG - освободить страницы в памяти         1016




                           - 22 -

                        00152-01 97 06


  13.113. $ULWSET - освободить страницы в рабочем

          наборе                                         1016

  13.114. $UNWIND - развернуть стек вызовов              1016

  13.115. $UPDSEC - обновить файл секции на диске        1017

  13.116. $UPDSECW  -  обновить  файл  секции  на

          диске и ждать                                  1017

  13.117. $WAITFR - ждать один флаг события              1017

  13.118. $WAKE - пробудить процесс от спячки            1018

  13.119. $WFLAND - ждать логического "и"  флагов

          событий                                        1018

  13.120. $WFLOR - ждать логического "или" флагов

          событий                                        1018


































                            - 22К-

                      2б.00152-01 97 06


  13.113. $ULWSET - освободить страницы в рабочем

          наборе                                         1064

  13.114. $UNWIND - развернуть стек вызовов              1067

  13.115. $UPDSEC - обновить файл секции на диске        1070

  13.116. $UPDSECW  -  обновить  файл  секции  на

          диске и ждать                                  1078

  13.117. $WAITFR - ждать один флаг события              1079

  13.118. $WAKE - пробудить процесс от спячки            1081

  13.119. $WFLAND - ждать логического "и"  флагов

          событий                                        1083

  13.120. $WFLOR - ждать логического "или" флагов

          событий                                        1085


     Перечень ссылочных документов	 		 1088К






























                           - 23 -

                        00152-01 97 06


       1. Введение в программы системного обслуживания



       Операционная система МОС ВП использует программы  сис-

  темного обслуживания для управления  ресурсами,  доступными

  процессам, обеспечения связи между процессами и  выполнения

  основных функций операционной системы, таких как  координа-

  ция операций ввода-вывода.

       Хотя  большинство  программ  системного   обслуживания

  используются главным образом  самой  операционной  системой

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

  из этих программ доступны для общего использования  и  пре-

  доставляют механизм, который может быть использован в прик-

  ладных программах. Например, когда пользователь подключает-

  ся к операционной системе МОС ВП, вызывается программа сис-

  темного обслуживания  $CREPRC  (создать  процесс),  которая

  создает процесс для  этого  пользователя.  Пользователь,  в

  свою очередь, может написать  программу,  которая  вызывает

  программу системного обслуживания  $CREPRC,  чтобы  создать

  процесс для выполнения определенных функций.

       Программы системного обслуживания можно  разделить  на

  функциональные группы.  В  табл.1  перечислены  все  группы

  программ системного обслуживания и их функции.














                           - 24 -

                        00152-01 97 06


                                                    Таблица 1

  -----------------------------------------------------------

  Группа служебных !               Функция

      программ     !

  -----------------------------------------------------------

  Защита           ! Служебные программы группы "защита" обе-

                   ! спечивают  различные  механизмы, которые

                   ! может использовать  пользователь для по-

                   ! вышения уровня  защиты операционной сис-

                   ! темы МОС ВП

  Флаг события     ! Процесс может использовать флаги событий

                   ! для  синхронизации   последовательностей

                   ! операций в программе. Служебные програм-

                   ! мы группы "флаг события" сбрасывают, ус-

                   ! танавливают и считывают флаги событий, а

                   ! также помещают процессы в состояние ожи-

                   ! дания, откладывая  установку  флага  или

                   ! флагов событий

  AST              ! Выполнение  процесса  может  прерываться

                   ! различными  событиями (такими как завер-

                   ! шение ввода-вывода).  По такому прерыва-

                   ! нию  выполняются  определенные  подпрог-

                   ! раммы. Эти программные прерывания  назы-

                   ! ваются асинхронными системными  прерыва-

                   ! ниями (AST  -  это аббревиатура соответ-

                   ! ствующего  английского  названия),  пос-

                   ! кольку они происходят асинхронно по  от-




                           - 25 -

                        00152-01 97 06


                                          Продолжение табл. 1

  -----------------------------------------------------------

  Группа служебных !               Функция

      программ     !

  -----------------------------------------------------------

                   ! ношению к выполнению процесса. Программы

                   ! системного  обслуживания   группы  "AST"

                   ! предназначены  для   управления  работой

                   ! AST-прерываний

  Логические имена ! Служебные  программы  группы "логические

                   ! имена" предоставляют обобщенную  технику

                   ! для  поддержки  и  доступа к  символьной

                   ! строке,  называемой логическим именем, а

                   ! также для  установления  эквивалентности

                   ! пары  имен.  Концепция  логических  имен

                   ! обеспечивает для  системы  и  прикладных

                   ! программ  независимость  операций ввода-

                   ! вывода от устройств

  Ввод-вывод       ! Служебные программы группы  "ввод-вывод"

                   ! выполняют  операции  ввода-вывода непос-

                   ! редственно, не используя служебные прог-

                   ! раммы работы  с файлами, входящие в сис-

                   ! тему управления данными (СУД).

                   ! служебные  программы группы "ввод-вывод"

                   ! предназначены для:

                   ! 1) выполнения логических,  физических  и

                   !    виртуальных операций ввода-вывода;




                           - 26 -

                        00152-01 97 06


                                          Продолжение табл. 1

  -----------------------------------------------------------

  Группа служебных !               Функция

      программ     !

  -----------------------------------------------------------

                   ! 2) форматирования выводных строк  с пре-

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

                   !    кода КОИ-8 и подстановкой переменных

                   !    данных в строки кода КОИ-8;

                   ! 3) выполнение операций с сетями;

                   ! 4) постановки  сообщений  в   очередь  к

                   !    системным процессам

  Управление про-  ! Служебные программы  группы  "управление

  цессами          ! процессами"  предоставляют   возможность

                   ! создавать, удалять и управлять процесса-

                   ! ми

  Таймер и преобра-! Служебные  программы  таймера  планируют

  зование времени  ! программные события на конкретное  время

                   ! дня или по истечении  заданного интерва-

                   ! ла времени. Служебные программы преобра-

                   ! зования  времени дают  возможность полу-

                   ! чать  и  формировать  двоичные  значения

                   ! времени  для  использования  в служебных

                   ! программах таймера

  Обработка исклю- ! Программы обработки  исключительных сос-

  чительных состоя-! тояний - это программы, которые получают

  ний              ! управление  при  возникновении  исключи-




                           - 27 -

                        00152-01 97 06


                                          Продолжение табл. 1

  -----------------------------------------------------------

  Группа служебных !               Функция

      программ     !

  -----------------------------------------------------------

                   ! тельного состояния  во время  выполнения

                   ! образа. Служебные  программы этой группы

                   ! используются для специальных целей

  Управление       ! Служебные  программы  управления памятью

  памятью          ! дают возможность сделать доступным прог-

                   ! рамме виртуальное адресное пространство.

                   ! в эту группу входят служебные программы,

                   ! которые могут:

                   ! 1) дать возможность образу увеличить или

                   !    изменить размер доступной виртуальной

                   !    памяти;

                   ! 2) управлять  страничным обменом и обме-

                   !    ном  рабочих  наборов  в  виртуальной

                   !    памяти;

                   ! 3) создавать  и  организовывать доступ к

                   !    файлам  в  памяти,  которые  содержат

                   !    разделяемый код или данные

  Изменение режима ! Служебные  программы  группы  "изменение

                   ! режима" меняют режим доступа процесса на

                   ! более привилегированный режим для выпол-

                   ! нения  отдельных  программ,  или  меняют

                   ! указатель стека для  менее  привилегиро-




                           - 28 -

                        00152-01 97 06


                                          Продолжение табл. 1

  -----------------------------------------------------------

  Группа служебных !               Функция

      программ     !

  -----------------------------------------------------------

                   ! ванного режима. Эти служебные  программы

                   ! используются главным образом  операцион-

                   ! ной системой МОС ВП

  Управление захва-! Служебные  программы управления захватом

  том              ! позволяют взаимосвязанным процессам син-

                   ! хронизировать свой  доступ к разделяемым

                   ! ресурсам



       1.1. Формат    документирования     программ

            системного обслуживания


       Каждая программа  системного  обслуживания  документи-

  руется с использованием структурного  формата,  называемого

  шаблоном программы. В данном  подразделе  описаны  основные

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

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

  ции.

       Цель данного подраздела - об'яснить, где найти  инфор-

  мацию и как правильно ее прочитать, но не как правильно  ее

  использовать.

       Некоторые  основные  заголовки  в  шаблоне   программы

  содержат  информацию,  которая  не  требует  дополнительных

  пояснений, кроме приведенных в табл. 2. Однако для  следую-



                           - 29 -

                        00152-01 97 06


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

  дополнительное описание,  которое  приводится  в  остальных

  подразделах данного раздела:

       1) заголовок формата;

       2) заголовок аргументов;

       3) заголовок возвращаемых значений кодов состояния.

                                                   Таблица 2

            Основные заголовки в шаблоне программы

  ----------------------------------------------------------

  Основной !                      Описание

  заголовок!

  ----------------------------------------------------------

  Имя      ! Требуется. Имя точки входа в программу

  программы!

  Коммента-! Требуется. Комментарий находится непосредствен-

  рий      ! но под именем программы. Комментарий об'ясняет

  программы! обычно одним-двумя  предложениями, что делает

           ! программа

  Формат   ! Требуется. Заголовок формата следует за описа-

           ! нием программы. Формат дает имя точки входа

           ! программы и список аргументов

  Аргументы! Требуется.  Заголовок аргументов следует за за-

           ! головком формат. Под  этим  заголовком сооб-

           ! щается подробная информация о каждом аргументе.

  Описание ! Не обязательно.  Заголовок  описания следует за

           ! заголовком аргументов. Текст описания  содержит

           ! информацию о специфических  действиях, выполня-




                           - 30 -

                        00152-01 97 06


                                         Продолжение табл. 2

  ----------------------------------------------------------

  Основной !                      Описание

  заголовок!

  ----------------------------------------------------------

           ! емых программой; взаимодействие между  аргумен-

           ! тами программы; работа  программы  в  контексте

           ! операционной системы МОС  ВП; привилегии  поль-

           ! зователя,  которые требуются для  вызова  прог-

           ! раммы; системные ресурсы, используемые програм-

           ! мой и  пользовательские  квоты,  которые  могут

           ! влиять на работу программы.

           ! для некоторых  простых  программ текст описания

           ! не требуется, поскольку  вся необходимая инфор-

           ! мация содержится в комментарии программы

  Возвраща-! Требуется.  Заголовок   возвращаемых   значений

  емые зна-! кодов состояния следует за заголовком описания.

  чения    ! Под этим заголовком перечисляются  все  значени

  кодов    ! кодов состояния  (обычно  это  или  коды завер-

  состояния! шения, или коды  состояния), которые возвращает

           ! программа



       1.1.1. Заголовок "формат"


       Под заголовком  "формат"  представлены  следующие  два

  типа информации:

       1) формат вызова программы;





                           - 31 -

                        00152-01 97 06


       2) пояснительный текст.

       Все программы  системного  обслуживания  имеют  формат

  вызова процедуры. Использование  формата  вызова  процедуры

  приводит к вызову программы в  соответствии  со  стандартом

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

  ционной системы МОС ВП, т.е. создается маска входа,  сохра-

  няются регистры и т.д.

       Пояснительный текст располагается после формата вызова

  программы. Данный текст присутствует, только если необходи-

  мо пояснить формат (или форматы). Например,  формат  вызова

  указывает, что какие-то аргументы не обязательны,  заключая

  их в квадратные скобки. Однако,  сами  по  себе  квадратные

  скобки не могут передать  всю  важную  информацию,  которая

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

  некоторых программах, которые  могут  иметь  необязательные

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

  то и другие необязательные аргументы должны быть  использо-

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

  вызова.

       В примере приводится формат вызова программы,  который

  записывается после заголовка формата. Хотя и  предполагает-

  ся, что здесь приводится формат  в  самом  общем  виде,  на

  самом деле он до  некоторой  степени  специфичен  и  выбран

  здесь для  того,  чтобы  выявить  некоторые  синтаксические

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

  ных вызовов процедур.






                           - 32 -

                        00152-01 97 06


       Пример.



  ENTRY_POINT_NAME ARG1, ARG2, [ARG3], NULLARG [,ARG4][,ARG5]

       Данный формат служит примером использования  синтакси-

  ческих правил приведенных в табл. 3.

                                                    Таблица 3

  -----------------------------------------------------------
  Элемент       !         Синтаксическое правило

  -----------------------------------------------------------

  Пробелы       ! Один или более пробелов должны присутство-

                ! вать между именем точки входа и первым ар-

                ! гументом, а также между аргументами

  Квадратные    ! В квадратных скобках записываются необяза-

  скобки        ! тельные  аргументы: ARG3, ARG4 и ARG5  яв-

                ! ляются  необязательными аргументами,  пос-

                ! кольку они  записаны в квадратных скобках.

                ! запятые  тоже  могут  быть необязательными

                ! (элемент "запятая")

  Запятые       ! Между  аргументами запятая  всегда следует

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

                ! то  запятая  может появиться либо  внутри,

                ! либо  вне квадратных скобок, в зависимости

                ! от  позиции аргумента  в списке и от того,

                ! являются  ли окружающие  аргументы  обяза-

                ! тельными или нет.

                !   Например, в приведенном примере аргумент

                ! ARG3   является   необязательным,   но




                           - 33 -

                        00152-01 97 06


                                          Продолжение табл. 3

  -----------------------------------------------------------

  Элемент       !         Синтаксическое правило

  -----------------------------------------------------------

                ! поскольку в списке есть  другие обязатель-

                ! ные аргументы,  следующие  за ARG3, то за-

                ! пятая обязательна (т.к. она отмечает  мес-

                ! то ARG3), поэтому запятая расположена  вне

                ! квадратных скобок.

                !     Аргументы  ARG4  и ARG5 не  обязатель-

                ! ны. Поскольку  в списке  нет  обязательных

                ! аргументов, следующих  за  ARG4 и ARG5, то

                ! и сами запятые перед ARG4 и ARG5  являются

                ! необязательными. Это означает,  что если в

                ! вызове не заданы ARG4 и ARG5, то  не будут

                ! указаны  и  эти  запятые. Поэтому  запятые

                ! перед ARG4 и ARG5 записаны внутри квадрат-

                ! ных скобок

  Нулевые       ! Нулевой аргумент - это аргумент,  занимаю-

  аргументы     ! щий  место. Он используется, чтобы удержи-

                ! вать место в списке  аргументов.

                ! При вызове  программы,  содержащей нулевой

                ! аргумент,  необходимо либо обеспечить зна-

                ! чение 0 для  нулевого  аргумента,  либо не

                ! давать ему никакого значения, но  отметить

                ! запятой его место в формате вызова






                           - 34 -

                        00152-01 97 06


       1.1.2. Заголовок "аргументы"


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

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

  Аргументы описываются в том порядке, в котором они располо-

  жены в формате вызова.

       Для определения каждого аргумента используются следую-

  щие элементы:

       Имя-аргумента

       Использование в МОС ВП:

       Тип:

       Доступ:

       Механизм:



       1.1.2.1. Элемент "использование  в  операционной

                системе МОС ВП"


       Каждый тип данных операционной системы  МОС  ВП  имеет

  только одно представление в памяти,  например,  тип  данных

  МОС ВП "ACCESS_MODE" (тип  доступа)  представляет  из  себя

  байт без знака. Кроме того, тип данных МОС ВП  может  иметь

  или не иметь "определенного" значения.

       Большинство типов данных МОС  ВП  можно  рассматривать

  как  "определенные",  т.е.  они  несут  значение,   которое

  является уникальным в контексте  операционной  системы  мос

  вп. Например, тип данных МОС ВП "ACCESS_MODE". В памяти  он

  представлен одним байтом без знака, а определенное содержи-

  мое этого байта без знака связано с тем фактом, что он ука-




                           - 35 -

                        00152-01 97 06


  зывает режим аппаратного доступа и  имеет,  таким  образом,

  только четыре допустимых значения:

             0     - режим ядра;

             1     - режим управления;

             2     - режим супервизора;

             3     - пользовательский режим.

       Однако, некоторые типы данных МОС ВП не являются опре-

  деленными, то есть они задают представление в памяти, но не

  несут другого семантического содержания с точки зрения опе-

  рационной системы МОС  ВП,  например,  тип  данных  МОС  ВП

  "BYTE_SIGNED" (байт со знаком) не является определенным.

       В МОС ВП используются следующие типы данных:

  ACCESS_BIT_NAMES -

       однородный массив из 32 дескрипторов, каждый длиной  в

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

       из 32 битов в маске доступа. Первый дескриптор именует

       бит 0, второй дескриптор именует бит 1 и т.д;

  АCCESS_MODE (режим доступа) -

       Байт без знака, означающий режим аппаратного  доступа.

       Байт без знака может иметь четыре значения:

       0 - режим ядра;

       1 - режим управления;

       2 - режим супервизора;

       3 - пользовательский режим.

  ADDRESS (адрес) -

       длинное слово без знака, означающее адрес в  виртуаль-

       ной памяти данных или кода, но не маски входа в проце-




                           - 36 -

                        00152-01 97 06


       дуру (который относится к типу "PROCEDURE");

  ADDRESS_RANGE (диапазон адресов) -

       квадрослово без знака, определяющее диапазон адресов в

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

       первое длинное слово указывает начальный адрес в  диа-

       пазоне, а второе длинное слово задает конечный адрес в

       диапазоне;

  ARG_LIST -

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

       слов, число которых может меняться от 1 до 256. Первое

       длинное слово содержит целое число без  знака,  равное

       количеству следующих за ним  последовательных  длинных

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

       должен передаваться процедуре  посредством  инструкции

       CALL. Формат списка аргументов приведен на рис. 1.


                   Формат списка аргументов


                   !                         !
                   !---------------------+---!
                   !                     ! N !
                   !---------------------+---!
                   !     Аргумент 1          !
                   !-------------------------!
                   !     Аргумент 2          !
                   !-------------------------!
                   !          .              !
                   !          .              !
                   !          .              !
                   !-------------------------!
                   !     Аргумент N          !
                   !-------------------------!

                            Рис. 1







                           - 37 -

                        00152-01 97 06


  AST_PROCEDURE (AST-процедура) -

       длинное слово без знака, представляющее маску входа  в

       процедуру, которая должна вызываться  на  уровне  AST.

       (Процедуры, которые не должны вызываться на уровне AST

       относятся к типу "PROCEDURE");

  BOOLEAN (булев) -

       длинное слово без знака,  обозначающее  булев  флаг  с

       двумя значениями:

       0 - ложь;

       1 - истина;

  BYTE_SIGNED (байт со знаком) -

       тип данных МОС ВП "байт со знаком" совпадает  с  типом

       данных "целое число  (со  знаком)  размером  в  байт",

       представленном в табл. 5;

  BYTE_UNSIGNеD (байт без знака) -

       тип данных МОС ВП "байт без знака" совпадает  с  типом

       данных "байт (без знака)", представленном в табл. 5;

  CHANNEL (канал) -

       целое число без знака длиной в слово, которое является

       индексом канала ввода-вывода;

  CHAR_STRING (строка символов) -

       строка длиной от 0 до 65535 символов. Этот тип  данных

       МОС ВП совпадает с  типом  данных  "строка  символов",

       представленном в табл. 5. На рис.  2  показана  строка

       символов "XYZ".








                           - 38 -

                        00152-01 97 06



                 Строка символов

              7                   0
              +-------------------+
              !       "X"         !  :A
              +-------------------+
              !       "Y"         !  :A+1
              +-------------------+
              !       "Z"         !  :A+2
              +-------------------+

                            Рис. 2


  COMPLEX_NUMBER (комплексное число) -

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

       МОС ВП представляющих комплексное  число  с  плавающей

       запятой. Их может быть три:

       1) комплексное число с плавающей запятой F-формата;

       2) комплексное число с плавающей запятой D-формата;

       3) комплексное число с плавающей запятой G-формата.

       Комплексное число с плавающей запятой F-формата  (R,I)

       состоит из двух чисел с плавающей  запятой  F-формата.

       Первое число с плавающей запятой F-формата есть дейст-

       вительная часть (R) комплексного числа, второе число с

       плавающей запятой F-формата  есть  мнимая  часть  (I).

       Структура  комплексного  числа  с  плавающей   запятой

       F-формата приведена на рис. 3.















                           - 39 -

                        00152-01 97 06




        Комплексное число с плавающей запятой F-формата

               15  14         7 6       0
               +------------------------+
        Дейст- ! S !  Порядок  !Мантисса!:а
        витель-+------------------------+
        ная    !        Мантисса        !:а+2
        часть  +------------------------+
        Мнимая ! S !  Порядок  !Мантисса!:A+6
        часть  +------------------------+
               !         Мантисса       !:а+8
               +------------------------+

                            Рис. 3



       Kомплексное число с плавающей запятой D-формата (R, I)

       состоит из двух чисел с плавающей  запятой  D-формата.

       Первое число с плавающей запятой D-формата есть дейст-

       вительная часть (R) комплексного числа, второе число с

       плавающей запятой  D-формата  есть  мнимая  часть  (I)

       комплексного числа.  Структура  комплексного  числа  с

       плавающей запятой D-формата приведена на рис. 4

























                           - 40 -

                        00152-01 97 06



       Комплексное число с плавающей запятой D-формата

              15   14        7 6        0
            -- +------------------------+
            !  ! S !  Порядок !Мантисса !:а
            !  +------------------------+
      Дейст-!  !      Мантисса          !:а+2
      вите- <  +------------------------+
      льная !  !      Мантисса          !:а+4
      часть !  +------------------------+
            !  !      мантисса          !:а+6
            -- +------------------------+
            !  ! S !  Морядок !Мантисса !:A+8
            !  +------------------------+
      Мнимая!  !       Мантисса         !:а+10
            <  +------------------------+
      часть !  !       Мантисса         !:а+12
            !  +------------------------+
            !  !       Мантисса         !:а+14
            -- +------------------------+

                            Рис. 4


       Комплексное число с плавающей запятой G-формата (R, I)

       состоит из двух чисел с плавающей  запятой  G-формата.

       Первое число с плавающей запятой G-формата есть дейст-

       вительная часть (R) комплексного числа, второе число с

       плавающей запятой  G-формата  есть  мнимая  часть  (I)

       комплексного числа.  Структура  комплексного  числа  с

       плавающей запятой G-формата приведена на рис. 5.



















                           - 41 -

                        00152-01 97 06



        Комплексное число с плавающей запятой G-формата

                 15   14        4 3       0
              -- +------------------------+
              !  ! S !  Порядок !Мантисса !:а
              !  +------------------------+
        Дейст-!  !       Мантисса         !:а+2
        вите- <  +------------------------+
        льная !  !       Мантисса         !:а+4
        часть !  +------------------------+
              !  !       Мантисса         !:а+6
              -- +------------------------+
              !  ! S !  Порядок !Мантисса !:A+8
              !  +------------------------+
        Мнимая!  !       Мантисса         !:а+10
              <  +------------------------+
        часть !  !       Мантисса         !:а+12
              !  +------------------------+
              !  !       Мантисса         !:а+14
              -- +------------------------+

                            Рис. 5


  COND_VALUE -

       Целое число размером  в  длинное  слово,  определяющее

       значение кода состояния (т.е. состояние  возврата  или

       системный код состояния), которое обычно  возвращается

       процедурой в  регистре  R0.  Значение  кода  состояния

       имеет структуру, изображенную на рис. 6. В зависимости

       от конкретных нужд  пользователя  он  может  проверять

       либо только самый младший бит, либо три младших  бита,

       либо все значение целиком. Самый младший бит указывает

       на успешное (1) или неуспешное (0) завершение обслужи-

       вания.  Три  младших  бита,  взятые  вместе,  отражают

       серьезность ошибки. Оставшиеся биты (с 3 по 31)  клас-

       сифицируют конкретное состояние возврата и  компоненту

       операционной системы МОС ВП, выдавшую  код  состояния.

       Каждое числовое значение кода состояния имеет уникаль-



                           - 42 -

                        00152-01 97 06


       ное символическое имя, формат которого SS$CODE -  код,

       где код- это мнемоническое имя, описывающее  состояние

       возврата.


                      Формат кода состояния

        31     28 27                       3 2          0
         +----------------------------------------------+
         ! CNTRL !  Идентификация состояния !Серьезность!
         !       !                          !   ошибки  !
         +----------------------------------------------+
                 \-------------------------/ \---- ----/
                                !                  \/
                                !            2       1  0
                                !            +-----------+
                                !            !       ! S !
                                !            +-----------+
                                V
                  27          16 15          3
                 +---------------------------+
                 !   Номер      !  Номер     !
                 !   средства   !  сообщения !
                 +---------------------------+

                            Рис. 6


  CONTEXT (контекст) -

       длинное слово без знака, которое используется вызывае-

       мой процедурой для управления положением в итеративной

       последовательности вызовов. Оно обычно инициализирует-

       ся в вызывающем об'екте, но  после  этого  управляется

       вызванной программой;

  DATA-TIME (дата-время) -

       целое двоичное число без знака  размером  в  64  бита,

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

       100-наносекундных интервалов, прошедших с  момента  00

       часов 00 мин. 17 ноября 1858 года. Тип данных  МОС  ВП

       "дата-время" совпадает с типом данных "абсолютная дата




                           - 43 -

                        00152-01 97 06


       и время", представленном в табл. 5;

  DEVICE-NAME -

       строка символов, обозначающая  имя  устройства.  Длина

       строки может составлять от одного до 15 символов.  Это

       может быть логическое имя, но в таком случае оно долж-

       но транслироваться в допустимое имя  устройства.  Если

       имя устройства содержит двоеточие (:), то это  двоето-

       чие и все символы после него игнорируются. Если строке

       с именем устройства предшествует символ  подчеркивания

       (_), это указывает на то, что строка является физичес-

       ким именем устройства;

  EF_CLUSTER_NAME (имя кластера флагов событий) -

       строка  символов,  обозначающая  имя  кластера  флагов

       событий. Длина может составлять от 1 до  15  символов.

       Это может быть логическое имя, но в таком  случае  оно

       должно транслироваться в допустимое имя кластера  фла-

       гов событий (раздел 4);

  EF_NUMBER  (номер флага события) -

       целое число без знака размером в длинное слово,  обоз-

       начающее номер флага события. Для программ пользовате-

       лей доступны флаги, пронумерованные от 32 до 63;

  EXIT_HANDLER_BLOCK (блок программы управления выходом) -

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

       для программы управления  выходом.  Управляющий  блок,

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

       ден на рис. 7.






                           - 44 -

                        00152-01 97 06



             Блок программы управления  выходом

   31                                                     0
   ---------------------------------------------------------
   !Связь в прямом направлении (используется только МОС ВП)!
   ---------------------------------------------------------
   !         Адрес программы управления выходом            !
   ---------------------------------------------------------
   ! Эти три байта должны содержать 0 ! Счетчик аргументов !
   ---------------------------------------------------------
   !   Адрес значения кода состояния (записывается МОС ВП) !
   ---------------------------------------------------------
   !                                                       !
    .  Дополнительные аргументы для программы управления  .
    .  Выходом                                            .
    .  Они не обязательны                                 .
    .  В каждом длинном слове записывается один аргумент  .
   !                                                       !
   ---------------------------------------------------------

                            Рис. 7


  FAB (блок доступа к файлу) -

       структура, обозначающая блок доступа  к  файлу  СУД-32

       (документ [1]);

  FILE_PROTECTION (защита файла) -

       слово без знака,  представляющее  из  себя  16-битовую

       маску, которая  определяет  защиту  файла.  Эта  маска

       содержит четыре  4-битовых  поля,  каждое  из  которых

       задает уровни защиты, для доступа  к  файлу  одной  из

       четырех групп пользователей. Справа налево поля задают

       доступ (1) системных пользователей, (2) владельца фай-

       ла  (3) пользователей, относящихся  к  той  же  группе

       кодов идентификации пользователей (UIC), что и  владе-

       лец файла, и (4) все  остальные  пользователи.  Каждое

       поле задает, считая биты справа налево, (1) доступ  на

       чтение, (2) доступ на запись, (3) доступ на исполнение




                           - 45 -

                        00152-01 97 06


       , (4) доступ на удаление. Биты, содержащие "1", указы-

       вают, что доступ запрещен.  На  рис.  8.  представлена

       16-битовая маска защиты файла.


                 Маска защиты файла

         -------------------------------------
         !Все ос-! Группа! Владелец ! Система!
         !тальные!       !          !        !
         -------------------------------------
         !D!E!W!R!D!E!W!R! D! E! W! R!D!E!W!R!
         -------------------------------------

                            Рис. 8


  FLOATING_POINT (плавающая запятая) -

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

       МОС ВП с плавающей запятой.  Таких  типов  может  быть

       Четыре:

       1) число с плавающей запятой F-формата;

       2) число с плавающей запятой G-формата;

       3) число с плавающей запятой D-формата;

       4) число с плавающей запятой H-формата.

       Формат числа с плавающей запятой F-формата представлен

       на рис. 9.


      Формат числа с плавающей запятой F-формата

       15   14        7 6            0
        ------------------------------
        ! S !  Порядок !   Мантисса  !:А
        ------------------------------
        !          Мантисса          !:А+2
        ------------------------------
        31                          16

                            Рис. 9






                           - 46 -

                        00152-01 97 06


       Формат числа с плавающей запятой D-формата приведен на

       рис. 10.


        Формат числа с плавающей D-формата

        15   14        7 6            0
         ------------------------------
         ! S !  Порядок !  Мантисса   !:А
         ------------------------------
         !         Мантисса           ! :А+2
         ------------------------------
         !         Мантисса           ! :А+4
         ------------------------------
         !         Мантисса           ! :А+6
         ------------------------------
         63                         48

                            Рис. 10



       Формат числа с плавающей запятой G_формата приведен на

       рис. 11.



        Формат числа с плавающей запятой G-формата

         15 14          4 3         0
         ------------------------------
         ! S !  Порядок !  Мантисса   !:А
         ------------------------------
         !         Мантисса           ! :А+2
         ------------------------------
         !         Мантисса           ! :А+4
         ------------------------------
         !         Мантисса           ! :А+6
         ------------------------------
         63                         48

                            Рис. 11



       Формат числа с плавающей запятой H_формата приведен на

       рис. 12.







                           - 47 -

                        00152-01 97 06



     Формат числа с плавающей запятой H-формата

         15   14                      0
         ------------------------------
         ! S !       Порядок          ! :А
         ------------------------------
         !           Мантисса         ! :А+2
         ------------------------------
         !           Мантисса         ! :А+4
         ------------------------------
         !           Мантисса         ! :А+6
         ------------------------------
         !           Мантисса         ! :А+8
         ------------------------------
         !           Мантисса         ! :А+10
         ------------------------------
         !           Мантисса         ! :А+12
         ------------------------------
         !           Мантисса         ! :А+14
         ------------------------------
         127                        113

                            Рис. 12


  FUNCTION_CODE (код функции) -

       длинное  слово,  задающее  операции,  которые   должна

       выполнить процедура. Это длинное слово имеет два  поля

       длиной в слово: первое поле является числом,  задающим

       основную операцию; второе поле  представляет  из  себя

       маску или вектор битов, задающий различные подоперации

       внутри основной операции;

  IO_STATUS_BLOCK (блок состояния ввода-вывода) -

       структура размером в квадрослово, содержащая  информа-

       цию,  возвращаемую  программой,  которая   завершается

       асинхронно. Возвращаемая информация меняется в зависи-

       мости от конкретной программы. На рис. 13 показан фор-

       мат информации, который записывается в блок IOSB (сос-

       тояния ввода-вывода) для программы SYS$QIO.




                           - 48 -

                        00152-01 97 06



          Формат блока состояния ввода-вывода

  31                     16 15                          0
  --------------------------------------------------------
  !       Счетчик          !   Значение кода состояния   !
  --------------------------------------------------------
  !           Информация, зависящая от устройства        !
  --------------------------------------------------------

                            Рис. 13



       В данном формате первое слово содержит  значение  кода

       состояния, индицирующее успешное или неуспешное завер-

       шение операции и используются  те  же  значения  кодов

       состояния, что и для всех других  программ  системного

       обслуживания, например, SS$NORMAL указывает на  успеш-

       ное завершение операции. Второе слово  содержит  число

       байтов, реально перемещенных в операции  ввода-вывода.

       Для некоторых устройств заполняется только слово счет-

       чика (документ [2]).  Второе  длинное  слово  содержит

       возвращаемую информацию, зависящую от конкретного уст-

       ройства. Чтобы гарантировать успешное завершение  опе-

       рации ввода-вывода и  целостность  переданных  данных,

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

       ввод-вывод,  в  особенности  при  выполнении   функций

       ввода-вывода, зависящих от устройств;

  ITEM_LIST_2  (список элементов) -

       структура, состоящая из одного или более  дескрипторов

       элементов. Последним в списке элементов является длин-

       ное слово, содержащее 0.  Каждый  дескриптор  элемента

       представляет из себя структуру длиной в 2 длинных сло-




                           - 49 -

                        00152-01 97 06


       ва, которая содержит три поля. На рис. 14 показан один

       дескриптор элемента:


                   Дескриптор элемента

  31                      15                            0
  --------------------------------------------------------
  !   Код элемента         !    Длина компоненты         !
  --------------------------------------------------------
  !               Адрес компоненты                       !
  --------------------------------------------------------

                            Рис. 14


       В первом поле длиной в слово программа системного обс-

       луживания записывает длину (в символах)  затребованной

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

       находит нужной компоненты, то  она  возвращает  в  это

       поле и в поле адреса  компоненты  значение  0.  Второе

       поле содержит символический код длиной в слово, предс-

       тавляемый пользователем. Данный код  задает  требуемую

       компоненту. Коды элементов определяются  макрокоманда-

       ми, специфичными для данной программы системного  обс-

       луживания. Третье поле  имеет  длину  равную  длинному

       слову и в нем программа системного обслуживания  запи-

       сывает начальный адрес компоненты. Данный адрес содер-

       жится внутри самой входной строки;

  ITEM_LIST_3 (список элементов) -

       структура, состоящая из одного или более  дескрипторов

       элементов. Последним в этом  списке  является  длинное

       слово, содержащее 0. Каждый дескриптор элемента предс-

       тавляет из себя структуру из 3-х длинных слов, которая

       содержит четыре поля. На рис.  15  представлен  формат



                           - 50 -

                        00152-01 97 06


       одного дескриптора элемента.


                   Дескриптор элемента

    31                     15                           0
    -------------------------------------------------------
    !    Элемнтный код      !      Длина буфера           !
    -------------------------------------------------------
    !                Адрес буфера                         !
    -------------------------------------------------------
    !Адрес слова,содержащего длину возвращаемой информации!
    -------------------------------------------------------

                            Рис. 15


       Первое поле является словом, содержащим представленное

       пользователем целое число, которое задает длину буфера

       (в байтах), в который программа системного  обслужива-

       ния  записывает  информацию.  Требуемая  длина  буфера

       зависит от элементного кода, указанного  в  соответст-

       вующем поле дескриптора элемента.  Если  длина  буфера

       слишком мала,  то  программа  системного  обслуживания

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

       щим предоставляемый пользователем  символический  код,

       указывающий тот  элемент  информации,  который  должна

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

       определяются в макрокомандах, связанных с данной прог-

       раммой системного обслуживания. Третье  поле  является

       длинным словом, содержащим представляемый  пользовате-

       лем адрес буфера, в который программа системного  обс-

       луживания  записывает   информацию.   Четвертое   поле

       является длинным  словом,  содержащим  предоставляемый

       пользователем адрес слова, в которое программа систем-

       ного обслуживания записывает длину в байтах той инфор-



                           - 51 -

                        00152-01 97 06

                                          
       мации, которую она реально возвращает;

  IMET_QUOTA_LIST (список квот) -

       структура,  содержащая  один  или  более  дескрипторов

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

       ну, заданную символическим именем PQL$_LISTEND. Каждый

       дескриптор квот состоит из 1-байтового имени квоты, за

       которым следует длинное слово  без  знака,  содержащее

       значение для этой квоты;

  LOCK_ID (идентификатор  захвата) -

       длинное слово, содержащее целое число без знака, опре-

       деляющее идентификатор захвата.  Данный  идентификатор

       назначается  захвату  средством  управления  захватом,

       когда разрешается захват;

  LOCK_STATUS_BLOCK (блок состояния захвата) -

       структура,  в  которую  средство  управления  захватом

       записывает информацию состояния захвата. Блок  состоя-

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

       ных слова. Первое  слово  из  первого  длинного  слова

       Содержит значение кода состояния. Второе слово из пер-

       вого длинного слова неиспользуется, а  второе  длинное

       слово содержит идентификатор захвата.  Блок  состояния

       захвата получает конечное значение  кода  состояния  и

       идентификацию захвата, а также  может  содержать  блок

       значений захвата. Когда  запрос  ставится  в  очередь,

       идентификация захвата запоминается в  блоке  состояния

       захвата, даже если захват не был разрешен. Это  позво-

       ляет программе выводить из очереди неразрешенные  зах-




                           - 52 -

                        00152-01 97 06


       ваты. Значение кода состояния помещается в  блок  сос-

       тояния захвата, только когда захват  разрещается  (или

       если при разрешении захвата возникает ошибка). На рис.

       16 приведен блок состояния захвата,  который  включает

       необязательный 16-байтовый блок значений захвата;


               Блок состояния захвата

          -------------------------------------
          ! Неиспользуется  ! Значение кода   !
          !                 !  состояния      !
          -------------------------------------
          !      Идентификация захвата        !
          -------------------------------------
          ! 16-байтовый блок значений захвата.!
          ! используется только, если установ-!
          ! лен бит LCK$M_VALBLK              !
          -------------------------------------

                            Рис. 16


  LOCK_VALUE_BLOCK (блок значений захвата) -

       16-байтовый блок, который по запросу средства управле-

       ния захватом может быть включен в блок состояния  зах-

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

       пользователем и не интерпретируется средством управле-

       ния захвата

  LOGICAL_NAME (логическое имя) -

       строка, содержащая от 1 до 255 символов, которая иден-

       тифицирует логическое имя или эквивалентное имя, кото-

       рым должна манипулировать программа обслуживания логи-

       ческих имен операционной системы  МОС  ВП.  Логические

       имена, которые обозначают специфические об'екты опера-

       ционной системы МОС ВП, имеют свои  собственные  типы,

       например, логическое имя, идентифицирующее устройство,



                           - 53 -

                        00152-01 97 06


       имеет тип "DEVICE_NAME" (имя устройства);

  LONGWORD_SIGNED (длинное слово со знаком) -

       данный тип данных МОС  ВП  совпадает  с  типом  данных

       "целое число (со знаком) размером  в  длинное  слово",

       представленном в табл. 5;

  LONGWORD_UNSIGNED (длинное слово без знака) -

       данный тип данных МОС  ВП  совпадает  с  типом  данных

       "длинное слово (без знака)", представленном в табл. 5;

  MASK_BYTE  (маска размером в байт) -

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

       вызываемой программой. Маску  также  называют  набором

       "флагов" или "маской битов";

  MASK_LONGWORD (маска размером с длинное слово) -

       длинное слово без знака, в котором каждый бит  интерп-

       ретируется вызываемой программой. Маску также называют

       набором "флагов" или "маской битов";

  MASK_QUADWORD (маска размером в квадрослово) -

       квадрослово без знака, в котором каждый бит  интерпре-

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

       набором "флагов" или "маской битов";

  MASK_WORD (маска размером в слово) -

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

       вызываемой программой. Маску  также  называют  набором

       "флагов" или "маской битов";

  NULL_ARG (нулевой аргумент) -

       длинное слово без знака, обозначающее  "нулевой  аргу-

       мент". "нулевой аргумент" - это аргумент, единственное




                           - 54 -

                        00152-01 97 06


       назначение которого - занимать место в списке аргумен-

       тов;

  OCTAWORD_SIGNED (октаслово со знаком) -

       данный тип данных МОС  ВП  совпадает  с  типом  данных

       "целое число (со знаком) размером в октаслово", предс-

       тавленном в табл. 5;

  OCTAWORD_UNSIGNED (октаслово без знака) -

       данный тип данных МОС  ВП  совпадает  с  типом  данных

       "октаслово (без знака)", представленном в табл. 5;

  PAGE_PROTECTION (защиты страницы) -

       длинное слово без знака, определяющее защиту  страниц,

       которая используется аппаратными средствами операцион-

       ной системы МОС  ВП.  Значения,  определяющие  защиту,

       указываются битами с 0 по 3; биты с 4  по  31  игнори-

       руются. Макрокоманда $PRTDEF определяет  символические

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

       табл. 4.


                                                   Таблица 4

   ---------------------------------------------------------

             Имя     !          Описание

   ---------------------------------------------------------

         PRT$C_NA    ! Нет доступа

         PRT$C_KR    ! Только чтение в режиме ядра

         PRT$C_KW    ! Запись в режиме ядра

         PRT$C_ER    ! Только чтение в режиме управления

         PRT$C_EW    ! Запись в режиме управления




                           - 55 -

                        00152-01 97 06


                                         Продолжение табл. 4

   ---------------------------------------------------------

             Имя     !          Описание

   ---------------------------------------------------------

         PRT$C_SR    ! Только чтение в режиме супервизора

         PRT$C_SW    ! Запись в режиме супервизора

         PRT$C_UR    ! Только чтение в режиме пользователя

         PRT$C_UW    ! Запись в режиме пользователя

         PRT$C_ERKW  ! Чтение в режиме управления,

                     ! запись в режиме ядра

         PRT$C_SRKW  ! Чтение в режиме супервизора, запись

                     ! в режиме ядра

         PRT$C_SREW  ! Чтение в режиме супервизора, запись

                     ! в режиме управления

         PRT$C_URKW  ! Чтение в режиме пользователя, запись

                     ! в режиме ядра

         PRT$C_UREW  ! Чтение в режиме пользователя, запись

                     ! в режиме управления

         PRT$C_URSW  ! Чтение в режиме пользователя, запись

                     ! в режиме супервизора


       Если значение, определяющее защиту, задано  равным  0,

       то по умолчанию разрешено только чтение в режиме ядра;

  PROCEDURE (процедура) -

       длинное слово без знака, определяющее  маску  входа  в

       процедуру, которая не должна вызываться на уровне пре-

       рывания AST (аргументы,  задающие  процедуры,  которые

       должны вызываться на  уровне  AST,  имеют  тип  данных



                           - 56 -

                        00152-01 97 06


       "AST_PROCEDURе";

  PROCESS_ID (идентификатор процесса) -

       целое число без знака размером в длинное слово,  опре-

       деляющее идентификатор процесса (PID). Этот  идентифи-

       катор назначается процессу операционной  системой  МОС

       ВП при создании процесса;

  PROCESS_NAME (имя процесса) -

       строка, содержащая от 1 до 15 символов, которая  опре-

       деляет имя процесса;

  QUADRO_SIGNED (квадрослово со знаком) -

       этот тип данных МОС ВП совпадает с типом данных "целое

       число (без знака) размером в  квадрослово",  представ-

       ленном в табл. 5;

  QUADRO_UNSIGNED (квадрослово без знака) -

       этот тип данных МОС ВП совпадает с типом данных "квад-

       рослово без знака", представленном в табл. 5;

  RIGHTS_HOLDER (держатель прав) -

       квадрослово без знака, задающее права пользователя  на

       доступ к системным об'ектам. Это  квадрослово  состоит

       из двух полей: первое - длинное слово без знака, содр-

       жащее идентификатор (тип данных МОС ВП  RIGHTS_ID),  а

       второе - битовая маска размером  в  длинное  слово,  в

       которой каждый бит указывает право доступа. На рис. 17

       приведен формат держателя прав.










                           - 57 -

                        00152-01 97 06



                Формат держателя прав

         -------------------------------------
         ! Идентификатор UIC держателя прав  !
         -------------------------------------
         !                  0                !
         -------------------------------------

                            Рис. 17


  RIGHTS_ID (идентификатор прав) -

       длинное  слово  без  знака,  означающее  идентификатор

       прав. Идентификаторы имеют два формата в  базе  данных

       прав:

       1) формат UIC (тип данных МОС ВП "UIC");

       2) формат ID.

       старшие биты значения идентификатора указывают  формат

       идентификатора. Если два старших бита  имеют  значение

       0, то это идентификатор формата UIC, если бит 31 уста-

       новлен, то это идентификатор формата ID. Биты с 28  по

       30 не используются. Остальные биты указывают  значение

       идентификатора. На рис. 18 представлен формат ID иден-

       тификатора прав.



          31                                0
         -------------------------------------
         ! 1000 !     Идентификатор          !
         -------------------------------------

                            Рис. 18



       Для операционной системы МОС ВП идентификатор является

       двоичным числом. Чтобы запросить использование иденти-

       фикатора,  операционная  система  МОС  ВП  транслирует



                           - 58 -

                        00152-01 97 06


       двоичный идентификатор в имя идентификатора.  Двоичное

       значение и имя идентификатора связаны  в  базе  данных

       прав. Имя идентификатора состоит из алфавитно-цифровых

       символов, из которых по крайней мере один должен  быть

       не цифровым. Число символов может меняться от 1 до 31.

       Имя идентификатора не может состоять целиком из цифро-

       вых символов. Оно может включать символы от  А  до  Z.

       Знаки денежной единицы ($) и подчеркивания (_), а так-

       же цифры от 0 до 9. Любая строчная буква автоматически

       преобразовывается в прописную;

  RAB (блок доступа к записи) -

       структура, содержащая блок доступа  к  записи  системы

       управления данными СУД-32 (см. Документ [1]);

  SECTION_ID (идентификатор секции) -

       квадрослово без знака, означающее  идентификатор  гло-

       бальной секции. В  данном  идентификаторе  указывается

       версия глобальной секции и  критерий,  который  должен

       использоваться при поиске данной секции;

  SECTION_NAME (имя секции) -

       строка, содержащая от 1 до 43 символов, которая  обоз-

       начает имя глобальной секции. Данная  строка  символов

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

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

       (раздел 11);

  SYSTEM_ACCESS_ID (идентификатор доступа к системе) -

       квадрослово без знака, определяющее значение идентифи-

       кации системы, которое должно  быть  связано  с  базой




                           - 59 -

                        00152-01 97 06


       данных прав;

  TIME_NAME (время) -

       строка символов, содержащая значение времени в формате

       МОС ВП;

  UIC (код идентификации пользователя) -

       длинное слово без знака, содержащее код  идентификации

       пользователя (UIC). Каждый код UIC уникален  и  предс-

       тавляет  пользователя  операционной  системы  МОС  ВП.

       Идентификатор UIC содержит два старших  бита,  которые

       обозначают формат, поле члена и поле группы.  Диапазон

       номеров членов составляет  от  0  до  65534,  диапазон

       номеров групп - от 1 до 16832. На рис. 19 показан фор-

       мат кода UIC.


                 Формат кода UIC

          -------------------------------------
          ! 00 !    Группа     !      Член    !
          -------------------------------------

                            Рис. 19


  USER_ARG (пользовательский аргумент) -

       длинное слово без знака, содержащее аргумент,  опреде-

       ленный пользователем. Данное длинное слово  передается

       программе в качестве аргумента,  но  содержимое  этого

       длинного слова определяется и интерпретируется пользо-

       вателем;

  VARYING_ARG (переменный аргумент) -

       длинное слово без знака, содержащее  переменный  аргу-

       мент. Данный переменный аргумент может иметь различные




                           - 60 -
                                             
                        00152-01 97 06


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

       гих аргументов при вызове;

  VECTOR_BYTE_SIGNED (вектор из байтов со знаком) -

       однородный массив, всеми элементами которого  являются

       байты со знаком;

  VECTOR_BYTE_UNSIGNED (вектор из байтов без знака) -

       однородный массив, всеми элементами которого  являются

       байты без знака;

  VECTOR_LONGWORD_SIGNED (вектор из длинных слов со знаком) -

       однородный массив, всеми элементами которого  являются

       длинные слова со знаком;

  VECTOR_LONGWORD_UNSIGNED (вектор из длинных слов без знака)

       однородный массив, всеми элементами которого  являются

       длинные слова без знаков;

  VECTOR_QUADWORD_SIGNED (вектор из квадрослов со знаком) -

       однородный массив, всеми элементами которого  являются

       квадрослова со знаком;

  VECTOR_QUADWORD_UNSIGNED (вектор из квадрослов без знака) -

       однородный массив, всеми элементами которого  являются

       квадрослова без знака;

  VECTOR_WORD_SIGNED (вектор из слов  со знаком) -

       однородный массив, всеми элементами которого  являются

       слова со знаком;

  VECTOR_WORD_UNSIGNED (вектор из слов без знака) -

       однородный массив, всеми элементами которого  являются

       слова без знака;






                           - 61 -

                        00152-01 97 06


  WORD_SIGNED (слово со знаком) -

       тип данных МОС ВП "слово со знаком" совпадает с  типом

       данных "целое  число  (со  знаком)  длиной  в  слово",

       представленном в табл. 5;

  WORD_UNSIGNED (слово без знака) -

       тип данных МОС ВП "слово без знака" совпадает с  типом

       данных "целое  число  (без  знака)  длиной  в  слово",

       представленном в табл. 5.



       1.1.2.2. Элемент "тип"


       Когда вызывающая программа передает аргументы програм-

  ме системного обслуживания, последняя ожидает, чтобы  аргу-

  менты были данными конкретного типа.  В  описании  программ

  системного обслуживания указаны ожидаемые типы  данных  для

  каждого аргумента.

       Аргумент не имеет типа данных, скорее данные,  указан-

  ные аргументом, имеют тип данных. Аргумент является средст-

  вом для передачи данных вызываемой программе.

       Вызовы программ приводят к построению списка  аргумен-

  тов. Список аргументов представляет из себя вектор из длин-

  ных слов.  Первое  длинное  слово  содержит  счетчик  числа

  остальных длинных слов, а каждое из этих остальных  длинных

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

  - это одно длинное слово в списке аргументов.

       Фраза "тип данного аргумента" часто  используется  для

  описания типа того данного, которое указано аргументом. Эта

  терминалогия используется, поскольку она проще и  понятнее,



                           - 62 -

                        00152-01 97 06


  чем вполне точная фраза "тип того данного, которое  указано

  аргументом".

       Табл. 5 содержит типы данных, допустимые  для  вызовов

  процедур операционной системы МОС ВП.

                                                    Таблица 5

      Стандартные типы данных операционной системы МОС ВП

  -----------------------------------------------------------

                 Тип данного              ! Символический код

  -----------------------------------------------------------

  Абсолютные дата и время                 ! DSC$K_DTYPE_ADT

  Целое число (со знаком) размером в байт ! DSC$K_DTYPE_B

  Максимальная величина метки             ! DSC$K_DTYPE_BLV

  Максимальная величина процедуры         ! DSC$K_DTYPE_BPV

  Байт (без знака)                        ! DSC$K_DTYPE_BU

  Число с плавающей запятой D-формата     ! DSC$K_DTYPE_D

  Комплексное число с плавающей запятой   ! DSC$K_DTYPE_DC

  D-формата                               !

  Дескриптор                              ! DSC$K_DTYPE_DSC

  Число с плавающей запятой F-формата     ! DSC$K_DTYPE_F

  Комплексное число с плавающей запятой   ! DSC$K_DTYPE_FC

  F-формата                               !

  Число с плавающей запятой G-формата     ! DSC$K_DTYPE_G

  Комплексное число с плавающей запятой   ! DSC$K_DTYPE_GC

  G-формата                               !

  Число с плавающей запятой H-формата     ! DSC$K_DTYPE_H

  Комплексное число с плавающей запятой   ! DSC$K_DTYPE_HC

  H-формата                               !




                           - 63 -

                        00152-01 97 06


                                          Продолжение табл. 5

  -----------------------------------------------------------

                 Тип данного              ! Символический код

  -----------------------------------------------------------

  Целое число (со знаком) размером в      ! DSC$K_DTYPE_L

  длинное слово                           !

  Длинное слово без знака                 ! DSC$K_DTYPE_LU

  Числовая строка, знак слева отдельно    ! DSC$K_DTYPE_NL

  Числовая строка, знак слева встроенный  ! DSC$K_DTYPE_NLO

  Числовая строка, знак справа отдельно   ! DSC$K_DTYPE_NR

  Числовая строка, знак справа встроенный ! DSC$K_DTYPE_NRO

  Числовая строка без знака               ! DSC$K_DTYPE_NU

  Числовая строка, зонированный знак      ! DSC$K_DTYPE_NZ

  Целое число (со знаком) размером в      ! DSC$K_DTYPE_O

  октаслово                               !

  Октаслово без знака                     ! DSC$K_DTYPE_OU

  Строка упакованного десятичного числа   ! DSC$K_DTYPE_P

  Целое число (со знаком), размером в     ! DSC$K_DTYPE_Q

  квадрослово                             !

  Квадрослово без знака                   ! DSC$K_DTYPE_QU

  Строка символов                         ! DSC$K_DTYPE_T

  Выравненная строка битов                ! DSC$K_DTYPE_V

  Переменная строка символов              ! DSC$K_DTYPE_VT

  Невыравненная строка битов              ! DSC$K_DTYPE_VU

  Целое число (со знаком) размером в слово! DSC$K_DTYPE_W

  Слово без знака                         ! DSC$K_DTYPE_WU

  Неспецифицирован                        ! DSC$K_DTYPE_Z




                           - 64 -

                        00152-01 97 06


                                          Продолжение табл. 5

  -----------------------------------------------------------

                 Тип данного              ! Символический код

  -----------------------------------------------------------

  Маска входа в процедуру                 ! DSC$K_DTYPE_ZEM

  Последовательность инструкций           ! DSC$K_DTYPE_ZI



       1.1.2.3. Элемент "доступ"


       Элемент "доступ" описывает способ,  которым  вызванная

  программа получает доступ к данным, задаваемым  аргументом.

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

       1) только чтение. Данные, с которыми работает програм-

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

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

  данные также называются входными  данными.  Когда  аргумент

  задает  входные  данные,  то  элемент  "доступ"  показывает

  "только чтение".

       Термин "только" необходим, чтобы показать,  что  прог-

  рамма не выполняет обе операции -  чтение  и  запись  (т.е.

  Модификацию) входных данных. Таким образом, входные данные,

  представленные  переменной,  сохраняются,  когда  вызванная

  программа завершает выполнение;

       2) только запись. Данные, которые вызываемая программа

  возвращает вызывающей программе, должны быть записаны в  то

  место памяти, откуда вызывающая программа может их достать.

  Такие данные  также  называются  выходными.  Если  аргумент

  задает выходные данные, то элемент "доступ" содержит "толь-



                           - 65 -

                        00152-01 97 06


  ко запись".

       Термин "только" необходим, чтобы показать,  что  вызы-

  ваемая программа не читает содержимое памяти ни до, ни пос-

  ле того, как она записывает туда данные;

       3) модификация. Если аргумент задает данные, которые и

  читаются и записываются вызываемой программой,  то  элемент

  "доступ" содержит "модификация". В этом  случае  вызываемая

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

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

  результат (т.е. выходные данные) операции.  Таким  образом,

  после завершения выполнения  вызываемой  программы  входные

  данные, заданные аргументом, теряются.

       Полный список типов  доступа,  допустимых  стандартами

  вызова процедур операционной системы МОС ВП:

       1) только чтение;

       2) только запись;

       3) модификация;

       4) вызов функции (перед возвратом);

       5) выполнение инструкции JMP после развертывания;

       6) вызов после развертывания стека;

       7) вызов без развертывания стека.



       1.1.2.4. Элемент "механизм"












                           - 66 -

                        00152-01 97 06


       Способ,  которым  аргумент  задает  реальные   данные,

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

  механизма передачи аргумента. Имеется три механизма переда-

  чи:

       1) по значению. Если аргумент размером в длинное слово

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

  должны использоваться программой, то реальные данные  пере-

  даются программе "по значению". В этом случае аргумент раз-

  мером в длинное слово содержит реальные данные, аргумент  и

  есть реальные данные. Поскольку  аргумент  имеет  размер  в

  длинное слово, то по значению могут передаваться только  те

  данные, которые могут быть представлены длинным словом;

       2) по ссылке. Если аргумент размером в  длинное  слово

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

  использоваться программой, то данные передаются  "по  ссыл-

  ке". В этом случае аргумент является указателем на данные;

       3) по дескриптору. Если аргумент  размером  в  длинное

  слово из списка аргументов содержит адрес  дескриптора,  то

  данные передаются "по дескриптору". Дескриптор  состоит  из

  двух или более длинных слов (в зависимости от типа  исполь-

  зуемого дескриптора), в  которых  описывается  тип  данных,

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

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

  в свою очередь является указателем на реальные данные.

       Список  механизмов  передачи,  допустимые   стандартом

  вызова процедур операционной системы  МОС  ВП,  приведен  в

  табл. 6.




                           - 67 -

                        00152-01 97 06



                                                    Таблица 6

  -----------------------------------------------------------

           Механизм передачи              ! Код дескриптора

  -----------------------------------------------------------

  По значению                             !

  По ссылке                               !

  По дескриптору                          !

  По ссылке, массив ссылок                !

  По дескриптору, фиксированная длина     ! DSC$K_CLASS_S

  По дескриптору, строка переменной длины ! DSC$K_CLASS_D

  По дескриптору, массив                  ! DSC$K_CLASS_A

  По дескриптору, программа               ! DSC$K_CLASS_P

  По дескриптору, десятичная строка       ! DSC$K_CLASS_SD

  По дескриптору, несплошной массив       ! DSC$K_CLASS_NCA

  По дескриптору, переменная строка       ! DSC$K_CLASS_VS

  По дескриптору, массив переменных       ! DSC$K_CLASS_VSA

  строк                                   !

  По дескриптору, невыровненная строка    ! DSC$K_CLASS_UBS

  битов                                   !

  По дескриптору, невыровненный массив    ! DSC$K_CLASS_UBA

  битов                                   !

  По дескриптору, строка с границами      ! DSC$K_CLASS_SB

  По дескриптору, невыровненная строка    ! DSC$K_CLASS_UBSB

  битов с границами                       !









                           - 68 -

                        00152-01 97 06


       1.1.2.5. Элемент "пояснительный текст"


       Для каждого элемента "тип", "доступ" и "механизм" сле-

  дует пояснительный текст, который содержит следующую инфор-

  мацию:

       1) начальное предложение, которое описывает:

       - физическую сущность данных, указанных аргументом;

       - способ, которым программа использует эти данные.

  Например, если аргумент указывает число, которое  программа

  должна преобразовать в  другой  тип  данных,  то  начальное

  предложение могло бы  иметь  вид:  "число,  которое  должно

  преобразовываться в такой-то тип данных";

       2) предложение, выражающее отношение между  аргументом

  и данными, которые он специфицирует. Эти отношения являются

  используемым механизмом передачи данных.

       Если испольуется механизм передачи "по  значению",  то

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

  XXX содержит такие-то данные".

       Если используется механизм передачи  "по  ссылке",  то

  это предложение записывается  вроде  следующего:  "аргумент

  XXX является адресом таких-то данных".

       Если используется механизм передачи "по  дескриптору",

  то это предложение записывается вроде следующего: "аргумент

  XXX является адресом дескриптора, указывающего на  такие-то

  данные".









                           - 69 -

                        00152-01 97 06


       1.1.3. Заголовок "возвращаемые значения  кодов

              состояния"


       Значение кода состояния представляет из  себя  длинное

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

  архитектуре операционной системы МОС ВП:

       1) индицирует успешное или неуспешное завершение  выз-

  ванной программы;

       2) описывает исключительные состояния;

       3) идентифицирует системные сообщения;

       4) сообщает  об  успешном  или  неуспешном  выполнении

  программы на уровне диалогового командного языка.

       Под заголовком "возвращаемые значения кодов состояний"

  в списке из двух колонок дан символический код для  каждого

  значения кода состояния, которое может вернуть программа, и

  соответствующее описание. Описание  поясняет,  означает  ли

  данное значение кода состояния успех или неудачу,  и,  если

  это неудача, то какие действия пользователя  могли  вызвать

  неудачу, а также, что можно сделать, чтобы исправить ситуа-

  цию.

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

  делены операционной системой  МОС  ВП.  Символический  код,

  определенный для каждого  значения  кода  состояния,  соот-

  ветствует числу, то есть идентичен значению кода  состояния

  размером в длинное слово, которое интерпретируется как чис-

  ло. Хотя  значение  кода  состояния  состоит  из  различных

  полей, каждое из которых может интерпретироваться  отдельно

  как конкретная информация, все значение кода состояния раз-



                           - 70 -

                        00152-01 97 06


  мером в длинное слово как  целое  может  интерпретироваться

  как целое число без знака размером в длинное слово, и  дан-

  ное длинное слово имеет эквивалентный символический код.

       Если вызываемая  программа  генерирует  исключительное

  состояние, то  данное  исключительное  состояние  включено.

  Исключительное состояние  затем  обрабатывается  программой

  обработки исключительных  состояний  (пользовательской  или

  системной). В зависимости  от  конкретного  исключительного

  состояния и от программы обработки  исключительных  состоя-

  ний, вызываемая программа либо продолжает нормальное выпол-

  нение, либо завершается по ошибке.

       Под заголовком "возвращаемые значения кодов состояния"

  описываются значения кодов состояния, возвращаемые програм-

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

  тельного состояния.



       1.1.4. Заголовок  "значения  кодов  состояния,

              возвращаемые    в    блок     состояния

              ввода-вывода"


       Если вызываемая  программа  возвращает  значение  кода

  состояния в блок состояния ввода-вывода, то возможные  зна-

  чения этих кодов  перечисляются  под  заголовком  "значения

  кодов   состояния,   возвращаемые    в    блок    состояния

  ввода-вывода".

       Некоторые программы системного обслуживания завершают-

  ся асинхронно, то есть они возвращают  управление  в  точку

  вызова сразу после того,  как  вызов  программы  системного



                           - 71 -

                        00152-01 97 06


  обслуживания успешно ставится в очередь, но перед  заверше-

  нием операции, которая  должна  быть  выполнена  программой

  системного обслуживания. Это позволяет вызывающей программе

  продолжать выполнение, в то время, как программа системного

  обслуживания сама еще выполняется. Все программы системного

  обслуживания, которые завершаются асинхронно,  имеют  аргу-

  менты, указывающие блок состояния ввода-вывода. После того,

  как операция программы системного обслуживания завершается,

  значение кода состояния, указывающее  состояние  завершения

  операции, записывается в блок состояния ввода-вывода.

       Первое слово в блоке состояния  ввода-вывода  получает

  значение кода состояния для конечного состояния  завершения

  асинхронной программы системного обслуживания.  Представле-

  ние значения кода размером в длинное слово в поле  размером

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

  поскольку старшее слово значения кода состояния  для  прог-

  раммы системного обслуживания содержит нуль.

       Одно поле в значении кода состояния  указывает,  какое

  средство сгенерировало код состояния. Данное поле  располо-

  жено в старшем слове длинного слова,  содержащего  значение

  кода состояния. Этот факт дает возможность представить зна-

  чение кода состояния, сгенерированного системным  средством

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

  слове, а не в длинном слове, так как все биты старшего сло-

  ва имеют значение нуль.








                           - 72 -

                        00152-01 97 06


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



       При вызове программ  системного  обслуживания  исполь-

  зуются стандартные соглашения вызова процедур  операционной

  системы МОС ВП. Языки программирования, которые  генерируют

  инструкции основного режима операционной  системы  МОС  ВП,

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

       При кодировании вызова программы системного обслужива-

  ния необходимо задать все аргументы, которые требует данная

  программа системного обслуживания.

       После завершения выполнения программы системного  обс-

  луживания, она возвращает управление  вызывающей  программе

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

  зировать значение кода состояния, чтобы определить, успешно

  или неуспешно прошел вызов программы системного  обслужива-

  ния. При этом программа, если  необходимо,  может  изменить

  последовательность выполнения.

       Для программиста, программирующего на  языке  макроас-

  семблер, необходимо прочитать подраздел 2.4,  где  подробно

  описано, как писать инструкции, которые  генерируют  вызовы

  программ системного обслуживания.

       Как программисту, программирующему на  языке  макроас-

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

  кого уровня, следует прочитать подразделы 2.2, 2.6. В  под-

  разделе 2.2 представлена информация по  спецификации  аргу-

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

  2.6 описаны методы проверки состояния возврата из программы




                           - 73 -

                        00152-01 97 06


  системного осблуживания.

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

  ния высокого уровня следует прочитать п. 1.2.7, где  приве-

  дена информация о том, как  вызывать  программы  системного

  обслуживания из языков  программирования  высокого  уровня.

  Детальная информация и  примеры  приведены  в  руководствах

  пользователей по соответствующему языку.

       Макрокоманды программ системного обслуживания  генери-

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

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

  в системной библиотеке SYS$LIBRARY:STARLET.MLB.  Библиотека

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

  ассемблировании исходной программы.

       Для понимания материала, представленного в этом разде-

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

  МОС ВП при программировании на языке макроассемблера (доку-

  менты [3] и [4]).



       2.1. Программы  системного  обслуживания   и

            целостность системы


       Многие программы системного  обслуживания  доступны  и

  удобны для прикладных программ, однако использование  неко-

  торых из этих программ должно быть ограничено, чтобы  защи-

  тить  работоспособность  операционной  системы  МОС  ВП   и

  целостность процессов пользователей.

       Например, поскольку создание постоянных почтовых  ящи-

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


                           - 74 -

                        00152-01 97 06


  ное пользование постоянными почтовыми ящиками может  умень-

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

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

  почтовых ящиков. Пользователю специально назначают привиле-

  гию использовать программу системного обслуживания "создать

  почтовый ящик" ($CREMBX) для создания постоянного почтового

  ящика.



       2.1.1. Привилегии пользователей


       Администратор системы, который сопровождает файл авто-

  ризации пользователей для операционной системы МОС ВП, пре-

  доставляет привилегии для пользования защищенными  програм-

  мами системного обслуживания. Файл авторизации  пользовате-

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

  сок специфических привилегий и квоты ресурсов.

       Когда пользователь подключается к операционной системе

  МОС ВП, то назначенные ему привилегии и квоты связываются с

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

  квоты относятся к каждому образу,  который  выполняет  про-

  цесс.

       Когда образ делает вызов программы системного обслужи-

  вания, которая защищена  привилегиями,  проверяется  список

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

  ческая привилегия, то образу разрешается выполнить програм-

  му системного обслуживания, в противном случае возвращается

  код состояния, указывающий на ошибку.





                           - 75 -

                        00152-01 97 06


       2.1.2. Квоты ресурсов


       Многие программы системного обслуживания  требуют  для

  своего выполнения определенных служебных ресурсов.  Служеб-

  ные ресурсы включают системную динамическую память и  квоты

  процесса для операций ввода-вывода. Когда вызывается  прог-

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

  контролируемый квотой, то  проверяется  квота  процесса  на

  требуемый ресурс. Если процесс  превысил  свою  квоту,  или

  процессу не была выделена квота, то  может  быть  возвращен

  код состояния, указывающий на ошибку. Обычно,  когда  вызы-

  вается  программа  системного  обслуживания,  а   требуемый

  ресурс недоступен, то процесс помещается в состояние ожида-

  ния до тех пор, пока  ресурс  не  станет  доступным.  Затем

  программа  системного  обслуживания  завершает  выполнение.

  Данный режим называется режимом ожидания ресурса.

       Однако в среде реального  времени  состояние  ожидания

  программы может быть нежелательным. В таких  случаях  прог-

  раммист может решить отменить режим ожидания  ресурса,  так

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

  возвращается в вызывающую программу с кодом состояния, ука-

  зывающим на ошибку. Режим ожидания ресурса можно  отключить

  (или включить) с помощью программы системного  обслуживания

  "установить режим ожидания ресурса" ($SETRWM).

       То, как программа реагирует на недоступность  ресурса,

  зависит в сильной степени от конкретной программы пользова-

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

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


                           - 76 -

                        00152-01 97 06


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

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

  тить, что программа должна была перейти в состояние  ожида-

  ния.



       2.1.3. Режим доступа


       Процесс может выполняться в одном из  четырех  режимов

  доступа:

       1) режим пользователя;

       2) режим супервизора;

       3) режим управления;

       4) режим ядра.

       Режим доступа определяет возможность процесса получить

  доступ к  страницам  виртуальной  памяти.  Каждая  страница

  имеет связанный с ней код защиты, задающий  тип  доступа  -

  читать, писать или нет доступа  -  допустимый  для  каждого

  режима (документы [5] и [6]).

       В большинстве случаев написанные  пользователем  прог-

  раммы выполняются в режиме пользователя. Системные програм-

  мы, выполняющиеся по запросу пользователя (например,  прог-

  раммы системного обслуживания), могут работать в  одном  из

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

  вилегированными.

       При некоторых вызовах программ системного обслуживания

  проверяется режим доступа вызывающей  программы.  Например,

  если процесс пытается отменить запросы таймера, то он может

  отменить только те запросы, которые были сделаны из того же



                           - 77 -

                        00152-01 97 06


  самого или менее привилегированных режимов  доступа.  Если,

  скажем, процесс выполняется в режиме пользователя, то он не

  может отменить запросы таймера, сделанные из режима  супер-

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

  вилегированные режимы доступа.

       Многие программы  системного  обслуживания  используют

  режим доступа, чтобы защитить ресурсы операционной  системы

  МОС ВП и для  этого  применяют  специальное  соглашение  по

  интерпретации аргументов  режима  доступа.  Можно  задавать

  режим доступа, используя числовые значения или  символичес-

  кие имена. В табл. 7 перечислены режимы доступа и приведены

  соответствующие им числовые значения и символические имена.

                                                    Таблица 7

  -----------------------------------------------------------

     Режим      !  Числовое  !  Символическое  !     Ранг

    доступа     !  значение  !       имя       !  привилегий

  -----------------------------------------------------------

   Режим ядра   !     0      !  PSL$C_KERNEL   !  Высокий

     Режим      !     1      !  PSL$C_EXEC     !    .

   управления   !            !                 !

     Режим      !     2      !  PSL$C_SUPER    !    .

  супервизора   !            !                 !

     Режим      !     3      !  PSL$C_USER     !  Низкий

  пользователя  !            !                 !


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

  аргументы режима доступа, могут только разрешить вызывающим

  программам задать режим доступа менее привилегированный или



                           - 78 -

                        00152-01 97 06


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

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

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

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

  доступа.

       Чтобы определить, какой  режим  доступа  использовать,

  операционная система МОС ВП сравнивает указанный режим дос-

  тупа с тем, из которого программа  системного  обслуживания

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

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

  результатом этой операции является режим доступа с  большим

  числовым значением (если режим доступа вызывающей программы

  отличается от указанного режима доступа), то режим  доступа

  "максимизирован".

       Поскольку большинство кодов, написанных пользователем,

  выполняются в режиме пользователя, то можно опускать  аргу-

  мент режима доступа. По  умолчанию  данный  аргумент  имеет

  значение 0 (режим ядра), а при сравнивании  этого  значения

  со значением текущего выполняемого режима доступа (3, режим

  пользователя) будет использовано наибольшее значение (3).



       2.2. Задание   аргументов    для    программ

            системного обслуживания


       Аргументы, которые требуются программе системного обс-

  луживания, приведены в разделе 13 в описании каждой из этих

  программ. Под заголовком "формат" каждого  такого  описания

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


                           - 79 -

                        00152-01 97 06


  показано в примере 1.

       Пример 1.

       $SERVICE ARGа, ARGB, ARGC, ARGD

       Формат указывает, что имя программы системного  обслу-

  живания есть SERVICE и  что  она  требует  задания  четырех

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

  ключевыми именами ARGа, ARGB, ARGC и ARGD. Для списка аргу-

  ментов этой программы  системного  обслуживания  необходимо

  использовать формат, изображенный на рис. 20.


                Формат списка аргументов

   31                                   8  7              0
  +---------------------------------------------------------+
  !                   0                   !         4       !
  +---------------------------------------------------------+
  !                         ARGA                            !
  +---------------------------------------------------------+
  !                         ARGB                            !
  +---------------------------------------------------------+
  !                         ARGC                            !
  +---------------------------------------------------------+
  !                         ARGD                            !
  +---------------------------------------------------------+

                            Рис. 20


       Все аргументы имеют размер  в  длинное  слово.  Первое

  длинное слово в списке всегда должно  содержать  в  младшем

  байте количество аргументов в списке. Остальные  три  байта

  должны быть равны нулю.

       Многие аргументы для вызова программ системного обслу-

  живания необязательны. Они отмечаются в формате макрокоман-

  ды квадратными скобками. Например,  если  второй  и  третий

  аргументы макрокоманды $SERVICE  необязательны,  то  формат

  этой макрокоманды имеет вид:



                           - 80 -

                        00152-01 97 06


       $SERVICE ARGа, [ARGB], [ARGC], ARGD

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

  программы системного обслуживания, то макрокоманда  исполь-

  зует для такого аргумента значение по умолчанию.

       Необязательные аргументы для программы системного обс-

  луживания всегда имеют значение по умолчанию, независимо от

  того, передаются ли они по значению, по ссылке или по деск-

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

  зательного аргумента равно нулю. Макрокоманды, используемые

  для  вызова  программ  системного  обслуживания,  позволяют

  некоторым  языкам  устанавливать  значения  по   умолчанию,

  отличные  от  нуля   (например,   макроассемблер   и   язык

  блисс-32).

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

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

  вания, если используется значение по умолчанию.

       Аргументы, которые задают адрес возврата,  могут  быть

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

  щает информацию. Если программа не требует информации, этот

  необязательный аргумент можно опустить.



       2.3. Получение  значений  для  символических

            кодов


       Отдельные программы системного обслуживания имеют сим-

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

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

  ных с этими  программами.  Например,  программа  системного



                           - 81 -

                        00152-01 97 06


  обслуживания "создать процесс" ($CREPRC),  которая  исполь-

  зуется для создания подпроцесса или отсоединенного процесса

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

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

  мому процессу.

       Макробиблиотека операционной системы МОС  ВП,  исполь-

  зуемая по умолчанию, STARLET.MLB, содержит макроопределения

  для большинства системных символических имен. При ассембли-

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

  этих макрокоманд, макроассемблер автоматически осуществляет

  поиск макроопределений  в  библиотеке  STARLET.MLB.  Каждое

  символическое имя имеет числовое значение.

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

  получения значений для  этих  символических  имен,  то  это

  об'ясняется в соответствующем руководстве пользователя.

       Если же язык не имеет такого средства, то  можно  сде-

  лать следующее:

       1) написать  короткую  программу  на  макроассемблере,

  которая содержит требуемую макрокоманду;

       2) ассемблировать эту программу и  сгенерировать  лис-

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

  на и их шестнадцатеричные значения;

       3) определить каждое символическое имя со своим значе-

  нием в исходной программе.

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

  луживания   "получить   информацию   о    задании/процессе"

  ($GETJPI) для  получения  суммарного  времени  центрального




                           - 82 -

                        00152-01 97 06


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

  цесса, необходимо получить значение, связанное с  идентифи-

  катором элемента JPI$_CPUTIM. Это можно  сделать  следующим

  способом:

       1) написать приведенную программу (пример 1)  из  трех

  строк  на   макроассемблере   (данная   программа   названа

  JPIDEF.MAR, однако допускается любое другое имя);

       Пример 1.

          .TITLE  JPIDEF   получить значения для $JPIDEF

          $JPIDEF GLOBAL

          .END

       2) ассемблировать и скомпоновать программу для  созда-

  ния файла JPIDEF.MAP (пример 2);

       Пример 2.

          $MACRO  JPIDEF

          $LINK/NOEXE/MAP/FULL    JPIDEF

          %LINK-W-USRTFR, IMAGE NL:[].EXE

       Файл  JPIDEF.MAP  будет  содержать  логические  имена,

  определенные макрокомандой $JPIDEF;

       3) найти значение идентификатора JPI$_CPUTIM и опреде-

  лить символическое имя в своей программе.



       2.4. Вызов программ системного  обслуживания

            из программ на языке макроассемблер


       Макрокоманды программ системного обслуживания  генери-

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

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


                           - 83 -

                        00152-01 97 06


  в системной библиотеке SYS$LIBRARY:STARLET.MLB.  Библиотека

  автоматически просматривается для разрешения ссылок, нераз-

  решенных при ассемблировании исходной программы.

       Для понимания материала данного подраздела  необходимо

  знание правил языка программирования макроассемблер.

       Каждая программа системного обслуживания имеет  четыре

  связанные с нею макрокоманды. Макрокоманды позволяют  поль-

  зователю определять символические имена для смещений  аргу-

  ментов, формировать список аргументов для программ  систем-

  ного обслуживания и вызывать программы системного  обслужи-

  вания.  Обобщенные  макрокоманды  и  функции,  которые  они

  выполняют, приведены в табл. 8.

                                                    Таблица 8

  -----------------------------------------------------------

  Макрокоманды !                 Функция

  -----------------------------------------------------------

  $имяDEF      ! Определяет символические имена для смещений

               ! в списке аргументов

  $имя         ! Определяет символические имена для смещений

               ! в списке аргументов и формирует список аргу-

               ! ментов

  $имя_S       ! Вызывает программу системного обслуживания и

               ! формирует список аргументов

  $имя_G       ! Вызывает программу системного обслуживания и

               ! использует список аргументов, сформированный

               ! макрокомандой $имя






                           - 84 -

                        00152-01 97 06


       2.4.1. Использование      макрокоманд      для

              формирования списков аргументов


       Имеется две обобщенные макрокоманды  для  формирования

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

  $имя_S.

       Использование той или  иной  макрокоманды  зависит  от

  того, какую макрокоманду используют  для  вызова  программы

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

  ного обслуживания используется макрокоманда $имя_G, то  для

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

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

  вания используется макрокоманда $имя_S, то эту же  макроко-

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

  тов.

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

  темного обслуживания используются макрокоманды  $имя_S  или

  $имя, то аргументы можно указать одним из трех способов:

       1) использовать ключевые слова для  описания  аргумен-

  тов.  За  каждым  ключевым  словом  должен  следовать  знак

  равенства (=), а затем значение аргумента;

       2) использовать  позиционный  порядок,  где  опущенные

  аргументы отмечаются запятыми в  соответствующих  позициях.

  Для необязательных аргументов в конце списка запятую  можно

  опускать;

       3) использовать как позиционный порядок, так и  ключе-

  вые имена (позиционные аргументы должны следовать в  списке

  первыми).



                           - 85 -

                        00152-01 97 06


       Пример.

        $SERVICE ARGA ,[ARGB] ,[ARGC], ARGD

       Предполагается, что в этом примере  аргументы  ARGA  и

  ARGB задают числовые значения,  а  аргументы  ARGC  и  ARGD

  задают адреса.

       В примерах 1 и 2 показаны  допустимые  способы  записи

  макрокоманды $имя_S для вызова программы $SERVICE.

       Примеры:

        1. Использование ключевых слов

  MYARGD: .LONG   100

           . . .

          $SERVICE_S  ARGB=#0, ARGC=0, ARGA=#1, ARGD=MYARGD



         2. Задание аргументов в позиционном порядке

  MYARGD: .LONG   100

          . . .

          $SERVICE_S  #1,,,MYARGD

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

          PUSHAL  MYARGD

          PUSHL   #0

          PUSHL   #0

          PUSHL   #1

       Все аргументы независимо от того, заданы ли они  пози-

  ционно или с помощью ключевых слов, должны быть допустимыми

  выражениями языка макроассемблер, поскольку они используют-

  ся как исходные операнды в инструкциях.

       В примерах 3 и 4 показаны  правильные  способы  записи




                           - 86 -

                        00152-01 97 06


  макрокоманды $имя, формирующей список аргументов для после-

  дующего вызова программы.

       Пример 3.

  LIST:   $SERVICE-

                  ARGB=0, -

                  ARGC=0, -

                  ARGA=1, -

                  ARGD=MYARGD

       Пример 4.

  LIST:   $SERVICE-

                  1,,,MYARGD

       В обоих случаях общий список аргументов имеет вид:

  LIST:   .LONG   4

          .LONG   1

          .LONG   0

          .LONG   0

          .ADDRESS -

                  MYARGD


       Все аргументы независимо от того, заданы ли они  пози-

  ционно или с помощью  ключевых  слов,  должны  быть  такими

  выражениями, из которых макроассемблер может  сгенерировать

  директивы данных .LONG и .ADDRESS. В отличие от этого аргу-

  менты макрокоманды $имя_S должны быть  правильными  выраже-

  ниями  макроассемблера,  поскольку  они  используются   как

  исходные операторы в инструкциях.







                           - 87 -

                        00152-01 97 06


       2.4.1.1. Соглашения  о  спецификации  аргументов

                для программ системного обслуживания


       Аргументы необходимо специфицировать в соответствии  с

  правилами макроассемблера операционной системы  МОС  ВП  по

  спецификации и адресации операндов.

       Способ спецификации конкретного аргумента  зависит  от

  следующих факторов:

       1) что требует в качестве аргумента программа  систем-

  ного обслуживания - адрес или  значение.  Булева  величина,

  число или маска принимаются в качестве аргумента;

       2) какая используется макрокоманда программы системно-

  го обслуживания.

       Если пользователю неизвестно, правильно ли он специфи-

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

  он может ассемблировать программу с директивой  .LIST  MEB,

  чтобы проверить макрорасширение (см. документ [3]).



       2.4.1.2. Определение  символических   имен   для

                смещений в списке  аргументов:  $имя  и

                $имяDEF


       К аргументам из списка аргументов можно обращаться  по

  символическому имени. Каждый аргумент в  списке  аргументов

  имеет смещение от начала списка. Для  численного  выражения

  смещения каждого аргумента определяется символическое  имя.

  Если для обращения к аргументам в списке используются  сим-

  волические имена, то нет  необходимости  помнить  численное




                           - 88 -

                        00152-01 97 06


  значение смещения (которое основывается на позиции аргумен-

  та, показанной в формате макрокоманды).

       Имена смещений для списков  аргументов  всех  программ

  системного обслуживания формируются путем  сцепления  имени

  макрокоманды программы системного обслуживания с  символами

  $_ и ключевым именем аргумента:

       Имя$_ключевое слово

  где имя

       - это имя программы системного обслуживания;

  ключевое слово

       - ключевое имя аргумента.

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

  для конкретной макрокоманды, определяется символически сле-

  дующим образом:

       Имя$_NARGS

       Символические имена для смещений в  списке  аргументов

  определяются автоматически, как только используется  макро-

  команда $имя для конкретной программы системного обслужива-

  ния. Кроме того, можно определить символические  имена  для

  списка  аргументов   программы   системного   обслуживания,

  используя  макрокоманду  $имяDEF.  Данная  макрокоманда  не

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

  ческие имена, так что они могут быть использованы позднее в

  программе.

       Пример.

       $QIODEF

       Макрокоманда  $QIODEF  определяет  символическое   имя




                           - 89 -

                        00152-01 97 06


  QIO$NARGS и символические имена смещений списка  аргументов

  программы системного обслуживания.

       Необходимость в макрокоманде $имяDEF может возникнуть,

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

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

  ды $имя, или если программа обращается к списку  аргументов

  в отдельно ассемблированном модуле.

       Например, макрокоманды $READEF и $READEFDEF определяют

  следующие значения:

       READEF$_NARGS -     число аргументов в списке (2);

       READEF$_EFN -       смещение аргумента EFN (4);

       READEF$_STATE -     смещение аргумента STATE (8).

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

  живания $READEF можно специфицировать макрокоманду  $READEF

  в целях построения списка аргументов.

       Пример 1.

  READLST: $READEF EFN=1,STATE=TEST1

       Позднее программе может понадобиться использовать дру-

  гое значение для аргумента STATE при вызове программы  сис-

  темного обслуживания. В примере 2 показано, как  это  можно

  выполнить, вызывая макрокоманду $имя_G.

       Пример 2.

          MOVAL           TEST2,READLST+READEF$_STATE

          $READEF_G       READLST

       Инстукция MOVAL заменяет адрес TEST1 в списке аргумен-

  тов программы $READEF на адрес  TEST2.  Затем  макрокоманда

  $READEF_G  вызывает  программу  системного  обслуживания  с




                           - 90 -

                        00152-01 97 06


  модифицированным списком.



       2.4.2. Использование  макрокоманд  для  вызова

              программ системного обслуживания


       Имеется две обобщенные макрокоманды для записи  вызова

  программы системного обслуживания:

       $имя_S

       $имя_G

       Выбор конкретной макрокоманды  зависит  от  того,  как

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

  луживания:

       1) макрокоманда $имя_S требует,  чтобы  аргументы  для

  программы системного обслуживания были представлены в  мак-

  рокоманде этой программы. Макрокоманда генерирует  код  для

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

  программы. С помощью этой макрокоманды  можно  использовать

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

       2) макрокоманда $имя_G требует, чтобы список  аргумен-

  тов был сформирован в каком-то месте программы и был указан

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

  темного обслуживания  (имеется  макрокоманда  для  создания

  списка аргументов для каждой программы системного  обслужи-

  вания. С помощью этой макрокоманды можно использовать  один

  и тот же список аргументов с необходимыми модификациями для

  более чем одного вызова макрокоманды).

       Макрокоманда $имя_S  генерирует  инструкцию  CALLS,  а

  макрокоманда $имя_G генерирует инструкцию CALLG.  Программы



                           - 91 -

                        00152-01 97 06


  системного обслуживания вызываются в соответствии со  стан-

  дартными соглашениями по вызову процедур. Программы систем-

  ного обслуживания сохраняют все регистры кроме R0  и  R1  и

  восстанавливают сохраненные регистры перед тем, как вернуть

  управление в точку вызова.



       2.4.2.1. Макрокоманда $имя_S


       Формат

       $имя_S ARG1,...,ARGN

       Макрокоманда генерирует код для помещения аргументов в

  стек в обратном порядке. Действительные инструкции, исполь-

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

  дующим образом:

       1) если программа системного  обслуживания  требует  в

  качестве аргумента  значение,  то  генерируется  инструкция

  PUSHL или MOVZWL;

       2)  если  программа  системного  обслуживания  требует

  адрес в качестве аргумента, то в зависимости  от  контекста

  генерируется инструкция PUSHAB, PUSHAW, PUSHAL, PUSHAQ.

       Затем макрокоманда генерирует вызов программы  систем-

  ного обслуживания (пример 1).

       Пример 1.

          CALLS   #N, @#SYS$имя

  где #N - число аргументов в стеке.

       Поскольку макрокоманда $имя_S формирует  список  аргу-

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

  представлять, используя режимы адресации регистров  (пример



                           - 92 -

                        00152-01 97 06


  2).

       Пример 2.

       $READEF_S  EFN=#1, STATE=(R10)

       Регистр R10 содержит  адрес  длинного  слова,  которое

  принимает информацию о состоянии флагов.

       Данная макрокоманда расширяется следующим образом:

          PUSHAL  (R10)

          PUSHAL  #1

          CALLS   #2, @#SYS$READEF



       2.4.2.2. Макрокоманда $имя_G


       Формат

       $имя_G метка

  где метка - это адрес списка аргументов.

       Макрокоманда $имя предназначена  для  создания  списка

  аргументов макрокоманды $имя_G (пример 1).

       Пример 1.

       Метка: $имя ARG1,...,ARGN



  где метка - символический  адрес  сгенерированного списка

              аргументов. Эта метка используется в качестве

              аргумента  в макрокоманде $имя_G;

      $имя -  это  имя   макрокоманды  программы системного

              обслуживания;

      ARG1,...ARGN -  аргументы, которые размещаются в после-

                      довательных длинных словах списка аргу-

                      ментов.



                           - 93 -

                        00152-01 97 06


       Макрокоманда $имя_G (используемая с марокомандой $имя)

  особенно полезна для выполнения следующих действий:

       1) вызов  программ  системного  обслуживания,  имеющих

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

       2) повторный вызов программ системного обслуживания во

  время выполнения отдельной программы с тем же самым  или  в

  основном с тем же самым списком аргументов.

       Формат макрокоманды программы системного  обслуживания

  $READEF показан в примере 2.

       Пример 2.



       $READEF   EFN, STATE

       Аргумент EFN указывает номер кластера флагов  событий,

  а аргумент STATE указывает адрес  длинного  слова,  которое

  принимает содержимое кластера.

       Данные аргументы можно специфицировать, используя мак-

  рокоманду $имя (пример 3).

       Пример 3.

  READLST:

          $READEF EFN=1, -    ;список аргументов для $READEF

                  STATE=TESTFLAG

       Макрокоманда $READEF генерирует код, представленный  в

  примере 4.

        Пример 4.

  READLST:

          .LONG   2       ;список аргументов для $READEF

          .LONG   1




                           - 94 -

                        00152-01 97 06


          .ADDREESS -

                  TESTFLAG

       Теперь для выполнения макрокоманды  $READEF  требуется

  строка, приведенная в примере 5.

        Пример 5.

          $READEF_G       READLST

       Данная макрокоманда генерирует  для  вызова  программы

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

        Пример 6.

          CALLG   READLST,@#SYS$READEF

       Где SYS$READEF - имя вектора для точки входа программы

  системного обслуживания "читать флаги событий". Компоновщик

  автоматически разрешает адреса точек входа для  всех  прог-

  рамм системного обслуживания.



       2.5. Завершение     программ      системного

            обслуживания


       После  завершения  программы  системного  обслуживания

  управление возвращается в вызывающую  программу.  Пользова-

  тель может решить, когда и как  управление  возвращается  в

  его программу, выбирая  синхронную  или  асинхронную  формы

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

  выполнения процесса.











                           - 95 -

                        00152-01 97 06


       2.5.1. Синхронные  и   асинхронные   программы

              системного обслуживания


       Целый  ряд  программ  системного  обслуживания   может

  выполняться  либо  синхронно,  либо  асинхронно  (например,

  SYS$GETJPI и SYS$GETJPIW). Символ "W" в конце  имени  прог-

  раммы системного обслуживания указывает на синхронную  вер-

  сию программы системного обслуживания.

       Асинхронная версия программы  системного  обслуживания

  ставит запрос в очередь и возвращает управление в  вызываю-

  щую программу. Вызывающая программа может выполнять  опера-

  ции, пока выполняется программа системного обслуживания. Не

  проверив, что программа  системного  обслуживания  закончи-

  лась, не имеет смысла обращаться к информации, возвращаемой

  этой программой.

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

  темного  обслуживания  флаг  события  и   блок   управления

  ввода-вывода.  Когда  программа   системного   обслуживания

  заканчивается, она устанавливает флаг события и помещает  в

  блок ввода-вывода конечное состояние запроса. Чтобы удосто-

  вериться,  что  данная  программа  системного  обслуживания

  закончилась, следует использовать программу системного обс-

  луживания  SYS$SYNCH.  Программе  системного   обслуживания

  SYS$SYNCH  передается  флаг  события   и   блок   состояния

  ввода-вывода. Программа SYS$SYNCH ожидает, пока будет уста-

  новлен флаг события, затем убеждается, что именно программа

  системного обслуживания, а не какая-либо  другая  программа

  установила   флаг   события,   проверяя   блок    состояния



                           - 96 -

                        00152-01 97 06


  ввода-вывода. Если  блок  состояния  ввода-вывода  все  еще

  нулевой, то программа SYS$SYNCH  ожидает,  пока  заполнится

  блок состояния ввода-вывода.

       Синхронная версия  программы  системного  обслуживания

  действует точно так, как если бы использовалась асинхронная

  версия, за которой сразу следует вызов программы SYS$SYNCH.

  Независимо от того, используется ли синхронная  или  асинх-

  ронная версия программы системного обслуживания, если опус-

  кается аргумент EFN, то программа  системного  обслуживания

  использует флаг события с нулевым номером.

       Пример использования программы системного обслуживания

  $SYNCH в программе на языке  фортран  операционной  системы

  МОС ВП.

        Пример.

          ! структура данных для SYS$GETJPI

              . . .

          INTEGER*4 STATUS,

          2         FLAG,

          2         PID_VALUE

          ! блок состояния ввода-вывода

          INTEGER*2 JPISTATUS,

          2         LEN

          INTEGER*4 ZERO /0/

          COMMON /IO_BLOCK/ JPISTATUS,

          2                 LEN,

          2                 ZERO

             . . .




                           - 97 -

                        00152-01 97 06


          ! вызвать SYS$GETJPI и ждать информацию

          STATUS = LIB$GET_EF (FLAG)

          IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))

          STATUS = SYS$GETJPI (%VAL(FLAG)),

          2                    PID_VALUE,

          2                    ,

          2                    NAME_BUF_LEN,

          2                    JPISTATUS,

          2                    ,)

          IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))

             . . .

          STATUS = SYS$SYNCH (%VAL(FLAG),

          2                   JPISTATUS)

          IF (.NOT. JPISTATUS) THEN

             CALL LIB$SIGNAL (%VAL(JPISTATUS))

          END IF

          END



       2.5.2. Режим выполнения процессов


       Режимы выполнения процессов оказывают влияние  на  то,

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

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

  ошибка. Таких режимов два:

       1) режим ожидания ресурса;

       2) режим исключительной ситуации по  ошибке  программы

  системного обслуживания.





                           - 98 -

                        00152-01 97 06


       Если изменить в программе установку по умолчанию любо-

  го из этих режимов, то в результате программа должна  будет

  обрабатывать специальные состояния возврата.



       2.5.2.1. Режим ожидания ресурса


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

  вания, а требуемый ресурс недоступен, процесс помещается  в

  состояние ожидания, пока ресурс не станет доступным.  После

  этого  программа  системного  обслуживания  завершает  свое

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

  са.

       Однако, в среде реального времени может  быть  нежела-

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

  лючить режим  ожидания  ресурса,  так  что  если  требуемый

  ресурс недоступен, управление сразу же возвращается в вызы-

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

  зывает на ошибку. Режим ожидания  ресурса  можно  отключить

  (или заново включить) с помощью программы системного обслу-

  живания "установить режим ожидания ресурса ($SETRWM)".

       То, как программа реагирует на недоступность  ресурса,

  в большой степени зависит от программы пользователя и конк-

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

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

  выполнение и попытаться повторить вызов программы системно-

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

  ся только отметить, что программе потребовалось  перейти  в

  ожидание.



                           - 99 -

                        00152-01 97 06


       2.5.2.2. Режим исключительной ситуации по ошибке

                программы системного обслуживания


       Если при выполнении программы системного  обслуживания

  возникает ошибка, то обычно управление передается следующей

  инструкции в вызывающей программе, которая может  проверить

  значение возвращенного кода состояния в регистре R0,  чтобы

  определить, успешно или неуспешно  прошел  вызов  программы

  системного обслуживания.

       Чтобы определить ошибку при выполнении вызова програм-

  мы системного обслуживания,  отреагировать  на  нее,  можно

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

  ной системы МОС ВП. Тогда при возникновении ошибки  генери-

  руется исключительное состояние программного обеспечения  и

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

       Данный режим называется режимом исключительной  ситуа-

  ции по ошибке программы системного обслуживания.  Он  может

  быть включен (или выключен) с помощью программы  системного

  обслуживания "установить режим исключительной  ситуации  по

  ошибке программы системного  обслуживания"  ($SETSFM),  как

  показано в примере.

        Пример.

          $SETSFM_S       ENBFLG=#1

       Данный вызов включает возможность  генерации  исключи-

  тельных ситуаций при возникновении  простых  или  серьезных

  ошибок во время выполнения программы системного  обслужива-

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

  тельные ситуации не генерируются).



                           - 100 -

                        00152-01 97 06


       Следующие программы системного обслуживания форматиро-

  вания и преобразования не  реагируют  на  включение  режима

  исключительной ситуации по ошибке  и  не  генерируют  соот-

  ветствующих ситуаций:

       $ASCTIM

       $BINTIM

       $FAO/$FAOL

       $PUTMSG

       $UNWIND

       Если  пользователь  пишет  программу,  которая  должна

  выполняться с включенным режимом исключительной ситуации по

  ошибке, то он может написать и подпрограмму обработки кодов

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

  ботки кодов  состояния,  при  возникновении  исключительной

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

  то программа обработки кодов состояний, принятая по умолча-

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

  дисплей описательную информацию о состоянии  исключительной

  ситуации.

       Не рекомендуется включать в программах на языках прог-

  раммирования высокого уровня режим исключительной  ситуации

  по ошибке, за исключением, может быть, определенных  ситуа-

  ций при отладке программы. Если программист  включает  этот

  режим в программе, но не  об'являет  собственную  программу

  обработки кодов состояний, то множество сообщений об  ошиб-

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

  ленными. Компиляторы языков программирования высокого уров-




                           - 101 -

                        00152-01 97 06


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

  многих предложений или инструкций исходной программы. (Нап-

  ример, чтение  и  запись  файла  генерирует  вызов  системы

  управления данными  СУД-32,  которая  использует  программы

  системного обслуживания $QIO и $QIOW). Если  включен  режим

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

  ошибок (такие как попытка  ввода-вывода  на  несуществующее

  устройство или нечисловой ввод в математическую  программу)

  будут    генерировать    одно    и    то    же    сообщение

  "$SYSTEM-F-SSFAIL, исключительная ситуация по ошибке  прог-

  раммы системного обслуживания ...".



       2.6. Значения кодов состояния,  возвращаемых

            из программ системного обслуживания


       Когда программа  системного  обслуживания  заканчивает

  выполнение, всегда возвращается числовое значение кода сос-

  тояния. При вызове программ системного обслуживания на язы-

  ке макроассемблер операционной системы МОС ВП значение кода

  состояния возвращается  в  общем  регистре  R0.  Механизмы,

  используемые в  языках  программирования  высокого  уровня,

  различны.

       В зависимости  от  конкретных  нужд,  можно  проверить

  только младший бит, три младших бита или все значение цели-

  ком:

       1) младший бит индицирует успешное (1) или  неуспешное

  (0) завершение программы системного обслуживания;





                           - 102 -

                        00152-01 97 06


       2)  три  младших  бита,  взятые  вместе,  представляют

  серьезность ошибки. Значения кодов серьезности ошибки пере-

  числены в табл. 9.

       Символические имена определяются макрокомандой опреде-

  ления символических имен $STSDEF;

       3) остальные биты (с 3 по 31) классифицируют  конкрет-

  ное состояние возврата и  компоненту  операционной  системы

  МОС ВП, которая выдала значение кода состояния.

       Для значений кодов состояния возврата программ систем-

  ного обслуживания старшее слово (биты с 16 по 31)  содержат

  нули.

                                                    Таблица 9

  -----------------------------------------------------------

  Значение!          Описание             ! Символическое имя

  -----------------------------------------------------------

    0     ! Предупреждение                ! STS$K_WARNING

    1     ! Успех                         ! STS$K_SUCCESS

    2     ! Ошибка                        ! STS$K_ERROR

    3     ! Информационное сообщение      ! STS$K_INFO

    4     ! Серьезная или фатальная ошибка! STS$K_SEVERR

   5-7    ! Не используются               !

       Каждое числовое значение кода состояния имеет уникаль-

  ное символическое имя в следующем формате:

       SS$_код



  где код - мнемоника, описывающая состояние возврата.






                           - 103 -

                        00152-01 97 06


       Примеры:

        1.     SS$_NORMAL       - успешное завершение



        2.     SS$ACCVIO        - нарушение режима доступа

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

  включены в системную библиотеку  (SYS$LIBRARY:STARLET.OLB),

  которая принимается по умолчанию. Листинг этих  символичес-

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

  системную макрокоманду $SSDEF. Символические имена значений

  системных кодов состояния используют для  проверки  возвра-

  щаемых кодов состояния, обработки кодов состояний.



       2.6.1. Информация,   содержащаяся   в    кодах

              состояний


       Значения  кодов  состояния,  возвращаемые  программами

  системного  обслуживания,  могут   содержать   определенную

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

  или неуспешное завершение программы  системного  обслужива-

  ния. Код SS$NORMAL является значением, индицирующим  успеш-

  ное завершение, однако определены также и другие  значения.

  Например, значение  кода  состояния  SS$BUFFEROVF,  которое

  возвращается, если длина строки  символов  выходных  данных

  программы системного обслуживания больше, чем размер прини-

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

  дает программе дополнительную информацию.

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

  некоторыми ошибками  указывают,  что  программа  системного



                           - 104 -

                        00152-01 97 06


  обслуживания могла выполнить некоторую  часть,  но  не  всю

  запрошенную функцию.

       Возможные  значения  кодов  состояния,  которые  может

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

  ны в описаниях отдельных программ (см. разлел 13). Програм-

  мист, который пишет вызовы программ  системного  обслужива-

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

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

  рять конкретные коды состояния.



       2.6.2. Проверка возвращаемых кодов состояний


       Чтобы проверить, успешно ли закончился вызов программы

  системного обслуживания, программа  может  проанализировать

  младший бит регистра R0 и перейти к программе контроля оши-

  бок, если этот бит содержит 0.

        Пример 1.

          BLBC    R0,ERRLABEL

  где ERRLABEL - метка программы обработки ошибок.

       Программы не проверяются на успешное окончание,  срав-

  нивая состояние возврата с символическим именем SS$_NORMAL.

       Программа контроля ошибок может контролировать  специ-

  фические значения или специфические уровни серьезности оши-

  бок. Например,  следующая  инструкция  проверяет  ошибочное

  состояние при недопустимом числе флагов событий (пример 2).









                           - 105 -

                        00152-01 97 06


        Пример 2.

          CMPL    #SS$_ILLEFC,R0  ; допустимо ли число флагов

                                  ; событий

       Значения кодов состояния возврата всегда имеют  размер

  длинного слова, однако старшие слова  всех  значений  кодов

  состояния, которые возвращаются в регистре  R0  программами

  системного обслуживания, всегда одинаковые.



       2.6.3. Системные    сообщения,    генерируемые

              кодами состояния


       Если программа выполняется по команде RUN  языка  DCL,

  то интерпретатор команд использует содержимое  регистра  R0

  для выдачи описательного сообщения при неуспешном  заверше-

  нии программы.

       Следующий фрагмент кода  показывает  пример  программы

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

        Пример.

          $READEF_S-

                  EFN=#64,-

                  STATE=TEST

          BSBW    ERROR

             . . .

  ERROR:  BLBC    R0,10$  ; проверить регистр R0

          RSB             ; успешно, вернуться

  10$:    RET             ; выход с кодом состояния в R0

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

  инструкция BSBW осуществляет переход к подпрограмме  ERROR.



                           - 106 -

                        00152-01 97 06


  подпрограмма проверяет младший бит в регистре R0 и, если он

  равен 0, то переходит к инструкции RET, которая приводит  к

  выходу с сохраненным кодом состояния в регистре R0. В  про-

  тивном случае (если младший бит в R0 равен 1)  подпрограмма

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

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

  вызове программы системного обслуживания $READEF, не досту-

  пен в данный момент процессу, то происходит выход из  прог-

  раммы, а интерпретатор команд выдает следующее сообщение:

  %SYSTEM-F-UNASEFC      ; кластер флагов событий отсоединен

       Ключевое слово UNASEFC в сообщении соответствует  зна-

  чению кода состояния SS$UNASEFC.

       Три серьезные ошибки, приведенные в табл. 10,  которые

  генерируются самими вызовами, а не  программами  системного

  обслуживания, могут возвращаться из вызовов  программ  сис-

  темного обслуживания.

                                                   Таблица 10

  -----------------------------------------------------------

    Ошибка    !                Значение

  -----------------------------------------------------------

  SS$_ACCVIO  ! Список аргументов не может  быть считан вызы-

              ! вающей  программой   (используя  макрокоманду

              ! $имя_G)  и программа системного обслуживания

              ! не вызывается. Это верно не для всех программ

              ! системного обслуживания.

              ! Если SS$ACCVIO возвращается из отдельных про-

              ! грамм  системного  обслуживания, то программа




                           - 107 -

                        00152-01 97 06


                                         Продолжение табл. 10

  -----------------------------------------------------------

    Ошибка    !                Значение

  -----------------------------------------------------------

              ! вызывается,  но при этом один или более аргу-

              ! ментов программы  не могут быть прочитаны или

              ! записаны вызывающей программой

  SS$_INSFARG ! Недостаточно аргументов для вызова программы

  SS$_ILLSER  ! Была вызвана недопустимая программа системно-

              ! го обслуживания



       2.7. Вызовы программ системного обслуживания

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

            уровня


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

  операционной системой МОС  ВП,  обеспечивает  механизм  для

  вызова внешней программы и передачи аргументов в эту  прог-

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

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

  данного руководства невозможно  описать  способы,  которыми

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

  обслуживания.

       Программы системного обслуживания операционной системы

  МОС ВП являются  внешними  программами,  которые  принимают

  аргументы. Имеется три способа передачи аргументов програм-

  ме системного обслуживания (рис. 21 - 23):





                           - 108 -

                        00152-01 97 06


       1) по значению. Если аргумент размером в длинное слово

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

  должны использоваться программой, то реальные данные  пере-

  даются программе по значению. В этом случае в длинном слове

  аргумента  содержатся  реальные  данные,  другими  словами,

  аргумент и есть реальные данные. Поскольку длина  аргумента

  равна длинному слову, то  по  значению  могут  передаваться

  только такие данные, которые представляются длинным словом;

       2) по ссылке. Если аргумент размером в  длинное  слово

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

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

  В этом случае аргумент является указателем на данные;

       3) по дескриптору. Если аргумент  размером  в  длинное

  слово из списка аргументов содержит адрес  дескриптора,  то

  данные передаются по  дескриптору.  Дескриптор  состоит  из

  двух или более длинных слов (в зависимости от типа  исполь-

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

  на и адрес тех данных, которые должны использоваться  вызы-

  ваемой программой; в этом случае аргумент используется  как

  указатель на дескриптор, который в  свою  очередь  является

  указателем на реальные данные.

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

  (см. раздел 13) указано,  как  должен  передаваться  каждый

  аргумент. Такие фразы  как  "адрес"  и  "адрес  дескриптора

  строки символов" указывают,  что  это  аргумент-ссылка  или

  аргумент-дескриптор,  соответственно.  Фразы  типа  "булево

  значение", "число", "значение" или "маска"  указывают,  что




                           - 109 -

                        00152-01 97 06


  аргумент передается по значению. Как  аргументы  передаются

  программам системного обслуживания (см. рис. 21 - 23).

       Для некоторых программ системного  обслуживания  также

  требуются  структуры  данных,  специфичные  для  конкретной

  программы системного обслуживания, которые указывают, какие

  должны быть выполнены функции или какая  информация  должна

  возвращаться.



       2.7.1. Проверка  значений  возвращаемых  кодов

              состояния  в  языках   программирования

              высокого уровня


       Когда  программа  системного  обслуживания  возвращает

  управление в программу пользователя, она помещает  в  общий

  регистр R0 значение состояния возврата. Значение в  младшем

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

  ния закончилась успешно, либо какая-то конкретная ошибка не

  дала выполнить некоторые или все свои функции. После каждо-

  го вызова программы системного обслуживания необходимо про-

  верить, закончилась ли она успешно. Можно  также  проверить

  состояния, описывающие конкретные ошибки.

       Каждый язык  обеспечивает  определенный  механизм  для

  проверки состояний возврата. Часто требуется только  прове-

  рить младший бит, сравнивая его  с  логическими  значениями

  TRUE (успешное окончаение или информационное сообщение  при

  возврате) и FALSE (ошибка или предупреждающее сообщение при

  возврате).





                           - 110 -

                        00152-01 97 06


       Для проверки всего значения  на  конкретное  состояние

  возврата, каждый язык  обеспечивает  способ  определения  в

  программе значений, связанных  с  конкретными  символически

  заданными кодами. В  программе  при  кодировании  теста  на

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

  имена.

       В  руководствах  пользователей  по  конкретным  языкам

  изложена информация о контроле кодов возврата.


               Аргумент, передаваемый по значению

                    Список аргументов
                    !              !
                    ----------------
                    !          ! N ! (AP)
                    ----------------
                    !  Аргумент 1  !
                    ----------------
                    !  Аргумент 2  !
                    ----------------
                    !Действительное!
                    !   значение   !
                    ----------------
                    !     . . .    !
                    ----------------
                    !  Аргумент N  !
                    ----------------
                    !              !

                            Рис. 21



















                           - 111 -

                        00152-01 97 06


             Аргумент, передаваемый по ссылке

                  !              !
                  ----------------
                  !          ! N ! (AP)
                  ----------------
                  !  Аргумент 1  !
                  ----------------
                  !  Аргумент 2  !
                  ----------------
                  !Указатель на  ! -------------------------
                  !действительное!         Данные          !
                  !значение      !     ----------------    !
                  ----------------     !Действительное!<----
                  !    . . .     !     !   значение   !
                  ----------------     ----------------
                  !  Аргумент N  !
                  ----------------
                  !              !

                            Рис. 22


                Аргумент, передаваемый по дескриптору

  !              !                             --> ----- ----
  ----------------                             !   ! A !  ^
  !          ! N ! (AP)                        !   -----  !
  ----------------                             !   ! B !  !
  !  Аргумент 1  !                             !   -----  !
  ----------------                             !   ! C !  !
  !  Аргумент 2  !                             !   -----  !
  ----------------                             !   ! D !  д
  ! Указатель на !---------------------------  !   -----  л
  !  дексриптор  !     Дескриптор           !  !   ! E !  и
  ----------------  --------------------    !  !   -----  н
  !     . . .    !  !Класс! Тип  !Длина!<----  !   ! F !  а
  ----------------  !     !данных!     !       !   -----  !
  !  Аргумент N  !  --------------------       !   ! G !  !
  ----------------  !      ---------------------   -----  !
  !              !  !    Указатель     !           ! H !  V
                    --------------------           ----- ----

                            Рис. 23













                           - 112 -

                        00152-01 97 06


   3. Программы системного обслуживания обеспечения защиты



       Программы системного обслуживания  обеспечения  защиты

  операционной системы МОС ВП обеспечивают различные механиз-

  мы для повышения уровня защиты операционной системы МОС ВП.

  Программы системного обслуживания включают средства для:

       1) создания и сопровождения базы данных прав;

       2) создания и трансляции элементов  списка  управления

  доступом;

       3) модификации списка прав процессов;

       4) контроля защиты доступа;

       5) обеспечения шаблона стирания секретных данных;

       6) управления доступом к магнитным лентам.

       В табл.11 перечислены программы системного  обслужива-

  ния, имеющие отношение к защите  операционной  системы  мос

  вп.


                                                   Таблица 11

  -----------------------------------------------------------

  Имя программы    !              Функция

  системного обслу-!

  живания          !

  -----------------------------------------------------------

  $ADD_HOLDER      ! Добавляет  в  базу  данных  прав  запись

                   ! держателя

  $ADD_IDENT       ! Добавляет идентификатор  в  базу  данных

                   ! прав




                           - 113 -

                        00152-01 97 06


                                         Продолжение табл. 11

  -----------------------------------------------------------

  Имя программы    !              Функция

  системного обслу-!

  живания          !

  -----------------------------------------------------------

  $ASCTOID         ! Транслирует  имя идентификатора в двоич-

                   ! ное число

  $CHANGE_ACL      ! Создает  или  модифицирует список ACL

  $CHKPRO          ! Вызывает  системную  программу  контроля

                   ! защиты доступа

  $CREATE_RDB      ! Инициализирует базу данных прав

  $ERAPAT          ! Генерирует  шаблон  стирания   секретных

                   ! данных

  $FIND_HELD       ! Возвращает  идентификатор(ы), принадле-

                   ! жащий держателю в базе данных

  $FIND_HOLDER     ! Возвращает держатель идентификатора в

                   ! базе данных прав

  $FINISH_RDB      ! Отменяет поток записей и очищает

                   ! значение контекста при поиске в базе

                   ! данных прав

  $FORMAT_ACL      ! Форматирует элемет ACL в строку текста

  $GRANTID         ! Добавляет идентификатор к  процессу  или

                   ! в системный список прав

  $IDTOASC         ! Транслирует  значение  идентификатора  в

                   ! имя этого идентификатора

  $MOD_HOLDER      ! Модифицирует  запись  держателя  в  базе




                           - 114 -

                        00152-01 97 06


                                         Продолжение табл. 11

  -----------------------------------------------------------

  Имя программы    !              Функция

  системного обслу-!

  живания          !

  -----------------------------------------------------------

                   ! данных прав

  $MOD_IDENT       ! Модифицирует  запись   идентификатора  в

                   ! базе данных прав

  $MTACCESS        ! Управляет  доступом  к  магнитным лентам

  $PARSE_ACL       ! Преобразовывает  текст  элемента  ACL  в

                   ! двоичный формат

  $REM_HOLDER      ! Удаляет запись держателя из списка  дер-

                   ! жателей идентификаторов  в  базе  данных

                   ! прав

  $REM_IDENT       ! Удаляет  идентификатор  и  всех держате-

                   ! лей этого   идентификатора  из  базы

                   ! данных прав

  $REVOKID         ! Удаляет   идентификатор  из процесса или

                   ! системного списка прав



       3.1. Обзор схемы защиты операционной системы

            МОС ВП


       Основой  схемы  защиты  операционной  системы  МОС  ВП

  является идентификатор, 32-битовое двоичное число,  который

  представляет процесс в системе. Идентификатор может  предс-

  тавлять отдельного пользователя, группу  пользователей  или



                           - 115 -

                        00152-01 97 06


  какой-то аспект среды,  в  которой  работает  пользователь.

  Процесс является держателем идентификатора, если  идентифи-

  катор может представлять этот процесс в операционной систе-

  ме МОС ВП.

       Системная база данных прав является  идексным  файлом,

  состоящим из  записей  идентификаторов  и  держателей  этих

  идентификаторов в операционной системе МОС ВП. Когда  поль-

  зователь входит в операционную систему  МОС  ВП,  программа

  LOGINOUT создает список прав для процесса из  соответствую-

  щих элементов в базе данных прав. Таким образом список прав

  процесса содержит все идентификаторы,  которые  имеет  про-

  цесс. Процесс может быть держателем нескольких  идентифика-

  торов. Список прав процесса становится  частью  процесса  и

  распространяется на любой создаваемый процесс.

       Когда процесс пытается  получить  доступ  к  какому-то

  об'екту в операционной системе МОС ВП, последняя использует

  список прав для проверки защиты. Она сравнивает идентифика-

  торы в списке прав с атрибутами защиты об'екта и  разрешает

  или запрещает доступ к этому об'екту на основе этого  срав-

  нения. Другими словами элеметы списка прав еще не  гаранти-

  руют доступа, они используются операционной системой МОС ВП

  для контроля защиты, когда процесс пытается получить доступ

  к об'екту.

       Схема защиты операционной системы МОС ВП  обеспечивает

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

  (ACL). Список  управления  доступом  состоит  из  элементов

  (ACE),  определяющих  тип  доступа,  который  идентификатор




                           - 116 -

                        00152-01 97 06


  имеет к об'ектам типа файл, устройство или  почтовый  ящик.

  Когда процесс пытается получить доступ к об'екту со связан-

  ным списком ACL, операционная система МОС ВП разрешает  или

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

  соответствие в базе данных прав для идентификатора из спис-

  ка ACL.



       3.2. Идентификаторы


       Базовой компонентой схемы защиты операционной  системы

  МОС ВП является идентификатор. Это 32-битовое двоичное чис-

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

  операционную систему МОС ВП. Эти типы  пользователей  вклю-

  чают отдельных пользователей, группы пользователей  и  раз-

  личные среды, в которых оперирует процесс.



       3.2.1. Форматы идентификаторов


       Идентификаторы имеют два формата в базе  данных  прав:

  формат UIC и формат ID, представленные на  рис.  24  и  25.

  Старшие биты значения  идентификатора  задают  его  формат.

  Если два старших бита имеют значение нуль, то это указывает

  на формат UIC идентификатора, если бит  31  установлен,  то

  это указывает на формат ID идентификатора.

       Каждый идентификатор UIC является уникальным и  предс-

  тавляет пользователя операционной системы MОС ВП. Идентифи-

  катор UIC содержит два  старших  бита,  которые  определяют

  формат, поле члена, поле группы. Номера членов меняются  от




                           - 117 -

                        00152-01 97 06


  0 до 65534, номера группы меняются от 1 до 16382.



                    Формат UIC

         31                               0
         +----------+-----------+---------+
         !  00      !  Группа   !  Член   !
         +----------+-----------+---------+

                            Рис. 24


       Если бит 31 установлен, то это указывает на формат ID.

  Биты с 30 по 28 не используются. Остальные биты задают зна-

  чение идентификатора.



                    Формат ID

         31                               0
         +----------+---------------------+
         !  1000    !   Идентификатор     !
         +----------+---------------------+

                            Рис. 25


       3.2.2. Имена идентификаторов


       Для операционной системы MОС ВП идентификаторы являют-

  ся двоичными числами, однако, чтобы сделать  идентификаторы

  более удобными для использования, операционная система  МОС

  ВП транслирует двоичное значение идентификатора в имя иден-

  тификатора. Двоичное значение и имя идентификатора  связаны

  в базе данных прав.

       Имя   идентификатора   содержит    от    1    до    31

  алфавитно-цифровых символа, из которых по крайней мере один

  символ не цифра. Имя идентификатора не может  целиком  сос-

  тоять из цифровых символов. Оно может включать символы от A



                           - 118 -

                        00152-01 97 06


  до Z, знаки денежной единицы ($)  и  подчеркивания  (_),  а

  также цифры от 0 до 9. Любой строчный символ  автоматически

  преобразовывается в заглавный.



       3.2.3. Идентификаторы,            определенные

              операционной системой МОС ВП


       Идентификаторы, определенные операционной системой мос

  вп, или идентификаторы, задающие среду, автоматически опре-

  деляются при  инициализации  базы  данных  прав.  Следующие

  идентификаторы, определенные операционной системой  МОС  ВП

  непосредственно согласуются с классами подключения и  имеют

  отношение к среде, в которой работает процесс:

       1) BATCH - все попытки получить доступ, сделанные


       пакетными заданиями;

       2) NETWORK - все попытки получить доступ, сделанные


       через программу системного обеспечения


       "трал";

       3) INTERACTIVE - все попытки получить доступ,  сделан-

  ные


       интерактивными процессами;

       4) LOCAL - все попытки получить доступ, сделанные


       пользователями, подключенными


       через локальные терминалы;





                           - 119 -

                        00152-01 97 06


       5) DIALUP - все попытки получить доступ, сделанные


       пользователями, подключенными к коммути-


       руемым терминалам;

       6) REMOTE - все попытки получить доступ, сделанные


       пользователями, подключенными к сети.

       В зависимости от среды, в  которой  работает  процесс,

  программа LOGINOUT включает один или более из этих  иденти-

  фикаторов при создании списка прав процесса.



       3.2.4. Общие идентификаторы


       Общие  идентификаторы  предоставляются   пользователям

  путем создания записей держателей в базе данных прав. Общие

  идентификаторы могут идентифицировать отдельного  пользова-

  теля, отдельную группу UIC, группу пользователей  или  нес-

  колько групп.

       Идентификаторы и их держатели определяются в базе дан-

  ных прав с помощью обслуживающей программы авторизации  или

  с помощью соответствующей программы  системного  обслужива-

  ния. Можно также так определить идентификатор в базе данных

  прав, чтобы позволить пользователям из различных групп  UIC

  иметь этот идентификатор.

       Альтернативная  группировка,  которая  описана  здесь,

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

  вающихся групп. Кроме того это позволяет  управлять  типами

  доступа более точно, чем с помощью  защиты,  основанной  на




                           - 120 -

                        00152-01 97 06


  идентификаторах UIC.

       Также можно определять идентификаторы  таким  образом,

  чтобы они представляли конкретные терминалы, время дня  или

  другие атрибуты, имеющие отношение к среде, специфичной для

  данной установки (документы [7] и [8]). Такие идентификато-

  ры не получают записей держателей в базе  данных  прав,  но

  могут быть предоставлены пользователям с помощью привилеги-

  рованного программного обеспечения, написанного  потребите-

  лем. Эта особенность системы защиты придает гибкость каждой

  установке и (поскольку идентификаторы могут быть достаточно

  специфичны для установки) повысить защиту.



       3.2.5. Атрибуты идентификаторов


       Идентификатор имеет атрибуты, связанные с ним  в  базе

  данных прав. Часть списка прав  процесса  включает  в  себя

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

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

  если идентификатор имеет соответствующий атрибут.

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

  является атрибут RESOURCE (ресурс). Атрибут RESOURCE позво-

  ляет держателю идентификатора запрашивать ресурсы типа бло-

  ков дисковой памяти для идентификатора и, наоборот,  держа-

  тель, не имеющий атрибута RESOURCE,  не  может  запрашивать

  ресурсы для идентификатора.









                           - 121 -

                        00152-01 97 06


       3.3. Базы данных прав


       База данных прав является индексным файлом, содержащим

  два типа записей, которые  определяют  все  идентификаторы:

  записи идентификаторов и записи держателей.

       Для каждого идентификатора в базе данных прав  имеется

  одна запись идентификатора. Запись идентификатора связывает

  имя идентификатора с 32-битовым двоичным значением и задает

  атрибуты идентификатора. На рис. 26 показан  формат  записи

  идентификатора.


           Формат записи идентификатора

             +-----------------------+
             !Значение идентификатора!
             +-----------------------+
             !     Атрибуты          !
             +-----------------------+
             !         0             !
             +-----------------------+
             !         0             !
             +-----------------------+
             !  Имя  идентификатора  !
             +-----------------------+

                            Рис. 26


       Для каждого держателя каждого  идентификатора  в  базе

  данных прав имеется одна запись держателя. Запись держателя

  связывает держателя с идентификатором, задает атрибуты дер-

  жателя и  указывает  идентификатор  UIC  держателя.  Формат

  записи держателя показан на рис. 27.











                           - 122 -

                        00152-01 97 06



       Формат записи держателя идентификатора

            +------------------------+
            !Значение идентификатора !
            +------------------------+
            !       Атрибуты         !
            +------------------------+
            !         UIC            !
            !Идентификатор  держателя!
            +------------------------+
            !   Не используется      !
            +------------------------+

                            Рис. 27


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

  ключами. Первичным ключом является значение идентификатора,

  вторичным ключом является идентификатор держателя и третьим

  ключом  является  имя   идентификатора.   Когда   программа

  LOGINOUT создает список прав процесса, все права этого про-

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

  идентификатор держателя в качестве вторичного ключа.



       3.3.1. Инициализация базы данных прав


       База данных прав инициализируется одним  из  следующих

  способов:

       1) при установке или  усовершенствовании  операционной

  системы МОС ВП;

       2) с помощью обслуживанющей программы авторизации;

       3)  с  помощью   программы   системного   обслуживания

  $CREATE_RDB.

       При   вызове   программы    системного    обслуживания

  $CREATE_RDB можно использовать аргумент SYSID для  передачи

   


                           - 123 -

                        00152-01 97 06


  значения идентификации операционной системы МОС ВП, связан-

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

  то операционная система МОС ВП использует текущее системное

  время в 64-битовом  формате.  Если  база  данных  прав  уже

  существует,   то    программа    системного    обслуживания

  $CREATE_RDB завершается с кодом ошибки RMS$_FEX. Чтобы соз-

  дать новую базу данных  прав,  когда  она  уже  существует,

  необходимо либо  явно  удалить  старую  базу  данных,  либо

  переименовать ее.

       Когда база данных прав инициируется, ей  присваивается

  логическое имя RIGHTSLIST,  которое  необходимо  определить

  как системное логическое  имя  в  режиме  управления.  Если

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

  файловую   спецификацию,    принимаемую    по    умолчанию,

  SYS$SYSTEM:RIGHTSLIST.DAT.

       После создания файл  RIGHTSLIST.DAT  имеет  защиту  по

  умолчанию (S:RWED,O:RWED,G:RWE,W:R). Доступ всем  пользова-

  телям к оглавлению базы данных необходим  для  того,  чтобы

  все пользователи могли читать записи в базе  данных.  Чтобы

  использовать программу системного обслуживания $CREATE_RBD,

  необходим доступ с записью в базу данных. Если база  данных

  находится в группе файлов SYS$SYSTEM,  что  принимается  по

  умолчанию, то для получения доступа с записью в базу данных

  требуется привилегия SYSPRV.

       Когда программа  системного  обслуживания  $CREATE_RDB

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

  идентификаторы, определенные операционной системой МОС  ВП,




                           - 124 -

                        00152-01 97 06


  описывающие среду, в которой может работать процесс.

       Чтобы добавить другие  идентификаторы  в  базу  данных

  прав необходимо определить их с помощью обслуживающей прог-

  раммы авторизации или с помощью  соответствующей  программы

  системного обслуживания.



       3.3.2. Использование    программ    системного

              обслуживания для работы с базой  данных

              прав


       Записи идентификатора и держателя в базе  данных  прав

  содержат следующие элементы:

       1) двоичное значение идентификатора;

       2) имя идентификатора;

       3) держатель (или держатели) каждого идентификатора;

       4) атрибуты каждого идентификатора и каждого держателя

  каждого идентификатора.

       Для того чтобы добавлять, удалять, отображать, модифи-

  цировать или транслировать различные элементы  базы  данных

  прав используется обслуживающая программа  авторизации  или

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

  табл. 12.















                           - 125 -

                        00152-01 97 06


                                                   Таблица 12

  -----------------------------------------------------------

  Действие        !      Элемент          ! Используемая

                  !                       ! программа систем-

                  !                       ! ного обслуживания

  -----------------------------------------------------------

  Транслировать   ! Имя идентификатора в  ! $ASCTOID

                  ! двоичное значение иде-!

                  ! нтификатора.          !

                  ! двоичное значение иде-! $IDTOASC

                  ! нтификатора в имя иден!

                  ! -тификатора           !

  Добавить        ! Запись держателя к    ! $ADD_HOLDER

                  ! идентификатору        !

                  ! новую запись идентифи-! $ADD_IDENT

                  ! катора.               !

  Найти           ! Значение идентификато-! $FIND_HELD

                  ! ра, принадлежащего    !

                  ! держателю.            !

                  ! Держателя(ей) иденти- ! $FIND_HOLDER

                  ! фикатора.             !

                  ! Все идентификаторы    ! $IDTOASC

  Модифицировать  ! Атрибуты в записи дер-! $MOD_HOLDER

                  ! жателя.               !

                  ! Атрибуты и записи иде-! $MOD_IDENT

                  ! нтификатора           !

  Удалить         ! Держателя из записи   ! $REM_HOLDER




                           - 126 -

                        00152-01 97 06


                                         Продолжение табл. 12

  -----------------------------------------------------------

  Действие        !      Элемент          ! Используемая

                  !                       ! программа систем-

                  !                       ! ного обслуживания

  -----------------------------------------------------------

                  ! идентификатора.       !

                  ! Идентификатор и всех  ! $REM_IDENT

                  ! его держателей        !

       Необходимые типы доступа при использовании этих  прог-

  рамм системного обслуживания приведены  в  табл.  13.  Если

  база данных прав находится в группе файлов SYS$SYSTEM,  что

  принимается  по  умолчанию,  то  для  получения  доступа  с

  записью в базу данных требуется привилегия SYSPRV.

                                                  Таблица 13

  ----------------------------------------------------------

  Программа системного  !         Требуемый доступ

  обслуживания          !

  ----------------------------------------------------------

  $ADD_HOLDER           ! Доступ на запись

  $ADD_IDENT            ! Доступ на запись

  $ASCTOID              ! Доступ на чтение

  $CREATE_RDB           ! Доступ на запись

  $FIND_HELD            ! Доступ на чтение

  $FIND_HOLDER          ! Доступ на чтение

  $FINISH_RDB           ! Доступ на чтение

  $IDTOASC              ! Доступ на чтение




                           - 127 -

                        00152-01 97 06


                                        Продолжение табл. 13

  ----------------------------------------------------------

  Программа системного  !         Требуемый доступ

  обслуживания          !

  ----------------------------------------------------------

  $MOD_HOLDER           ! Доступ на запись

  $MOD_IDENT            ! Доступ на запись

  $REM_HOLDER           ! Доступ на запись

  $REM_IDENT            ! Доступ на запись



       3.3.2.1. Трансляция   имен   идентификаторов   и

                двоичных значений


       Для  операционной  системы  МОС   ВП   идентификатором

  является двоичное 32-битовое значение. Чтобы сделать  иден-

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

  чение имеет связанное с ним  имя  идентификатора.  Значение

  идентификатора и строка имени идентификатора в  коде  КОИ-8

  связываются в базе данных прав. Для трансляции одного  фор-

  мата в другой можно использовать программы системного  обс-

  луживания $ASCTOID и  $IDTOASC.  Когда  программе  $ASCTOID

  передается адрес дескриптора строки,  указывающего  на  имя

  идентификатора, она возвращает двоичное значение  идентифи-

  катора. И наоборот, для трансляции двоичного значения иден-

  тификатора в  строку  имени  идентификатора  в  коде  КОИ-8

  используют программу системного обслуживания $IDTOASC.

       Программу системного обслуживания $IDTOASC можно также

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


                           - 128 -

                        00152-01 97 06


  базе данных прав. Для этого необходимо задать  аргумент  ID

  равным -1, инициализировать аргумент CONTEXT нулем  и  пов-

  торно вызывать программу $IDTOASC до тех пор, пока не будет

  возвращен код SS$_NOSUCHID. Программа системного обслужива-

  ния $IDTOASC возвращает имена идентификаторов в  алфавитном

  порядке.  Когда  возвращает  код  SS$_NOSUCHID,   программа

  $IDTOASC очищает длинное слово контекста и  отменяет  поток

  записей. Если вызовы  программы  $IDTOASC  прекращаются  до

  того, как будет возвращен код SS$_NOSUCHID,  то  необходимо

  использовать программу системного обслуживания  $FINISH_RDB

  для очистки длинного слова контекста и отмены потока  запи-

  сей.



       3.3.2.2. Добавление идентификаторов и держателей

                в базу данных прав


       Идентификаторы  в  базу  данных  прав  добавляются   с

  помощью   вызова    программы    системного    обслуживания

  $ADD_IDENT. Необходимо использовать аргумент NAME для пере-

  дачи имени идентификатора, который  необходимо  добавить  к

  базе данных прав. С помощью аргумента ID можно указать зна-

  чение идентификатора. Однако, если значение  идентификатора

  не указывается, то операционная система МОС ВП выбирает это

  значение из области общих идентификаторов.

       Кроме определения значения идентификатора и его  имени

  программа $ADD_IDENT может быть использована  для  указания

  атрибута RESOURCE в записи идентификатора. Атрибут RESOURCE

  допустим для держателя идентификатора, только если он уста-



                           - 129 -

                        00152-01 97 06


  новлен как в записи идентификатора, так и в записи держате-

  ля. Аргумент ATTRIB представляет длинное слово,  содержащее

  битовую маску, которая задает атрибуты.  Символическое  имя

  KGB$V_RESOURCE, определенное  в  системной  макробиблиотеке

  $KGBDEF, устанавливает бит RESOURCE в маске.  (Вместо  пре-

  фикса KGB$V можно использовать KGB$M).

       После успешного завершения выполнения  программы  сис-

  темного обслуживания $ADD_IDENT в базе  данных  прав  будет

  сформирована новая запись идентификатора, содержащая значе-

  ние идентификатора, имя идентификатора и атрибуты идентифи-

  катора.

       После того как запись идентификатора занесена  в  базу

  данных прав, можно определить  держателя  (или  держателей)

  этого идентификатора с помощью программы системного  обслу-

  живания $ADD_HOLDER.  С  помощью  аргумента  ID  передается

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

  ментом HOLDER, который является адресом квадрослова, содер-

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

  28.


               Формат записи держателя

               +-----------------------+
               !    Идентификатор      !
               !    UIC держателя      !
               +-----------------------+
               !          0            !
               +-----------------------+

                            Рис. 28


       В базе данных прав идентификатор держателя имеет  фор-

  мат UIC. Атрибуты держателя задаются аргументом ATTRIB точ-



                           - 130 -

                        00152-01 97 06


  но также как и для программы $ADD_IDENT.  Атрибут  RESOURCE

  допустим для держателя идентификатора, только если он уста-

  новлен как в записи идентификатора, так и в записи держате-

  ля.

       После завершения выполнения программы системного  обс-

  луживания $ADD_HOLDER в базе данных прав будет сформирована

  новая запись держателя, содержащая двоичное значение  иден-

  тификатора, который принадлежит держателю, атрибуты  держа-

  теля и идентификатор UIC держателя.



       3.3.2.3. Определение держателей идентификаторов


       Держателя (или держателей) конкретного  идентификатора

  можно определить с помощью вызова программы системного обс-

  луживания $FIND_HOLDER. При вызове  программы  $FIND_HOLDER

  для передачи двоичного значения идентификатора используется

  аргумент ID. При успешном завершении  выполнения  программа

  $FIND_HOLDER возвращает идентификатор держателя в аргументе

  HOLDER и атрибуты держателя в аргументе ATTRIB.

       Чтобы найти всех держателей идентификатора, необходимо

  инициализировать аргумент CONTEXT нулем  и  последовательно

  вызывать программу $FIND_HOLDER (п. 3.3.3). Поскольку прог-

  рамма системного обслуживания $FIND_HOLDER  находит  записи

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

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









                           - 131 -

                        00152-01 97 06


       3.3.2.4. Определение                удерживаемых

                идентификаторов


       Идентификатор (или идентификаторы), удерживаемые  дер-

  жателем, можно определить, вызвав программу системного обс-

  луживания  $FIND_HELD.  При  вызове  программы   $FIND_HELD

  используется аргумент HOLDER для указания  того  держателя,

  чей идентификатор необходимо найти.

       При завершении выполнения программа $FIND_HILD возвра-

  щает двоичное значение идентификатора и атрибуты.

       Можно найти все идентификаторы, удерживаемые указанным

  держателем, если инициализировать нулем аргумент CONTEXT  и

  последовательно  вызывать  программу  $FIND_HELD  (см.   П.

  3.3.3). Поскольку программа $FIND_HELD  находит  записи  по

  одному ключу (идентификатор), то она  возвращает  записи  в

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



       3.3.2.5. Модификация записи идентификатора


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

  $MOD_IDENT можно  модифицировать  имя  идентификатора,  его

  значение и/или атрибут в базе  данных  прав.  Для  передачи

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

  зуется аргумент ID. Чтобы  установить  атрибут,  необходимо

  использовать аргумент SET_ATTRIB, являющийся  длинным  сло-

  вом, содержащим битовую маску, которая задает атрибут. Сим-

  волическое имя  KGB$V_RESOURCE,  определенное  в  системной

  макробиблиотеке $KGBDEF, используют, чтобы  установить  бит




                           - 132 -

                        00152-01 97 06


  RESOURCE в битовой маске атрибута. (Вместо  префикса  KGB$V

  можно использовать префикс KGB$M).

       Если  атрибут  не  требуется  для  идентификатора,  то

  используется аргумент CLR_ATTRIB, являющийся  длинным  сло-

  вом, содержащим битовую маску, которая задает атрибут. Если

  один и тот же атрибут задается в аргументе SET_ATTRIB  и  в

  аргументе CLR_ATTRIB, то атрибут устанавливается.

       С помощью аргументов NEW_NAME и NEW_VALUE можно  изме-

  нить  имя  идентификатора  и/или  его  значение.   Аргумент

  NEW_NAME  является  адресом  дескриптора,  указывающего  на

  строку имени идентификатора.  Аргумент  NEW_VALUE  является

  длинным словом, содержащим двоичное значение  идентификато-

  ра.  Если  изменяется  значение   идентификатора,   который

  является держателем других идентификаторов (например, UIC),

  то программа $MOD_IDENT обновляет все  существующие  записи

  держателей новым значением идентификатора держателя.

       После  успешного   завершения   выполнения   программы

  $MOD_IDENT, в базе  данных  прав  существует  новая  запись

  идентификатора, содержащая значение идентификатора, его имя

  и атрибуты.



       3.3.2.6. Модификация записи держателя


       Вызывая программу системного обслуживания $MOD_HOLDER,

  можно модифицировать запись держателя. При вызове программы

  $MOD_HOLDER аргументы ID и HOLDER используется для передачи

  двоичного значения идентификатора и идентификатора UIC дер-

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


                           - 133 -

                        00152-01 97 06


       Программу $MOD_HOLDER можно использовать для установки

  и отключения атрибутов идентификатора точно так же,  как  и

  при работе с программой $MOD_IDENT.

       После завершения работы программы $MOD_HOLDER  в  базе

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

  содержащая значение идентификатора, идентификатор держателя

  и атрибуты держателя.



       3.3.2.7. Удаление идентификаторов  и  держателей

                из базы данных прав


       Для удаления идентификатора и его держателей  из  базы

  данных прав используется программа системного  обслуживания

  $REM_IDENT. При вызове  программы  $REM_IDENT  аргумент  ID

  используется для передачи двоичного значения  идентификато-

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

  программы $REM_IDENT идентификатор и все  связанные  с  ним

  записи держателей удаляются из базы данных прав.

       Чтобы удалить держателя из списка держателей идентифи-

  катора,  используют   программу   системного   обслуживания

  $REM_HOLDER. При вызове программы $REM_HOLDER аргументы  ID

  и HOLDER используются для передачи двоичного значения иден-

  тификатора и идентификатора UIC держателя, запись  которого

  требуется удалить.

       При   успешном   завершении    выполнения    программа

  $REM_HOLDER удаляет держателя из списка держателей  иденти-

  фикатора.





                           - 134 -

                        00152-01 97 06


       3.3.3. Операции поиска


       При  использовании  программ  системного  обслуживания

  $IDTOASC, $FIND_HELD и $FIND_HOLDER можно  выполнять  поиск

  во всей базе данных прав. Для этого необходимо  инициализи-

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

  одной из этих трех программ системного  обслуживания,  пока

  не будет возвращен код состояния SS$NOSUCHID. После возвра-

  та этого  кода  программа  системного  обслуживания  чистит

  длинное слово контекста  и  отменяет  поток  записей.  Если

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

  вания до того, как  будет  возвращен  код  SS$NOSUCHID,  то

  необходимо использовать программу $FINISH_RDB  для  очистки

  длинного слова контекста и отмены потока записей.

       Структура базы данных прав влияет на порядок, в  кото-

  ром каждая из этих программ возвращает записи при поиске  в

  базе данных прав. База данных прав является идексным файлом

  с тремя ключами. Первичным ключом является двоичное  значе-

  ние идентификатора, вторичным ключом  -  идентификатор  UIC

  держателя и третьим ключом является имя идентификатора.

       Во время операции поиска программа системного обслужи-

  вания получает первую запись с помощью  индексной  операции

  GET системы управления данными. Ключ, используемый для опе-

  рации GET, зависит от  программы  системного  обслуживания.

  Программа $FIND_HOLDER использует двоичное значение иденти-

  фикатора; программа $FIND_HELD использует идентификатор UIC

  держателя. После индексной операции GET программа системно-

  го обслуживания возвращает записи с помощью  последователь-



                           - 135 -

                        00152-01 97 06


  ной операции GET системы управления данными. Следовательно,

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

  GET, и порядок, в котором записи были первоначально записа-

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

  луживания возвращает записи при операции поиска.

       Примеры:

       1. $IDTOASC         В порядке имен идентификаторов.

       2. $FIND_HELD       Первая операция GET-ключ  держате-

                           ля. Последующие записи возвращают-

                           ся в том порядке,  в  котором  они

                           были записаны.

       3. $FIND_HOLDER     Первая операция GET-ключ идентифи-

                           катора. Последующие записи возвра-

                           щаются в том  порядке,  в  котором

                           они были записаны.



       3.4. Создание,  трансляция  и  сопровождение

            элементов ACE


       Список управления доступом (ACL) является списком эле-

  ментов, определяющих тип доступа  к  об'ектам  операционной

  системы МОС ВП типа файла, устройства или почтового  ящика.

  Когда процесс пытается получить доступ к об'екту со связан-

  ным списком ACL, операционная система МОС ВП разрешает дос-

  туп на основе типа доступа, заданного элементами  в  списке

  ACL.

       Элементы списка управления доступом (ACE) имеют двоич-

  ную форму. Однако для удобства использования этих  ACE  они



                           - 136 -

                        00152-01 97 06


  имеют также формат строки текста. Программы системного обс-

  луживания $FORMAT_ACL и $PARSE_ACL используются для  транс-

  ляции элементов ACE из одного формата в  другой  точно  так

  же, как программы $IDTOASC и $ASCTOID транслируют идентифи-

  каторы из двоичной формы в текстовый формат, из  текстового

  формата в двоичный.

       Создавать и обрабатывать списки ACL  можно  с  помощью

  редактора ACL, команды SET ACL языка DCL и вызова программы

  системного обслуживания $CHANGE_ACL.



       3.4.1. Формат элементов ACE


       Имеется четыре типа элементов ACE:

       1) сигнальный;

       2) зависящий от программы пользователя;

       3) защиты по умолчанию;

       4) идентификатор.

       Сигнальный элемент  ACE  обеспечивает  сигнал  защиты,

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

  Элемент ACE пользователя содержит информацию, зависящую  от

  программы пользователя, или информацию заданную пользовате-

  лем. Элемент ACE защиты по умолчанию определяет  защиту  по

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

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

  Элемент ACE идентификатора управляет типом доступа,  разре-

  шенного пользователю или группе пользователей, в соответст-

  вии с идентификатором.





                           - 137 -

                        00152-01 97 06


       Тип элемента ACE определяет его формат.  Символические

  имена, задающие смещения в байтах и значения типов, опреде-

  лены в системной макробиблиотеке ($ACEDEF).



       3.4.1.1. Сигнальный элемент ACE


       Сигнальный элемент ACE устанавливает сигнал защиты  на

  об'екте операционной системы МОС ВП. На  рис.  29  приведен

  формат сигнального элемента ACE.  Описание  структуры  сиг-

  нального элемента ACE приведено в табл. 14.


            Формат сигнального элемента ACE

            +---------------+------+-------+
            !     Флаги     !  Тип ! Длина !
            +---------------+------+-------+
            !           Доступ             !
            +------------------------------+
            !          Имя сигнала         !
            +------------------------------+

                            Рис. 29

                                                   Таблица 14

  -----------------------------------------------------------

      Поле   ! Символическое имя !         Описание

  -----------------------------------------------------------

  Длина      ! ACE$B_SIZE        ! Байт, содержащий длину  в

             !                   ! байтах буфера элемента ACE

  Тип        ! ACE$B_TYPE        ! Байт, содержащий  значение

             !                   ! типа ACE$C_ALARM

  Флаги      ! ACE$W_FLAGS       ! Слово, содержащее информа-

             !                   ! цию о сигнальном  элементе

             !                   ! ACE и информацию, не зави-




                           - 138 -

                        00152-01 97 06


                                         Продолжение табл. 14

  -----------------------------------------------------------

      пПле   ! сСмволическое имя !         Описание

  -----------------------------------------------------------

             !                   ! сящую от типа элемента ACE

  Доступ     ! ACE$L_ACCESS      ! Длинное слово,  содержащее

             !                   ! маску, которая  указывает,

             !                   ! какие режимы доступа долж-

             !                   ! ны отслеживаться

  Имя сигнала! ACE$T_AUDITNAME   ! Строка  символов, содержа-

             !                   ! щая имя сигнала

       Слово флагов содержит информацию, специфичную для сиг-

  нальных элементов ACE, и информацию,  относящуюся  ко  всем

  типам элементов ACE. В слове флагов  первый  байт  содержит

  флаги, специфичные для каждого типа  элемента  ACE,  второй

  байт содержит флаги общие для  всех  типов  элементов  ACE.

  Символические имена, приведенные в табл. 15 являются  бито-

  выми смещениями в слове флагов к  информации  о  сигнальном

  элементе ACE.

                                                   Таблица 15

  -----------------------------------------------------------

          Бит       !   Значение, если бит установлен

  -----------------------------------------------------------

  ACE$V_SUCCESS     ! Указывает, что сигнал установлен при

                    ! успешном доступе

  ACE$V_FAILURE     ! Указывает, что сигнал установлен при

                    ! неудачном доступе




                           - 139 -

                        00152-01 97 06


       Символические имена, приведенные в табл.  16  являются

  битовыми смещениями в слове флагов относительно информации,

  имеющей отношение ко всем типам элементов ACE.


                                                   Таблица 16

  -----------------------------------------------------------

      Бит           !    Значение, если бит установлен

  -----------------------------------------------------------

  ACE$V_DEFAULT     ! Данный элемент ACE добавляется к списку

                    ! ACL для любого файла, созданного  в ка-

                    ! талоге, чей список  ACL содержит данный

                    ! элемент ACE. Описанная операция относи-

                    ! тся только к элементу ACE из списка ACL

                    ! файла каталога

  ACE$V_HIDDEN      ! Данный  элемент  зависит  от  программы

                    ! пользователя. Команды  ACL  языка DCL и

                    ! редактор  ACL не могут быть использова-

                    ! ны для  изменения установки этого бита.

                    ! команда  DIRECTORY/ACL языка  DCL  не

                    ! отображает  этот бит

  ACE$V_NOPROPAGATE ! Данный  элемент  ACE  не распространя-

                    ! ется на версии файла

  ACE$V_PROTECTED   ! Данный элемент ACE не  удаляется, когда

                    ! удаляется весь список ACL. Этот элемент

                    ! АCE необходимо удалять только явно


       Символические  значения,  приведенные  в   табл.   17,

  являются смещениями в битах в маске  доступа.  Можно  также




                           - 140 -

                        00152-01 97 06


  получить символические значения в виде масок  с  соответст-

  вующим набором битов,  если  использовать  вместо  префикса

  ACE$V префикс ACE$M.


                                                   Таблица 17

  -----------------------------------------------------------

        Бит     !     Значение, если бит установлен

  -----------------------------------------------------------

  ACE$V_READ    ! Управление доступом на чтение

  ACE$V_WRITE   ! Управление доступом на запись

  ACE$V_EXECUTE ! Управление доступом на выполнение

  ACE$V_DELETE  ! Управление доступом на удаление

  ACE$V_CONTROL ! Управление доступом на модификацию поля



       3.4.1.2. Элемент ACE пользователя


       Элемент ACE пользователя содержит информацию,  завися-

  щую от программы пользователя. На рис.  30  показан  формат

  элемента пользователя.






















                           - 141 -

                        00152-01 97 06



       Формат элемента пользователя

         +------------------------+
         ! Флаги     ! Тип ! Длина!
         +-----------+-----+------+
         !    Маска программы     !
         !      пользователя      !
         +------------------------+
         !           .            !
         !           .            !
         !  Информация программы  !
         !     пользователя       !
         !           .            !
         !           .            !
         +------------------------+

                            Рис. 30


       Символические имена, приведенные  в  табл.  18  задают

  смещения в байтах.


                                                   Таблица 18

  -----------------------------------------------------------

   Поле  ! Символическое имя !           Описание

  -----------------------------------------------------------

  Длина  ! ACE$B_SIZE        ! Байт, содержащий  длину в бай-

         !                   ! тах буфера элемента ACE

  Тип    ! ACE$B_TYPE        ! Байт, содержащий значение типа

         !                   ! ACE$C_INFO

  Флаги  ! ACE$W_FLAGS       ! Слово,  содержащее  информацию

         !                   ! элемента ACE пользователя и

         !                   ! информацию, не зависящую от

         !                   ! типа элемента ACE

         !                   !

  Маска  ! ACE$L_INFO_FLAGS  ! Длинное  слово,  содержащее




                           - 142 -

                        00152-01 97 06


                                         Продолжение табл. 18

  -----------------------------------------------------------

   Поле  ! Символическое имя !           Описание

  -----------------------------------------------------------

  прог-  !                   ! маску,  которая  определена

  раммы  !                   ! и используется  программой

  пользо-!                   ! пользователя

  вателя !                   !

  Инфор- ! ACE$T_INFO_START  ! Структура данных переменной

  мация  !                   ! длины, определенная и испо-

  прог-  !                   ! льзуемая программой пользова-

  раммы  !                   ! теля. Длина этих данных запи-

  пользо-!                   ! сана в поле длины

  вателя !                   !


       Слово флагов содержит информацию, специфичную для эле-

  ментов ACE пользователя, и информацию, относящуюся ко  всем

  типам элементов ACE. В слове флагов  первый  байт  содержит

  флаги, специфические для каждого типа элемента ACE,  второй

  байт содержит флаги общие для  всех  типов  элементов  ACE.

  Подробно информация, не зависящая  от  типа  элемента  ACE,

  описана в табл. 16. Символическое имя, приведенное в  табл.

  19, является смещением в битах в слове флагов к  информации

  элемента ACE пользователя.











                           - 143 -

                        00152-01 97 06


                                                   Таблица 19

  -----------------------------------------------------------

         Бит      !   Значение, если бит установлен

  -----------------------------------------------------------

  ACE$V_INFO_TYPE ! Четырехбитовое поле, содержащее значение,

                  ! которое указывает, является ли программа

                  ! пользователя программой типа CSS

                  ! (ACE$C_CSS) или программой потребителя

                  ! (ACE$C_CUST)



       3.4.1.3. Элемент ACE защиты по умолчанию


       Элемент ACE защиты по умолчанию  специфицирует  защиту

  по умолчанию всех файлов и подкаталогов, созданных в  ката-

  логе. Данный тип элемента ACE можно использовать  только  в

  списке ACL файла каталога. На рис. 31 приведен формат этого

  элемента.


     Формат элемента ACE защиты по умолчанию

            +-----------------------+
            ! Флаги !  Тип  ! Длина !
            +-------+-------+-------+
            !    Не используется    !
            +-----------------------+
            !      Система          !
            +-----------------------+
            !      Владелец         !
            +-----------------------+
            !      Группа           !
            +-----------------------+
            !        Все            !
            +-----------------------+

                            Рис. 31






                           - 144 -

                        00152-01 97 06


       Символические имена, приведенные  в  табл.  20  задают

  смещения в байтах.


                                                   Таблица 20

  -----------------------------------------------------------

    Поле  ! Символическое имя !          Описание

  -----------------------------------------------------------

  Длина   ! ACE$B_SIZE        ! Байт, содержащий длину в бай-

          !                   ! тах буфера элемента ACE

  Тип     ! ACE$B_TYPE        ! Байт, содержащий значение ти-

          !                   ! па ACE$C_DIRDEF

  Флаги   ! ACE$W_FLAGS       ! Слово, содержащее информацию,

          !                   ! независящую от типа ACE

  Не ис-  ! ACE$L_SPARE1      ! Длинное слово. Должно быть

  пользу- !                   ! нулевым

  ется    !                   !

  Система ! ACE$L_SYS_PROT    ! Длинное слово, содержащее ма-

          !                   ! ску, которая индицирует режим

          !                   ! доступа, предоставленный сис-

          !                   ! темным пользователям. Каждый

          !                   ! бит представляет один тип до-

          !                   ! ступа

  Владелец! ACE$L_OWN_PROT    ! Длинное слово, содержащее ма-

          !                   ! ску, которая индицирует режим

          !                   ! доступа, предоставленный вла-

          !                   ! дельцу. Каждый бит представ-

          !                   ! ляет один тип доступа




                           - 145 -

                        00152-01 97 06


                                         Продолжение табл. 20

  -----------------------------------------------------------

    Поле  ! Символическое имя !          Описание

  -----------------------------------------------------------

  Группа  ! ACE$L_GRP_PROT    ! Длинное слово, содержащее ма-

          !                   ! ску, которая индицирует режим

          !                   ! доступа, предоставленный гру-

          !                   ! ппе пользователей. Каждый бит

          !                   ! представляет один тип доступа

  Все     ! ACE$L_WOR_PROT    ! Длинное слово, содержащее ма-

          !                   ! ску, которая индицирует режим

          !                   ! доступа, предоставленный всем

          !                   ! пользователям.

          !                   ! каждый бит представляет один

          !                   ! тип доступа


       В слове флагов первый байт содержит флаги  специфичные

  для каждого типа элементов ACE, второй байт содержит  флаги

  общие для всех типов элементов АCЕ (см. табл. 16).

       Операционная система МОС ВП интерпретирует биты в мас-

  ке доступа, как показано в табл. 21. Символические значения

  являются смещениями в  битах  внутри  маски,  индицирующими

  режим доступа, предоставленный в полях системы,  владельца,

  группы и всех пользователей.











                           - 146 -

                        00152-01 97 06


                                                   Таблица 21

  -----------------------------------------------------------

       Бит      ! Значение, если бит установлен

  -----------------------------------------------------------

  ACE$V_READ    ! Управление доступом на чтение

  ACE$V_WRITE   ! Управление доступом на запись

  ACE$V_EXECUTE ! Управление доступом на выполнение

  ACE$V_DELETE  ! Управление доступом на удаление


       Можно также получить  символические  значения  в  виде

  масок с соответствующим набором  битов,  используя  префикс

  ACE$M вместо префикса ACE$V.



       3.4.1.4. Элемент ACE идентификатора


       Элемент ACE идентификатора управляет типом разрешенно-

  го доступа на базе идентификаторов. Доступ  управляется  на

  основе того, есть или нет точное соответствие между иденти-

  фикатором списка прав процесса и идентификатором в элементе

  ACE. Рис. 32 иллюстрирует формат этого элемента.




















                           - 147 -

                        00152-01 97 06



        Формат элемента ACE идентификатора

              +-----------------------+
              ! Флаги !  Тип  ! Длина !
              +-------+-------+-------+
              !      Доступ           !
              +-----------------------+
              !      Зарезервировано  !
              +-----------------------+
              !      Зарезервировано  !
              +-----------------------+
              !         .             !
              !         .             !
              !         .             !
              +-----------------------+
              !      Идентификатор    !
              +-----------------------+
              !      Идентификатор    !
              +-----------------------+
              !         .             !
              !         .             !
              !         .             !
              +-----------------------+

                            Рис. 32


       Символические имена, приведенные  в  табл.  22  задают

  смещения в байтах.


                                                   Таблица 22

  -----------------------------------------------------------

      Поле   ! Символическое имя !         Описание

  -----------------------------------------------------------

  Длина      ! ACE$B_SIZE        ! Байт,  содержащий  длину в

             !                   ! байтах буфера элемента ACE

  Тип        ! ACE$B_TYPE        ! Байт, содержащий  значение

             !                   ! типа ACE$C_KEYID

  Флаги      ! ACE$W_FLAGS       ! Слово, содержащее информа-

             !                   ! цию элементA  ACE  иденти-




                           - 148 -

                        00152-01 97 06


                                         Продолжение табл. 22

  -----------------------------------------------------------

      Поле   ! Символическое имя !         Описание

  -----------------------------------------------------------

             !                   ! фикатора и информацию,  не

             !                   ! зависящую от типа элемента

             !                   ! ACE

  Доступ     ! ACE$L_ACCESS      ! Длинное слово,  содержащее

             !                   ! маску, которая  индицирует

             !                   ! режим доступа,  предостав-

             !                   ! ленный указанным идентифи-

             !                   ! катора

  Зарезерви- ! ACE$V_RESERVED    ! Длинные слова,  содержащие

  ровано     !                   ! информацию, относящуюся  к

             !                   ! программе пользователя.

             !                   ! Число зарезервированных

             !                   ! слов задается в поле

             !                   ! флагов

  Идентифика-! ACE$L_KEY         ! Длинные слова,  содержащие

  тор        !                   ! идентификаторы. Число этих

             !                   ! длинных  слов  хранится  в

             !                   ! поле   ACE$B_LENGTH.  Если

             !                   ! пользователь,   пытающийся

             !                   ! получить доступ, имеет все

             !                   ! идентификаторы  в  списке,

             !                   ! то элемент  ACE соответст-

             !                   ! вует этому пользователю, и




                           - 149 -

                        00152-01 97 06


                                         Продолжение табл. 22

  -----------------------------------------------------------

      Поле   ! Символическое имя !         Описание

  -----------------------------------------------------------

             !                   ! доступ, указанный  в  поле

             !                   ! ACE$L_ACCESS, предоставля-

             !                   ! ется


       Слово флагов содержит информацию, специфичную для эле-

  мента ACE идентификатора, и информацию, относящуюся ко всем

  типам элементов ACE. В слове флагов  первый  байт  содержит

  флаги, специфичные для каждого типа элементов  ACE,  второй

  байт содержит флаги общие для всех типов элементов ACE (см.

  табл.  16).  Символическое  имя,  приведенное  в  табл.  23

  является битовым смещением к информации элемента ACE  иден-

  тификатора.


                                                   Таблица 23

  -----------------------------------------------------------

     Бит         !      Значение, если бит установлен

  -----------------------------------------------------------

  ACE$V_RESERVED ! Четырехбитовое поле, содержащее число дли-

                 ! нных  слов,  зарезервированных для данных,

                 ! зависящих от программы  пользователя.  Это

                 ! число может  быть между 0 и 15. Зарезерви-

                 ! рованные  длинные  слова, если они имеются

                 ! непосредственно предшествуют идентификато-

                 ! рам




                           - 150 -

                        00152-01 97 06


       Символические имена, приведенные в табл. 24,  являются

  битовыми смещениями внутри маски, идинцирующей режим досту-

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

  пользователей.


                                                   Таблица 24

  -----------------------------------------------------------

        Бит     !     Значение, если бит установлен

  -----------------------------------------------------------

  ACE$V_READ    ! Управление доступом на чтение

  ACE$V_WRITE   ! Управление доступом на запись

  ACE$V_EXECUTE ! Управление доступом на выполнение

  ACE$V_DELETE  ! Управление доступом на удаление

  ACE$V_CONTROL ! Управление доступом на модификацию поля


       Символические значения можно  также  получить  в  виде

  масок с соответствующим набором  битов,  если  использовать

  префикс ACE$M вместо префикса ACE$V.



       3.4.2. Трансляция элементов ACE


       Для трансляции элементов ACE из  двоичного  формата  в

  текстовую строку можно  использовать  программу  системного

  обслуживания $FORMAT_ACL. Аргумент ACLENT является  адресом

  дескриптора, указывающим на буфер, который содержит  описа-

  ние элемента ACE. Первый байт буфера содержит длину элемен-

  та ACE, второй байт содержит тип, который  в  свою  очередь

  определяет формат элемента ACE (табл. 25).





                           - 151 -

                        00152-01 97 06


                                                  Таблица 25

  ----------------------------------------------------------

  Символическое    !       Тип элемента

  имя              !

  ----------------------------------------------------------

  ACE$C_ALARM      ! Сигнальный элемент ACE

  ACE$C_INFO       ! Элемент ACE пользователя

  ACE$C_DIRDEF     ! Элемент ACE защиты по умолчанию

  ACE$C_KEYID      ! Элемент ACE идентификатора


       Аргумент ACLLEN задает длину текстовой  строки,  запи-

  санной в буфер, на которую указывает аргумент ACLSTR. Аргу-

  менты WIDTH, TRMDSC и IDENT используются для указания конк-

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

  элемента ACE. Аргумент ACCNAM содержит адрес массива из  32

  квадрослов дескриторов, которые определяют  имена  битов  в

  маске доступа элемента ACE.

       Если аргумент ACCNAM опущен, то используются следующие

  имена:

         бит 0 - читать;

         бит 1 - писать;

         бит 2 - выполнить;

         бит 3 - удалить;

         бит 4 - управлять (в данном случае модифицировать);

         бит 5 - BIT_5;

         бит 6 - BIТ_6;

         .

         .



                           - 152 -

                        00152-01 97 06


         .

         бит 31 - BIT_31.

       Программа системного обслуживания $PARSE_ACL  трансли-

  рует эелементы ACE из формата текстовой строки  в  двоичный

  формат. Аргумент ACLSTR является адресом дескриптора  стро-

  ки, указывающим на текстовую строку элемента  ACE.  Так  же

  как и для программы $FORMAT_ACL  аргумент  ACLENT  является

  адресом дескриптора, указывающего на буфер, содержащий опи-

  сание элемента ACE. Первый байт буфера содержит длину  эле-

  мента ACE, второй байт содержит тип, который в свою очередь

  определяет формат элемента ACE. Если  программа  $PARSE_ACL

  заканчивается по ошибке, то аргумент  ERRPOS  указывает  на

  ошибочную позицию в строке. Аргумент ACCNAM содержит  адрес

  массива из 32 квадрослов дескрипторов,  которые  определяют

  имена битов в маске доступа элемента ACE.



       3.4.3. Создание и обслуживание элементов ACE


       Программа системного обслуживания $CHANGE_ACL  исполь-

  зуется для создания или модификации списка ACL,  связанного

  с об'ектом. Об'ект, чей список ACL должен модифицироваться,

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

  ввода-вывода,  связанного  с  об'ектом,   либо   аргументом

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

  мент OBJNAM, то аргумент CHAN должен быть либо опущен, либо

  задан нулем. Аргумент OBJTYP указывает тип об'екта.







                           - 153 -

                        00152-01 97 06


       Следующие значения задают тип об'екта:

          ACL$C_DEVICE - об'ект есть устройство;

          ACL$C_FILE - об'ект есть файл;

          ACL$C_GROUP_GLOBAL_SECTION -  об'ект есть групповая

  глобальная секция;

          ACL$C_LOGICAL_NAME_SECTION - об'ект  есть   таблица

  логических имен;

          ACL$C_SYSTEM_GLOBAL_SECTION - об'ект есть системная

  глобальная секция.

       Аргумент ACMODE используется для задания режима досту-

  па, который используется при контроле защиты доступа к фай-

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

  ная система МОС ВП сравнивает  аргумент  ACMODE  с  режимом

  досупа вызывающей программы и использует наименее  привиле-

  гированный режим. Аргумент ITMLST является списком элемент-

  ных кодов, задающим изменения, которые необходимо сделать в

  списке ACL. Каждый элементный код состоит из  трех  элемен-

  тов. Рис. 33 иллюстрирует формат элементного кода.


             +---------------+--------------+
             !     Код       ! Длина буфера !
             +------------------------------+
             !           Адрес буфера       !
             +------------------------------+
             !          Не используется     !
             +------------------------------+

                            Рис. 33


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

  жащим нулевое значение. Поле "длина буфера" содержит  коли-

  чество байтов  в  буфере,  содержащем  информацию,  которая




                           - 154 -

                        00152-01 97 06


  передается программе или из  программы  $CHANGE_ACL.  Адрес

  буфера содержится в поле  "адрес  буфера".  Третье  длинное

  слово стандартного элементного дескриптора не  используется

  программой $CHANGE_ACL и должно быть нулевым.

       Элементный код специфицирует изменения, которые должны

  быть сделаны в списке АCL.  Следующие  символические  имена

  для элементных кодов определены в системной макробиблиотеке

  ($ACLDEF):

  ACL$C_ACLLENGTH    - возвращает размер в байтах списка ACL

                       об'екта. Поле "адрес буфера" указывает

                       на длинное слово, содержащее размер;

  ACL$C_ADDACLENT    - добавляет элемент ACE в начало списка

                       ACL, если аргумент CONTXT равен 0, в

                       конец ACL, если аргумент CONTXT равен

                       минус 1, или в то место,  на  которое

                       указывает    предыдущий      код

                       ACL$C_FNDACETYP  или ACL$C_EFDACLENT.

                       Поле "адрес буфера" указывает на стру-

                       ктуру данных  переменной длины, содер-

                       жащую добавляемый элемент ACE. Исполь-

                       зуя код  ACL$C_ADDаCLENT,  можно доба-

                       вить более одного   элемента  ACE, при

                       этом поле "адрес буфера" должно содер-

                       жать общий размер всех элементов ACE,

                       которые находятся в буфере;

  ACL$C_DELACLENT    - удаляет элемент ACE, на который ука-

                       зывает поле "адрес буфера" или, если




                           - 155 -

                        00152-01 97 06


                       это поле равно нулю, тот элемент ACE,

                       на который указывают предыдущие коды

                       ACL$C_FNDACETYP или ACL$_FNDACLENT;

  ACL$C_DELETEACL    - удаляет весь список ACL за исключе-

                       нием защищенных элементов ACE;

  ACL$C_FNDACETYP    - определяет местоположение элемента

                       ACE того типа, на который указывает

                       поле "адрес буфера";

  ACL$C_FNDACLENT    - определяет местоположение элемента

                       ACE, на который указывает поле

                       "адрес буфера";

  ACL$C_RLOCK_ACL    - обеспечивает блокировку чтения

                       об'екта, чтобы заблокировать все

                       записи в список ACL об'екта. Неза-

                       висимо от режима вызывающей прог-

                       раммы блокировки списка ACL явля-

                       ются блокировками режима пользова-

                       теля, так что все режимы доступа

                       будут корректно блокировать списки

                       ACL;

  ACL$C_WLOCK_ACL    - обеспечивает исключающую блокировку

                       об'екта, чтобы заблокировать все

                       остальные попытки чтения и записи

                       списка ACL об'екта. Независимо от

                       режима вызывающей программы блоки-

                       ровки списка ACL являются блокиров-

                       ками режима пользователя, так что




                           - 156 -

                        00152-01 97 06


                       все режимы доступа будут корректно

                       блокировать списки ACL;

  ACL$C_MODACLENT    - заменяет элемент ACE, на который

                       указывает предыдущий код ACL$C_

                       FNDACETYP или ACL$C_FNDACLENT, эле-

                       ментом ACE, на который указывает

                       поле "адрес буфера";

  ACL$C_READACE      - читает элемент ACE, на который ука-

                       зывает код ACL$C_FNDACETYP или ACL$C_

                       FNDACLENT в буфер, на который ука-

                       зывает поле "адрес буфера";

  ACL$C_READACL      - читает список ACL об'екта. Аргумент

                       CONTXT должен быть первоначально

                       установлен равным нулю. Элементы

                       ACЕ считываются в буфер, на который

                       указывает поле "адрес буфера";

  ACL$C_UNLOCK_ACL   - освобождает блокировку, полученную

                       кодами ACL$C_RLOCK_ACL или ACL$C_

                       WLOCK_ACL.

       При добавлении элемента ACE кодом ACL$C_ADDACLENT  или

  определении    местоположения    элемента     ACE     кодом

  ACL$C_FNDACETYP или ACL$C_FNDACLENT  программа  $CHANGE_ACL

  просматривает список ACL в поисках элемента,  соответствую-

  щего элементу в буфере ACE. Программа $CHANGE_ACL не всегда

  находит соответствие, основываясь на содержимом всего буфе-

  ра ACE. То, как программа находит соответствие, определяет-

  ся типом элемента ACE. Существуют следующие алгоритмы поис-




                           - 157 -

                        00152-01 97 06


  ка элементов ACE:

       1) элементы ACE  защиты  по  умолчанию  (ACE$C_DIRDEF)

  сопоставляются только по полю типа (ACE$B_TYPE).  Поскольку

  список ACL может иметь только один элемент  ACE  защиты  по

  умолчанию, то программа  $CHANGE_ACL  прекращает  просмотр,

  как только обнаружит соответствие типов;

       2) элементы ACE идентификатора (ACE$C_KEYID) сопостав-

  ляются  по  полям  флагов  (ACE$W_FLAGS)  и  идентификатора

  (ACE$L_KEY);

       3) сигнальные элементы ACE (ACE$C_ALARM) сопоставляют-

  ся  по  полям  флагов   (ACE$W_FLAGS)   и   маски   доступа

  (ACE$L_ACCESS);

       4) все остальные типы элементов  ACE  сравниваются  по

  полному содержанию буфера ACE.

       Поскольку  программа  $CHANGE_ACL  использует  правила

  соответствия, добавление  элемента  ACE  может  привести  к

  замене другого элемента  ACE.  Например,  если  добавляется

  элемент ACE идентификатора с теми же полями флагов и идент-

  фикатора, но с другой маской доступа, то новый элемент  ACE

  заменит старый. Если добавляется элемент ACE в начало спис-

  ка ACL, программа $CHANGE_ACL удаляет такой же элемент ACE,

  т.к. он не может быть найден.

       - Если добавляется элемент элемент ACE ниже соответст-

         вующего ему элемента в списке  ACL,  то  добавляемый

         элемент ACE не имеет никакого влияния, поскольку  он

         никогда не будет найден.






                           - 158 -

                        00152-01 97 06


       3.5. Модификация списка прав


       Когда создается  процесс,  программа  LOGINOUT  строит

  список прав для  процесса,  состоящий  из  идентификаторов,

  которые принадлежат пользователю и соответствующих  иденти-

  фикаторов, связанных со средой. Системный список прав, соз-

  даваемый по умолчанию, используется в дополнение  к  любому

  списку прав процесса. Модификации  системного  списка  прав

  вызывают модификации прав каждого процесса.

       Привилегированная подсистема может изменить  системный

  список прав или список прав  процесса  с  помощью  программ

  системного обслуживания $GRANTID или $REVOKID. Эти програм-

  мы системного обслуживания не  предназначены  для  обычного

  пользователя  операционной  системы   МОС   ВП.   Программа

  $GRANTID добавляет идентификатор к списку  прав  или,  если

  идентификатор уже является частью списка прав, она  модифи-

  цирует атрибут идентификатора. Программа  $REVOKID  удаляет

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

  аргументами ID или NAME, является владельцем других иденти-

  фикаторов, то идентификатор удаляется из этих записей  дер-

  жателей.

       Программы $GRANTID  и  $REVOKID  используют  аргументы

  PIDADR и PRCNAM таким же способом, что и все  другие  прог-

  раммы управления процессами (см. документы [7] и [8]).











                           - 159 -

                        00152-01 97 06


       3.6. Контроль защиты доступа


       Программа системного обслуживания $CHKPRO обращается к

  контролю защиты доступа, который используется  операционной

  системой МОС ВП. Программа системного обслуживания не  раз-

  решает и не запрещает доступ, а только  выполняет  контроль

  защиты для программного продукта,  прикладной  программы  и

  дуругих подобных подсистем, которые в свою  очередь  должны

  разрешать или запрещать доступ.

       Входная и  выходная  информация  передается  программе

  $CHKPRO с помощью аргумента ITMLST, который является  адре-

  сом  элементного  списка  дескрипторов.  Программа  $CHKPRO

  сравнивает элементный список прав и привилегий  пользовате-

  ля, пытающегося получить доступ к об'екту, со списком атри-

  бутов защиты данного об'екта. Если пользователь может полу-

  чить доступ к об'екту, то программа $CHKPRO возвращает сос-

  тояние SS$_NORMAL, в противном случае возвращается  состоя-

  ние SS$_NOPRIV.

       Программа $CHKPRO не запрещает и не разрешает доступа.

  Подсистема сама  должна  разрешить  или  запретить  доступ,

  основываясь на выходной информации программы $CHKPRO  (коды

  SS$_NORMAL или SS$_NOPRIV).

       Кроме того  программа  $CHKPRO  возвращает  элементный

  список прав и привилегий,  которые  разрешают  пользователю

  доступ к об'екту, а также имена  сигналов  защиты,  которые

  подаются при попытке доступа.







                           - 160 -

                        00152-01 97 06


       3.7. Дополнительные   программы   системного

            обеспечения защиты


       Операционная система МОС ВП предоставляет две дополни-

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

  вают влияние на защиту системы. Служебная программа $ERAPAT

  обеспечивает механизм,  посредством  которого  пользователь

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

  Шаблон стирания секретных данных может иметь  конфигурацию,

  удовлетворяющую конкретным требованиям установки. Служебная

  программа $MTACCESS проверяет поле доступности в метке маг-

  нитной ленты, чтобы определить защищен ли данный том опера-

  ционной системой МОС ВП.

































                           - 161 -

                        00152-01 97 06


           4. Программы обслуживания флагов событий



       Флаги событий являются битами извещения  о  состоянии,

  которые обслуживаются операционной системой МОС ВП и  пред-

  назначены для общего использования в программах.  Программы

  могут использовать флаги событий для  выполнения  множества

  функций сигнализации. Программы обслуживания флагов событий

  сбрасывают, устанавливают и считывают  флаги  событий.  Они

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

  жив установку флага или флагов событий. Следующие программы

  системного осблуживания обслуживают флаги событий:

       1)   подсоединить   кластер   общих   флагов   событий

  ($ASCEFC);

       2) отсоединить кластер общих флагов событий ($DACEFC);

       3) удалить кластер общих флагов событий ($DLCEFC);

       4) установить флаг события ($SETEF);

       5) сбросить флаг события ($CLREF);

       6) прочитать флаги событий ($READEF);

       7) ожидать одного флага события ($WAITFR);

       8) ожидать логического "или" флагов событий ($WFLOR);

       9) ожидать логического "и" флагов событий ($WFLAND).

       Некоторые программы системного обслуживания устанавли-

  вают флаг события, чтобы отметить, что событие  завершилось

  или произошло. Вызывающая программа может  проверить  флаг.

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

  используют флаги событий, чтобы сигнализировать о  событиях

  вызывающему процессу:




                           - 162 -

                        00152-01 97 06


       1) поставить в очередь запрос на блокирование ($ENQ  и

  $ENQW);

       2) получить информацию об устройстве или томе ($GETDVI

  и $GETDVIW);

       3) получить информацию о задании или процессе ($GETJPI

  и $GETJPIW);

       4) получить информацию обо  всей  системе  ($GETSYI  и

  $GETSYIW);

       5) поставить в очередь запрос на  ввод-вывод  ($QIO  и

  $QIOW);

       6) установить таймер ($SETIMR);

       7) обновить файл секции на диске ($UPDSEC);

       8) обновить файл секции на диске и ждать ($UPDSECW).

       Более того, флаги событий могут использовать несколько

  процессов, если только эти процессы входят в  одну  группу.

  Так, если требуется разработать подсистему, которая требует

  одновременного  выполнения  нескольких   процессов,   можно

  использовать флаги событий  для  установления  связи  между

  ними и синхронизации их действий.



       4.1. Номера флагов событий и кластеры флагов

            событий


       Каждый флаг события имеет уникальный десятичный номер,

  и все аргументы флагов событий при вызовах программ систем-

  ного обслуживания ссылаются  на  данные  номера.  Например,

  если при вызове программы системного обслуживания $QIO ука-

  зывается флаг  события  1,  то  после  завершения  операции



                           - 163 -

                        00152-01 97 06


  ввода-вывода устанавливается флаг 1.

       Чтобы организовать работу с  группой  флагов  событий,

  данные флаги группируются в кластеры по 32 флага  в  каждом

  кластере, и нумеруются справа налево в соответствии с бита-

  ми с 0 по 31 в длинном слове, кластеры нумеруются с 0 до 3.

  Диапазон номеров флагов  событий  включает  флаги  во  всех

  кластерах: флаг 0 - это первый флаг в кластере 0, флаг 32 -

  это первый флаг в кластере 1 и т.д.

       Имеется два  типа  кластеров,  кластеры  общих  флагов

  событий и кластеры локальных флагов событий:

       1) кластеры локальных флагов событий  можно  использо-

  вать только внутри одного процесса. Кластеры локальных фла-

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

       2) кластеры общих  флагов  событий  могут  разделяться

  коопирирующимися процессами из одной группы. Перед тем, как

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

  он должен быть явным образом "соединен" с этим кластером.

       Диапазоны флагов событий и кластеров,  к  которым  они

  принадлежат, приведены в табл. 26.




















                           - 164 -

                        00152-01 97 06


                                                   Таблица 26

           Сводка номеров флагов событий и кластеров

  -----------------------------------------------------------

   Номер  !Номера флагов!    Описание     !    Ограничение

  кластера!   событий   !                 !

  -----------------------------------------------------------

     0    !   0 - 31    ! Кластеры локаль-!Флаги событий с 24

     1    !  32 - 63    ! Ных флагов собы-!по 31 не использу-

          !             ! тий процесса для!ются операционной

          !             ! общего  исполь- !системой МОС ВП

          !             ! зования         !

     2    !  64 - 95    ! Назначаемый кла-!Должен быть подсо-

     3    !  96 - 127   ! Стер общих фла- !Единен перед ис-

          !             ! гов событий     !пользованием



       4.1.1. Спецификация номеров флагов  событий  и

              кластеров флагов событий


       Одни и те же программы системного обслуживания манипу-

  лируют флагами как в кластерах локальных флагов событий так

  и в кластерах общих флагов событий. Поскольку  номер  флага

  события включает в себя номер кластера, то при вызове прог-

  раммы системного обслуживания, которая обращается  к  флагу

  события, нет необходимости указывать номер кластера.

       Если  программа  системного  обслуживания  требует   в

  качестве аргумента номер кластера общих флагов событий,  то

  необходимо только задать номер любого флага события, входя-

  щего в этот кластер. Так, чтобы прочитать флаги событий  из



                           - 165 -

                        00152-01 97 06


  кластера 1, можно указать любой номер в диапазоне от 32  до

  63.

       Чтобы  предотвратить  случайное  использование   флага

  события, который уже используется в каком-то месте програм-

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

  событий.

       Локальные флаги событий  наиболее  часто  используются

  совместно с другими  программами  системного  обслуживания.

  Например, можно использовать программу системного  обслужи-

  вания установки таймера ($SETIMR) для запроса на  установку

  флага события в конкретное время дня  или  после  истечения

  определенного интервала времени. Если  требуется  перевести

  процесс в состояние ожидания на определенный период  време-

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

  программы $SETIMR, а затем использовать программу системно-

  го обслуживания $WAITFR.

       Пример.

  TIME:   .BLKQ   1       ; будет содержать интервал времени

                          ; ожидания

            . . .

          $SETIMR_S -     ; установить таймер

                  EFN=#33, -

                  DAYTIM=TIME

          $WAITFR_S -

                  EFN=#33 ; ждать, пока истечет интервал вре-

                          ; мени

       В   приведенном   примере   аргумент   DAYTIM   задает




                           - 166 -

                        00152-01 97 06


  64-битовое значение времени.



       4.2. Ожидания флагов событий


       Три программы системного обслуживания помещают процесс

  в состояние ожидания до тех пор, пока не  будет  установлен

  флаг (или флаги) события:

       1) программа  системного  обслуживания  "ждать  одного

  флага события" ($WAITFR) помещает процесс в состояние  ожи-

  дания, пока не будет установлен флаг события;

       2) программа системного обслуживания "ждать логическо-

  го "или" флагов событий" ($WFLOR) помещает процесс  в  сос-

  тояние ожидания, пока не будет  установлен  любой  флаг  из

  указанной группы флагов событий;

       3) программа системного обслуживания "ждать логическо-

  го "и" флагов событий" ($WFLAND) помещает процесс в состоя-

  ние ожидания, пока не будут установлены все флаги  из  ука-

  занной группы флагов событий.

       Другой  программой  системного  обслуживания,  которая

  принимает в качестве аргумента номер флага события, являет-

  ся программа "поставить в  очередь  запрос  на  ввод-вывод"

  ($QIO). В примере показан программный  сегмент,  в  котором

  дважды вызывается программа системного обслуживания $QIO  и

  используется программа системного обслуживания $WFLAND  для

  перевода в состояние ожидания, пока на выполнятся обе  опе-

  рации ввода-вывода, после чего программа продолжает  выпол-

  нение.





                           - 167 -

                        00152-01 97 06


       Пример.

          $QIO_S  EFN=#1,...  1   ; выдает первый запрос на

                                  ; ввод-вывод

          BSBW    ERROR           ; контроль на ошибку

          $QIO_S  EFN=#2,...      ; выдается второй запрос на

                                  ; ввод-вывод

          BSBW    ERROR           ; контроль на ошибку

          $WFLAND_S -   2         ; ожидать, пока закончатся

                                  ; обе операции

                  EFN=#1, -  3

                  MASK=#^B0110

          BSBW    ERROR           ; контроль на ошибку

                    . . .         ; продолжить выполнение

       Примечания:

       1. Аргумент флаг события задается для каждого  запроса

  $QIO. Оба эти флага события находятся в кластере с  номером

  0;

       2. После того, как оба запроса на  ввод-вывод  успешно

  поставлены в очередь, программа вызывает программу  систем-

  ного обслуживания "ждать логического  "и"  флагов  событий"

  ($WFLAND) для перевода в состояние ожидания, пока не закон-

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

  раммы аргумент EFN может указывать любой номер флага  собы-

  тия в кластере, который должен  содержать  ожидаемые  флаги

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

  2;

       3. Программа системного обслуживания $WFLAND (и другие




                           - 168 -

                        00152-01 97 06


  программы системного обслуживания ожидания) ждет,  пока  не

  будет установлен флаг события,  а  не  завершения  операции

  ввода-вывода. Если какое-либо другое событие должно было бы

  установить требуемые флаги событий, то ожидание флага  было

  бы абсолютно  бессмысленным.  Использование  флагов  должно

  быть четко скоординировано (п. 7.3.1).



       4.3. Установка и сброс флагов событий


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

  флаги событий, сбрасывают флаг события, указанный при вызо-

  ве программы, перед тем, как поставить в очередь запрос  на

  таймер или операцию ввода-вывода. Это гарантирует, что сос-

  тояние флага события различается процессами. При  использо-

  вании флагов событий в кластерах локальных  флагов  событий

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

  тоянием флага.

       Программы  системного  обслуживания  "установить  флаг

  события" ($SETEF) и "сбросить флаг события" ($CLREF)  уста-

  навливают и сбрасывают флаги событий.

       Пример.

          $CLREF_S        EFN=#32

       Программы  системного  обслуживания  $SETEF  и  $CLREF

  возвращают коды успешного  состояния,  которые  индицируют,

  был ли установлен или сброшен  указанный  флаг  при  вызове

  программы. Вызывающая программа, таким образом, может опре-

  делить, если требуется, предыдущее состояние флага. Возвра-

  щаемые  коды  имеют  символические   имена   SS$_WASSET   и



                           - 169 -

                        00152-01 97 06


  SS$_WASCLR.

       Флаги событий в кластере общих флагов событий первона-

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



       4.4. Кластеры общих флагов событий


       Флаги общих событий действуют как  линия  связи  между

  образами, выполняющимися в  различных  процессах  из  одной

  группы. Флаги общих событий используются в качестве средст-

  ва синхронизации для других более  сложных  методов  связи,

  таких как логические имена и глобальные секции.

       Прежде, чем  какой-либо  процесс  сможет  использовать

  флаги событий в кластере общих флагов  событий,  необходимо

  создать этот  кластер.  Программа  системного  обслуживания

  "присоединить кластер общих флагов событий" ($ASCEFC)  соз-

  дает кластер общих флагов событий. После того, как  кластер

  создан, другие процессы из  той  же  группы  могут  вызвать

  программу $ASCEFC, чтобы установить свою связь с этим клас-

  тером, после чего они получают доступ к флагам в этом клас-

  тере.

       Когда создается кластер общих флагов событий, он  дол-

  жен идентифицироваться строкой  имени  (п.  4.6.1).  Каждый

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

  вать то же самое имя для обращения  к  кластеру.  Программа

  $ASCEFC устанавливает соответствие между именем кластера  и

  его номером, который ему назначает процесс.

       В примере показано, как процесс может создать  кластер

  общих флагов событий с именем  COMMON_CLUSTER  и  назначить



                           - 170 -

                        00152-01 97 06


  ему номер 2.

       Пример.

  CLUSTER:

          .ASCID  /COMMON_CLUSTER/ ; имя кластера

           . . .

          $ASCEFC_S -              ; создать кластер с

                                   ; с номером 2

                  EFN=#65, -

                  NAME=CLUSTER

       После этого другие процессы той же группы  могут  свя-

  заться с этим кластером. Такие  процессы  при  обращении  к

  кластеру должны использовать то же имя в виде строки симво-

  лов, однако номера кластера, которые они назначают, не обя-

  заны быть теми же самыми.

       Кластеры общих флагов событий бывают  постоянными  или

  временными. Аргумент PERM программы системного обслуживания

  $ASCEFC определяет, является ли кластер временным или  пос-

  тоянным.

       Временные кластеры требуют,  чтобы  создающий  процесс

  имел квоту для элементов очереди таймера (квота TQELM). Они

  удаляются, когда отсоединяются все  процессы,  связанные  с

  кластером. Отсоединение может быть выполнено либо  в  явном

  виде с помощью программы системного обслуживания  "отсоеди-

  нить кластер общих флагов событий" ($DACEFC)  либо  неявно,

  когда образ выходит из операционной системы МОС ВП.

       Постоянные кластеры требуют, чтобы  создающий  процесс

  имел пользовательскую  привилегию  PRMCEB.  Такие  кластеры




                           - 171 -

                        00152-01 97 06


  существуют до тех пор, пока не будут явно помечены для уда-

  ления с помощью программы системного обслуживания $DLCEFC.

       Если все взаимодействующие процессы, которые собирают-

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

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

  же процесс,  вызвавший  программу  системного  обслуживания

  $ASCEFC, создает кластер.



       4.5. Отсоединение и удаление кластеров общих

            флагов событий


       Когда процесс больше не нуждается в доступе к кластеру

  общих флагов событий, он вызывает программу системного обс-

  луживания  "отсоединить  кластер  общих   флагов   событий"

  ($DACEFC). Если все процессы, соединение с временным  клас-

  тером вызвали программу $DACEFC,  то  операционная  система

  МОС ВП удаляет этот кластер. Если  процесс  не  отсоединяет

  себя от кластера  явно,  то  операционная  система  МОС  ВП

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

  программу $ASCEFC, выходит из системы.

       Постоянные кластеры, однако,  должны  явно  помечаться

  для удаления программой  системного  обслуживания  "удалить

  кластер общих флагов событий" ($DLCEFC).  После  того,  как

  кластер помечается для удаления, он не удаляется, пока  все

  соединенные с ним процессы не будут отсоединены.









                           - 172 -

                        00152-01 97 06


       4.6. Кластеры   общих   флагов   событий   в

            разделяемой памяти


       Кластер общих флагов  событий  в  памяти,  разделяемой

  несколькими процессорами,  является  средством,  с  помощью

  которого процессы, выполняющиеся на  различных  процессорах

  могут связываться один  с  другим.  Процесс  может  создать

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

  "соединить кластер общих флагов событий ($ASCEFC), специфи-

  цирующую имя кластера, которая размещает кластер в  памяти,

  разделяемой несколькими процессорами (см. п. 4.6.1). Другие

  процессы на том же или на другом процессоре могут связаться

  с этим кластером, задавая то же самое имя кластера.

       Чтобы создать или удалить кластер общих флагов событий

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

  зовательская привилегия  SHMEM,  однако  для  подсоединения

  сущестующего кластера такой привилегии не требуется.



       4.6.1. Имя кластера


       Аргумент NAME для  программы  системного  обслуживания

  "подсоединить кластер общих флагов событий" ($ASCEFC) иден-

  тифицирует кластер, который процесс создает или  с  которым

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

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

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








                           - 173 -

                        00152-01 97 06


       Эта строка имеет следующий формат:

  [имя-разделяемой-памяти:] имя-кластера

  где имя-разделяемой-памяти - идентифицирует память,  разде-

       ляемую многими процессорами, в  которой  кластер  соз-

       дается либо уже существует. (это имя назначается блоку

       памяти когда он подсоединяется во время генерации сис-

       темы). Если это поле не включено, то  кластер  сущест-

       вует или создается в памяти, которая является  локаль-

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

       вающий процесс;

      имя-кластера - это  имя кластера. Можно  выбрать  любое

       допустимое имя длиной от 1 до 15  символов.  При  этом

       все процессы, связанные с тем же самым кластером общих

       флагов событий, должны задавать то же имя.

       Можно  включать  как  имя-разделяемой-памяти   так   и

  имя-кластера для кластера общих флагов  событий  в  памяти,

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

  требуется использовать существующие программы без повторной

  компиляции или повторной компановки, то  он  может  указать

  только имя-кластера и оставить операционной системе МОС  ВП

  транслировать его до полной спецификации. Операционная сис-

  тема МОС ВП пытается выполнить трансляцию логического имени

  строки, заданной аргументом NAME.

       Текущая строка  с  именем  просматривается  в  поисках

  двоеточия. Если двоеточие  найдено  внутри  текущей  строки

  имени, то принимается, что  кластер  общих  флагов  событий

  должен быть расположен в разделяемой  памяти  и  трансляция




                           - 174 -

                        00152-01 97 06


  продолжается следующим образом:

       1) часть текущей  строки  имени  справа  от  двоеточия

  помещается в буфер имя-кластера. Часть текущей строки имени

  слева от двоеточия становится новой текущей строкой имени;

       2) к текущей строке имени добавляется префикс  CEF$  и

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

       3) если результат содержит логическое имя, то шаги 1 и

  2 повторяются до  тех  пор,  пока  трансляция  не  кончится

  успешно или пока число трансляций не превышает число,  ука-

  занное параметром LNM$C_MAXDEPTH при генерации операционной

  системы МОС ВП;

       4) префикс CEF$ удаляется  из  текущей  строки  имени,

  которую уже нельзя транслировать. Это имя становится именем

  разделяемой памяти. Именем кластера будет являться  текущая

  строка, которая содержится в буфере имя-кластера.

       Если  кластер  общих  флагов  событий  размещается   в

  локальной  памяти,  то  трансляция  продолжается  следующим

  образом:

       1) к текущей строке имени добавляется префикс  CEF$  и

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

       2) если результат является логическим именем, то  пов-

  торяется шаг 1 до тех пор, пока  трансляция  не  закончится

  успешно или количество выполненных трансляций  не  превысит

  число, заданное параметром LNM$C_MAXDEPTH;

       3) префикс CEF$ удаляется  из  текущей  строки  имени,

  которую уже нельзя транслировать. Эта текущая строка  имени

  является именем-кластера.




                           - 175 -

                        00152-01 97 06


       Например,  пользователь  сделал  следующее  назначение

  логического имени:

       Пример 1.

  $DEFINE CEF$CLUS_RT SHRMEM$1:CLUS_RT

       Пользовательская программа  содержит  следующий  фраг-

  мент:

       Пример 2.

  NAMEDESC:

          .ASCID  /CLUS_RT/       ; дескриптор для

                                  ; логического имени

                                  ; кластера

           . . .

          $ASCEFC_S -

                  ...,NAME=NAMEDESC,...

       Примечания:

       Имеет место следующая трансляция логического имени:

       1. К имени CLUS_RT добавляется префикс CEF$;

       2. Имя CEF$CLUS_RT транслируется  в  SHRMEM$1:CLUS_RT.

  (дальнейшая трансляция логического имени  заканчивается  по

  ошибке и строка передается служебной программе).

       Имеется два исключения из  данного  метода  трансляции

  логического имени:

       1) если строка имени начинается с символа  подчеркива-

  ния (_),  то  операционная  система  МОС  ВП  рассматривает

  результирующую строку в качестве актуального имени (т.е. не

  выполняется дальнейшая трансляция);

       2) если строка имени является  результатом  трансляции




                           - 176 -

                        00152-01 97 06


  логического имени, тогда проверяется, имеет ли  эта  строка

  имени "терминальный атрибут". Если  строка  имени  отмечена

  "терминальным" атрибутом, то операционная  система  МОС  ВП

  рассматривает результирующую строку в качестве  актуального

  имени (т.е. не выполняется дальнейшей трансляции).
















































                           - 177 -

                        00152-01 97 06


                  5. Служебные программы AST



       Некоторые программы системного обслуживания  разрешают

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

  ное событие.  Поскольку  прерывание  происходит  асинхронно

  (вне последовательности) по отношению к выполнению  процес-

  са, механизм прерывания  называется  асинхронным  системным

  прерыванием (AST). Прерывание обеспечивает передачу  управ-

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

  событие.

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

  вают AST:

       1) включить механизм AST ($SETAST);

       2) об'явить AST ($DCLAST);

       3) установить AST восстановления питания ($SETPRA).

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

  механизм AST, принимают в качестве аргумента адрес подпрог-

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

  передаваться управление, когда происходит событие.

       Прерывания AST используют следующие программы  систем-

  ного обслуживания:

       1) об'явить AST ($DCLAST);

       2) поставить в очередь запрос на блокирование ($ENQ);

       3)   получить   информацию    об    устройстве-задании

  ($GETDVI);

       4) получить информацию о задании-процессе ($GETJPI);

       5) получить информацию о всей системе ($GETSYI);




                           - 178 -

                        00152-01 97 06


       6) поставить в очередь запрос на ввод-вывод ($QIO);

       7) установить таймер ($SETIMR);

       8) установить AST восстановления питания ($SETPRA);

       9) обновить файл секции на диске ($UPDSEC).

       Например, если вызывается программа системного  обслу-

  живания "установить таймер"  ($SETIMR),  то  можно  указать

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

  интервала времени или в  конкретное  время  дня.  Программа

  системного обслуживания планирует выполнение подпрограммы и

  возвращает управление, а образ программы продолжает  выпол-

  нение. Когда происходит затребованное событие, операционная

  система МОС ВП "доставляет" AST, прерывая процесс и вызывая

  указанную подпрограмму.

       В примере 1 показана типичная программа, которая вызы-

  вает программу системного обслуживания $SETIMR  с  запросом

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

       Пример 1.

  NOON:   .BLKQ   1               ; будет содержать 12:00

                                  ; системного времени

          .ENTRY  LIBRA,0         ; маска входа для LIBRA

            .

            .

            .

  1       $SETIMR_S -            ; установить таймер

                  DAYTIM=NOON, -

                  ASTADR=TIMEAST

          BSBW    ERROR           ; контроль на ошибку




                           - 179 -

                        00152-01 97 06



            .
            .                      +-------------+
            .    <-----------------!  Прерывание ! 2
            .                      !  таймера    !
            .                      +-------------+
          .ENTRY  TIMEAST, ^M<>   ; маска входа для подпрог-

            . . .                 ; раммы AST, обрабатываю-

                                  ; щей запрос таймера

  3       .

          RET                     ; сделано

          .END    LIBRA

       Примечания:

       1. Вызов  программы  системного  обслуживания  $SETIMR

  запрашивает прерывание ASт в полдень 12:00.

       Аргумент DAYTIM  ссылается  на  квадрослово  с  именем

  NOON, которое должно содержать время  в  системном  формате

  времени (64 бита). Аргумент ASTADR  ссылается  на  TIMEAST,

  адрес подпрограммы обслуживания AST.

       После завершения вызова программы системного  обслужи-

  вания процесс продолжает выполнение.

       2. В 12:00 таймер извещает операционную систему МОС ВП

  о возникновении заданного события. Операционная система мос

  вп прерывает  выполнение  процесса  и  передает  управление

  подпрограмме обслуживания AST.

       3. Пользовательская подпрограмма TIMEAST  обрабатывает

  прерывание. Когда подпрограмма AST заканчивается она выдает

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

  возобнавляет выполнение с той точки,  в  которой  она  была

  прервана.




                           - 180 -

                        00152-01 97 06


       5.1. Режим доступа для выполнения AST


       Каждый запрос на AST связан с режимом доступа програм-

  мы, из  которой  запрашивается  AST.  Таким  образом,  если

  образ, выполняющийся  в  режиме  пользователя,  запрашивает

  отметку о событии посредством AST, то подпрограмма обслужи-

  вания AST выполняется в пользовательском режиме.

       Поскольку прерывания AST, которые запрашиваются  поль-

  зователем, почти всегда выполняются в режиме  пользователя,

  то ему нет необходимости беспокоиться  о  режимах  доступа.

  Однако пользователю полезно знать о некоторых подходах опе-

  рационной системы МОС ВП к доставке AST (подраздел 5.5.).



       5.2. Прерывания  AST  и  состояния  ожидания

            процессов


       Процесс, который находится в состоянии ожидания, может

  быть прерван для доставки  AST  и  выполнения  подпрограммы

  обслуживания AST. После того как подпрограмма  обслуживания

  AST закончит выполнение, процесс возвращается  в  состояние

  ожидания, если еще действительны те условия, которые вызва-

  ли ожидание.

       Можно прерывать любые состояния ожидания, кроме приос-

  тановленных ожиданий  (SUSP)  и  приостановленных  ожиданий

  обмена (SUSPO).










                           - 181 -

                        00152-01 97 06


       5.2.1. Ожидание флагов событий


       Если процесс ожидает флаг события, то после выполнения

  подпрограммы обслуживания AST состояние ожидания восстанав-

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

  AST флаг окажется установленным (например, закончилась опе-

  рация ввода-вывода), то процесс продолжает выполнение.



       5.2.2. Спячка


       Процесс может поместить себя в  состояние  ожидания  с

  помощью   программы   системного   обслуживания    "спячка"

  ($HIBER). Это состояние ожидания может прерваться для  дос-

  тавки AST. После завершения выполнения подпрограммы  обслу-

  живания AST процесс продолжает "спячку".  Процесс,  однако,

  может "разбудить" себя в подпрограмме обслуживания AST, или

  быть разбуженным другим процессом, или в результате  запла-

  нированного по времени запроса  на  пробуждение.  Тогда  он

  продолжает выполнение после завершения подпрограммы  обслу-

  живания AST.

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

  Такое ожидание не может быть прервано AST (раздел 8).



       5.2.3. Ожидание ресурсов и страничные отказы


       Когда процесс выполняет  образ,  операционная  система

  МОС ВП может поместить этот процесс в  состояние  ожидания,

  пока не станут доступными затребованные ресурсы,  или  пока

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


                           - 182 -

                        00152-01 97 06


  го пространства. Эти ожидания могут  прерываться  доставкой

  AST.



       5.3. Об'явление прерываний AST


       Большинство AST  происходят  в  результате  завершения

  асинхронного события инициализированного программой систем-

  ного обслуживания (например,  запросы  $QIO  или  $SETIMR),

  когда процесс запрашивает извещение об этом с помощью AST.

       Имеется также программа системного обслуживания, кото-

  рая создает прерывания AST. Это  программа  "об'явить  AST"

  ($DCLAST). С помощью этой программы процесс может об'являть

  AST только для того же или менее привилегированного  режима

  доступа.



       5.4. Подпрограммы обслуживания AST


       Подпрограмма обслуживания AST  должна  быть  отдельной

  программой. Операционная система МОС ВП вызывает AST  инст-

  рукцией CALLG. Подпрограмма должна  возвращать  управление,

  используя инструкцию RET.  Если  подпрограмма  обслуживания

  модифицирует любые регистры, отличные от R0 или R1, то  она

  должна установить соответствующие биты в маске входа, чтобы

  содержимое этих регистров было сохранено.

       Поскольку нельзя  заранее  знать,  когда  подпрограмма

  обслуживания AST  начнет  выполняться,  программист  должен

  корректно писать эту подпрограмму, чтобы она не модифициро-

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




                           - 183 -

                        00152-01 97 06


  (если только это не является ее функцией).

       При входе в подпрограмму обслуживания AST регистр ука-

  зателя аргумента (AP) указывает на список аргументов, кото-

  рый имеет формат, представленный на рис. 34.


  31                                       8 7           0
  +-----------------------------------------+-------------+
  !                 0                       !     5       !
  +-----------------------------------------+-------------+
  !                  Параметр AST                         !
  +-------------------------------------------------------+
  !                       R0                              !
  +-------------------------------------------------------+
  !                       R1                              !
  +-------------------------------------------------------+
  !                       PC                              !
  +-------------------------------------------------------+
  !                       PSL                             !
  +-------------------------------------------------------+

                            Рис. 34


       Регистры R0 и R1, PC и PSL в этом списке  совпадают  с

  теми, которые были сохранены в момент  прерывания  процесса

  доставкой AST.

       Параметр AST является аргументом,  который  передается

  подпрограмме обслуживания AST так, чтобы он идентифицировал

  событие, которое вызывает прерывание AST. При вызове  прог-

  раммы системного обслуживания, требующей AST, или при вызо-

  ве системной служебной программы $DCLAST можно указать  это

  значение для параметра AST. Если это значение не  задается,

  то по умолчанию оно принимается равным 0.

       Пример иллюстрирует подпрограмму обслуживания  AST.  В

  этом примере прерывания AST ставятся в  очередь  программой

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


                           - 184 -

                        00152-01 97 06


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

  обслуживания $DCLAST.

       Пример.

          .ENTRY  CELESTEF,0       ; маска входа

            .

  1   $DCLAST_S -                  ; AST с параметром = 1

                  ASTADR=ASTRTN, -

                  ASTPRM=#1

           . . .

          $DCLAST_S -            ; AST с параметром = 2

                  ASTADR=ASTRTN, -

                  ASTPRM=#2

           . . .

          RET                    ; вернуть управление

  ;

  ASTRTN: .WORD   0              ; маска входа

  2       CMPL  #1,4(AP)   ; проверить, этот параметр AST

          BEQL    10$        ; если равно 1, то  перейти  к

                             ; 10$

          CMPL    #2,4(AP)   ; проверить, этот параметр AST

          BEQL    20$        ; если равно 2, то  перейти  к

                             ; 20$

            .

  10$:      .                    ; обработать первое AST

          RET                    ; вернуться

  20$       .                    ; обработать второе AST

          RET                    ; вернуться




                           - 185 -

                        00152-01 97 06


           .

          .END CELESTEF

       Примечание.

       1. Программа CELESTEF дважды вызывает  программу  сис-

  темного обслуживания $DCLAST, чтобы поставить  AST  в  оче-

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

  именем ASTRTN. Однако для каждого вызова передаются различ-

  ные параметры.

       2. Первое  действие,  которое  выполняет  подпрограмма

  AST, состоит в проверке параметра  AST,  чтобы  определить,

  доставлен он при первом  или  втором  об'явлении.  Значение

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

  имеется несколько различных значений, определяющих несколь-

  ко различных путей выполнения, то  рекомендуется  использо-

  вать инструкцию CASE языка макроассемблер операционной сис-

  темы МОС ВП.



       5.5. Доставка AST


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

  какого-то условия требует доставить ASТ, операционная  сис-

  тема МОС ВП не может сразу же доставить AST  процессу.  AST

  не может быть доставлено процессу, если имеет место одно из

  следующих условий:

       1) в данное время выполняется подпрограмма  обслужива-

  ния AST с таким же или более привилегированным режимом дос-

  тупа.





                           - 186 -

                        00152-01 97 06


       Поскольку во время выполнения подпрограммы  обслужива-

  ния AST прерывания AST неявно отключены, то  одна  подпрог-

  рамма AST не может быть прервана другой подпрограммой  AST,

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

  быть прервана для AST, об'явленного привилегированным режи-

  мом доступа;

       2) доставка AST для данного режима  доступа  отключена

  явно.

       Процесс может  отключать  доставку  прерываний  AST  с

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

  низм AST" ($SETAST). Эта программа системного  обслуживания

  может быть полезной, когда программа  выполняет  последова-

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

  выполнения подпрограммы AST;

       3) процесс выполняется с режимом доступа более  приви-

  легированным, чем тот с которым об'является AST.

       Например, если в результате работы программы системно-

  го обслуживания об'явлено AST с режимом пользователя, но  в

  это время программа выполняется с  более  привилегированным

  режимом доступа (например, вследствие другого вызова  прог-

  раммы системного обслуживания),  то  AST  не  доставляется,

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

  вателя.

       Если при возникновении прерывания AST  не  может  быть

  доставлено, то оно становится в очередь, пока  не  исчезнут

  условия, вызвавшие невозможность доставки. В очереди преры-

  вания AST упорядочиваются по режиму доступа  программы,  из




                           - 187 -

                        00152-01 97 06


  которой они были об'явлены. AST, об'явленные из более  при-

  вилегированных режимов доступа, становятся в начале  очере-

  ди. Если в очереди находятся более одного AST с совпадающим

  режимом доступа, то эти AST доставляются в том  порядке,  в

  котором они были поставлены в очередь.
















































                           - 188 -

                        00152-01 97 06


          6. Программы обслуживания логических имен



       Программы обслуживания  логических  имен  операционной

  системы МОС ВП обеспечивают технику манипулирования и заме-

  щения имен. Логические имена обычно используются для указа-

  ния устройств или файлов для операций  ввода-вывода.  Логи-

  ческие имена можно  использовать  для  передачи  информации

  между процессами путем  создания  логического  имени  одним

  процессом в разделяемой таблице логических имен и  трансля-

  ции этого логического имени в другом процессе. В операцион-

  ной системе МОС ВП имеются следующие программы обслуживания

  логических имен:

       1) создать логическое имя ($CRELNM);

       2) создать таблицу логических имен ($CRELNT);

       3) удалить логическое имя ($DELLNM);

       4) транслировать логическое имя ($TRNLNM).

       Операционная  система  МОС  ВП  выполняет  специальные

  программы трансляции логических имен для тех имен,  которые

  связаны со служебными программами ввода-вывода и с програм-

  мами, которые могут иметь дело со средствами, расположенны-

  ми в разделяемой (многовходовой) памяти (разделы 4, 7, 11).



       6.1. Концепции логических имен


       Как следует из названий системных программ  обслужива-

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

  может создавать, удалять и транслировать логические  имена,

  а также создавать и удалять таблицы логических имен. Имеет-



                           - 189 -

                        00152-01 97 06


  ся несколько концепций, о которых следует знать при исполь-

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



       6.1.1. Логические имена и эквивалентные имена


       Логическое имя -  это  заданная  пользователем  строка

  символов, которая может  представлять  спецификацию  файла,

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

  информацию или другое  логическое  имя.  Обычно  для  целей

  конкретного процесса пользователь задает логические  имена,

  которые легко использовать и запомнить. Администраторы опе-

  рационной системы МОС ВП и  привилегированные  пользователи

  выбирают мнемонические имена  для  файлов,  системных  уст-

  ройств и каталогов, к которым часто обращаются все  пользо-

  ватели.

       Эквивалентное имя - это строка символов, которая опре-

  деляет действительную спецификацию  файла,  имя  устройства

  или строку символов. Эквивалентное  имя  может  также  быть

  логическим  именем.  В  этом  случае  требуется  дальнейшая

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

  ное эквивалентное имя.

       Многозначное логическое имя, обычно называемое поиско-

  вым списком, является именем,  которое  имеет  более  одной

  эквивалентной строки. Каждой  эквивалентной  строке  назна-

  чается номер индекса, начиная с нуля.

       Логические имена и их эквивалентные строки  содержатся

  в таблице логических имен.





                           - 190 -

                        00152-01 97 06


       Логические имена могут иметь максимальную длину до 255

  символов. Длина эквивалентной строки не может превышать 255

  символов. Можно создать пару "логическое имя -  эквивалент-

  ная строка" следующим образом:

       1)  либо  на  командном  уровне,   используя   команды

  ALLOCATE (распределить), ASSIGN (назначить), DEFINE  (опре-

  делить) или MOUNT (смонтировать) языка DCL;

       2) либо в программе,  используя  программы  системного

  обслуживания "создать логическое  имя  ($CRELNM),  "создать

  почтовый ящик и назначить канал" ($CREMBX) или смонтировать

  том" ($MOUNT).

       Например, для обращения к терминалу в программе  можно

  было бы использовать символическое имя TERMINAL. Для  конк-

  ретного прогона программы можно использовать команду DEFINE

  для задания эквивалентного имени TTA2:.



       6.1.2. Таблицы логических имен


       Таблицы логических имен содержат пары "логическое  имя

  - эквивалентная строка". К таблице  логических  имен  обра-

  щаются по логическому имени.

       Таблица логических имен  может  быть  создана  либо  в

  адресном пространстве процесса, либо в  системном  адресном

  пространстве. Таблица, созданная  в  адресном  пространстве

  процесса доступна только этому процессу. Таблицы, созданные

  в системном адресном  пространстве,  потенциально  доступны

  многим процессам. Некоторые таблицы логических имен  содер-

  жат заранее определенные логические имена, которые  обеспе-



                           - 191 -

                        00152-01 97 06


  чивают среду для создания, удаления и трансляции логических

  имен,  заданных  пользователем.  Эти  заранее  определенные

  логические имена начинаются с префикса LNM$. Пары "логичес-

  кое имя - эквивалентное имя"  могут  обслуживаться  в  трех

  типах таблиц логических имен:

       1) каталоги таблиц логических имен;

       2) таблицы логических имен, принятых по умолчанию;

       3) таблицы логических имен, заданных пользователем.

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

  ся каталоги таблиц логических  имен  и  таблицы  логических

  имен, принятых по умолчанию.



       6.1.2.1. Каталоги таблиц логических имен


       Поскольку имена таблиц логических имен являются  логи-

  ческимим именами, то имена таблиц тоже должны размещаться в

  таблицах логических имен. Для  этих  целей  существуют  две

  специальные таблицы, называемые  каталогами.  Имена  таблиц

  транслируются из этих  каталогов  таблиц  логических  имен.

  Пары "логическое имя - эквивалентное" имя  обслуживаются  в

  двух каталогах таблиц:

       1) каталог таблиц процесса (LNM$PROCESS_DIRECTORY);

       2) каталог таблиц системы (LNM$SYSTEM_DIRECTORY).

       Каталог таблиц логических имен процесса содержит имена

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

  конкретного процесса с помощью программы системного  обслу-

  живания $CRELNT. Кроме того, каталог таблиц процесса содер-

  жит имена таблиц логических имен, назначенных системой, имя



                           - 192 -

                        00152-01 97 06


  таблицы логических имен процесса LNM$PROCESS_TABLE и  поис-

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

       Каталог системных таблиц содержит  имена  потенциально

  разделяемых таблиц логических имен и имена таблиц  логичес-

  ких имен, назначенных операционной  системой  МОС  ВП.  Для

  создания логического имени  в  каталоге  системных  таблиц,

  требуется привилегия SYSPRV (п. 6.1.3).

       В этих каталогах таблиц могут присутствовать  логичес-

  кие имена, отличные от имен таблиц логических имен.  Макси-

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

  таблиц не должна превышать  31  символ.  Логические  имена,

  созданные  в   каталогах   таблиц,   должны   состоять   из

  алфавитно-цифровых символов, знаков денежной единицы ($)  и

  подчеркивания (_). Длина эквивалентных строк не должна пре-

  вышать 255 символов.



       6.1.2.2. Таблицы логических  имен,  принятых  по

                умолчанию


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

  процесса или назначаются ему  при  создании  процесса.  Эти

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

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

  цами по умолчанию.  В  таких  таблицах  обслуживаются  пары

  "логическое имя - эквивалентное имя".

       Каждая таблица логических имен, принятых по умолчанию,

  имеет связанное с ней логическое имя. Чтобы поместить логи-

  ческое имя в таблицу логических  имен,  необходимо  указать



                           - 193 -

                        00152-01 97 06


  имя таблицы логических имен. В табл. 27  перечислены  имена

  таблиц логических имен, принятых по умолчанию, и логические

  имена используемые для обращения к ним.

                                                  Таблица 27

  ----------------------------------------------------------

  Таблица         ! Имя               ! Логическое имя

  ----------------------------------------------------------

  Процесс         ! LNM$PROCESS_TABLE ! LNM$PROCESS

  Задание         ! LNM$JOB_XXXXXXXX  ! LNM$JOB

  Группа          ! LNM$GROUP_GGGGGG  ! LNM$GROUP

  Система         ! LNM$SYSTEM_TABLE  ! LNM$SYSTEM

       Буква х представляет  шестнадцатеричное  восьмизначное

  число, которое уникально идентифицирует таблицу  логических

  имен задания.

       Буква G представляет восьмеричное шестизначное  число,

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

       Максимальная длина логических имен, созданных  в  этих

  таблицах, не должна превышать 255 символов без  ограничения

  на типы используемых символов. Длина эквивалентных строк не

  должна превышать 255 символов.

       Таблица  логических  имен  процесса  LNM$PROCESS_TABLE

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

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

  каждого процесса в операционной системе МОС  ВП.  Некоторые

  элементы таблицы логических имен процесса создаются систем-

  ными программами, выполняющимися в более  привилегированных

  режимах доступа. Эти элементы квалифицируются режимом  дос-




                           - 194 -

                        00152-01 97 06


  тупа, из которого был создан данный элемент. Таблица  логи-

  ческих имен процесса содержит постоянные логические  имена,

  связанные с процессом (табл. 28).

                                                   Таблица 28

  -----------------------------------------------------------

  Логическое имя  !               Значение

  -----------------------------------------------------------

  SYS$INPUT       ! Входной поток, по умолчанию

  SYS$OUTPUT      ! Выходной поток, по умолчанию

  SYS$COMMAND     ! Первоначальный входной поток первого

                  ! уровня (SYS$INPUT)

  SYS$ERROR       ! Устройство, принимаемое по умолчанию, на

                  ! которое операционная система МОС ВП пишет

                  ! сообщения об ошибках

       Логическое имя SYS$COMMAND создается только  для  про-

  цесса, выполняющего программу LOGINOUT.

       Большинство элементов в таблице логических  имен  про-

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

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

  принадлежащее процессу логическое имя ABC,  которое  предс-

  тавляет эквивалентные строки XYZ и DEF. Всякий  раз,  когда

  вызывается элементный код LNM$_STRING аргумента ITMLST сле-

  дующей эквивалентной строке назначается  значение  индекса.

  Вновь созданное логическое имя и его  эквивалентная  строка

  содержатся   в    таблице    логических    имен    процесса

  LNM$PROCESS_TABLE.






                           - 195 -

                        00152-01 97 06


       Пример 1.

  LOGDESC:

          .ASCID                  /ABC/

  EQVNAM1:

          .ASCII                  /XYZ/

  EQVLEN1=

          .-EQVNAM1

  EQVNAM2:

          .ASCII                  /DEF/

  EQVLEN2=

          .-EQVNAM2

  TABDESC:

          .ASCID                  /LNM$PROCESS/

  CRELST:

          .WORD                   EQVLEN1

          .WORD                   LNM$_STRING

          .ADDRESS                EQVNAM1

          .LONG                   0

          .WORD                   EQVNAM2

          .WORD                   LNM$_STRING

          .ADDRESS                EQVNAM2

          .LONG                   0

          .LONG                   0

  $CRELNM_S-

          LOGNAM = LOGDESC,-      ; логическое имя

          TABNAM = TABDESC,-      ; таблица

          ITMLST = CRELST         ; эквивалентные строки




                           - 196 -

                        00152-01 97 06


       В примере 2 показано создание на языке DCL логического

  имени в режиме супервизора.

       Пример 2.

   $ DEFINE/SUPERVISOR_MODE/TABLE=LNM$PROCESS ABC XYZ, DEF

       Логические имена процесса, созданные в режиме  пользо-

  вателя, удаляются, когда процесс выполняет  прогон  образа.

  Это поведение иллюстрируется в примере 3.

       Пример 3.

      $ DEFINE/USER ABC XYZ

      $ SHOW TRANSLATION ABC

          ABC    =    XYZ

      $ DIRECTORY

      $ SHOW LOGICAL ABC

          ABC    =    (неопределено)

       Команда DIRECTORY языка DCL выполняет прогон образа. В

  это время удаляются  все  логические  имена,  принадлежащие

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

  ческое имя ABC.

       Таблица логических имен задания  является  разделяемой

  таблицей, доступной всем процессам в пределах того же дере-

  ва заданий. Когда создается отсоединенный процесс, для это-

  го процесса и всех его потенциальных подпроцессов создается

  таблица логических имен задания. В это же время в  каталоге

  таблиц логических имен процесса LNM$PROCESS_DIRECTORY  соз-

  дается  логическое  имя  LNM$JOB,  принадлежащее  процессу.

  Логическое имя LNM$JOB транслируется в имя таблицы логичес-

  ких имен задания.




                           - 197 -

                        00152-01 97 06


       Когда создается подпроцесс, создается только принадле-

  жащее процессу логическое имя LNM$JOB, поскольку для основ-

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

  ния.

       Таблица логических имен задания содержит три  логичес-

  ких  имени,  постоянно  принадлежащие  процессам,   которые

  выполняют программу LOGINOUT (табл. 29).


                                                   Таблица 29

  -----------------------------------------------------------

  Логические имена !              Значение

  -----------------------------------------------------------

  SYS$LOGIN        ! Первоначальное устройство, принятое по

                   ! умолчанию и каталог

  SYS$LOGIN_DEVICE ! Первоначальное устройство, принятое по

                   ! умолчанию

  SYS$SCRATCH      ! Устройство и каталог, принятые по умол-

                   ! чанию, на которые записываются времен-

                   ! ные файлы


       Таким образом, вместо создания этих логических имен  в

  таблице логических имен процесса LNM$PROCESS_TABLE для каж-

  дого процесса в пределах дерева заданий, программа LOGINOUT

  создает эти логические имена один раз, когда эта  программа

  выполняется для процесса в корне дерева заданий.

       Таблица логических имен задания может  содержать  сле-

  дующие необязательные логические имена:

       1) логическое имя, связанное с вновь созданным времен-




                           - 198 -

                        00152-01 97 06


  ным почтовым ящиком;

       2) логическое имя, связанное с томом,  который  монти-

  руется как личный.

       Таблица логических имен группы содержит имена, которые

  могут использовать взаимосвязанные процессы одной и той  же

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

  группы требуется привилегия SYSPRV (см. п. 6.1.3.).

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

  требуется.      Однако      в       каталоге       процесса

  LNM$PROCESS_DIRECTORY,  для  каждого  процесса   существует

  логическое имя LNM$GROUP. Это логическое имя  транслируется

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


       Таблица логических имен  системы,  содержит  имена,  к

  которым могут иметь доступ все процессы операционной систе-

  мы МОС ВП . Эта таблица включает все имена, принимаемые  по

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

  ной системой МОС ВП. Для добавления и  удаления  логических

  имен из  таблицы  системы  требуются  привилегии  SYSNAM  и

  SYSPRV (см. п. 6.1.3).



       6.1.2.3. Таблицы логических  имен,  определенные

                пользователем


       Таблицы, принадлежащие процессу, а  также  разделяемые

  таблицы можно создавать, вызывая из программы  пользователя

  программу системного обслуживания $CRELNT. Однако для  соз-

  дания разделяемой таблицы требуется привилегия SYSPRV  (см.




                           - 199 -

                        00152-01 97 06


  п. 6.1.3).

       Логические имена из таблицы,  принадлежащей  процессу,

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

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

  раммы  системного  обслуживания  $CRELNT,  либо  с  помощью

  команды CREATE/NAME_TABLE языка DCL.  Разделяемой  таблицей

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

  шего эту таблицу, если им разрешен доступ.

       Максимальная  длина  логических  имен,  создаваемых  в

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

  шать 255 символов. Такое же ограничение наложено  на  длину

  эквивалентных строк.



       6.1.3. Привилегии


       Определенные функции системных программ, обслуживающих

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

  привилегиями. Операционная система МОС ВП проверяет в файле

  авторизации  пользователей  (UAF)  привилегии   конкретного

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

  системы. Операционная система МОС ВП также проверяет  право

  доступа на чтение, запись и удаление. Привилегии  позволяют

  пользователям выполнять функции, приведенные в табл. 30.














                           - 200 -

                        00152-01 97 06


                                                   Таблица 30

                       Сводка привилегий

  -----------------------------------------------------------

  Привилегия      !       Функция

  -----------------------------------------------------------

  GRPNAM          ! Создание  или  удаление логического имени

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

  GRPPRV          ! Создание или  удаление  логического имени

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

  SYSNAM          ! Создание логических  имен режима управле-

                  ! ления  или  ядра. Создание  или  удаление

                  ! логических  имен  в  своей  таблице логи-

                  ! ческих  имен  системы.  Удаление логичес-

                  ! кого имени  или таблицы  в более привиле-

                  ! гированном режиме доступа

  SYSPRV          ! Создание или удаление логического  имени

                  ! в таблице логических имен своей  группы.

                  ! создание или удаление  логического имени

                  ! в таблице  логических  имен  системы.

                  ! создание разделяемой таблицы





      6.1.4. В основном атрибуты, задаваемые с  помощью  сис-

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

  две функции:

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

  работой программ системного обслуживания;




                           - 201 -

                        00152-01 97 06


       2) влияют на трансляцию логических имен и  эквивалент-

  ных строк.

       Атрибуты, которые влияют на создание  логических  имен

  указываются в  необязательном  аргументе  ATTR  при  вызове

  программы системного обслуживания:

  LNM$M_CONFINE - препятствует копированию логического  имени

       из таблицы  логических  имен  процесса  в  порожденный

       подпроцесс.  Подпроцесс  может  быть  создан  командой

       SPAWN языка DCL или программой LIB$SPAWN  исполнитель-

       ной библиотеки.  Этот  атрибут  может  быть  определен

       только в программе системного обслуживания $CRELNM или

       $CRELNT;

  LNM$M_NO_ALIAS - препятствует созданию дубликата логическо-

       го имени в указанной таблице логических имен во  внеш-

       нем режиме доступа. Если  другое  логическое  имя  уже

       существует в таблице для внешнего режима  доступа,  то

       оно удаляется.

       Если этот атрибут задается при вызове  программы  сис-

       темного обслуживания $CRELNT, то он препятствует  соз-

       данию таблицы логических имен для внешнего режима дос-

       тупа в каталоге таблиц, если  такое  имя  таблицы  уже

       существует в каталоге.

       Этот атрибут указывается только  при  вызове  программ

       системного обслуживания $CRELNM или $CRELNT;

  LNM$M_CREATE_IF - препятствует созданию таблицы  логических

       имен, если указанная таблица уже существует для задан-

       ного режима доступа в соответствующем каталоге таблиц.




                           - 202 -

                        00152-01 97 06


       Этот атрибут указывается только при  вызове  программы

       системного обслуживания $CRELNT;

  LNM$M_CASE_BLIND - управляет процессом трансляции и застав-

       ляет  программу  $TRNLNM  игнорировать  разницу  между

       большими или строчными буквами при поиске  логического

       имени. Этот аргумент  указывается  только  при  вызове

       программы системного обслуживания $TRNLNM.

       При вызове программы системного обслуживания $CRELNM в

  аргументе ITMLST с помощью элементного кода LNM$_ATTRIBUTES

  можно    задать    необязательные    атрибуты    трансляции

  LNM$M_CONCEALED и LNM$M_TERMINAL, связанные  с  логическими

  именами и  эквивалентными  строками.  Если  элементный  код

  LNM$_ATTRIBUTES задается через программу $TRNLNM, то опера-

  ционная система МОС ВП возвращает текущие атрибуты, связан-

  ные с логическим именем и эквивалентной строкой, в  текущем

  значении индекса:

  LNM$M_CONCEALED - указывает,  что  эквивалентная  строка  с

       текущим значением индекса для данного логического име-

       ни является  именем  устройства,  принятым  в  системе

       управления данными;

  LNM$M_CONFILE - указывает, что порожденный процесс  не  мо-

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

       создаются командой SPAWN языка  DCL  или  библиотечной

       программой LIB$SPAWN;

  LNM$M_CRELOG - указывает, что  логическое имя было  создано

       с помощью программы системного обслуживания $CRELOG;






                           - 203 -

                        00152-01 97 06


  LNM$M_EXISTS - указывает, что  для указанного  значения ин-

       декса существует эквивалентная строка;

  LNM$M_NO_ALIAS - указывает, что, если логическое  имя   уже

       существует в таблице, то оно не может быть  создано  в

       этой таблице для внешнего режима доступа;

  LNM$M_TABLE - указывает,  что логическое имя  является име-

       нем таблицы логических имен;

  LNM$M_TERMINAL - указывает, что эквивалентные строки больше

       нельзя транслировать.

       Атрибуты множественных эквивалентных строк  не  должны

  быть одинаковыми.



       6.1.5. Квоты таблиц логических имен


       Квота таблицы логических  имен  -  это  число  байтов,

  выделенных в памяти для  логических  имен,  содержащихся  в

  этой таблице. Квоты таблиц логических имен  устанавливаются

  на следующих этапах:

       1) инициализация операционной системы МОС ВП;

       2) создание процесса;

       3) создание таблицы логических имен.

       Каждая таблица логических имен имеет связанную  с  ней

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

  пула процесса, либо из страничного пула  системы),  которые

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

  Квота таблицы устанавливается при создании таблицы.

       Если не указана никакая квота, то вновь созданная таб-

  лица имеет неограниченную квоту. Эта таблица  может  расши-



                           - 204 -

                        00152-01 97 06


  ряться и при этом потреблять всю память доступную  процессу

  или операционной системе МОС ВП, а все пользователи,  имею-

  щие доступ на запись к  такой  разделяемой  таблице,  могут

  вызвать неограниченное потребление  системного  страничного

  пула.



       6.1.5.1. Квоты каталогов таблиц


       При инициализации операционной системы МОС ВП для сис-

  темного каталога таблиц LNM$SYSTEM_DIRECTORY  автоматически

  устанавливается неограниченная квота.

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

  МОС ВП для каталога таблиц  процесса  LNM$PROCESS_DIRECTORY

  автоматически устанавливается неограниченная квота.



       6.1.5.2. Квоты    таблиц    логических     имен,

                принимаемых по умолчанию


       Таблицы логических имен  процесса,  группы  и  системы

  имеют неограниченные квоты.

       Поскольку таблица  логических  имен  задания  является

  разделяемой таблицей, и для создания в ней логических  имен

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

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

  создании. Для указания квоты таблицы логических имен  зада-

  ния во время ее создания существуют три механизма:

       1) для всех процессов, которые активизируют  программу

  LOGINOUT, квота для логических имен задания берется из фай-




                           - 205 -

                        00152-01 97 06


  ла авторизации. Можно изменять квоту для таблицы логических

  имен задания используя команду AUTORIZE/JTQUOTA=;

       2) для всех процессов, которые активизируют  программу

  LOGINOUT, квота для таблицы логических имен  задания  может

  быть задана как элемент списка квот PQL$_JTQUOTA при вызове

  программы   системного   обслуживания   "создать   процесс"

  ($CREPRC). Если отсоединенный процесс необходимо создать  с

  помощью команды RUN/DETACHED языка  DCL,  то  для  указания

  элемента списка квот программы $CREPRC используется команда

  RUN/JOB_TABLE_QUOTA;

       3) для всех процессов, которые не  активизируют  прог-

  рамму  LOGINOUT  и  не  указывают   элемент   списка   квот

  PQL$_JTQUOTA при вызове программы $CREPRC, квота для табли-

  цы логических имен задания берется из  динамического  пара-

  метра генерации системы (SYSGEN) PQL$DJTQUOTA.  Обслуживаю-

  щую программу SYSGEN  можно  использовать  для  отображения

  значений параметров PQL$_DJTQUOTA и PQL$_MJTQUOTA,  которые

  задают квоту, принимаемую по умолчанию, и минимальную  кво-

  ту, соответственно.



       6.1.5.3. Квоты таблиц логических имен,  заданных

                пользователем


       Таблицу логических имен, заданных пользователем, можно

  создавать либо с явно ограниченной квотой, либо без ограни-

  чений квоты.

       Наличие  квот  таблиц  логических  имен,  определенных

  пользователем, устраняет необходимость в привилегиях,  нап-



                           - 206 -

                        00152-01 97 06


  ример, SYSNAM или  GRPNAM,  для  управления  использованием

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

  таблице.



       6.1.6. Соглашения о форматах логических имен и

              эквивалентных имен


       При создании и трансляции логических  имен  и  эквива-

  лентных имен операционная система МОС  ВП  использует  спе-

  циальные соглашения.

       Если строке логического имени, которая присутствует  в

  служебных программах ввода-вывода, предшествует символ под-

  черкивания (_),  то  программы  ввода-вывода  не  выполняют

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

  черкивания, считая это логическое  имя  именем  физического

  устройства.

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

  вп создает элементы в таблице логических имен по  умолчанию

  для постоянных файлов процесса.  Эквивалентным  именам  для

  этих элементов (например, SYS$INPUT и SYS$OUTPUT) предшест-

  вует четырехбайтовый заголовок, который содержит следующее:

        1) байт 0     ^X1B знак переключения;

        2) байт 1     ^X00;

        3) байты 2-3  внутренний идентификатор файла (IFI)

                      системы управления данными СУД-32.


       За этим заголовком следует строка эквивалентного  име-

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




                           - 207 -

                        00152-01 97 06


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

  МОС ВП, то программа должна быть готовой проверить  наличие

  этого заголовка и затем использовать  только  нужную  часть

  эквивалентной строки. В примере фрагмент программы демонст-

  рирует этот метод.

       Пример.

  ILST:

          .WORD           LNM$C_NAMLENGTH

          .WORD           LNM$_STRING

          .LONG           RESSTRING

          .LONG           RESDESC

          .LONG           0

  TABDESC:

          .ASCID          /LNM$FILE_DEV/  ; имя таблицы

                                          ; файлов/устройств

  LOGDESC:                                ; логическое имя,

                                          ; которое необходи-

                                          ; мо транслировать

          .ASCID          /INPUT_DEVICE/

  RESDESC:                                ; дескриптор для

                                          ; результирующей

                                          ; строки

          .LONG           LNM$C_NAMLENGTH ; размер результи-

                                          ; рующей строки

          .ADDRESS -                      ; адрес результи-

                          RESSTRING       ; рующей строки

  RESSTRING:                              ; назначение резу-




                           - 208 -

                        00152-01 97 06


                                          ; льтирующей строки

          .BLKB           LNM$C_NAMLENGTH

       .

       .

       .

          $TRNLNM_S                       ; транслировать ло-

                          LOGNAM=LOGDESC,-; гическое имя

                          TABNAM=TABDESC,-

                          ITMLST=ILST

          BLBC            R0,ERR          ; перейти по ошибке

          CMPW            RESSTRING, ^X001B ; является ли пер

                                          ; вый символ знаком

                                          ; переключения?

          BNEQ            1$              ; если нет, то пе-

                                          ; рейти к 1$

          SUBW            #4,RESDESC      ; если да, то вы-

                                          ; честь 4 из длины

          ADDL            #4,RESDESC+4    ; и добавить 4 к ад

                                          ; ресу строки

  1$:

       .

       .

       .



       6.1.7. Спецификация поискового  списка  таблиц

              логических имен






                           - 209 -

                        00152-01 97 06


       Логические имена существуют как  элементы  в  таблицах

  логических имен.  Когда  необходимо  создать,  удалить  или

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

  которое обозначает таблицу, содержащую логическое имя. Дан-

  ное имя обладает одной из следующих характеристик:

       1) это имя таблицы логических имен;

       2) это имя таблицы логических имен, которое итеративно

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

  имя таблицы логических имен;

       3) это многозначное логическое имя, которое итеративно

  транслируется в имена  различных  таблиц  логических  имен.

  Многозначное логическое имя также называют поисковым  спис-

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

  перечислены в списке.

       Для некоторых таблиц логических имен существуют  зара-

  нее определенные логические имена. Эти заранее определенные

  имена  начинаются  с  перфикса  LNM$.  Пользователь   может

  переопределить  эти  имена,  чтобы  модифицировать  порядок

  поиска или используемые таблицы.

       Вместо фиксированного набора таблиц логических имен  и

  жестко определенного  порядка  (процесс,  задание,  группа,

  система) поиска в этих таблицах пользователь может указать,

  какие таблицы следует просматривать и в каком порядке.  Для

  указания порядка просмотра используются логические имена  в

  каталоге таблиц. По соглашению, каждый класс  использования

  логических имен, например, спецификация файла или устройст-

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




                           - 210 -

                        00152-01 97 06


  ным именем.

       Например, LNM$FILE_DEV является именем  таблицы  логи-

  ческих имен, которое используется при трансляции имен  спе-

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

  данными или программ  обслуживания  ввода-вывода.  Это  имя

  должно транслироваться в списке из одного  или  более  имен

  таблиц логических имен. Полученный список задает те  табли-

  цы, которые должны просматриваться при трансляции  специфи-

  каций файлов.

       По умолчанию LNM$FILE_DEV указывает, что должны  прос-

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

  в порядке этого перечисления, и возвращается первое найден-

  ное соответствие.

       Имена таблиц логических  имен  транслируются  из  двух

  таблиц:   каталога   таблиц   логических   имен    процесса

  LNM$PROCESS_DIRECTORY и  каталога  таблиц  логических  имен

  системы LNM$SYSTEM_DIRECTORY. В одной из этих таблиц должно

  быть определено имя LNM$FILE_DEV.

       Таким образом,  если  в  таблицах  процесса  и  группы

  существуют идентичные логические имена, то, поскольку  эле-

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

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

  таблице логических имен процесса, элементы  просматриваются

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

  затем режим супервизора и т.д.

       Если необходимо изменить список  таблиц,  используемых

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




                           - 211 -

                        00152-01 97 06


  LNM$FILE_DEV в каталоге процесса LNM$PROCESS_DIRECTORY.



       6.2. Создание логических имен - $CRELNM


       Чтобы создать логическое имя в программе,  программист

  должен обеспечить дескрипторы символьных  строк  для  строк

  имен, выбрать таблицу, которая будет  содержать  логическое

  имя и использовать служебную программу $CRELNM, как показа-

  но в примере.

       Пример.

  LOGDESC:

          .ASCID                  /TTY/

  TABDESC:

          .ASCID                  /LNM$JOB/

  LNMATTR:

          .LONG                   LNM$_TERMINAL

  CRELST:

          .WORD                   4

          .WORD                   LNM$_ATTRIBUTES

          .ADDRESS                LNMATTR

          .LONG                   0

          .WORD                   EQVLEN

          .WORD                   LNM$_STRING

          .ADDRESS                EQVNAM

          .LONG                   0

          .LONG                   0

  EQVNAM:

          .ASCII                  /TTA2:/



                           - 212 -

                        00152-01 97 06


  EQVLEN=

          .-EQVNAM

        .

        .

        .

  $CRELNM_S -

          LOGNAM = LOGDESC,-

          TABNAM = TABDESC,-

          ATTR   = TABDESC,-

          ITMLST = CLELST

       В примере атрибут трансляции задан  как  терминальный.

  Этот атрибут указывает, что итеративная трансляция логичес-

  кого имени TTY заканчивается,  когда  возвращается  эквива-

  лентная строка TTA2. Кроме того, поскольку не  задан  аргу-

  мент ACMODE, то режим доступа логического имени TTY  совпа-

  дает с режимом доступа вызывающего образа.



       6.2.1. Дублирование логических имен


       Таблица логических имен может содержать  элементы  для

  одного логического имени в разных режимах доступа.  Различ-

  ные таблицы логических имен могут содержать элементы одного

  и того же логического имени.

       Во всех остальных случаях для конкретного  логического

  имени может быть только один элемент в  таблице  логических

  имен.

       Любое число логических  имен  может  иметь  одинаковые

  эквивалентные имена.



                           - 213 -

                        00152-01 97 06


       На рис. 35-37 логическое  имя  TERMINAL  транслируется

  по-разному, в зависимости от того, в какой таблице логичес-

  ких имен оно специфицировано.


  ----------------------------------------------------------
  Логическое      Эквивалетное имя       Режим доступа
  имя
  ----------------------------------------------------------
  INFINE   --->  DM1:[HIGGINS]TEST.DAT    Режим супервизора
  OUTFILE  --->  DM1:[HIGGINS]TEST.OUT    Режим супервизора
  TERMINAL --->  TTA2:                    Режим супервизора
     .                   .                    .
     .                   .                    .
     .                   .                    .

                            Рис. 35


       Таблица логических имен процесса приравнивает логичес-

  кое имя TERMINAL  конкретному  терминалу  TTA2.  Логические

  имена INFILE и OUTFILE приравниваются спецификациям  диска.

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

       Чтобы определить эквивалентную строку для  логического

  имени TERMINAL необходимо выдать следующую команду:

       $ SHOW LOGICAL TERMINAL

  операционная система МОС ВП  вернет  эквивалентную  строку:

  TTA2:


  ----------------------------------------------------------
  Логическое имя    Эквивалентное имя      Режим доступа
  ----------------------------------------------------------
  SYS$LOGIN     ---> DBA9:[HIGGINS]      Режим управления
  TERMINAL      ---> VTA14:              Режим пользователя
      .                  .                     .
      .                  .                     .
      .                  .                     .

                            Рис. 36


       Таблица логических имен задания определяет  логический




                           - 214 -

                        00152-01 97 06


  терминал TERMINAL как виртуальный терминал VTA14.  Логичес-

  кое имя SYS$LOGIN является устройством и каталогом для про-

  цесса при подключении к операционной системе МОС ВП.  Логи-

  ческое имя SYS$LOGIN определяется в режиме управления.

       Чтобы определить эквивалентную строку для  логического

  имени TERMINAL, заданного на  рис.  36,  необходимо  выдать

  следующую команду:

       $ SHOW LOGICAL/JOB TERMINAL

       Операционная система МОС ВП  возвращает  эквивалентную

  строку: VTA14:, полученную в результате трансляции.


  ----------------------------------------------------------
  Логическое имя    Эквивалентное имя     Режим доступа
  ----------------------------------------------------------
  TERMINAL     ---> MBA407:               Режим супервизора
  XYZ          ---> DISK1:                Режим супервизора
               ---> DISK3:                Режим супервизора
     .                .                       .
     .                .                       .
     .                .                       .

                            Рис. 37


       Таблица логических имен LOG_TBL, заданная  пользовате-

  лем, содержит опрделение  логического  имени  TERMINAL  как

  устройства почтового ящика MBA407:. Многозначное логическое

  имя XYZ имеет две трансляции - DISK1 и DISK3.

       Чтобы определить эквивалентную строку для  логического

  имени TERMINAL, показанного на рис. 37,  необходимо  выдать

  следующую команду:

       $ SHOW LOGICAL/TABLE=LOG_TBL TERMINAL

       Операционная система МОС ВП  возвращает  эквивалентное

  имя: MBA407:. Чтобы использовать данное  определение  логи-




                           - 215 -

                        00152-01 97 06


  ческого имени TERMINAL в качестве  спецификации  файла  или

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

  LNM$FILE_DEV так, чтобы  обращаться  к  таблице  логических

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

       $ DEFINE/TABLE=LNM$PROCESS_DIRECTORY LNM$FILE_DEV

         LOG_TBL, LNM$PROCESS, LNM$JOB, LNM$SYSTEM

       Команда DEFINE языка DCL используется для  переопреде-

  ления поискового списка по умолчанию LNM$FILE_DEV.

       Квалификатор       /TABLE        задает        таблицу

  LNM$PROCESS_DIRECTORY, которая будет содержать  переопреде-

  ленный поисковый список. Операционная система МОС ВП  будет

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

  LNM$FILE_DEV,     в     следующем     порядке:     LOG_TBL,

  LNM$PROCESS_TABLE, LNM$JOB и LNM$SYSTEM_TABLE.


  --------------------------------------------------------
       Логическое имя         Эквивалентное имя
  --------------------------------------------------------
       SYS$LIBRARY     --->   SYS$SYSROOT:[SYSLIB]
       SYS$SYSTEM      --->   SYS$SYSROOT:[SYSEXE]
           .                          .
           .                          .
           .                          .

                            Рис. 38


       Системная таблица логических имен содержит назначенные

  операционной системой МОС ВП  логические  имена,  доступные

  всем процессам в системе.  Например,  к  логическим  именам

  SYS$LIBRARY и SYS$SYSTEM, показанным на рис.38, может полу-

  чить доступ любой пользователь, для того чтобы использовать

  устройство и каталог содержащие системные файлы.





                           - 216 -

                        00152-01 97 06


       6.2.1.1. Замена логических имен


       Если логическому имени TERMINAL соответствует  эквива-

  лентное имя ТТА2, в таблице процесса, а затем процесс  при-

  равнивает логическое имя TERMINAL к ТТА3, то  эквивалентное

  имя -  ТТА2  заменяется  новым  эквивалентным  именем.  Код

  успешного состояния возврата SS$_SUPERSEDE  указывает,  что

  новый элемент заменил старый.

       Определения логического имени TERMINAL в таблице зада-

  ния  и  таблице  LOG_TBL,  определенной  пользователем,  не

  меняются.



       6.3. Создание  таблиц  логических   имен   -

            $CRELNT


       Программа системного обслуживания $CRELNT создает таб-

  лицы логических имен. Таблицы логических имен могут  созда-

  ваться в любом режиме доступа в зависимости  от  привилегий

  вызывающего процесса. Задаваемое  пользователем  логическое

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

  имен    запоминается    в    каталоге    таблиц    процесса

  LNM$PROCESS_DIRECTORY.



       6.3.1. Разделяемые таблицы логических имен


       Если пользователь имеет привилегию SYSPRV, то он может

  создавать разделяемые таблицы  логических  имен.  Он  может

  назначить защиту  для  этих  таблиц  с  помощью,  аргумента

  PROMSK программы системного обслуживания $CRELNT.  Аргумент



                           - 217 -

                        00152-01 97 06


  PROMSK разрешает специфицировать тип доступа  для  системы,

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

       1) привилегия на доступ с чтением разрешает  доступ  к

  именам в таблице логических имен;

       2) привилегия на доступ с записью разрешает создание и

  удаление имен из таблицы логических имен;

       3) привилегия на доступ с удалением разрешает удаление

  таблицы логических имен.

       Примечание. Бит защиты "E" не используется.

       Если аргумент опущен, то системе и владельцу  гаранти-

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

  доступа запрещены.



       6.3.2. Вызов программы системного обслуживания

              $CRELNT


       Пример иллюстрирует вызов программы системного  обслу-

  живания.

       Пример.

  TABDESC:

          .ASCID          /LOG_TABLE/

  PARDESC:

          .ASCID          /LNM$PROCESS_DIRECTORY/

  TAB_ATTR:

          .LONG           LNM$M_CONFINE

  TAB_QUOTA:

          .LONG           5000

       .



                           - 218 -

                        00152-01 97 06


       .

       .

  $CRELNT$S -

          TABNAM = TABDESC,-      ; имя таблицы

          PARTAB = PARDESC,-      ; порождающая таблица

          ATTR   = TAB_ATTR,-     ; атрибуты

          QUOTA  = TAB_QUOTA      ; квота

       В примере создается определенная пользователем таблица

  LOG_TABLE с явно заданной квотой в 5000 байтов.  Имя  вновь

  созданной   таблицы   является    элементом    в    таблице

  LNM$PROCESS_DIRеCTORY. Поскольку атрибут CONFINE  связан  с

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

  процесса в порожденные им подпроцессы.



       6.4. Удаление логических имен - $DELLNM


       Программа системного обслуживания $DELLNM удаляет эле-

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

  вызова программы  системного  обслуживания  $DELLNM,  можно

  указать одно логическое имя для удаления, либо указать, что

  требуется удалить все логические имена из конкретной табли-

  цы. Следующий пример иллюстрирует  вызов,  который  удаляет

  логическое имя TERMINAL из таблицы логических имен задания.

       Пример.

  LOGDESC:

          .ASCID          /TERMINAL/

  TABDESC:

          .ASCID          /LNM$JOB/



                           - 219 -

                        00152-01 97 06


  $DELLNM_S -

          LOGNAM = LOGDESC, -

          TABNAM = TABDESC, -

       Имена таблиц логических  имен  или  логические  имена,

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

  цессу с помощью команд языка DCL ASSIGN/USER и  DEFINE/USER

  языка DCL, автоматически удаляются  при  завершении  работы

  образа. Элементы, сделанные из потока команд  помещаются  в

  таблицу интерпретатором команд. Это элементы режима  супер-

  визора и они не  удаляются  при  завершении  работы  образа

  (кроме логических имен, определенных командами  АSSIGN/USER

  и DEFINE/USER языка DCL).



       6.5. Трансляция логических имен - $TRNLNM


       Программа системного обслуживания $TRNLNM  транслирует

  логическое имя в эквивалентную строку. Кроме того, програм-

  ма $TRNLNM возвращает информацию о логическом имени и экви-

  валентной строке.

       Таблицы, в которых  осуществляется  поиск  логического

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

  ного обслуживания $TRNLNM.

       Этот аргумент может быть либо именем таблицы  логичес-

  ких имен, либо логическим именем, которое  транслируется  в

  список из одной или более таблиц логических имен.

       Поскольку логические имена могут иметь  много  эквива-

  лентных строк, то можно задавать, какую именно  эквивалент-

  ную строку желательно получить.



                           - 220 -

                        00152-01 97 06


       Ряд программ системного обслуживания, которым требует-

  ся имя устройства, принимают логическое имя  и  транслируют

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

  ройства (или пока не будет выполнено  то  число  трансляций

  логического имени, которое принято в  операционной  системе

  МОС ВП по умолчанию). Эти системные программы неявно задают

  имя таблицы логических имен LNM$FINE_DEV (п.  6.1.7).  Сле-

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

  выполняют итеративную трансляцию логического имени:

       1) $ALLOC - распределить устройство;

       2) $ASSIGN - назначить канал ввода-вывода;

       3) $BRDCST - разослать сообщение;

       4) $CREMBX - создать почтовый ящик;

       5) $DALLOC - освободить устройство;

       6) $DISMOU - демонтировать том;

       7) $GETDVI - получить информацию об устройстве/томе;

       8) $MOUNT - смонтировать том.

       Однако во многих случаях  программа  должна  выполнить

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

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

  таблицы или таблиц, в которых  требуется  выполнять  поиск.

  Программа системного обслуживания  $TRNLNM  ("транслировать

  логическое имя") просматривает заданные пользователем  таб-

  лицы логических имен в поисках указанного логического имени

  и  возвращает  эквивалентное  имя.  Кроме  того,  программа

  $TRNLNM возвращает атрибуты (которые могут и не  указывать-

  ся) для логического имени и эквивалентной строки.




                           - 221 -

                        00152-01 97 06


       В примере 1 показан вызов программы системного  обслу-

  живания $TRNLNM для трансляции логического имени ABC.

       Пример 1.

  LOGDESC:

          .ASCID          /ABC/

  TABDESC:

          .ASCID          /LMN$FILE_DEV/

  EQVBUF1:

          .BLKB           LMN$C_NAMLENGTH

  EQVDESC1:

          .LONG           0

          .ADDRESS        EQVBUF1

  EQVBUF2:

          .BLKB           LMN$C_NAMLENGTH

  EQVDESC2:

          .LONG           0

          .ADDRESS        EQVBUF2

  TRNLIST:

          .WORD           LMN$C_NAMLENGTH

          .WORD           LNM$_STRING

          .ADDRESS        EQVBUF1

          .ADDRESS        EQVDESC1

          .WORD           LMN$C_NAMLENGTH

          .WORD           LNM$_STRING

          .ADDRESS        EQVBUF2

          .ADDRESS        EQVDESC2

          .LONG           0




                           - 222 -

                        00152-01 97 06


  TRNATTR:

          .LONG           LNM$M_CASE_BLIND

     .

     .

     .

  $TRNLNM_S     -

          LOGNAM  =  LOGDESC,-

          TABNAM  =  TABDESC,-

          ATTR    =  TRNATTR,-

          ITMLST  =  TRNLIST

       Вызов программы системного обслуживания $TRNLNM приво-

  дит к трансляции логического имени ABC. Кроме  того,  аргу-

  мент TАBNAM задает LNM$FILE_DEV в качестве поискового спис-

  ка, который будет использовать программа $TRNLNM для поиска

  логического имени ABC. Логическому имени ABC назначены  две

  эквивалентные строки. Элементный код LNM$_STRING в аргумен-

  те ITMLST указывает программе $TRNLNM искать  эквивалентную

  строку  с  текущим  значением   индекса.   Элементный   код

  LNM$_STRING вызывается дважды. Эквивалентные  строки  поме-

  щаются в два выходных буфера EQVBUF1 и EQVBUF2, описанные с

  помощью ссылки TRNLIST.

       Атрибут LNM$M_CASE_BLIND управляет процессом  трансля-

  ции. Программа $TRNLNM ищет эквивалентные строки, не  обра-

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

       Длина выходной строки эквивалентного имени записывает-

  ся в первое слово дескриптора строки символов.  Этот  деск-

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




                           - 223 -

                        00152-01 97 06


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
























































                           - 224 -

                        00152-01 97 06


            7. Программы обслуживания ввода-вывода



       Для выполнения операций  ввода-вывода  в  операционной

  системе МОС ВП можно использовать два базовых метода:

       1) систему управления  данными  (СУД-32)  операционной

  системы МОС ВП;

       2) системные программы обслуживания ввода-вывода.

       Система управления данными (СУД-32) предоставляет  ряд

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

  общего назначения, таких как хранение данных,  их  поиск  и

  модификация.

       Системные программы обслуживания  ввода-вывода  позво-

  ляют непосредственно использовать ресурсы ввода-вывода опе-

  рационной системы МОС ВП методом, зависящим  от  конкретных

  устройств. Программы обслуживания ввода-вывода  также  пре-

  доставляют некоторые  специальные  функции,  недоступные  в

  СУД-32. Использование  программ  обслуживания  ввода-вывода

  требует от пользователя  больше  знаний,  чем  если  бы  он

  использовал СУД-32, но приводит к более эффективным  опера-

  циям ввода-вывода.

       Системные программы обслуживания ввода-вывода:

       1) назначить канал ввода-вывода ($ASSIGN);

       2) освободить канал ($DASSGN);

       3) поставить в очередь запрос на ввод-вывод ($QIO);

       4) поставить в очередь запрос на  ввод-вывод  и  ждать

  флага событий ($QIOW);

       5) форматировать вход ($FAO);




                           - 225 -

                        00152-01 97 06


       6) форматировать вход с параметром ($FAOL);

       7) распределить устройство ($ALLOC);

       8) освободить устройство ($DALLOC);

       9) смонтировать том ($MOUNT);

       10) демонтировать том ($DISMOU);

       11)  получить  информацию  об  устройстве   и   канале

  ($GETDVI);

       12) получить информацию об устройстве и канале и ждать

  ($GETDVIW);

       13) отменить операцию ввода-вывода в канале ($CANCEL);

       14) создать почтовый ящик и назначить канал ($CREMBX);

       15) удалить почтовый ящик ($DELMBX);

       16) разослать сообщение ($BRKTHRU);

       17) разослать сообщение и ждать ($BRKTHRUW);

       18) послать сообщение контроллеру заданий ($SNDJBC);

       19) послать  сообщение  контроллеру  заданий  и  ждать

  ($SNDJBCW);

       20) послать сообщение оператору ($SNDOPR);

       21)  послать  сообщение  в  файл  регистрации   ошибок

  ($SNDERR);

       22) получить сообщение ($GETMSG);

       23) выдать сообщение ($PUTMSG).

       В разделе 7 приводится общая  информация  о  том,  как

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

       1) назначение каналов;

       2) постановка в очередь запросов на ввод-вывод;

       3) распределение устройств;




                           - 226 -

                        00152-01 97 06


       4) использование почтовых ящиков.

       Приведены  примеры,  показывающие,  как   использовать

  программы обслуживания ввода-вывода с терминала (см.  Доку-

  мент [2]).



       7.1. Назначение каналов


       Перед  тем   как   могут   быть   выполнены   операции

  ввода-вывода на  физическом  устройстве,  этому  устройству

  должен быть назначен канал,  чтобы  обеспечить  путь  между

  процессом и устройством. Программа системного  обслуживания

  устанавливает этот путь.

       При вызове служебной программы $ASSIGN необходимо пре-

  доставить имя устройства, которое может быть  именем  физи-

  ческого устройства или логическим именем, и адрес слова,  в

  которое заносится номер канала. Служебная программа возвра-

  щает номер канала, который программист использует  в  своей

  программе, когда он пишет запрос на ввод-вывод.

       В  приведенном  примере  устройству  ТТА2  назначается

  канал  ввода-вывода.  Номер  канала  возвращается  в  слове

  ттCHAN.

       Пример.

  TTNAME: .ASCID  /TTA2:/         ; дескриптор терминала

  TTCHAN: .BLKW   1               ; номер канала терминала

            .

            .

            .

          $ASSIGN_S -



                           - 227 -

                        00152-01 97 06


                  DEVNAM = TTNAME,-

                  CHAN   = TTCHAN

       Чтобы назначить канал текущему устройству ввода-вывода

  по умолчанию, следует использовать логическое имя SYS$INPUT

  или SYS$OUPUT (подраздел 7.10).



       7.2. Постановка  в   очередь   запросов   на

            ввод-вывод


       Все операции ввода-вывода в операционной  системе  мос

  вп инициируются программой  системного  обслуживания  $QIO.

  Программа $QIO ставит в очередь запрос и возвращает  управ-

  ление. Пока операционная система МОС ВП  обрабатывает  этот

  запрос, программа, которая выдала запрос, может  продолжать

  выполнение.

       Аргументы, которые требуются для  служебной  программы

  $QIO, включают номер  канала,  назначенный  устройству,  на

  котором должны выполняться  операции  ввода-вывода,  и  код

  функции (выраженный символически), который указывает, какие

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

  от кода функции могут  потребоваться  от  одного  до  шести

  дополнительных параметров.

       Например, коды функций IO$_WRITEVBLK и IO$_READVBLK не

  зависят от устройств и используются  для  чтения  и  записи

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

  удобны для простого ввода-вывода с терминала.  Они  требуют

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

  и длину буфера. Вызов программы $QIO для записи  строки  на



                           - 228 -

                        00152-01 97 06


  терминале приведен в примере.

       Пример.

  $QIO_S  CHAN=TTCHAN, -

          FUNC=#IO$_WRITEVBLK,-

          P1=BUFADDR,-

          P2=#BUFLEN

       Коды функций определены для всех поддерживаемых  типов

  устройств, и большинство кодов являются зависимыми от  уст-

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

  ретного устройства. Макрокоманда $IODEF определяет символи-

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



       7.3. Синхронизация   завершения    служебной

            программы


       Программы системного обслуживания $ENQ и $QIO  возвра-

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

  поставлен в очередь. Код состояния возвращается в  регистре

  R0 и указывает, успешно или неудачно запрос был поставлен в

  очередь. Чтобы гарантировать правильную синхронизацию  опе-

  рации постановки в очередь по отношению к  программе,  пос-

  ледняя должна выполнить следующее:

       1) проверить, что операция успешно постановлена в оче-

  редь;

       2) проверить, что сама операция успешно закончилась.

       Необязательные аргументы служебных программ $ENQ и QIO

  обеспечивают методы синхронизации завершения  ввода-вывода.

  Имеется три метода, которые можно использовать для проверки



                           - 229 -

                        00152-01 97 06


  завершения управления захватом или запроса на ввод-вывод:

       1) указать номер  флага  события,  который  необходимо

  установить после завершения операции;

       2) указать адрес программы AST, которая должна  выпол-

  няться после завершения операции;

       3) указать адрес  блока  состояния  ввода-вывода,  или

  блока состояния захвата, в который операционная система мос

  вп может поместить состояние возврата после завершения опе-

  рации.

       Примеры 1, 2, 3 иллюстрируют использование  этих  трех

  методов.

       Пример 1.

  $QIO_S  EFN=#1,...      ; выдать первый запрос на ввод-

                          ; вывод

  BSBW    ERROR           ; успешно поставлен в очередь?

  $QIO_S  EFN=#2,...      ; выдать второй запрос на ввод-

                          ; вывод

  BSBW    ERROR           ; успешно поставлен в очередь?

  $WFLAND_S -             ; ждать пока выполняются оба

          EFN=#0, -

          MASK=#^B110

       Примечания:

       1. Если в качестве аргумента указывается  номер  флага

  события, программа $QIO сбрасывает этот флаг, когда  ставит

  в очередь запрос на ввод-вывод. Когда  ввод-вывод  заканчи-

  вается, флаг устанавливается.

       2. В приведенном примере программа выдает два требова-




                           - 230 -

                        00152-01 97 06


  ния на постановку в очередь  запросов  на  ввод-вывод.  Для

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

       3. Программа системного обслуживания  $WFLAND  ("ждать

  логического "и" флагов событий") помещает процесс в состоя-

  ние ожидания, пока не закончатся обе операции ввода-вывода.

  Аргумент EFN указывает, что оба флага находятся в  кластере

  0. Аргумент MASK указывает, какие флаги ожидаются.

       4. Программа системного обслуживания $WFLAND (и другие

  программы системного обслуживания, связанные  с  ожиданием)

  ожидает установки флага события, а не  завершения  операции

  ввода-вывода. Если бы какое-либо другое событие  установило

  требуемые флаги событий, то ожидание флага событий закончи-

  лось бы преждевременно. Использование флагов событий должно

  быть четко скоординировано. (п. 7.3.1)

       Пример 2.

   $QIO_S  ...,ASTADR=TTAST, -

              ASTPRM=#1, ...

   BSBW    ERROR                    ; успешно поставлен в

     .                              ; очередь?

     .

     .

   .ENTRY         TTAST,^M<R10,R11> ; маска входа для под-

                                    ; программы обслуживания

                                    ; AST

     .                              ; обработка завершения

     .                              ; ввода-вывода

     .




                           - 231 -

                        00152-01 97 06


   RET                              ; конец подпрограммы

                                    ; обслуживания AST

       Примечания:

       1. Если задан аргумент  ASTADR  при  вызове  программы

  системного обслуживания $QIO, то операционная  система  мос

  вп прерывает процесс, когда завершается ввод-вывод, и пере-

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

       2. При вызове программы системного  обслуживания  $QIO

  задается адрес подпрограммы AST и параметр,  который  пере-

  дается в качестве аргумента подпрограмме обслуживания  AST.

  Когда программа $QIO возвращает управление, процесс продол-

  жает выполнение.

       3. Когда завершается ввод-вывод,  вызывается  подпрог-

  рамма AST с именем ТТAST, которая реагирует  на  завершение

  ввода-вывода. Проверяя  параметр,  пожпрограмма  AST  может

  определить источник запроса на ввод-вывод.

       Когда эта подпрограмма заканчивает выполнение,  управ-

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

  прерван. Если при  вызове  программы  $QIO  задан  аргумент

  ASTADR, то следует также указать аргумент IOSB, чтобы подп-

  рограмма AST могла оценить, успешно ли закончилась операция

  ввода-вывода.

       Пример 3.

  TTIOSB: .BLKQ   1                  ; блок состояния

            .                        ; ввода-вывода

            .

            .




                           - 232 -

                        00152-01 97 06


          $QIO_S  ...,IOSB=TTIOSB,...     ; выдать запрос

                                          ; на ввод-вывод

          BSBW    ERROR                   ; успешно поставлен

            .                             ; в очередь?

            .                             ; продолжить

            .

  10$:    TSTW    TTIOSB          ; операция ввода-вывода уже

                                  ; выполнена?

          BEQL    10$             ; если нет, то выполнять

                                  ; проверку, пока не выпол-

                                  ; нится

               SMPW       TTIOSB,#SS$_NORMAL ; операция вво-

                                  ; да-вывода закончилась

                                  ; успешно?

          BNEQ    IO_ERR          ; если нет, то обработать

           .                      ; ошибку

           .

           .

       Примечания:

       1. Блок  состояния  ввода-вывода  является  структурой

  размером в квадрослово, которую операционная система МОС ВП

  использует для извещения о состоянии операции ввода-вывода.

  Эту область размером в квадрослово необходимо определить  в

  программе пользователя.

       2. TTIOSB определяет блок состояния  ввода-вывода  для

  этой операции ввода-вывода. Аргумент IOSB в программе  сис-

  темного обслуживания $QIO ссылается на это квадрослово.




                           - 233 -

                        00152-01 97 06


       3. Программа $QIO очищает это квадрослово,  когда  она

  ставит в очередь запрос на ввод-вывод. После того как  зап-

  рос поставлен в очередь, программа  вызывает  подпрограмму,

  чтобы проверить, успешно ли  поставлен  запрос  в  очередь.

  Если да, программа продолжает выполнение.

       4. Процесс  опрашивает  блок  состояния  ввода-вывода.

  Если младшее слово его содержит 0,  то  это  означает,  что

  операция ввода-вывода еще не закончилась. В примере 3 прог-

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

       5. Как  только  операция  ввода-вывода  заканчивается,

  процесс   сравнивает   младшее   слово   блока    состояния

  ввода-вывода с кодом успешного состояния  SS$_NORMAL.  Если

  состояние возврата не совпадает с SS$_NORMAL, то  программа

  переходит к обработке ошибки IO_ERR.

       6. Метод, показанный в примере 3, впустую тратит  сис-

  темное время, выполняя цикл,  пока  не  закончится  запрос.

  Этот метод следует использовать, только  если  он  является

  последней возможной альтернативой.



       7.3.1. Рекомендуемый   метод   для    проверки

              асинхронного завершения


       Для определения завершения асинхронного события  реко-

  мендуется использовать  программу  системного  обслуживания

  $SYNCH  ("синхронизировать").  Служебная  программа  $SYNCH

  корректно ожидает действительного  завершения  асинхронного

  события, даже если какое-то  другое  событие  устанавливает

  флаг события.



                           - 234 -

                        00152-01 97 06


       Чтобы использовать служебную программу $SYNCH для ожи-

  дания завершения асинхронного события,  необходимо  указать

  как номер  флага  события,  так  и  адрес  блока  состояния

  ввода-вывода (IOSB) при вызове программы системного  обслу-

  живания. Асинхронная служебная программа  ставит  запрос  в

  очередь и возвращает управление в программу.  Когда  асинх-

  ронная служебная программа завершает выполнение, она  уста-

  навливает флаг события и помещает код  конечного  состояния

  запроса в блок IOSB.

       При вызове программы $SYNCH, необходимо задать тот  же

  аргумент EFN и блок состояния  ввода-вывода,  которые  были

  указаны при вызове асинхронной служебной  программы.  Прог-

  рамма $SYNCH ожидает флага  события,  который  должен  быть

  установлен  с  помощью  программы  системного  обслуживания

  $WAITFR.  Когда  устанавливается  указанный  флаг  события,

  программа  $SYNCH   проверяет   заданный   блок   состояния

  ввода-вывода.

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

  рамма  системного  обслуживания  завершилась  и   программа

  $SYNCH возвращает управление в программу пользователя. Если

  блок состояния ввода-вывода  содержит  нуль,  то  программа

  $SYNCH сбрасывает флаг события с помощью служебной програм-

  мы $CLREF и вызывает служебную программу $WFLOR для  ожида-

  ния установки флага события.

       Программа $SYNCH устанавливает флаг события и  возвра-

  щает управление в программу. Это дает гарантию, что  вызову

  программы $SYNCH не помешает  проверка  завершения  другого




                           - 235 -

                        00152-01 97 06


  асинхронного события, которое завершается приблизительно  в

  то же время и использует тот же флаг события для сигнализа-

  ции о завершении.

       Пример.

  EVENT_FLAG = 1

  ;

  Q_IOSB: .QUAD   0

            .

            .

            .

          $QIO_S  EFN=#EVENT_FLAG,-

                  IOSB=Q_IOSB,...

          $SYNCH_S, -

                  EFN=#EVENT_FLAG

                  IOSB=Q_IOSB

          BLBC    R0,ERROR

           .

           .

           .

       Примечание. Служебная программа $QIOW заменяет  комби-

  нацию процедур $QIO и $SYNCH. В приведенном фрагменте прог-

  раммы показан пример работы программы $SYNCH.



       7.4. Синхронные формы программ  обслуживания

            ввода-вывода


       Некоторые программы  обслуживания  ввода-вывода  можно

  выполнять либо синхронно, либо  асинхронно.  Символ  "W"  в



                           - 236 -

                        00152-01 97 06


  конце имени программы  системного  обслуживания  определяет

  синхронную версию служебной программы.

       Синхронная версия  программы  системного  обслуживания

  комбинирует функции асинхронной  версии  этой  программы  и

  программы системного обслуживания $SYNCH. Синхронная версия

  работает так, как если бы использовалась асинхронная версия

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

  довал  вызов  программы  $SYNCH.  Она  помещает  запрос  на

  ввод-вывод в очередь и затем переводит программу в  состоя-

  ние ожидания, пока  не  завершится  запрос  на  ввод-вывод.

  Синхронная версия требует те же аргументы, что и  асинхрон-

  ная версия.

       В табл. 31 приводится список имен асинхронных и  синх-

  ронных программ обслуживания ввода-вывода.


                                                  Таблица 31

  ----------------------------------------------------------

  Асинхронные ! Синхронные !        Описание

  программы   ! программы  !

  ----------------------------------------------------------

  $BRKTHRU    ! $BRKTHRUW  ! Разослать сообщение

  $GETDVI     ! $GETDVIW   ! Получить информацию об устройс-

              !            ! тве или томе

  $GETJPI     ! $GETJPIW   ! Получить информацию о задании

              !            ! или процессе

  $GETLKI     ! $GETLKIW   ! Получить информацию о захвате

  $GETQUI     ! $GETQUIW   ! Получить информацию об очереди




                           - 237 -

                        00152-01 97 06


                                        Продолжение табл. 31

  ----------------------------------------------------------

  Асинхронные ! Синхронные !        Описание

  программы   ! программы  !

  ----------------------------------------------------------

  $QIO        ! $QIOW      ! Поставить в очередь запрос на

              !            ! ввод-вывод

  $SNDJBC     ! $SNDJBCW   ! Послать сообщение контроллеру

              !            ! заданий

  $UPDSEC     ! $UPDSECW   ! Обновить файл секции на диске





      7.5. При завершении операции ввода-вывода, операционная

  система МОС ВП извещает о состоянии завершения в блоке сос-

  тояния  ввода-вывода,  если  он  специфицирован.  Состояние

  завершения сообщает закончилась  ли  операция  успешно  или

  нет, число переданных байтов  и  дополнительную  информацию

  возврата, зависящую от устройства.

       На рис. 39 показан  формат  информации,  записанной  в

  блок IOSB.


       31                 16 15                      0
     +-----------------------------------------------+
     !      Счетчик         ! Значение кода возврата !
     +-----------------------------------------------+
     !      Информация зависящая от устройства       !
     +-----------------------------------------------+

                            Рис. 39


       Первое слово содержит системный код состояния, индици-

  рующий успех или неудачу операции. Используемые  коды  сос-



                           - 238 -

                        00152-01 97 06


  тояния совпадают с теми, которые возвращают  все  программы

  системного обслуживания, например,  код  SS$_NORMAL  свиде-

  тельствует об успешном завершении.

       Второе слово содержит число  байтов,  которое  реально

  передано в операции ввода-вывода (см. докумнет [5]).
                             
       Второе длинное  слово  содержит  информацию  возврата,

  зависящую от устройства.

       Чтобы удостовериться в  успешном  завершении  операции

  ввода-вывода и целостности  переданных  данных,  блок  IOSB

  следует проверять сразу после  запросов  на  ввод-вывод,  в

  особенности для функций  ввода-вывода,  зависящих  от  уст-

  ройств. (см. документ [2]).



       7.6. Освобождение каналов ввода-вывода


       Если процесс больше не нуждается в доступе к устройст-

  ву ввода-вывода, ему следует  освободить  назначенный  уст-

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

  темного обслуживания $DASSGN.

       Пример.

          $DASSGN_S CHAN=TTCHAN

       Операционная система МОС ВП автоматически  освобождает

  канал для процесса, когда образ, для которого был  назначен

  канал, завершает свою работу.

       Пример иллюстрирует полную последовательность операций

  ввода-вывода, использующих макрокоманду $QIOW для чтения  и

  записи строк на текущее устройство по  умолчанию  с  именем

  SYS$INPUT. Эта программа будет работать  корректно,  только



                           - 239 -

                        00152-01 97 06


  если она  выполняется  интерактивно,  поскольку  ввод-вывод

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

       Пример.

  TTNAME: .ASCID  /SYS$INPUT:/    ; дескриптор для имени

                                  ; терминала

  TTCHAN: .BLKW   1               ; получить здесь номер

                                  ; канала

  TTIOSB: .BLKW   1               ; первое слово блока IOSB,

                                  ; состояние

  TTIOLEN:

          .BLKW   1               ; второе слово, получить

                                  ; длину

          .BLKL   1               ; второе длинное слово

                                  ; блока IOSB

  OUTLEN: .BLKL   1               ; длина строки для выхода

  INBUF:  .BLKB   80              ; буфер для чтения входа

            .

            .

            .

  10$:    $ASSIGN_S -             ; назначить канал

                  DEVNAM=TTNAME, -; логическое имя, трансли-

                  CHAN=TTCHAN     ; руемое программой $ASSIGN

          BSBW    ERROR

          $QIOW_S -

                  FUNC=#IO$_READVBLK -

                  CHAN=TTCHAN, -

                  LENGTH=P2, -




                           - 240 -

                        00152-01 97 06


                  BUFFER=P1, -

                  IOSB=TTIOSB

          BSBW    ERROR

          MOVZWL  TTIOSB,R0       ; поместить код состояния

                                  ; в регистр R0

        BSBW    ERROR

        MOVZWL  TTIOLEN,OUTLEN    ; получить длину из блока

                                  ; IOSB

          $QIOW_S -

                  FUNC=#IO$_WRITVBLK -

                  CHAN=TTCHAN, -

                  LENGTH=P2, -

                  BUFFER=P1, -

                  IOSB=TTIOSB

        BSBW    ERROR

          MOVZWL  TTIOSB,R0       ; поместить код состояния

                                  ; в регистр R0

          BSBW    ERROR

        $DASSNG_S -               ; выполнено, освободить

                                  ; канал

                  CHAN=TTCHAN

          BSBW    ERROR

           .

           .

           .

  ERROR:  BLBS    R0,10$           ; проверить, успешный ли

                                   ; код возврата




                           - 241 -

                        00152-01 97 06


          $EXIт_S R0               ; если нет, то выйти и

                                   ; просигнализировать

  10$:    RSB                      ; если успешный, вернуть-

                                   ; ся в точку вызова

       Примечания:

       1. TTNAME - это дескриптор строки символов  для  логи-

  ческого устройства SYS$INPUT, ТТCHAN - это слово, в которое

  заносится номер канала, назначенный этому устройству.

       2. Блок IOSB для  операций  ввода-вывода  имеет  такую

  структуру, чтобы программа легко могла проверить  состояние

  завершения (в первом слове) и  длину  возвращаемой  входной

  строки (во втором слове).

       3. Строка будет читаться в буфер INBUF. Длинное  слово

  OUTLEN  будет   содержать   длину   строки   для   операции

  ввода-вывода.

       4. Программа $ASSIGN назначает  канал  и  пишет  номер

  канала в TTCHAN.

       5. Если служебная программа $ASSIGN завершается успеш-

  но, то программа $QIOW читает строку с терминала и требует,

  чтобы в блок состояния ввода-вывода с именем TTIOSB  пришло

  извещение о состоянии завершения.

       6. Процесс ожидает, пока закончится ввод-вывод,  затем

  проверяет в первом слове блока состояния ввода-вывода  сос-

  тояния возврата. Если состояние не успешное,  то  программа

  переходит на обработку ошибки.

       7. Затем в длинное слово OUTLEN помещается длина  про-

  читанной строки. Это необходимо, поскольку программа  $QIOW




                           - 242 -

                        00152-01 97 06


  требует аргумента размером в длинное слово, а поле длины  в

  блоке состояния ввода-вывода имеет размер слово.  Программа

  $QIOW пишет только что прочитанную строку на терминал.

       8. Программа выполняет контроль ошибок: сначала  убеж-

  дается,  что  успешно  поставила  в   очередь   запрос   на

  ввод-вывод, затем после завершения запроса  она  проверяет,

  успешно ли закончилась операция ввода-вывода.

       9. После того как все операции ввода-вывода завершают-

  ся, канал освобождается.



       7.7. Отмена запросов на ввод-вывод


       Если процесс должен отменить  запросы  на  ввод-вывод,

  которые были поставлены в очередь, но еще не успели  выпол-

  ниться, он может вызвать программу системного  обслуживания

  $CANCEL ("отменить ввод-вывод в канале").  При  этом  будут

  отменены все запросы на ввод-вывод этого процесса,  находя-

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

  ввод-вывод указать нельзя.

       Программу системного обслуживания $CANCEL  можно  выз-

  вать слудующим образом:

        $CANCEL_S CHAN=TTCHAN

       В приведенном примере программа системного  обслужива-

  ния $CANCEL инициирует отмену всех запросов на  ввод-вывод,

  ожидающих в канале, чей номер помещен в TTCHAN.

       Программа системного обслуживания  $CANCEL  возвращает

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

  ввод-вывод. Если при вызове $QIO указан флаг события, подп-



                           - 243 -

                        00152-01 97 06


  рограмма обслуживания AST или блок состояния  ввода-вывода,

  то операционная система МОС ВП устанавливает флаг,  достав-

  ляет AST или извещает блок  состояния  ввода-вывода,  соот-

  ветственно, после реального завершения отмены запросов.



       7.8. Распределение устройств


       Многие устройства ввода-вывода являются  разделяемыми,

  т.е. одновременно к такому устройству  могут  иметь  доступ

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

  вания $ASSIGN, процесс  получает  канал  к  устройству  для

  выполнения операций ввода-вывода.

       В некоторых случаях процессу может понадобиться  моно-

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

  сам устройство было недоступно. Чтобы зарезервировать  уст-

  ройство  для  монопольного  использования,  его  необходимо

  распределить.

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

  команд языка DCL командой  ALLOCATE.  Процесс  может  также

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

  луживания $ALLOC ("распределить  устройство").  Когда  уст-

  ройство распределяется процессом, только процесс, распреде-

  ляющий устройство, и все  созданные  им  подпроцессы  могут

  назначать каналы к устройству.

       При вызове программы  системного  обслуживания  $ALLOC

  необходимо задать имя устройства. Задаваемое имя устройства

  может быть одного их трех типов:





                           - 244 -

                        00152-01 97 06


       1) именем физического устройства,  например  лентопро-

  тяжное устройство MTBЗ;

       2) логическим именем, например, TAPE;

       3) обобщенным именем устройства, например, мт.

       Если указывается имя физического устройства, то  прог-

  рамма $ALLOC пытается распределить заданное устройство.

       Если указывается логическое имя, то  программа  $ALLOC

  транслирует логическое  имя  и  пытается  распределить  имя

  физического устройства, приравненное логическому имени.

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

  указывается тип устройства, но  не  указывается  контроллер

  и/или номер устройства, программа $ALLOC пытается распреде-

  лить любое доступное устройство указанного типа.

       Если задаются обобщенные имена  устройств,  необходимо

  обеспечить поля в которые программа системного обслуживания

  $ALLOC возвращает имя и длину физического устройства, кото-

  рое реально распределяется, так что это имя можно использо-

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

  $ASSIGN.

       Пример иллюстрирует распределение устройства  управле-

  ния лентами, которое задается логическим именем TAPE.

       Пример.

  LOGDEV: .ASCID  /TAPE/  ; дескриптор для логического

                          ; имени

  DEVDESC:                ; дескриптор для физического

                          ; имени

          .LONG   64      ; длина буфера




                           - 245 -

                        00152-01 97 06


          .ADDRESS -      ; адрес буфера

                  DEVSTR

  DEVSTR: .BLKB   64      ; получить возвращенное фи-

                          ; зическое имя

  TAPECHAN:

          .BLKW   1               ; канал для ввода-

            .                     ; вывода с ленты

            .

            .

          $ALLOC_S -

                  DEVNAM=LOGDEV,-

                  PHYLEN=DEVDESC,-

                  PHUYUF=DEVDESC

          BSBW    ERROR

          $ASSIGN_S -               ; назначить канал

                  DEVNAM=DEVDESC,-

                  CHAN=TAPECHAN

          BSBW    ERROR

            .                     ; продолжить ввод-вывод

            .

            .

          $DASSGN_S -             ; освободить канал

                  CHAN=TAPECHAN

          BSBW    ERROR

          $DALLOC_S -             ; освободить ленту

                  DEVNAM=DEVDESC

       Примечания:




                           - 246 -

                        00152-01 97 06


       1. Служебная программа $ALLOC запрашивает  распределе-

  ние устройства, соответствующего  логическому  имени  TAPE,

  определенному дескриптором строки LOGDEV. Аргумент  DEVDESC

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

  ройства, которое реально распределяется и длина строки име-

  ни. Программа $ALLOC  транслирует  логическое  имя  таре  и

  возвращает строку эквивалентного имени устройства,  которое

  реально распределено, в буфер DEVDESC. Программа записывает

  длину строки в первое слово буфера DEVDESC.

       2. Программа $ASSIGN использует строку символов, возв-

  ращаемую  программой  системного  обслуживания   $ALLOC   в

  качестве входного аргумента  имени  устройства  и  требует,

  чтобы номер канала был записан в TAPECHAN.

       3. После завершения  операций  ввода-вывода  программа

  системного обслуживания $DASSGN освобождает канал, а  прог-

  рамма системного  обслуживания  $DALLOC  обсвобождает  уст-

  ройство. Канал должен быть освобожден раньше, чем устройст-

  во.



       7.8.1. Неявное распределение


       Устройства, которые не могут  разделяться  несколькими

  процессами (например, терминалы и построчно-печатающее уст-

  ройство) не нуждаются в явном распределении. Поскольку  эти

  устройства неразделяемые, они распределяются  неявно  прог-

  раммой системного обслуживания $ASSIGN, когда эта программа

  вызывается для назначения канала устройству.





                           - 247 -

                        00152-01 97 06


       7.8.2. Освобождение устройства


       Когда завершается программа, использующая распределен-

  ное устройство, желательно, чтобы она освободила устройство

  с помощью программы системного обслуживания $DALLOC ("осво-

  бодить устройство"), с целью сделать его доступным для дру-

  гих процессов, как показано в примере.

       Пример.

          $DALLOC_S DEVNAM=DEVDESC

       При завершении работы образа операционная система  мос

  вп  автоматически  освобождает  устройства,  распределенные

  образу.



       7.9. Монтирование и демонтирование томов


       Монтирование тома  устанавливает  связь  между  томом,

  устройством и процессом. Чтобы можно было выполнить  опера-

  ции ввода-вывода на томе, этот том или группу томов необхо-

  димо смонтировать. Обычно пользователь монтирует или демон-

  тирует том из потока команд DCL с помощью команд MOUNT  или

  DISMOUNT. Процесс  может  также  монтировать  том  или  ряд

  томов, используя программу системного  обслуживания  $MOUNT

  ("монтировать том"). Том или группу томов можно  демонтиро-

  вать с помощью программы  системного  обслуживания  $DISMOU

  ("демонтировать том").

       Монтирование тома включает две отдельные операции:

       1) поместить том на устройство и подготовить к  работе

  это устройство;




                           - 248 -

                        00152-01 97 06


       2) смонтировать том  с  помощью  программы  системного

  обслуживания $MOUNT.



       7.9.1. Вызов программы системного обслуживания

              $MOUNT


       Программа  системного  обслуживания  $MOUNT  позволяет

  процессу  смонтировать  либо  отдельный  том,  либо  группу

  томов. При вызове программы системного обслуживания  $MOUNT

  необходимо указать имя устройства.

       Программа системного обслуживания $MOUNT имеет единст-

  венный аргумент - адрес списка дескрипторов элементов. Этот

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

  рис. 40 показан формат дескриптора элемента.


    31                  16  15                    0
  +------------------------------------------------+
  !     Код элемента      !   Длина буфера         !
  +------------------------------------------------+
  !               Адрес буфера                     !
  +------------------------------------------------+
  !         Адрес возвращаемой длины               !
  +------------------------------------------------+

                            Рис. 40


       Большинство дескрипторов элементов не должны задавать-

  ся в каком-либо порядке. Чтобы  смонтировать  набор  томов,

  необходимо указать один дескриптор элемента на устройство и

  один дескриптор элемента  на  том.  Дескрипторы  для  томов

  должны указываться в том же порядке, что и дескрипторы  для

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

  ментов, отличных от имени устройства или тома, если  указы-




                           - 249 -

                        00152-01 97 06


  вается один и тот  же  дескриптор  более  одного  раза,  то

  используется последняя из ссылок на этот дескриптор.

       Пример иллюстрирует вызов программы $MOUNT. Этот вызов

  эквивалентен следующей команде языка DCL:

  $MOUNT/SYSTEM/NOQUOTA DRA4:,DRA5: USER01,USER02,USERD$

       Пример.

          $MNTDEF

  ITEMS:  .WORD   4               ; длина флагов

          .WORD   MNT$_FLAGS      ; код флага

          .ADDRESS -              ; адрес длинного слова

                  FLAGS           ; флага

          .LONG   0               ; неиспользуемое длинное

                                  ; слово

  ;

          .WORD   5               ; длина имени первого

                                  ; устройства

          .WORD   MNT$_DEVNAM     ; код устройства

          .ADDRESS -              ; адрес имени первого

                  DEV1            ; устройства

          .LONG   0               ; неиспользуемое длинное

                                  ; слово

  ;

          .WORD   6               ; длина имени первого тома

          .WORD   MNT$_VOLNAM     ; код тома

          .ADDRESS -              ; адрес имени первого тома

                  VOL1

          .LONG   0               ; неиспользуемое длинное




                           - 250 -

                        00152-01 97 06


                                  ; слово

  ;

          .WORD   5               ; длина имени второго уст-

                                  ; ройства

          .WORD   MNT$_DEVNAM     ; код устройства

          .ADDRESS -              ; адрес имени второго уст-

                  DEV2            ; ройства

          .LONG   0               ; неиспользуемое длинное

                                  ; слово

  ;

          .WORD   6               ; длина имени второго тома

          .WORD   MNT$_VOLNAM     ; код тома

          .ADDRESS -

                  VOL2            ; адрес имени второго тома

          .LONG   0               ; неиспользуемое длинное

                                  ; слово

  ;

          .WORD   6               ; длина логического имени

                                  ; тома

          .WORD   MNT$_LOGNAM     ; код логического имени

          .ADDRESS -              ; адрес логического имени

                  LOG             ; тома

          .LONG   0               ; неиспользуемое длинное

                                  ; слово

          .LONG   0               ; конец элементного списка

  ;

  DEV1:   .ASCII  /DRA4:/         ; первое устройство




                           - 251 -

                        00152-01 97 06


  VOL1:   .ASCII  /USER01/        ; имя первого тома

  DEV2:   .ASCII  /DRA5:/         ; второе устройство

  VOL2:   .ASCII  /USER02/        ; имя второго устройства

  LOG:    .ASCII  /USERD$/        ; логическое имя

  ;

  FLAGS:  .LONG   <MNT$M_SYSTEM!MNT$M_NODISKQ>

            .

            .

            .

          $MOUNT_S -              ; теперь вызвать $MOUNT

                  ITMLST=ITEMS





       7.9.2. Вызов программы системного обслуживания

              $DISMOU


       Программа системного  обслуживания  $DISMOU  позволяет

  процессу демонтировать один том или группу томов. При вызо-

  ве программы $DISMOU  необходимо  указать  имя  устройства.

  Если том, смонтированный  на  данном  устройстве,  является

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

  ги, то демонтируется вся группа томов.

       Пример иллюстрирует вызов программы $DISMOU. При рабо-

  те программы демонтируется группа томов,  смонтированная  в

  примере, показанном в п. 7.9.1.









                           - 252 -

                        00152-01 97 06


  пример.


  DEV1_DESC:

          .ASCID  /DRA4:/

            .

            .

            .

          $DISMOU_S -

                  DEVNAM=DEV1_DESC

            .

            .

            .



       7.10. Логические  имена  и  имена  физических

             устройств


       Когда имя устройства указывается в  качестве  входного

  для программы  системного  обслуживания  ввода-вывода,  оно

  может быть либо именем физического устройства,  либо  логи-

  ческим именем. Если имя устройства содержит  двоеточие,  то

  двоеточие и все следующие за ним символы игнорируются. Если

  строке имени устройства предшествует символ  подчеркивания,

  то это означает, что данная строка является именем физичес-

  кого устройства.

       Пример.

          TTNAME:.ASCID /_TTB3:/

       Любая строка, которая начинается не со знака подчерки-

  вания, рассматривается как логическое имя,  даже  если  это




                           - 253 -

                        00152-01 97 06


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

  обслуживания транслируют логическое имя итеративно, пока не

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

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

  по умолчанию:

       1) распределить устройство ($ALLOC);

       2) назначить канал ввода-вывода ($ASSIGN);

       3) разослать сообщение ($BRKTHRU);

       4) освободить устройство ($DALLOC);

       5) демонтировать том ($DISMOU);

       6) получить информацию об устройстве/томе ($GETDVI);

       7) монтировать том ($MOUNT).

       При каждой трансляции по порядку просматриваются  таб-

  лицы  логических  имен,  определенные   логическим   именем

  LNM$FILE_DEV.  Это  обычно  таблицы  LNM$PROCESS,  LNM$JOB,

  LNM$GROUP и LNM$SYSTEM, перечисленные в порядке  просмотра.

  Если в результате трансляции  определяется  физическое  имя

  устройства, то для этого устройства выполняется  запрос  на

  ввод-вывод.

       Если служебные програмы не находят в таблице  логичес-

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

  живания ввода-вывода рассматривает указанное имя в качестве

  имени физического устройства. Если при вызове одной из этих

  служебных программ указывается  имя  реального  физического

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

  избежать трансляции логического имени.

       Когда программа системного обслуживания $ALLOC возвра-




                           - 254 -

                        00152-01 97 06


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

  мая строка с именем имеет префикс в виде символа  подчерки-

  вания. Когда это имя используется для  последующего  вызова

  программы системного обслуживания $ASSIGN, эта программа не

  пытается транслировать имя устройства.

       Если при  вызове  программ  обслуживания  ввода-вывода

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

  необходимо установить правильную эквивалентность имени уст-

  ройства. Это можно сделать либо с  помощью  команды  DEFINE

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

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

  программы системного обслуживания $CRELNM  ("создать  логи-

  ческое имя"), которая устанавливает эквивалентное имя  (см.

  раздел 6).



       7.10.1. Имена устройств, принятые по умолчанию


       Если после трансляции логического имени строка с  име-

  нем устройства при вызове программы системного обслуживания

  ввода-вывода не полностью специфицирует имя устройства  (то

  есть тип устройства, контроллер и устройство), то эта прог-

  рамма дополняет незаданные поля, либо значениями, принятыми

  по умолчанию, либо значениями, выбранными по принципу  дос-

  тупности устройства.

       Используются следующие правила:

       1) программы системного обслуживания $ASSIGN и $DALLOC

  используют значения, принятые по умолчанию из табл. 32;





                           - 255 -

                        00152-01 97 06


       2) программа системного обслуживания $ALLOC рассматри-

  вает имя устройства как обобщенное  имя  и  пытается  найти

  устройство,  которое  удовлетворяет  компонентам  заданного

  имени устройства (см. табл. 32).



       7.11. Получение   информации   о   физических

             устройствах


       Программа $GETDVI возвращает информацию  об  устройст-

  вах. Возвращаемая информация  задается  списком  элементов,

  который создается перед вызовом программы $GETDVI.

       При вызове программы системного обслуживания  $GETDVI,

  необходимо предоставить  адрес  списка  элементов,  который

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

  мент [2]). В тех случаях, когда при вызове программы обслу-

  живания ввода-вывода используется обобщенное имя (т.е. нес-

  пецифическое)  устройства,  программе  может   понадобиться

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

  Чтобы выяснить это,  программа  должна  передать  программе

  $GETDVI номер канала для устройства и затребовать имя  уст-

  ройства в элементном идентификаторе DVI$_DEVNAM.

















                           - 256 -

                        00152-01 97 06


                                                   Таблица 32

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

         системных программ обслуживания ввода-вывода

  -----------------------------------------------------------

  Заданное ! Имя устройства по   !Обобщенные имена устройств,

  имя      ! умолчанию для боль- ! используемые программами

  устройст-! шинства программ об-! $ASSIGN и $DALLOC

  ва       ! служивания ввода-вы-!

           ! вода                !

  -----------------------------------------------------------

  DD:      ! DRA0:  (устройство 0! DDXY: (любое доступное ус-

           ! на контроллере а)   ! тройство указанного типа)

  DDC:     ! DDC0:  (устройство 0! DDCY: (любое доступное ус-

           ! на указанном кон-   ! тройство на указанном кон-

           ! троллере)           ! троллере)

  DDU:     ! DDAU:  (указанное   ! DDXU: (устройство указан-

           ! устройство на конт- ! ного типа на любом доступ-

           ! роллере а)          ! ном контроллере)

  DDCU:    ! DDCU:  (указанные   ! DDCU: (указанные устройст-

           ! устройство и конт-  ! во и контроллер)

           ! роллер)             !

  -----------------

       DD: - заданный тип устройства;

       C: - заданный контроллер;

       X: - любой контроллер;

       U: - заданный номер устройства;

       Y: - любой номер устройства.




                           - 257 -

                        00152-01 97 06


       7.12. Форматирование выходных строк


       При подготовке выходных строк для программ может пона-

  добиться перед выводом ввести в строку переменную  информа-

  цию или преобразовать числовое значение  в  строку  в  коде

  КОИ-8. Эти функции выполняет программа системного  обслужи-

  вания $FAO.

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

       1) управляющей строки, которая содержит  фиксированную

  часть с текстом и директив форматирования. Директивы  опре-

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

  тановки и описывают тип данных  и  длину  входных  величин,

  которые должны быть заменены или преобразованы;

       2) выходного буфера, который должен  содержать  строку

  после преобразований и подстановок;

       3) необязательного аргумента,  указывающего  слово,  в

  которое записывается конечная длина форматированной  выход-

  ной строки;

       4)  параметров,  которые  обеспечивают  аргументы  для

  директив форматирования.

       Пример показывает вызов программы системного  обслужи-

  вания $FAO с целью форматирования выходной строки для  мак-

  рокоманды $QIOW.

       Пример.

  FAOSTR: .ASCID  /файл !AS  не существует/ ; дескриптор для

                                        ; управляющей строки

                                        ; программы $FAO

  FAODESC:                              ; дескриптор для вы-



                           - 258 -

                        00152-01 97 06


                                       ; хода программы $FAO

          .LONG   80                    ; длина буфера

          .ADDRESS -                    ; адрес буфера

                  FAOBUF

  FAOBUF: .BLKB   80                    ; буфер для выхода

                                        ; программы $FAO

  FAOLEN: .LONG   0                     ; получить длину вы-

                                        ; хода программы

                                        ; $FAO

  FILESPEC:

          .ASCID  /DISK$USER:MYFILE.DAT/; дескриптор для па-

            .                           ; раметра программы

            .                           ; $FAO

            .

          $FAO_S  CTRSTR=FAOSTR, -

                  OUTLEN=FAOLEN, -

                  OUTBUF=FAODESC, -

                  P1=#FILESPEC           ; параметр для $FAO

          BSBW    ERROR

          $QIOW   ...,BUFFER=FAOBUF, -

                  LENGTH=FAOLEN

          BSBW    ERROR

       Примечания:

       1. FAOSTR представляет  управляющую  строку  программы

  $FAO. !AS является примером директивы  программы  FAO.  Она

  требует входного параметра, который задает адрес дескрипто-

  ра строки символов. Когда  программа  $FAO  вызывается  для




                           - 259 -

                        00152-01 97 06


  формирования этой управляющей строки, !AS заменяется  стро-

  кой, для которой указан адрес дескриптора.

       2. FAODESC  является  дескриптором   строки   символов

  выходного буфера. Программа $FAO будет писать в этот  буфер

  выходную строку, а длину окончательно сформированной строки

  запишет в младшее слово  длинного  слова  FAOLEN.  (длинное

  слово резервируется, чтобы использовать  его  для  входного

  аргумента программы $QIOW).

       3. FILESPEC - это дескриптор строки символов,  опреде-

  ляющий входную строку для директивы !AS программы $FAO.

       4. Вызов программы  $FAO  задает  управляющую  строку,

  поля выходного буфера и длины  и  параметр  P1,  являющийся

  адресом дескриптора строки, которая должна подставляться на

  место директивы.

       5. Когда программа $FAO завершается,  программа  $QIOW

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

          файл DISK$USER:MYFILE.DAT не существует



       7.13. Почтовые ящики


       Почтовые ящики - это виртуальные  устройства,  которые

  используются для связи между процессами. Реальная  передача

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

  (СУД-32) или программ обслуживания ввода-вывода. Когда слу-

  жебная программа $CREMBX создает почтовый ящик,  она  также

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

  процессом. После  этого  другие  процессы  могут  назначить

  каналы к этому почтовому ящику, используя программы систем-



                           - 260 -

                        00152-01 97 06


  ного обслуживания $CREMBX или $ASSIGN. (если почтовый  ящик

  расположен в памяти, разделяемой многими  процессорами,  то

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

  процесс каждого процессора  должен  использовать  служебную

  программу $CREMBX).

       Программа системного обслуживания $CREMBX создает поч-

  товый ящик.  Эта  программа  идентифицирует  почтовый  ящик

  логическим именем, заданным пользователем, и назначает  ему

  эквивалентное имя. Эквивалентное имя является именем  физи-

  ческого устройства в формате MBAN, где N - номер  устройст-

  ва. Эквивалентное имя имеет терминальный атрибут.

       Когда другой процесс назначает канал к почтовому ящику

  с помощью программы  системного  обслуживания  $CREMBX  или

  $ASSIGN, он может идентифицировать этот почтовый  ящик  его

  логическим именем. Процесс может получить имя MBAN,  транс-

  лируя логическое имя (с помощью программы системного обслу-

  живания $TRNLNM), или вызвать программу системного обслужи-

  вания $GETDVI, чтобы получить номер устройства и имя  физи-

  ческого устройства.

       Почтовые ящики бывают либо временными, либо постоянны-

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

  пользователь должен иметь привилегии TMPMBX и PRMMBX, соот-

  ветственно.

       Для временного  почтового  ящика  служебная  программа

  $CREMBX вводит логическое имя и эквивалентное имя в таблицу

  логических имен LNM$TEMPORARY_MAILBOX. Операционная система

  МОС ВП удаляет временный почтовый ящик, когда больше нет ни




                           - 261 -

                        00152-01 97 06


  одного назначенного ему канала.

       Для постоянного почтового  ящика  служебная  программа

  $CREMBX вводит логическое и  эквивалентное  имя  в  таблицу

  логических имен LNM$PERMANENT_MAILBOX. Постоянные  почтовые

  ящики продолжают существовать до тех  пор,  пока  не  будут

  специально помечены для удаления с помощью  программы  сис-

  темного обслуживания $DELMBX.

       Почтовый ящик,  расположенный  в  памяти,  разделяемой

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

  следующие события:

       1) процессор заново загружается;

       2) многовходовая память заново не инициализируется;

       3) ни один другой процессор не имеет процессов, назна-

  чивших каналы к этому почтовому ящику.

       Пример показывает как процессы могут связываться между

  собой посредством почтового ящика.

       Пример.

  Процесс ORION

  MBLOGNAM:

          .ASCID  /GROUP100_MAILBOX/

  MBUFLEN = 128

  MBUFFER:

          .BLKW   1

  MBXCHAN:

          .BLKW   1

  MBXIOSB:

          .BLKW   1




                           - 262 -

                        00152-01 97 06


  MBLEN:  .BLKW   1

          .BLKL   1

  OUTLEN: .BLKL   1

             .

             .

             .

          .ENTRY  ORION,_^M<R2,R3,R4>

  ;

          $CREMBX__S -

                  PRMFLG=_#O, -

                  CHAN=MBXCHAN, -

                  MAXMSG=#MBUFLEN, -

                  BUFQUO=_#384,-

                  PROMSK=_#_^X0000, -

                  LOGNAM=MBLOGNAM

          BSBW    ERROR

          $QIO__S CHAN=MBXCHAN, -

                  FUNC=_#IO$__READVBLK,-

                  IOSB=MBXIOSB,-

                  ASTADR=MBXAST,-

                  P1=MBUFFER,-

                  P2=#MBUFLEN

          BSBW    ERROR

           .

           .

          RET

          .ENTRY  MBXAST,_^M<R2,R3,R4>




                           - 263 -

                        00152-01 97 06


          CMPW    MBXIOSB,_#SS$_NORMAL

          BNEQ    ASTERR

          MOVZWL  MBLEN,OUTLEN

          $QIOW_S ...,BUFFER=MBUFFER,-

                  LENGTH=OUTLEN,...

          BSBW    ERROR

           .

           .

          RET

  PROCESS CYGNUS

  MAILBOX:

          .ASCID  /GROUP100_MAILBOX/

  MAILCHAN:

          .BLKW   1

  OUTBUF: .BLKB   128

  OUTLEN: .BLKL   1

            .

            .

          .ENTRY  CYGNUS,_^M<R2,R3,R4>

          $ASSIGN__S -

                  DEVNAM=MAILBOX,-

                  CHAN=MAILCHAN

          BSBW    ERROR

           .

           .

           .

          $QIOW_S CHAN=MAILCHAN,-




                           - 264 -

                        00152-01 97 06


                  BUFFER=OUTBUF,-

                  LENGTH=OUTLEN,...

          BSBW    ERROR

            .

            .

          RET

       Примечания:

       1. Процесс ORION  создает  почтовый  ящик  и  получает

  номер канала в аргументе MBXCHAN.

       Аргумент PRMFLG указывает, что почтовый ящик  является

  временным почтовым ящиком. Логическое имя вводится в табли-

  цу логических имен LNM$TEMPORARY_MAILBOX.

       Аргумент MAXMSG ограничивает размер сообщений, которые

  может принимать почтовый ящик. В этом примере  указан  раз-

  мер,  совпадающий  с  размером  буфера  (MBUFFER),  который

  используется  при  вызове   программы   $QIO.   Буфер   для

  ввода-вывода из почтового  ящика  должен  иметь  размер  не

  меньший, чем размер, заданный в аргументе MAXMSG.

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

  чество системной памяти, которая распределяется для буфери-

  зации сообщений, вычитается из квоты буфера  процесса.  Для

  указания, какую часть квоты процесса  желательно  использо-

  вать для буферизации сообщений, следует использовать  аргу-

  мент BUFQUO.

       Почтовые  ящики  являются  защищенными   устройствами.

  Задавая маску защиты  с  помощью  аргумента  PROMSK,  можно

  ограничить доступ к почтовому ящику. (в  этом  примере  все




                           - 265 -

                        00152-01 97 06


  биты в маске сброшены, указывая  тем  самым  неограниченный

  доступ с чтением и записью).

       2. Создав почтовый ящик, процесс ORION вызывает  прог-

  рамму системного обслуживания $QIO, требуя чтобы его извес-

  тили об окончании ввода-вывода (т.е.  когда  почтовый  ящик

  получает сообщение)  посредством  прерывания  AST.  Процесс

  может продолжить выполнение, однако при получении сообщения

  подпрограмма обслуживания AST прерывает выполнение.

       3. Когда процесс CYGNUS посылает сообщение в  почтовый

  ящик, доставляется AST и процесс ORION реагирует на сообще-

  ние. ORION получает длину сообщения из первого слова  блока

  состояния ввода-вывода с меткой MBXIOSB и  помещает  его  в

  длинное слово OUTLEN, чтобы иметь возможность передать  его

  макрокоманде $QIOW_S.

       4. Процесс CYGNUS  назначает  канал  почтовому  ящику,

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

  му ящику. Программа  системного  обслуживания  $QIOW  пишет

  сообщения из выходного буфера с именем OUTBUF.



       7.13.1. Формат почтового ящика


       Строка логического имени, назначенного почтовому  ящи-

  ку, определяет, где расположен этот почтовый ящик - в памя-

  ти, используемой одним процессором, или в памяти, разделяе-

  мой многими процессорами. Аргумент LOGNAM  служебной  прог-

  раммы $CREMBX задает дескриптор, указывающий на строку сим-

  волов следующего формата:





                           - 266 -

                        00152-01 97 06


       Имя-разделяемой-памяти: имя-почтового-ящика

  где имя-разделяемой-памяти - указывает, что  почтовый  ящик

       расположен в  названной  памяти,  разделяемой  многими

       процессорами. Имя этой памяти задается во время  гене-

       рации операционной системы МОС  ВП.  Например,  строка

       SHRMEM$1:CHKPNT идентифицирует почтовый ящик с  именем

       CHKPNT, расположенный в разделяемой  памяти  с  именем

       SHRMEM$1. Если эта часть строки не включена в логичес-

       кое имя, значит почтовый ящик не расположен в  памяти,

       разделяемой многими процессорами;

      имя-почтового-ящика - это  имя,  назначенное  почтовому

       ящику длиной от 1 до 15 символов.

       При желании  для  почтового  ящика,  расположенного  в

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

  оба имени - имя-разделяемой-памяти  и  имя-почтового-ящика.

  Однако, если желательно использовать существующие программы

  без повторной компиляции или компоновки, то можно указывать

  только имя-почтового-ящика, предоставив операционной систе-

  ме МОС ВП транслировать его до полной спецификации.  Опера-

  ционная система МОС ВП пытается выполнить трансляцию  стро-

  ки, указанной аргументом LOGNAM, следующим образом:

       1) текущая  строка  имени  просматривается  в  поисках

  двоеточия. Если в этой строке двоеточие найдено, то делает-

  ся вывод, что почтовый ящик должен быть расположен в разде-

  ляемой памяти и трансляция продолжается по следующей схеме:

       - часть текущей строки имени, расположенная справа  от

  двоеточия, помещается в буфер имени-почтового-ящика.  Часть




                           - 267 -

                        00152-01 97 06


  текущей строки имени,  расположенная  слева  от  двоеточия,

  становится новой текущей строкой имени;

       - к текущей строке имени добавляется  префикс  MBX$  и

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

       - если результат содержит логическое имя, то шаги 1  и

  2 повторяются до тех пор, пока  трансляция  не  приведет  к

  ошибке, либо  пока  число  трансляций  не  превысит  числа,

  заданного при генерации системы параметром LNM$C_MAXDEPTH;

       - префикс MBX$  удаляется  из  текущей  строки  имени,

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

  именем-разделяемой-памяти. Текущая строка,  содержащаяся  в

  буфере имени-почтового-ящика, становится логическим  именем

  с эквивалентным именем MBAN (N - число, назначаемое  опера-

  ционной системой МОС ВП).

       2) если почтовый ящик расположен в  локальной  памяти,

  то трансляция продолжается по следующей схеме:

       - к текущей строке имени добавляется префикс  MBX$,  а

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

       - если результат является логическим именем, то шаг  1

  повторяется до тех пор, пока трансляция не приведет к ошиб-

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

  при генерации системы параметром LNM$C_MAXDEPTH;

       - префикс MBX$  удаляется  из  текущей  строки  имени,

  которое уже не требуется транслировать. Эта текущая  строка

  становится логическим именем с эквивалентным именем MBAN:

       Примеры 1 и 2 иллюстрируют технику использования логи-

  ческих имен.




                           - 268 -

                        00152-01 97 06


       Пример 1.

          $DEFINE MBX$CHKPNT      SHRMEM$1:CHKPNT

       Пример 2.

  MBXDESC:        .ASCID /CHKPNT/    ; дескриптор для логи-

                                     ; ческого имени почто-

                                     ; вого ящика

                     .

                     .

                  $CREMBX_S LOGNAM=MBXDESC,...

       Выполняется следующая трансляция логического имени:

       1) к CHKPNT добавляется префикс MBX$;

       2) имя  MBX$CHKPNT  транслируется  в  SHRMEM$1:CHKPNT.

  Поскольку дальнейшая трансляция не приводит  к  успеху,  то

  создается логическое  имя  CHKPNT  с  эквивалентным  именем

  MBAN: ("N" является  параметром,  назначенным  операционной

  системой МОС ВП).

       Есть два исключения из  метода  трансляции  логических

  имен, который обсуждается в этом пункте:

       1) если строка имени начинается с символа  подчеркива-

  ния (_), операционная система МОС ВП удаляет этот символ  и

  рассматривает результирующую строку как действительное  имя

  (т.е. Дальнейшая трансляция не выполняется);

       2) если строка имени является  результатом  трансляции

  логического имени, то строка имени проверяется, имеется  ли

  в ней атрибут TERMINAL. Если строка имени отмечена  атрибу-

  том TERMINAL, операционная  система  МОС  ВП  рассматривает

  результирующую строку как действительное имя (т.е. дальней-




                           - 269 -

                        00152-01 97 06


  шая трансляция не выполняется).



       7.13.2. Системные почтовые ящики


       Операционная система МОС ВП использует почтовые  ящики

  для связи между процессами системы. Все сообщения системных

  почтовых ящиков содержат в первом слове  каждого  сообщения

  константу, которая идентифицирует отправителя этого сообще-

  ния. Эти константы имеют символические имена  (определяемые

  в макрокоманде $MSGDEF) в следующем формате: MSG$_SENDER.

       В табл. 33 содержатся имена, определяемые  макрокоман-

  дой $MSGDEF, и описаны их значения.


                                                   Таблица 33

  -----------------------------------------------------------

  Символические имена  !             Значение

  -----------------------------------------------------------

  MSG$_TRMUNSOLIC      ! Незатребованные данные терминала

  MSG$_CRUNSOLIC       ! Незатребованные данные устройства

                       ! ввода перфокарт

  MSG$_ABORT           ! Связь по сети с партнером отменена

  MSG$_CONFIRM         ! Подтверждение связи в сети

  MSG$_CONNECT         ! Инициирование связи с прибывшим в

                       ! сеть

  MSG$_DISCON          ! Зависание при отключении партнера

                       ! по сети

  MSG$_EXIT            ! Партнер по сети выбыл преждевремен-

                       ! но




                           - 270 -

                        00152-01 97 06


                                         Продолжение табл. 33

  -----------------------------------------------------------

  Символические имена  !             Значение

  -----------------------------------------------------------

  MSG$_INTMSG          ! Сообщение о прерывании в сети; неза-

                       ! требованные данные

  MSG$_PATHLOST        ! Маршрут в сети потерян для партнера

  MSG$_PROTOCOL        ! Ошибка в протоколе сети

  MSG$_REJECT          ! Отказ от связи в сети

  MSG$_THIRDPARTY      ! Отсоединение третьего адресата в се-

                       ! ти

  MSG$_TIMEOUT         ! Перерыв связи в сети

  MSG$_NETSHUT         ! Отключение сети

  MSG$_NODEACC         ! Узел стал доступным

  MSG$_NODEINACC       ! Узел стал недоступным

  MSG$_EVTAVL          ! События доступны программе регистра-

                       ! ции событий сети

  MSG$_EVTRCVCHG       ! Смена базы данных получателя событий

  MSG$_INCDAT          ! Доступные входные незатребованные

                       ! данные

  MSG$_RESET           ! Запрос на сброс виртуального цикла

  MSG$_LINUP           ! Линия PVC включена

  MSG$_LINDWN          ! Линия PVC отключена

  MSG$_EVTXMTCHG       ! Смена базы данных передатчика

                       ! событий


       Остальная часть сообщений содержит переменную информа-

  цию, зависящую от системной компоненты, которая послала это



                           - 271 -

                        00152-01 97 06


  сообщение.

       Формат переменной информации для каждого типа  сообще-

  ний документирован вместе с системной  программой,  исполь-

  зующей почтовый ящик.



       7.13.3. Почтовые   ящики   для   сообщений    о

               завершении процессов


       Когда процесс создает другой процесс, он может указать

  номер устройства почтового ящика в качестве  аргумента  для

  программы системного обслуживания $CREPRC. Когда  созданный

  процесс удаляется, операционная  система  МОС  ВП  посылает

  сообщение в указанный почтовый ящик завершения.

       Почтовые ящики, расположенные  в  памяти,  разделяемой

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

  почтовых ящиков завершения.



       7.13.4. Почтовые ящики для системных процессов


       Следующие программы обслуживания ввода-вывода  исполь-

  зуются внутри системных процессов для связи  с  информацией

  разного рода.

       1) послать сообщение контроллеру заданий ($SNDJBC);

       2) послать сообщение оператору ($SNDOPR).












                           - 272 -

                        00152-01 97 06


         8. Служебные программы управления процессом



       При подключении пользователя операционная система  МОС

  ВП создает процесс  для  выполнения  образов.  Пользователь

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

  образа, выдавая команды RUN или SPAWN, используя любые ква-

  лификаторы, допустимые для создания процесса.  Кроме  того,

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

  выполнения определенного образа.

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

  жебные программы:

       1) создать процесс ($CREPRC);

       2) удалить процесс ($DELPRC);

       3) приостановить процесс ($SUSPND);

       4) возобновить процесс ($RESUME);

       5) перевести в "спячку" ($HIBER);

       6) разбудить ($WAKE);

       7) запланировать пробуждение ($SCHDWK);

       8) отменить пробуждение ($CANWAK);

       9) выход ($EXIT);

       10) принудительный выход ($FORCEX);

       11) об'явить обработчик выхода ($DCLEXH);

       12) отменить обработчик выхода ($CANEXH);

       13) установить имя процесса ($SETPRN);

       14) установить приоритет ($SETPRI);

       15) установить привилегии ($SETPRV);

       16) установить режим ожидания ресурса ($SETRWM);




                           - 273 -

                        00152-01 97 06


       17)  получить  информацию  о  задании   или   процессе

  ($GETJPI).

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

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

  Данный раздел описывает некоторые аспекты программ управле-

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

       1) подпроцессы и отсоединенные процессы;

       2) контекст выполнения процесса;

       3) создание процесса;

       4) межпроцессорное управление и связи;

       5) спячка и приостановка процесса;

       6) выход образа и обработчики выхода;

       7) удаление процесса и сообщения об окончании.



       8.1. Подпроцессы и отсоединенные процессы


       Каждый процесс является либо подпроцессом, либо отсое-

  диненным процессом. Подпроцесс получает часть квоты  ресур-

  сов создавшего его процесса и должен  заканчиваться  раньше

  этого процесса. Отсоединенный процесс полностью  независим.

  Например, процесс, который операционная система МОС ВП соз-

  дает при подключении пользователя,  является  отсоединенным

  процессом.

       Системная программа $CREPRC создает  как  подпроцессы,

  так  и  отсоединенные  процессы.  Количество  подпроцессов,

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

  PRCLM (максимальное количество процессов). Возможность соз-

  дания отсоединенного процесса с кодом идентификации пользо-



                           - 274 -

                        00152-01 97 06


  вателя, отличным от кода идентификации  пользователя  (UIC)

  создающего процесса, обеспечивается привилегией DETACH.



       8.2. Контекст выполнения процесса


       Контекст выполнения процесса определяет процесс в опе-

  рационной системе МОС ВП. Он включает следующее:

       1) образ, который выполняет данный процесс;

       2) входные и выходные потоки для образа, работающего в

  процессе;

       3) принимаемые по умолчанию диск и каталог для данного

  процесса;

       4) квоты системных ресурсов и привилегии пользователя,

  доступные данному процессу.

       Когда операционная система МОС ВП создает  отсоединен-

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

  использует для определения  контекста  выполнения  процесса

  системный файл авторизации пользователя (SYSUAF.DAT).

       Когда пользователь подключается к операционной системе

  МОС ВП, происходит следующее:

       1)  процесс,  созданный  для  пользователя,  выполняет

  образ с именем LOGINOUT;

       2) терминал, который использует пользователь,  опреде-

  ляется как устройство входного и выходного потока и  потока

  сообщений об ошибках для образов, выполняемых  данным  про-

  цессом;

       3) имена по умолчанию для дисков и каталогов пользова-

  теля берутся из файла авторизации пользователя;



                           - 275 -

                        00152-01 97 06


       4) с созданным процессом связываются квоты ресурсов  и

  привилегии, предоставленные  пользователю  системным  адми-

  нистратором;

       5) в созданный процесс отображается интерпретатор язы-

  ка команд.

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

  рамма $CREPRC, то контекст определяется при помощи  задания

  аргументов программы.



       8.3. Создание процесса


       В пп. 8.3.1...8.3.5. приведены примеры  создания  про-

  цесса и  описывается,  как  аргументы  системной  программы

  $CREPRC определяют контекст процесса.



       8.3.1. Определение  выполняемого  образа   для

              подпроцесса


       При вызове программы системного  обслуживания  $CREPRC

  следует указывать аргумент IMAGE, чтобы обеспечить процессу

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

  создание  процесса   для   выполнения   образа   с   именем

  CARRIE.EXE.

       Пример.

  PROGNAME:

          .ASCID  /CARRIE/ ; дескриптор для образа, который

                           ; должен выполняться

          $CREPRC_S -      ; создать процесс для выполнения




                           - 276 -

                        00152-01 97 06


                           ; CARRIE

                  IMAGE=PROGNAME

       В приведенном примере указано только имя  файла;  слу-

  жебная программа использует текущие значения  по  умолчанию

  для дисков и каталогов, осуществляет трансляцию  логических

  имен, по умолчанию принимает тип файла - EXE и находит наи-

  более позднюю версию  файла  образа.  Подпроцесс  удаляется

  после того, как он завершит выполнение образа.



       8.3.2. Входные,  выходные  и   диагностические

              устройства для подпроцессов


       При вызове программы системного  обслуживания  $CREPRC

  можно  указать  эквивалентные  имена  для  логических  имен

  SYS$INPUT, SYS$OUTPUT и SYS$ERROR. Такие  пары  "логическое

  имя - эквивалентное имя" помещаются  в  таблицу  логических

  имен для создаваемого процесса.

       В примере 1 представлен фрагмент программы определения

  входных, выходных и диагностических устройств  для  подпро-

  цесса. В примечаниях описано,  как  используются  эти  уст-

  ройства.

       Пример 1.

  INSTREAM: -

          .ASCID  /SUB_MAIL_BOX/  ; дескриптор для входного

                                  ; потока

  OUTSTREAM:

          .ASCID  /COMPUTE_OUT/   ; дескриптор для выходного

                                  ; и диагностического пото-



                           - 277 -

                        00152-01 97 06


                                  ; ка

  PROGNAME: -                     ; дескриптор для имени об-

                                  ; раза

          .ASCID  /COMPUTE.EXE/

             .

             .

             .

          $CREPRC_S -             ; создать процесс

                  IMAGE=PROGNAME,-

                  INRUT=INSTREAM,-

                  OUTPUT=OUTSTREAM,-

                  ERROR=OUTSTREAM

       Примечания:

       1. Аргумент  INPUT  отождествляет  эквивалентное   имя

  SUB_MAIL_BOX с логическим именем SYS$INPUT. Это  логическое

  имя может представлять почтовый  ящик,  который  вызывающий

  процесс предварительно создал при помощи программы  систем-

  ного обслуживания $CREMBX. Все данные,  которые  подпроцесс

  считывает с логического устройства SYS$INPUT, будут  прочи-

  таны из почтового ящика.

       2. Аргумент  OUTPUT  отождествляет  эквивалентное  имя

  COMPUTE_OUT с логическим именем SYS$OUTPUT. Все  сообщения,

  которые   программа   пишет   на   логическое    устройство

  SYS$OUTPUT, будут записаны в данный файл.

       3. Аргумент  ERROR  отождествляет  эквивалентное   имя

  COMPUTE_OUT с логическим именем SYS$ERROR.  Все  выдаваемые

  операционной системой МОС ВП  сообщения  об  ошибках  будут




                           - 278 -

                        00152-01 97 06


  записываться в этот  файл.  Поскольку  тот  же  самый  файл

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

  содержит  всю  выходную  информацию,  полученную  во  время

  выполнения образа программы.

       Программа системного обслуживания $CREPRC не обеспечи-

  вает принимаемых по умолчанию эквивалентных имен для  логи-

  ческих имен SYS$INPUT, SYS$OUTPUT и SYS$ERROR. Если  ничего

  не указано, то в качестве  эквивалентных  имен  могут  быть

  использованы элементы, если таковые  имеются,  в  групповых

  или системных  таблицах  логических  имен.  Если  во  время

  выполнения подпроцесс считывает  или  записывает  на  такие

  логические устройства, для которых  не  существует  эквива-

  лентного имени, то возникает ошибка.

       В программе, которая создает подпроцесс, можно сделать

  так, чтобы данный подпроцесс разделял с создающим процессом

  входное, выходное или диагностическое устройство. Для этого

  требуется процелать следующее:

       1)  получить  имя  устройства  для  логического  имени

  SYS$INPUT, SYS$OUTPUT или SYS$ERROR  при  помощи  программы

  системного обслуживания $GETDVI;

       2) использовать адрес данного дескриптора при  задании

  аргументов INPUT, OUTPUT  или  ERROR  программы  системного

  обслуживания $CREPRC.

       Пример 2 иллюстрирует эти действия.

       Пример 2.

          $PRCDEF

          $DVIDEF




                           - 279 -

                        00152-01 97 06


  DVILIST:                        ; начало списка элеме-

                                  ; нтов программы $GETDVI

          .WORD   64              ; длиной максимум 16 бай-

                                  ; тов

          .WORD   DVI$_DEVNAM     ; получить имя терминала

          .ADDRESS -              ; пункт назначения имени

                  TERM            ; терминала

          .ADDRESS -              ; пункт назначения длины

                  TERMDESC        ; строки

          .LONG           0       ; конец списка элементов

  ;

  TERMDESC:                       ; дескриптор для имени

                                  ; терминала

          .WORD   64              ; длиной максимум 16 бай-

                                  ; тов

          .WORD   0

  TERMADDR:

          .ADDRESS -

                  TERM

  TERM:   .BLKB   64              ; здесь размещается имя

                                  ; терминала

  ;

  LOGNAM: .ASCID  /SYS$INPUT/

  ;

  IMAGENAME:

          .ASCID  /WRKD$:[ORANGE]MIRROR/     ; образ для

                                             ; подпроцесса




                           - 280 -

                        00152-01 97 06


  ;

            .

            .

            .

  ;

          $GETDVI_S -

                  DEVNAM=LOGNAM, - ; поместить возвращаемую

                                  ; информацию на SYS$INPUT

                  ITMLST=DVILIST  ; адрес списка элементов

  ;

          BLBC    R0,SSERR        ; в случае неуспешного за-

                                  ; вершения перейти на про-

                                  ; грамму обработки ошибки

  ;

  10$:    $CREPRC_S -             ; создать подпроцесс,

                  IMAGE=IMAGENAME,-  ; выполняющий образ

                  INRUT=TERMDESC,-   ; MIRROR и использую-

                  OUTPUT=TERMDESC,-  ; щий терминал созда-

                  ERROR=TERMDESC,-   ; ющего процесса в ка-

                                     ; честве входного, вы-

                                     ; ходного и диагности-

                                     ; ческого устройства

                  BASPRI=#4       ; установить базовый при-

                                  ; оритет, равный 4

       При работе  подпроцесса  логические  имена  SYS$INPUT,

  SYS$OUTPUT и SYS$ERROR отождествляются с именем логического

  входного устройства создающего процесса. Кроме того,  подп-




                           - 281 -

                        00152-01 97 06


  роцесс может выбирать одну из следующих возможностей:

       1) использовать  систему  управления  данными  СУД-32,

  чтобы открыть файл для чтения и/или записи;

       2)  использовать  программу  системного   обслуживания

  $ASSIGN  для  того,  чтобы   назначить   устройству   канал

  ввода-вывода для операций ввода-вывода.

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

  определенного именем SYS$OUTPUT.

       Пример 3.

  OUTPUT: .ASCID  /SYS$OUTPUT/    ; дескриптор логичес-

                                  ; кого имени

  OUTCHAN:

          .BLKW   1               ; номер канала выход-

                                  ; ного устройтсва

            .

            .

            .

          $ASSIGN_S -

                  DEVNAM=OUTPUT,-

                  CHAN=OUTCHAN



       8.3.3. Принимаемые по умолчанию диск и каталог

              для создаваемых процессов


       Если для  создания  процесса,  выполняющего  некоторый

  образ,  используется  программа   системного   обслуживания

  $CREPRC, то операционная система МОС ВП находит файл образа

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


                           - 282 -

                        00152-01 97 06


  даваемого процесса. Каждый создаваемый процесс  приобретает

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

  создавшего процесса.

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

  его принятом по умолчанию каталоге, то пользователь  должен

  идентифицировать каталог и, если  требуется,  устройство  в

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

  ся.

       При вызове программы $CREPRC нельзя определить  прини-

  маемые по умолчанию устройство и/или каталог для  создавае-

  мого процесса, отличные от принимаемых  по  умолчанию  уст-

  ройства и каталога создающего процесса. Однако, создаваемый

  процесс может определить эквивалентное имя для  логического

  устройства SYS$DISK при помощи вызова программы  системного

  обслуживания $CRELNM.

       Если процесс является подпроцессом, то  можно  опреде-

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

  в таблице логических имен задания или в любой таблице логи-

  ческих имен, разделяемой между создающим процессом и  подп-

  роцессом. Созданный процесс  может  также  установить  свой

  собственный принимаемый по  умолчанию  каталог  при  помощи

  вызова програмы управления значениями по умолчанию каталога

  SYS$SEтDIR системы СУД-32.

       Процесс может создать другой процесс со  значением  по

  умолчанию для каталога, отличным от его собственного,  сле-

  дующим образом:

       1) процесс, создающий новый процесс, вызывает програм-




                           - 283 -

                        00152-01 97 06


  му SYS$SETDIR, чтобы изменить свой собственный, принятый по

  умолчанию каталог;

       2) создающий процесс вызывает  программу  $CREPRC  для

  создания нового процесса;

       3) создающий процесс  вызывает  программу  SYS$SETDIR,

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

  то, которое было до первого вызова SYS$SETDIR.

       Теперь создающий процесс  имеет  свой  первоначальный,

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

  тый по умолчанию каталог отличный  от  того,  который  имел

  создающий процесс при создании нового процесса.



       8.3.4. Управление    ресурсами     создаваемых

              процессов


       Обычно при создании подпроцесса требуется только  наз-

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

  нию, устройства SYS$INPUT, SYS$OUTPUT и  SYS$ERROR.  Опера-

  ционная система МОС ВП обеспечивает принимаемые по  умолча-

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

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

  можно конкретно определить эти значения. Аргументы програм-

  мы системного обслуживания $CREPRC, которые управляют таки-

  ми характеристиками следующие:

  PRVADR - адрес списка привилегий. Данный аргумент определя-

       ет список привилегий для создаваемого  процесса.  Если

       этот аргумент не  задан,  то  используются  привилегии

       вызывающего процесса. Если аргумент PRVADR  задан,  то



                           - 284 -

                        00152-01 97 06


       используются только привилегии,  указанные  в  битовой

       маске, привилегии вызывающего процесса не  используют-

       ся. Например, создающий процесс имеет пользовательские

       привилегии GROUP и TMPMBX. Он создает процесс,  указы-

       вая пользовательскую привилегию TMPMBX. Созданный про-

       цесс  получит   только   пользовательскую   привилегию

       TMPMBX; он не будет иметь пользовательской  привилегии

       GROUP.

       Если требуется создать  процесс,  имеющий  привилегию,

  которой нет  у  создающего  процесса,  пользователь  должен

  иметь привилегию SETPRV.

       Символические  имена,   соответствующие   привилегиям,

  определяются макрокомандой  $PRVDEF.  Каждое  символическое

  имя начинается с PRV$V_ и определяет  номер  бита,  который

  для задания данной привилегии должен устанавливаться  в  1.

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

  привилегии GRPNAM и GROUP.

       Пример.

  PRVMSK: .LONG   <1@PRV$V_GRPNAM>!<1@PRV$V_GROUP> ; имя

                                          ; группы и группа

          .LONG   0               ; требуется маска длиной в

                                  ; квадрослово. Для данных

                                  ; привилегий никакие биты

                                  ; в старшем длинном слове

                                  ; не устанавливаются

  QUOTA (квота) - определяет список квот для подпроцесса. По-

       скольку подпроцесс получает часть квот своего создате-




                           - 285 -

                        00152-01 97 06


       ля для элементов очереди таймера, буферов ввода-вывода

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

       начаемой подпроцессу. Если данный аргумент  не  задан,

       то операционная система МОС ВП определяет для  подпро-

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

       создающий процесс  сам  имеет  только  принимаемые  по

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

       чтобы предотвратить захват подпроцессом всех  отбирае-

       мых у процесса квот;

  STSFLG (флаг состояния) - определяет флаг  состояния,  т.е.

       набор битов, которые управляют некоторыми  характерис-

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

       ожидания ресурса и режим обмена процесса;

  BASPRI (базовый приоритет) - устанавливает базовый  приори-

       тет выполнения для созданного  процесса.  Если  он  не

       задан, то по умолчанию устанавливается приоритет 2 для

       языков макроассемблер и блисс и 0 для  других  языков.

       Если желательно, чтобы у подпроцесса был более высокий

       приоритет, чем у его  создателя,  пользователь  должен

       иметь привилегию ALTPRI, позволяющую повысить  уровень

       приоритета.



       8.3.5. Отсоединенные процессы


       Создание отсоединенного процесса - это, в первую  оче-

  редь, функция, выполняемая операционной системой МОС ВП  во

  время подключения пользователя. Привилегия DETACH управляет

  возможностью создавать отсоединенный процесс с UIC,  отлич-



                           - 286 -

                        00152-01 97 06


  ным от UIC создающего процесса.  Единственной  возможностью

  для определения, будет ли процесс подпроцессом или отсоеди-

  ненным процессом, является аргумент UIC программы системно-

  го обслуживания $CREPRC; он обеспечивает код  идентификации

  пользователя (UIC) для созданного процесса.  Если  аргумент

  UIC пропущен, то программа системного обслуживания  $CREPRC

  создает подпроцесс, который работает под кодом  идентифика-

  ции пользователя создающего процесса.

       Можно также создать отсоединенный  процесс  с  тем  же

  UIC, который имеет создающий процесс, задавая флаг в  аргу-

  менте STSFLG. Для того, чтобы создать отсоединенный процесс

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

  дающего процесса, привилегии DETACH не требуется.



       8.4. Межпроцессорные связи и управление


       Процессы могут быть либо полностью независимыми,  либо

  взаимосвязанными. Вопросы, обсуждаемые в пп. 8.4.1 и 8.4.2.

  касаются областей применения, которые требуют  единовремен-

  ного выполнения многих программ.



       8.4.1. Ограничения на  создание  и  управление

              процессом


       Существует три уровня привилегий управления процессом:

       1) процессы с одинаковым кодом идентификации пользова-

  теля  (UIC)  всегда  могут  выполнять  служебные  программы

  управления процессом друг для друга;




                           - 287 -

                        00152-01 97 06


       2) для того, чтобы процессы могли выполнять  служебные

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

  тающих в этой же группе, требуется привилегия GROUP;

       3) для того, чтобы  процесс  мог  выполнять  служебные

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

  ме, он должен иметь привилегию WORLD.

       Для выполнения некоторых специальных  функций,  напри-

  мер, для установления процессу  базового  приоритета  более

  высокого уровня, чем тот, который имеет запрашивающий  про-

  цесс, требуются дополнительные привилегии.



       8.4.2. Идентификация процесса


       Существует два типа идентификации процесса:

       1) номер идентификации процесса (PID). Когда создается

  процесс, операционная система МОС ВП присваивает  ему  уни-

  кальный 32-битовый номер. Если пользователь  обеспечил  для

  программы системного обслуживания $CREPRC аргумент  PIDADR,

  то операционная система МОС ВП возвращает номер идентифика-

  ции процесса в указанное место.  Потом  пользователь  может

  использовать этот номер идентификации процесса в  последую-

  щих служебных программах управления процессом;

       2) имя процесса. Именем процесса  является  символьная

  строка длиной от 1 до  15  символов.  Каждое  имя  процесса

  должно быть уникальным в пределах одной  и  той  же  группы

  (процессы, принадлежащие разным группам, могут иметь одина-

  ковые имена). Имя процессу можно присвоить при  его  созда-

  нии, указывая аргумент PRCNAM. Это имя затем можно  исполь-



                           - 288 -

                        00152-01 97 06


  зовать для ссылок на данный процесс в вызовах других  прог-

  рамм системного обслуживания. Нельзя использовать имя  про-

  цесса для идентификации процесса, не принадлежащего  к  той

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

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

       Если  требуется  управлять  выполнением   подпроцесса,

  необходимо дать ему имя. Кроме того, следует  давать  имена

  отсоединенным процессам, работающим в одной и той же  груп-

  пе, если они связаны друг с другом или выполняют  управляю-

  щие функции, оказывающие влияние друг на друга.

       Пример 1.

  ORION:  .ASCID  /ORION/         ; дескриптор для

                                  ; имени процесса

  ORIONID:

          .LONG   0               ; возвращаемый номер

            .                     ; идентификации процесса

            .

            .

          $CREPRC_S -

                  PRCNAM=ORION,-

                  PIDADR=ORIONID,...

       Служебная программа возвращает номер  идентификации  в

  длинное слово ORIONID. Для ссылок на данный процесс в  дру-

  гих вызовах программ системного обслуживания можно  исполь-

  зовать либо имя процесса (ORION), либо номер  идентификации

  процесса (ORIONID).

       Процесс может сам установить собственное имя или изме-




                           - 289 -

                        00152-01 97 06


  нить  его  при  помощи  программы  системного  обслуживания

  $SETPRN.

       Пример 2.

  CYGNUS: .ASCID  /CYGNUS/     ; дескриптор для имени

            .                  ; процесса

            .

            .

          $SETPRN_S -

                  PRCNAM=CYGNUS

       Большинство служебных  программ  управления  процессом

  допускает либо аргумент PRCNAM, либо PIDADR,  или  оба  эти

  аргумента. Однако, лучше идентифицировать  процесс  номером

  идентификации процесса по следующим причинам:

       1) служебная программа выполняется быстрее, потому что

  не требуется искать имена процессов в таблице;

       2) номер идентификации процесса необходим для  процес-

  сов, выполняющихся в другой группе (см. подпункт 8.4.2.1.).

       Если  не  указаны  ни  аргумент  PRCNAM,  ни  аргумент

  PIDADR, то служебная программа выполняется для  вызывающего

  процесса. Возможные комбинации этих аргументов и пояснения,

  как служебные  программы  интерпретируют  их,  приведены  в

  табл. 34.














                           - 290 -

                        00152-01 97 06


                                                   Таблица 34

                    Идентификация процесса

  -----------------------------------------------------------

  Имя     ! Адрес номера ! Номер иден-! Действия служебных

  процесса! идентификации! тификации  !   программ

  задано? ! процесса за- ! процесса   !

          ! дан?         ! содержит:  !

  -----------------------------------------------------------

  Нет     !  Нет         !     -      ! Используется иденти-

          !              !            ! фикация вызывающего

          !              !            ! процесса. Номер иден-

          !              !            ! тификации процесса

          !              !            ! не возвращается

  Нет     !  Да          !     0      ! Используется и возв-

          !              !            ! ращается номер иден-

          !              !            ! тификации вызывающе-

          !              !            ! го процесса

  Да      !  Нет         !     -      ! Используется имя

          !              !            ! процесса. Номер иден-

          !              !            ! тификации процесса не

          !              !            ! возвращается

  Да      !  Да          !     0      ! Используется имя про-

          !              !            ! цесса и возвращается

          !              !            ! номер идентификации

          !              !            ! процесса

  Да      !  Да          ! Номер иден-! Используется и возв-

          !              ! тификации  ! ращается номер иден-




                           - 291 -

                        00152-01 97 06


                                         Продолжение табл. 34

  -----------------------------------------------------------

  Имя     ! Адрес номера ! Номер иден-! Действия служебных

  процесса! идентификации! тификации  !   программ

  задано? ! процесса за- ! процесса   !

          ! дан?         ! содержит:  !

  -----------------------------------------------------------

          !              ! процесса   ! тификации процесса;

          !              !            ! имя процесса игнори-

          !              !            ! руется



       8.4.2.1. Присвоение имен процессам внутри групп


       В квалификационные имена процессов всегда  добавляется

  номер их группы. Операционная система МОС ВП строит таблицу

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

  (UIC), связанных с каждым именем процесса. Если в служебной

  программе  управления   процессом   используется   аргумент

  PRCNAM, то  в  таблице  ищется  элемент,  который  содержит

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

       Вызывающий процесс должен иметь привилегию  GROUP  для

  того, чтобы  использовать  служебные  программы  управления

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

  не требуется, если указан процесс с тем же кодом  идентифи-

  кации пользователя (UIC), который имеет вызывающий процесс.

       Если заданное имя процесса не имеет тот же номер груп-

  пы, что и  вызывающий  процесс,  то  поиск  имени  процесса

  заканчивается по ошибке. Поиск заканчивается по ошибке даже



                           - 292 -

                        00152-01 97 06


  в том случае, если вызывающий процесс имеет  пользовательс-

  кую привилегию WORLD. Для того, чтобы  выполнить  служебную

  программу управления процессом для процесса из другой груп-

  пы, запрашивающий процесс должен использовать номер иденти-

  фикации процесса и иметь пользовательскую привилегию WORLD.



       8.4.2.2. Получение информации о процессах


       Программа системного  обслуживания  $GETJPI  позволяет

  процессу получить информацию о нем самом или о другом  про-

  цессе.



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


       Для связи процессов существуют следующие средства:

       1) кластер общих флагов событий;

       2) логические имена;

       3) почтовые ящики;

       4) глобальные секции;

       5) программы системного обслуживания управления захва-

  том;

       6) файлы.

       Каждое средство связи предоставляет различные  возмож-

  ности в смысле скорости передачи  информации  и  количества

  передаваемой информации. Например, файлы  дают  возможность

  разделять практически неограниченное количество информации;

  в то же время использование файлов -  это  самое  медленное

  средство, потому что для получения информации  должен  быть




                           - 293 -

                        00152-01 97 06


  осуществлен доступ к диску.

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

  лять большие об'емы информации. Так как разделение информа-

  ции через глобальные секции требует только доступа к  памя-

  ти, оно является самым быстрым средством связи.

       Логические имена и почтовые ящики позволяют передавать

  средние об'емы информации. Поскольку оба эти средства рабо-

  тают через относительно сложные программы системного обслу-

  живания, они осуществляют передачу быстрее, чем  файлы,  но

  медленнее, чем остальные средства связи.

       Служебные  программы  управления  захватом  и  кластер

  общих флагов событий позволяют передавать небольшие  об'емы

  информации. Это самые быстрые,  за  исключением  глобальных

  секций, средства межпроцессной связи.

       Кластеры общих флагов событий
       -----------------------------


       Процессы, работающие в пределах одной и той же группы,

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

  чтобы  сигнализировать  о  возникновении   или   завершении

  отдельных действий (см. раздел 4).

       Таблицы логических имен
       -----------------------


       Процессы, работающие в одном и том же  задании,  могут

  получать эквивалентные имена для  логических  имен  таблицы

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

  же группе, могут использовать групповую таблицу  логических

  имен. Для того, чтобы процесс мог помещать имена в  группо-




                           - 294 -

                        00152-01 97 06


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

  кую привилегию GRPNAM. Системную  таблицу  логических  имен

  могут использовать все процессы в системе. Кроме того, про-

  цессы могут создавать и использовать определяемые пользова-

  телем таблицы логических имен (см. раздел 6).

       Почтовые ящики
       --------------


       Почтовые ящики можно использовать как виртуальные уст-

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

  ции, сообщений и данных (см. раздел 7). Кроме того,  почто-

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

  ность создающему процессу определить,  когда  и  при  каких

  условиях был удален созданный им подпроцесс.

       Глобальные секции
       -----------------


       Глобальными секциями могут быть либо файлы на  дисках,

  либо секции страничного файла, содержащие разделяемые  коды

  или  данные.  При  помощи  служебных  программ   управления

  памятью эти файлы  могут  быть  отображены  на  виртуальное

  адресное пространство нескольких процессов. В  том  случае,

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

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

  ние и запись данных в физической памяти; как только  данные

  обновляются, системное средство обмена страниц  перезаписы-

  вает обновленные данные непосредственно в  файл  на  диске.

  Глобальные секции страничного файла целесообразно использо-

  вать для временного хранения общих данных; они  не  отобра-




                           - 295 -

                        00152-01 97 06


  жаются в файл на диске, это просто страницы из принятого по

  умолчанию  системного  страничного  файла  (см.   Подраздел

  11.6).

       Программы системного обслуживания управления захватом
       -----------------------------------------------------


       Процессы могут использовать программы системного  обс-

  луживания управления захватом  для  того,  чтобы  управлять

  доступом к ресурсам (т.е. к любому об'екту  в  операционной

  системе МОС ВП, который данный процесс может выполнить, или

  читать с него, или записывать на него).

       Помимо управления доступом, программы системного  обс-

  луживания управления  захватом  обеспечивают  механизм  для

  передачи информации между  процессами,  имеющими  доступ  к

  ресурсу (блоки занчений захвата). Для того, чтобы  сообщить

  процессу, что другие процессы ждут ресурс, можно  использо-

  вать асинхронные системные прерывания (AST) по захвату (см.

  разлел 12).



       8.5. Спячка и приостанов процесса


       Существуют два способа временно прекратить  выполнение

  процесса:

       1) спячка, осуществляемая программой системного обслу-

  живания $HIBER;

       2) приостановка, осуществляемая программой  системного

  обслуживания $SUSPND.

       Процесс может нормально продолжить  выполнение  только

  после вызова соответствующей программы системного  обслужи-



                           - 296 -

                        00152-01 97 06


  вания $WAKE, если он был в спячке, или после  вызова  прог-

  раммы системного обслуживания $RESUME, если он был приоста-

  новлен.

       Сравнение состояний  спячки  и  приостановки  процесса

  приведено в табл. 35.


                                                   Таблица 35

                Спячка и приостановка процесса

  -----------------------------------------------------------

           Спячка              !        Приостановка

  -----------------------------------------------------------

  Можно вызвать спячку только  ! Можно приостанавливать себя

  для самого себя              ! или другой процесс в зависи-

                               ! мости от привилегии

  Возвращается в исходное сос- ! Возвращается в исходное сос-

  тояние программой системного ! тояние программой системного

  обслуживания $WAKE           ! обслуживания $RESUME

  Прерываемое состояние; может ! Непрерываемое состояние; не

  получать асинхронные систем- ! может получать асинхронные

  ные прерывания AST           ! системные прерывания AST

  Может пробудить себя         ! Не может возобновить себя

  Возможно пробуждение в опре- ! Не может возобновиться по

  деленный момент времени или  ! времени

  через фиксированные интервалы!

  времени                      !

  Требует мало системных нак-  ! Требует системной динамичес-

  ладных расходов              ! кой памяти





                           - 297 -

                        00152-01 97 06


       8.5.1. Спячка процесса


       Механизм "спячка/пробуждение" обеспечивает эффективное

  средство, чтобы подготовить образ для  выполнения  и  затем

  перевести его в состояние ожидания, пока он не потребуется.

  Когда выдается запрос на пробуждение, образ снова активизи-

  руется с малой задержкой.

       Например, если  создается  подпроцесс,  который  будет

  выполнять повторно одну и ту же функцию и  должен  работать

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

  программы системного обслуживания $HIBER и $WAKE, как пока-

  зано в примере.

       Вариантом  программы  системного  обслуживания   $WAKE

  является пробуждение по  времени  -  пробуждение  процесса,

  находящегося в спячке, в фиксированный момент  времени  или

  по истечении интервала времени.  Эту  функцию  осуществляет

  программа системного обслуживания $SCHDWK. При помощи прог-

  раммы системного обслуживания $SCHDWK процесс  может  зада-

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

  вызвать программу $HIBER.

       Процессы, находящиеся в спячке,  могут  быть  прерваны

  асинхронными системными прерываниями (AST) при условии если

  разрешена доставка AST.  Процесс  может  сделать  для  себя

  вызов программы $WAKE в процедуре обслуживания AST  и  про-

  должить работу после выполнения процедуры обслуживания  AST

  (см. раздел 5).







                           - 298 -

                        00152-01 97 06


       Пример.

  PROCESS TAURUS                  ; процесс TAURUS

  ORION:  .ASCID  /ORION/         ; дескриптор для имени

                                  ; подпроцесса

  FASTCOMP:

          .ASCID  /COMPUTE.EXE/   ; дескриптор для имени

                                  ; образа

            .

            .

  $CREPRC_S -                     ; создать процесс ORION

                  PRCNAM=ORION,-

                  IMAGE=FASTCOMP,...

          BSBW    ERROR           ; продолжить

           .

           .

  $WAKE_S PRCNAM=ORION           ; пробудить от спячки ORION

          BSBW    ERROR

           .

           .

          $WAKE_S PRCNAM=ORION   ; снова пробудить от спячки

                                 ; ORION

          BSBW    ERROR

           .

           .

  PROCESS ORION                   ; процесс ORION

          .ENTRY  COMPUTE,^M<>    ; входная маска

  10$:    $HIBER_S                ; спячка




                           - 299 -

                        00152-01 97 06


          BSBW    ERROR

           .                      ; выполнение

           .

          BRW     10$             ; возврат к спячке

       Примечания:

       1. Процесс TAURUS создает процесс ORION, задавая деск-

  риптор для образа с именем COMPUTE.

       2. Инициируется образ COMPUTE, и процесс  ORION  вызы-

  вает программу системного обслуживания $HIBER.

       3. В соответствующий  момент  времени  процесс  TAURUS

  вызывает программу $WAKE для процесса ORION. ORION  продол-

  жает выполнение действий, следующих после вызова  служебной

  программы $HIBER. По завершении своей работы ORION  возвра-

  щается в начало цикла, повторяет вызов $HIBER и  ждет  сле-

  дующего пробуждения от спячки.



       8.5.2. Альтернативные средства спячки


       Можно использовать два дополнительных способа перевода

  процесса в состояние спячки:

       1) задать аргумент  STSFLG  для  программы  системного

  обслуживания $CREPRC, установив тот бит, который заставляет

  программу $CREPRC перевести создаваемый процесс в состояние

  спячки сразу после инициализации процесса;

       2)  задать   квалификаторы   /DELAY,   /SCHEDULE   или

  /INтERVAL в команде RUN.

       Если используется первый способ, то создающий  процесс

  может управлять моментом пробуждения  созданного  процесса.



                           - 300 -

                        00152-01 97 06


  если используется команда RUN, то моментом пробуждения про-

  цесса управляют квалификаторы.

       Если задан квалификатор  /INTERVAL  и  образ,  который

  должен выполняться, не содержит вызова программы системного

  обслуживания $HIBER, то этот образ переводится в  состояние

  спячки всякий раз, когда будет выдана инструкция RET.  Каж-

  дый раз, когда образ пробуждается от  спячки,  он  начинает

  выполнение с его точки входа.  Если  образ  содержит  вызов

  программы $HIBER, то при каждом пробуждении  от  спячки  он

  начинает выполнение либо  с  точки,  следующей  за  вызовом

  программы $HIBER, либо с точки входа (если  последней  была

  выдана инструкция RET).

       Если запросы на пробуждение выполняются  по  истечении

  интервалов времени, то образ может заканчиваться программа-

  ми системного обслуживания  $DELPRC  или  $FORCEX,  или  на

  уровне команд языка DCL - командой STOP.

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

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

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

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

  но и состояния открытых файлов.



       8.5.3. Приостановка


       При помощи программы системного  обслуживания  $SUSPND

  процесс может перевести себя или другой процесс в состояние

  ожидания, подобного спячке. Операционная система МОС ВП  не

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


                           - 301 -

                        00152-01 97 06


  процесса, но программа системного обслуживания $SUSPND поз-

  воляет решить эту задачу. Приостановленные  процессы  выби-

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

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

  AST, и он может возобновить выполнение только  после  того,

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

  темного обслуживания $RESUME.  Если  асинхронные  системные

  прерывания AST были поставлены в очередь к приостановленно-

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

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

  блокирования доставки всех AST.



       8.6. Завершение выполнения образа


       Если выполнение образа завершается нормально, то  опе-

  рационная система МОС ВП выполняет ряд функций по свертыва-

  нию образа. Если образ выполняется командным  интерпретато-

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

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

  ным интерпретатором, а,  например,  подпроцессом,  то  этот

  подпроцесс удаляется.

       Такие завершающие действия инициируются  также  в  том

  случае, если образ завершился аварийно в результате  одного

  из следующих условий:

       1) условия ошибки спецификаций,  вызванные  ошибочными

  спецификациями при создании процесса. Например, если задано

  неверное имя для логического имени  SYS$INPUT,  SYS$OUTPUT,

  SYS$ERROR или указано неверное или несуществующее имя обра-



                           - 302 -

                        00152-01 97 06


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

  ошибки;

       2) при возникновении исключительной ситуации  управле-

  ние передается  какому-нибудь  определенному  пользователем

  обработчику кодов состояния для обработки  данной  исключи-

  тельной ситуации. Если определенных пользователем  обработ-

  чиков кодов состояния нет, то управление получает об'явлен-

  ный операционной системой МОС ВП обработчик  кодов  состоя-

  ния, который инициирует действия, завершающие  образ.  (см.

  раздел 10).

       3) программа системного обслуживания  $FORCEX  вызвана

  для данного процесса другим процессом.



       8.6.1. Действия по свертыванию образа


       Операционная система МОС ВП выполняет функции  сверты-

  вания образа, которые освобождают системные ресурсы,  полу-

  ченные процессом во время его выполнения в пользовательском

  режиме. Эти действия и порядок, в котором они  выполняются,

  следующие:

       1) отменяются все выставленные запросы ввода-вывода на

  каналы ввода-вывода и каналы ввода-вывода освобождаются;

       2) удаляются страницы памяти, занятые образом или наз-

  наченные ему, и размер рабочего набора процесса снова  при-

  нимает значение, принятое по умолчанию;

       3) освобождаются все устройства,  назначенные  данному

  процессу в пользовательском режиме (устройства, назначенные

  из потока команд языка DCL в режиме супервизора,  не  осво-



                           - 303 -

                        00152-01 97 06


  бождаются);

       4) отменяются все  запросы,  планируемые  по  таймеру,

  включая запросы на пробуждение;

       5) отсоединяются кластеры общих флагов событий;

       6) асинхронные системные прерывания  пользовательского

  режима, которые поставлены в очередь, но не были  доставле-

  ны, отменяются;

       7) отменяются векторы исключительных ситуаций,  об'яв-

  ленные в пользовательском режиме, обработчики  режима  сов-

  местимости и обработчики изменения режима в  пользовательс-

  кий режим;

       8) запрещается режим исключительной ситуации по ошибке

  программ системного обслуживания;

       9) удаляются все личные логические  имена  процесса  и

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

  режима. Удаление таблицы логических имен приводит к  удале-

  нию всех имен в этой таблице. Имена, входящие в разделяемые

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

  таблица задания, не удаляются при свертывании образа  неза-

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



       8.6.2. Программа системного обслуживания $EXIT


       Для того, что  инициировать  действия  по  свертыванию

  образа, операционная система МОС ВП от имени  данного  про-

  цесса вызывает программу системного обслуживания  $EXIT.  В

  некоторых случаях процесс может сам вызвать программу $EXIT

  для завершения образа, например, если возникла неопознавае-



                           - 304 -

                        00152-01 97 06


  мая ошибка. Программа системного обслуживания $EXIT  прини-

  мает в качестве аргумента  код  состояния.  Если  программа

  $EXIT применяется для  прекращения  выполнения  образа,  то

  можно использовать этот аргумент кода состояния  для  того,

  чтобы передать информацию о завершении образа. Если возврат

  из образа происходит без вызова программы $EXIT, то текущее

  значение в регистре R0 передается  как  код  состояния  при

  вызове системной программы $EXIT.

       Код состояния используется следующим образом:

       1) командный интерпретатор, если он получает  управле-

  ние после свертывания образа, использует код состояния  для

  выдачи на экран возможного сообщения об ошибке;

       2) если образ об'явил обработчик выхода, то  код  сос-

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

  ния выходом;

       3) если процесс был создан другим процессом, и создав-

  ший процесс указал почтовый ящик для  получения  информации

  об окончании, то код состояния, когда данный  процесс  уда-

  ляется, записывается в указанный почтовый ящик окончания.



       8.6.3. Обработчики выхода


       Обработчики выхода  -  это  программы,  которые  могут

  выполнять специальную очистку образа или операции по  свер-

  тыванию. Например, если образ использует память для буфери-

  зованных данных, то  обработчик  выхода  может  обеспечить,

  чтобы эти данные  не  потерялись,  если  завершение  работы

  образа происходит в результате возникновения ситуации ошиб-



                           - 305 -

                        00152-01 97 06


  ки.

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

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

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

  $DCLEXH. Обработчики выхода вызываются при помощи стандарт-

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

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

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

  должен задавать адрес длинного слова, в которое  операцион-

  ная система МОС ВП записывает код  состояния  из  программы

  $EXIT.

       Если образ об'являет несколько обработчиков выхода, то

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

  "последним пришел - первым ушел". После того, как  обработ-

  чик был вызван и вернул управление, данный блок  управления

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

  можно удалять перед выходом  образа  при  помощи  программы

  системного обслуживания $CANEXH.

       Обработчики выхода могут быть об'явлены  из  системных

  программ, работающих в  режиме  супервизора  или  в  режиме

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

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

  управление после  того,  как  будут  выполнены  обработчики

  выхода, об'явленные из пользовательского режима.

       Обработчики выхода вызываются как часть программы сис-

  темного обслуживания $EXIT. Не  существует  гарантии  того,

  что обработчики выхода будут вызваны  в  том  случае,  если




                           - 306 -

                        00152-01 97 06


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

  раммы $DELPRC из другого процесса.



       8.6.4. Принудительный выход


       Программа системного  обслуживания  $FORCEX  позволяет

  процессу инициировать свертывание образа для  другого  про-

  цесса.

       Пример 1.

  CYGNUS: .ASCID  /CYGNUS/     ; дескриптор имени

                               ; процесса

            .

            .

            .

          $FORCEX_S -

                  PRCNAM=CYGNUS

       Поскольку программа  системного  обслуживания  $FORCEX

  вызывает программу системного обслуживания $EXIT, то  перед

  свертыванием образа  выполняются  все  обработчики  выхода,

  об'явленные для данного  образа.  Если  процесс  использует

  командный интерпретатор, то этот процесс  не  отменяется  и

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

  обслуживания $FORCEX использует механизм  асинхронных  сис-

  темных прерываний AST, то выход нельзя выполнить в том слу-

  чае, если процесс, для которого осуществляется принудитель-

  ный выход, запретил доставку асинхронных системных прерыва-

  ний. (см. раздел 5).





                           - 307 -

                        00152-01 97 06


       Пример 2 иллюстрирует фрагмент программы, показывающий

  пример процедуры обработки выхода.

       Пример 2.

  EXITBLOCK:              ; блок управления выходом

          .LONG   0       ; система использует это как

                          ; указатель

          .ADDRESS -      ; адрес обработчика выхода

                  EXITRTN

          .LONG   1       ; количество аргументов

          .ADDRESS -      ; адрес длинного слова, при-

                  STATUS  ; нимающего код состояния

  STATUS: .BLKL   1       ; код состояния из программы

                          ; $EXIT

            .

            .

          .ENTRY  PEGASUS,^M<R2,R3>  ; маска входа для

                                     ; PEGASUS

          $DCLEXH_S -

                          DESBLK=EXITBLOCK   ; об'явить

                                  ; обработчик выхода

          BSBW    ERROR

           .

           .

          RET             ; конец основной программы

  ;

          .ENTRY  EXITRTN,^M<R2>  ; маска входа

          BLBS    STATUS,10$      ; нормальный выход?




                           - 308 -

                        00152-01 97 06


                                  ; да, закончить

                                  ; нет, очистка

           .

           .

  10$:    RET                     ; закончить

       Примечания:

       1. EXITBLOCK - это блок управления выходом  для  обра-

  ботчика выхода EXITRTN.  Третье  длинное  слово  определяет

  количество передаваемых аргументов. В данном примере  пере-

  дается толькр один аргумент - адрес длинного слова, в кото-

  рое операционная система МОС ВП  запишет  возвращаемый  код

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

  управления выходом.

       2. Вызов  программы  системного  обслуживания  $DCLEXH

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

  ляя EXITRTN как обработчик выхода.

       3. EXITRTN проверяет код состояния. В случае  нормаль-

  ного выхода EXITRTN возвращает управление. В противном слу-

  чае обрабатывает условие ошибки.



       8.7. Удаление процесса


       Удаление процесса приводит к полному уничтожению  про-

  цесса в операционной системе МОС ВП. Процесс может удалять-

  ся при одном из следующих событий:

       1) вызвана программа системного обслуживания $DELPRC;

       2) удален процесс, который создал данный подпроцесс;





                           - 309 -

                        00152-01 97 06


       3) интерактивный  процесс  использует  команду  LOGOUT

  диалогового командного языка DCL;

       4) пакетное задание достигает конца своего  командного

  файла;

       5) интерактивный процесс использует команду диалогово-

  го командного языка "STOP/ID = номер идентификации  процес-

  са" или "STOP имя пользователя";

       6) процесс, который содержит единственный образ, вызы-

  вает программу системного обслуживания $EXIT.

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

  подпроцессы, которые он создал. Когда операционная  система

  МОС ВП получает указание для удаления процесса в результате

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

  все подпроцессы, ведя поиск по иерархии. Низший по иерархии

  подпроцесс  -  это  тот,  который  не   имеет   собственных

  подпроцессов-потомков. Когда такой подпроцесс удален, поро-

  дивший его подпроцесс становится подпроцессом,  который  не

  имеет подпроцессов-потомков, и его можно удалить. Верхний в

  иерархии процесс - это процесс, который  в  конечном  счете

  вяляется порождающим процессом для всех  других  подпроцес-

  сов.

       Для всех процессов, начиная с  низшего  в  иерархии  и

  заканчивая высшим, выполняются следующие действия:

       ) свертывается образ, работающий  в  данном  процессе.

  (см. п. 8.6.1). При удалении процесса программа свертывания

  образа освобождает все системные ресурсы, включая те, кото-

  рые были получены из режимов доступа, отличных от пользова-




                           - 310 -

                        00152-01 97 06


  тельского режима;

       ) если удаляемый  процесс  является  подпроцессом,  то

  квоты ресурсов отдаются создавшему процессу;

       ) если создающий процесс задал почтовый ящик  заверше-

  ния, то в этот почтовый ящик посылается  сообщение  о  том,

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

  созданных операционной системой МОС ВП, сообщение об  окон-

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

       ) удаляется область  управления  виртуальным  адресным

  пространством  процесса.   (область   управления   содержит

  память, которую операционная система МОС ВП распределяет  и

  использует для нужд данного процесса);

       ) удаляется вся построенная операционной системой  мос

  вп информация о данном процессе.



       8.7.1. Программа    системного    обслуживания

              $DELPRC


       Процесс  может  удалить  себя  или  другой  процесс  в

  какой-либо момент времени  в  зависимости  от  ограничений,

  которые изложены в п. 8.4.1. Удаляет процесс программа сис-

  темного обслуживания $DELPRC.

       Пример.

  CYGNUS: .ASCID  /CYGNUS/     ; дескриптор для

                               ; имени процесса

            .

            .

            .



                           - 311 -

                        00152-01 97 06


          $DELPRC_S -

                  PRCNAM=CYGNUS

       Обычно нет необходимости явно вызывать программу  сис-

  темного обслуживания $DELPRC, так как подпроцесс  автомати-

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

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

  конца файла).

       В качестве альтернативы удалению процесса как средству

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

  обслуживания $FORCEX, чтобы создать принудительное заверше-

  ние работы образа, работающего в процессе (п. 8.6.4.).



       8.7.2. Почтовые ящики завершения


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

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

  процесс. Программа системного обслуживания  $CREPRC  допус-

  кает в качестве аргумента номер устройства почтового ящика.

  Когда созданный процесс удаляется, этот почтовый ящик полу-

  чает сообщение о его завершении.

       Первое слово сообщения о завершении содержит  символь-

  ную константу MSG$_DELPROC, которая указывает,  что  данное

  сообщение является сообщением о завершении. Второе  длинное

  слово сообщения о завершении  содержит  значение  конечного

  состояния  образа.  Остаток  сообщения  содержит  системную

  учетную информацию, используемую диспетчером заданий, посы-

  лаемую в системный учетный файл регистрации. Ч.LIN  0  если

  требуется, создающий процесс может определить номер иденти-



                           - 312 -

                        00152-01 97 06


  фикации   удаляемого   процесса    из    блока    состояния

  ввода-вывода. Второе  длинное  слово  IOSB  содержит  номер

  идентификации удаляемого процесса.

       Почтовый ящик завершения нельзя  размещать  в  памяти,

  разделяемой многими процессорами.




   9. Служебные программы таймера и преобразования времени



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

  по времени. В операционной системе МОС ВП образ может  пла-

  нировать некоторые события  на  заданное  время  или  через

  заданный интервал времени. Существуют  следующие  служебные

  программы таймера и преобразования времени:

       1) получить время ($GETTIM);

       2) преобразовать время из системного формата в  число-

  вой ($NUMTIM);

       3) преобразовать время из системного формата в  строку

  символов в коде КОИ-8 ($ASCTIM);

       4) преобразовать строку символов в коде КОИ-8 во время

  в системном формате ($BINTIM);

       5) установить таймер ($SETIMR);

       6) отменить запрос к таймеру ($CANTIM);

       7) запланировать пробуждение ($SCHDWK);

       8) отменить пробуждение ($CANWAK);

       9) установить системное время ($SETIME).

       Служебные программы  таймера  можно  использовать  для

  того, чтобы планировать, преобразовывать или отменять собы-



                           - 313 -

                        00152-01 97 06


  тия. Например, их можно использовать для следующих целей:

       1) запланировать установку флага события,  или  поста-

  новку в очередь асинхронного  системного  прерывания  (AST)

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

  если он еще не был удовлетворен;

       2) запланировать запрос на пробуждение процесса, нахо-

  дящегося в состоянии спячки, или отменить выставленный зап-

  рос на пробуждение, если он еще не был удовлетворен;

       3) установить или изменить  текущее  системное  время,

  если вызывающий  процесс  имеет  соответствующие  пользова-

  тельские привилегии.

       Служебные программы таймера требуют задания времени  в

  64-битовом формате. Для работы с временами, представленными

  в других форматах, можно использовать  служебные  программы

  преобразования времени, которые позволяют:

       1) получить текущую дату и время в виде строки  симво-

  лов в коде КОИ-8 или в системном формате;

       2) преобразовывать строку символов в коде КОИ-8 в фор-

  мат системного времени;

       3) преобразовывать значение системного времени в стро-

  ку символов в коде КОИ-8;

       4) преобразовывать время из системного формата в  чис-

  ловые величины.

       В данном разделе описан формат  системного  времени  и

  служебные программы, которые используют его, а  также  даны

  примеры планирования программных действий при  помощи  слу-

  жебных программ таймера.




                           - 314 -

                        00152-01 97 06


       9.1. Формат системного времени


       Операционная система МОС ВП использует текущую дату  и

  время в 64-битовом формате. Значение времени - это двоичное

  число, измеряемое в единицах, равных 100 нс (наносекунд), и

  представляющее смещение от системной базовой даты и  време-

  ни, а именно 17 ноября 1858 г., 00 ч. 00 м. (смитсонианская

  базовая дата и время для астрономического календаря).  Зна-

  чения времени  должны  передаваться  программам  системного

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

  содержащего время в 64-битовом  формате.  Значение  времени

  может представлять собой одно из двух:

       1) абсолютное время, которое представляет определенную

  дату и время дня. Абсолютное время всегда имеет положитель-

  ное значение (или равно нулю);

       2) дельта-время, которое является смещением  некоторой

  будущей даты или времени относительно текущего момента вре-

  мени. Дельта-время всегда выражается отрицательной  величи-

  ной.

       Если в качестве адреса значения  времени  задан  нуль,

  операционная система МОС ВП будет обеспечивать текущую дату

  и время.



       9.2. Получение текущей даты и времени


       Текущее время в системном формате можно  получить  при

  помощи программы системного обслуживания  $GETTIM,  которая

  помещает время в буфер.




                           - 315 -

                        00152-01 97 06


       Пример 1.

  TIME:   .BLKQ   1               ; буфер для времени

          .

          .

          .

          $GETTIM_S -

                  TIMARD=TIME     ; получить время

       В примере 2 программа системного обслуживания  $ASCTIM

  преобразует время, заданное в системном формате,  в  строку

  символов в коде КОИ-8 и возвращает эту строку в 23-байтовый

  буфер.

       Пример 2.

  ATIMENOW:                       ; дескриптор для времени

                                  ; в коде кои-8

          .LONG   23              ; длина буфера

          .ADDRESS -              ; адрес буфера

                  TIMESTR

  TIME_VALUE:                     ; 64-битовое значение вре-

                                  ; мени, подлежащего преоб-

                                  ; разованию

          .BLKQ   1

  TIMESTR:

          .BLKB   23              ; возвращаемые 23 байта

            .

            .

            .

          $ASCTIM_S -




                           - 316 -

                        00152-01 97 06


                  TIMBUF=ATIMENOW,-

                  TIMADR=TIME_VALUE

       Поскольку адрес 64-битового значения  времени  не  был

  указан, то использовалось значение по умолчанию - нуль.

       Строка, возвращаемая служебной программой  имеет  сле-

  дующий формат:

          DD-MMM-YYYY     HH:MM:SS.CC



       Где DD - день месяца;



       MMM - месяц (трехсимвольная буквенная аббревиатура);



       YYYY - год;



       HH:MM:SS.CC - время в часах, минутах, секундах и сотых

                     секунды.



       9.3. Получение   абсолютного    времени    в

            системном формате


       Программа  системного  обслуживания  $BINTIM  является

  противоположной по назначению программе системного обслужи-

  вания $ASCTIM. Служебной программе передается время в  фор-

  мате строки в коде КОИ-8 и она  преобразует  эту  строку  в

  значение времени в 64-битовом формате. Данное  возвращаемое

  значение можно затем использовать как  вход  для  служебной

  программы планирования по таймеру.





                           - 317 -

                        00152-01 97 06


       При задании буфера строки символов в коде кои-8  можно

  опустить  некоторые  поля,  и  служебная  программа   будет

  использовать для этих полей текущую дату  или  время.  Так,

  если требуется сделать запрос  к  таймеру,  независящий  от

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

  $BINTIM так, как это показано в примере.  Необходимо  вклю-

  чить два дефиса, которые обычно входят в поле  даты,  и  по

  крайней мере один пробел перед полем времени.

       Пример.

  ASCII_NOON:

          .ASCID  /-- 12:00:00.00/    ; дескриптор для вре-

                                      ; мени 12 часов дня в

                                      ; коде КОИ-8

  BINARY_NOON:                        ; буфер для двоичного

                                      ; времени 12 часов дня

          .BLKQ   1

            .

            .

            .

          $BINTIM_S -                 ; преобразовать время

                  TIMBUF=ASCII_NOON

                  TIMADR=BINARY_NOON



       9.4. Получение  дельта-времени  в  системном

            формате


       Программа системного обслуживания $BINTIM  преобразует

  также   строки   символов   в   коде   КОИ-8   в   значения



                           - 318 -

                        00152-01 97 06


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

  жебных программ таймера. Буфер  для  строк  в  коде  КОИ-8,

  представляющих дельта-время, имеет вид:

          DDDD    HH:MM:SS.CC

       Если задается дельта-время для текущего дня, то первое

  поле, представляющее количество  дней,  должно  быть  равно

  нулю.

       Следующий пример показывает, как использовать  служеб-

  ную программу $BNITIM для получения дельта-времени  в  сис-

  темном формате:

       Пример.

  ATENMIN:

          .ASCID  /0 00:10:00.00/ ; дескриптор для времени

                                  ; "10 минут" в коде кои-8

  BTENMIN:

          .BLKQ   1               ; буфер для двоичного вре-

                                  ; мени "10 минут"

            .

            .

            .

          $BINTIM_S               ; преобразовать время

                  TIMBUF=ATENMIN,-

                  TIMADR=BTENMIN

       Пользователь языка макроассемблер может также задавать

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

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

  цах, равных 100 наносекундам. Эта  арифметика  основана  на




                           - 319 -

                        00152-01 97 06


  следующей формуле:

          1 секунда = 10 миллионов * 100 наносекунд   (1)

       Например,  следующая  директива  определяет   значение

  дельта-времени, равное 5 секундам.

       Пример.

  FIVESEC:        .LONG   -10*1000*1000*5, -1 ; 5 секунд

       Для наглядности значение  10  миллионов  записано  как

  10*1000*1000. Значение дельта-времени отрицательно.

       Однако, при использовании такой нотации значение  вре-

  мени ограничено максимальным числом в единицах, равных  100

  наносекундам, помещающимся в длинное слово. В единицах вре-

  мени это число немногим больше 7 минут.



       9.5. Запросы к таймеру


       Запросы к  таймеру,  сделанные  программой  системного

  обслуживания $SETIMR, ставятся в очередь, откуда они  выби-

  раются для обработки в том порядке, в каком истекают задан-

  ные в них времена. Количеством  запросов,  которые  процесс

  может поставить в очередь к таймеру, управляет квота TQELM.

       При вызове программы системного  обслуживания  $SETIMR

  можно  задавать  любое  абсолютное  время,  либо   значение

  дельта-времени. В зависимости от того, как требуется  обра-

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

  щих аргумента:

       1) номер флага события, который требуется  установить,

  когда истечет заданное время. (если флаг события не указан,

  операционная система МОС ВП устанавливает флаг события 0);



                           - 320 -

                        00152-01 97 06


       2) адрес подпрограммы обслуживания асинхронных систем-

  ных прерываний (AST),  которая  должна  быть  выполнена  по

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

       По желанию можно указать идентификатор для  запроса  к

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

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

  идентификатор запроса передается как AST-параметр  подпрог-

  рамме обслуживания асинхронных системных прерываний  (AST),

  если она задана,  так  что  подпрограмма  обслуживания  AST

  может распознать данный запрос к таймеру.

       В примерах 1 и 2 показаны запросы к  таймеру,  исполь-

  зующие флаги событий  и  асинхронные  системные  прерывания

  (разделы 4,5).

       Пример 1.

       Установка флага события.

  A30SEC: .ASCID  /0 00:00:30.00/ ; дескриптор для дельта-

                                  ; времени "30 секунд" в

                                  ; коде КОИ-8

  B30SEC: .BLKQ   1               ; квадрослово для хранения

                                  ; преобразованного (двоич-

                                  ; ного) дельта-времени

            .

            .

            .

          $BINTIM_S               ; преобразовать в двоичное

                  TIMBUF=A30SEC,-

                  TIMADR=B30SEC




                           - 321 -

                        00152-01 97 06


          BSBW    ERROR

          $SETIMR_S -             ; установить время ожидания

                  EFN=#4, -

                  DAYTIM=B30SEC

          BSBW    ERROR           ; вызвать подпрограмму об-

                                  ; работки ошибок

          $WAITFR_S -             ; ждать 30 секунд

          EFN=#4

          BSBW    ERROR

           .

           .

           .

       Примечания:

       1. Вызов программы $SETIMR требует, чтобы флаг события

  4 был установлен через 30  секунд  (выраженных  в  двоичном

  виде в квадрослове B3OSEC).

       2. Программа системного обслуживания $WAITFR переводит

  процесс в состояние ожидания до  тех  пор,  пока  не  будет

  установлен данный флаг события.

       Пример 2.

       Использование подпрограммы обслуживания AST.

  ANOON:  .ASCID  /-- 12:00:00.00/ ; дескриптор для времени

                                  ; "12 часов дня" в коде

                                  ; КОИ-8

  BNOON:  .BLKQ   1               ; содержит преобразован-

                                  ; ное (двоичное) время

                                  ; "полдень"




                           - 322 -

                        00152-01 97 06


            .

            .

            .

          $BINTIM_S -             ; преобразовать в двоичное

                  TIMBUF=ANOON, -

                  TIMADR=BNOON

          BSBW    ERROR

  $SETIMR_S -

                  DAYTIM=BNOON, - ; установить таймер на пол-

                                  ; день

                  ASTADR=ASTSERV,-; указать подпрограмму AST

                  REQIDT=#12      ; идентификатор запроса на

                                  ; полдень как AST-параметр

          BSBW    ERROR

           .

           .

           .

          RET

  $ENTRY  ASTSERV,^M<>            ; маска входа подпрограммы

                                  ; AST

   CMPL   #12,4(AP)               ; это запрос "полдень"?

   BNEQ   10$                     ; если нет, обработать дру-

                                  ; гой тип

    .

    .                             ; обработать запрос AST

    .                             ; "полдень"

   RET




                           - 323 -

                        00152-01 97 06


  10$:   .                        ; обработать другие типы

         .                        ; запросов

         .

       RET

       Примечания:

       1. Вызов программы $BINTIM преобразует строку  в  коде

  КОИ-8, представляющую 12.00 дня, в системный формат. Значе-

  ние, возвращаемое в BNOON, используется как  входной  пара-

  метр программы системного обслуживания $SETIMR.

       2. Подпрограмма  AST,  указанная  в  запросе  $SETIMR,

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

  12.00 дня. Аргумент REQIDT идентифицирует данный  запрос  к

  таймеру. (этот аргумент передается как аST-параметр и  хра-

  нится в списке аргументов со смещением 4. (см.  раздел  5).

  Процесс продолжает выполнение; когда заданное время  насту-

  пит, он прервется доставкой AST. Если текущее время больше,

  чем полдень, то таймер сработает сразу же.

       3. Данная  подпрограмма  обслуживания  AST   проверяет

  параметр, переданный аргументом  REQIDT,  чтобы  узнать  (в

  данном примере), будет ли она обслуживать запрос к  таймеру

  "12.00 дня" или другой  тип  запроса  (определяемый  другим

  значением идентификатора запроса). После  выполнения  подп-

  рограммы обслуживания AST процесс продолжает  выполнение  с

  той точки, в которой он был прерван.










                           - 324 -

                        00152-01 97 06


       9.5.1. Отмена запросов к таймеру


       Программа системного обслуживания $CANTIM отменяет  те

  запросы к таймеру, которые еще не обработаны. Данные запро-

  сы удаляются из очереди к  таймеру.  Отмена  базируется  на

  идентификации запроса, указанной в запросе к таймеру.  Нап-

  ример, чтобы отменить запрос, показанный в примере 2  (под-

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

  $CANTIM.

       Пример.

          $CANTIM_S       REQIDT=#12

       Если такой же идентификатор  был  присвоен  нескольким

  запросам к таймеру, то будут отменены все  запросы  с  этим

  идентификатором.  Если  пользователь  не  указал   аргумент

  REQIDT, то все запросы этого пользователя будут отменены.



       9.6. Запланированные пробуждения от спячки


       В примере 1 (см. подраздел  9.5)  показан  подпроцесс,

  который переводит себя в состояние ожидания при помощи слу-

  жебных программ $SETIMR и $WAITFR;  другой  способ  сделать

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

  спячки. Процесс переводит себя в состояние спячки при помо-

  щи программы системного обслуживания $HIBER; возвращение из

  спячки осуществляется при помощи  запроса  на  пробуждение,

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

  системного обслуживания $WAKE, или в зависимости от  време-

  ни, если  используется  программа  системного  обслуживания




                           - 325 -

                        00152-01 97 06


  $SCHDWK (подраздел 8.5).

       В примере 1 показан  процесс,  который  планирует  для

  себя пробуждение прежде, чем перейти в спячку.

       Пример 1.

  ATENSEC:                        ; дескриптор для времени

          .ASCID  /0 00:00:10.00/ ; ожидания 10 секунд

  BTENSEC:

          .BLKQ   1               ; сохранить двоичное значе-

            .                     ; ние десяти секунд

            .

          $BINTIM_S               ; преобразовать время

                  TIMBUF=ATENSEC, -

                  TIMADR=BTENSEC

          $SCHDWK_S -             ; запланировать пробуждение

                  DAYTIM=BTENSEC

          $HIBER_S                ; уснуть на 10 секунд

       Спячка и пробуждение подробно  описаны  в  разделе  8.

  Процесс, имеющий соответствующую привилегию, может запраши-

  вать пробуждение или планировать  пробуждение  для  другого

  процесса; таким  образом,  взаимосвязанные  процессы  могут

  синхронизировать свои действия, используя перевод в состоя-

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

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

  $SCHDWK можно указать, что  запрос  на  пробуждение  должен

  повторяться через фиксированные интервалы времени.








                           - 326 -

                        00152-01 97 06


       9.6.1. Отмена запланированных пробуждений


       Запросы на запланированное пробуждение, если они  выс-

  тавлены, но еще не обработаны, можно  отменить  при  помощи

  программы системного обслуживания $CANWAK.

       В примере 1 показано планирование запросов на  пробуж-

  дение процесса CYGNUS и последующая отмена  этих  пробужде-

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

  $SCHDWK задает дельта-время 1 минуту, и интервал времени  1

  минуту; пробуждение повторяется  каждую  минуту,  пока  эти

  запросы не будут отменены.

       Пример 1.

  CYGNUS: .ASCID  /CYGNUS/        ; дескриптор для имени

                                  ; процесса

  ONE_MIN:

          .ASCID  /0 00:01:00.00/ ; дескриптор для 1 минуты

                                  ; (дельты)

  INTERVAL:

          .BLKQ   1               ; 8 байтов для хранения

            .                     ; двоичной 1 минуты

            .

            .

          $BINTIM_S -             ; преобразовать в двоичное

                  TIMBUF=ONе_MIN, -

                  TIMADR=INтERVAL

             .

             .

          $SCHDWK_S -             ; пробуждать каждую минуту



                           - 327 -

                        00152-01 97 06


                  PRCNAM=CYGNUS, -

                  DAYTIM=INTERVAL, -

                  REPTIM=INTERVAL

              .

              .

          $CANWAK_S -             ; отменить пробуждение

                  PRCNAM=CYGNUS

              .

              .



       9.7. Числовое время и время в коде КОИ-8


       Программа системного обслуживания $NUMTIM  преобразует

  время, выраженное в системном  формате,  в  двоичные  целые

  значения. Эта программа возвращает каждую компоненту време-

  ни (год, месяц, день, час и т.д.) в отдельное слово  буфера

  длиной 7 слов.

       Чтобы отформатировать время в строку в коде КОИ-8  для

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

  му системного  обслуживания  $ASCTIM.  Служебная  программа

  $ASCTIM принимает в качестве аргумента  адрес  квадрослова,

  содержащего время в системном формате, и возвращает дату  и

  время в формате КОИ-8.

       Если желательно включить дату  и  время  в  символьные

  строки, которая содержит дополнительные данные, можно  фор-

  матировать выходную строку при помощи программы $FAO. Прог-

  рамма системного  обслуживания  $FAO  преобразует  двоичные

  величины в коды КОИ-8 и подставляет результаты в символьные



                           - 328 -

                        00152-01 97 06


  строки в соответствии с директивами, содержащимися во вход-

  ной управляющей строке. Среди них есть директивы !%T и !%D,

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

  рослове, в строку в коде КОИ-8 и  подставляет  результат  в

  выходную строку.



       9.8. Установка системного времени


       Программа системного обслуживания $SETIME дает возмож-

  ность пользователю,  имеющему  привилегии  OPER  и  LOG_IO,

  устанавливать текущее системное время. Можно задавать новое

  системное время (используя аргумент  TIMADR),  либо  заново

  разметить текущее системное  время  при  помощи  аппаратных

  процессорных часов (опуская аргумент TIMADR). Если задается

  время, то оно должно быть  значением  абсолютного  времени;

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

       Системное время устанавливается  при  каждой  первона-

  чальной загрузке операционной системы МОС  ВП.  Обычно  нет

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

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

  ваться изменить системное время без перезагрузки. Например,

  можно задавать новое системное время для того, чтобы  синх-

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

  хождение между стандартным и световым временами(при перехо-

  де на летнее время).

       Программа системного обслуживания  $SETIME  вызывается

  командой диалогового командного языка DCL SET TIME.





                           - 329 -

                        00152-01 97 06


       Если процесс выдал запрос на дельта-время, и системное

  время изменилось, то интервал, остающийся до удовлетворения

  запроса, не изменяется; то есть, запрос  выполняется  после

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

  на абсолютное время, и системное время изменилось, то  зап-

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

  темного времени.












































                           - 330 -

                        00152-01 97 06


       10. Служебные программы обработки кода состояния



       Обработчик кода состояния  -  это  программа,  которой

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

  ситуаций. Исключительной ситуацией является событие,  кото-

  рое обнаруживается аппаратным или программным  обеспечением

  и которое прерывает выполнение  образа.  Примером  исключи-

  тельной ситуации может быть арифметическое  переполнение  и

  сбои на недействительных кодах операции или операндах.

       В том случае, если программа, имея информацию о  конк-

  ретной  исключительной   ситуации,   способна   предпринять

  какие-либо корректирующие действия, можно написать  и  ука-

  зать подпрограмму обработки кода состояния. Эта подпрограм-

  ма обработки кода состояния, которая будет получать  управ-

  ление  при  возникновении  любой  исключительной  ситуации,

  может  осуществить  проверку  на  заданные   исключительные

  ситуации.

       Если  возникла  какая-то  исключительная  ситуация,  и

  пользователь не указал подпрограмму обработки кода  состоя-

  ния, то управление передается подпрограмме  обработки  кода

  состояния, принятой по умолчанию операционной системой  мос

  вп.  Если  исключительная  ситуация  является   результатом

  неисправимой ошибки, то принятая по умолчанию  подпрограмма

  обработки кода состояния выдает диагностическое сообщение и

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

  ной исключительной ситуации.

       В данном разделе описано, как работает механизм  обра-




                           - 331 -

                        00152-01 97 06


  ботки кода состояния в МОС ВП, и даны пояснения к написанию

  подпрограммы обработки кода состояния. При написании  подп-

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

  системные программы:

       1)   установить   вектор    исключительной    ситуации

  ($SETEXV);

       2) установить режим исключительной ситуации по  ошибке

  программ системного обслуживания ($SETSFM);

       3) развернуть стек  вызовов  для  поиска  подпрограммы

  обработки кода состояния ($UNWIND);

       4) об'явить подпрограмму  обработки  изменения  режима

  или режима совместимости ($DCLCMH).



       10.1. Типы исключительных ситуаций


       Исключительные ситуации могут  создаваться  каким-либо

  из следующих средств:

       1) аппаратное обеспечение;

       2) программное обеспечение;

       3) ошибки программ системного обслуживания.

       Исключительные ситуации, создаваемые аппаратным  обес-

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

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

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

  печением, могут привести к условиям ошибки или предупрежде-

  ния (документы [14] и [15]).

       Исключительные ситуации по ошибке программ  системного

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


                           - 332 -

                        00152-01 97 06


  раммы системного обслуживания  возвращается  код  состояния

  простой или серьезной ошибки. Обработка возврата ошибки  из

  программ системного обслуживания при помощи механизма обра-

  ботки кода состояния предпочтительнее,  чем  другие  методы

  проверки ошибки. Чтобы иметь возможность обрабатывать  иск-

  лючительные ситуации, созданные ошибками программ ситемного

  обслуживания,  необходимо  включить  режим   исключительной

  ситуации по ошибке  программ  системного  обслуживания  при

  помощи программы $SETSFM.

       Пример.

          $SETSFM_S       ENBFLG = #1

       Режим исключительной ситуации по ошибке программ  сис-

  темного обслуживания первоначально выключен  и  может  быть

  включен или выключен в любой момент выполнения образа.

       В табл. 36 включены общие  коды  состояния,  вызванные

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

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

  состояние, давая информацию о типе, значении и  аргументах,

  относящихся к каждому состоянию (см. документы [5] и  [6]).

  Значение состояния исключительной ситуации  -  это  краткое

  описание каждого состояния. Перечислены аргументы для подп-

  рограммы обработки кода состояния (если  таковые  имеются),

  которые обеспечивают специальную информацию о состоянии.












                           - 333 -

                        00152-01 97 06


                                                   Таблица 36

            Коды состояния исключительных ситуаций

  -----------------------------------------------------------

  Имя кода сос-   !               Пояснение

  тояния          !

  -----------------------------------------------------------

  SS$_ACCVIO      ! Тип:       сбой

                  ! описание:  нарушение доступа

                  ! Аргументы: 1. Причина нарушения доступа.

                  !               это маска следующего фор-

                  !               мата:

                  !                 бит 0 - тип нарушения

                  !                         доступа;

                  !                     0 - код защиты эле-

                  !                     мента таблицы стра-

                  !                     ниц не допускает

                  !                     предполагаемого до-

                  !                     ступа;

                  !                     1 - нарушение длины

                  !                     P0LR, P1LR или SLR

                  !                     (длины области прог-

                  !                     раммы, области упра-

                  !                     вления или системы);

                  !                 бит 1 - ссылка на элемент

                  !                         таблицы страниц;

                  !                     0 - указанный виртуа-

                  !                     льный адрес не досту-




                           - 334 -

                        00152-01 97 06


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Имя кода сос-   !               Пояснение

  тояния          !

  -----------------------------------------------------------

                  !                     пен;

                  !                     1 - соответствующий

                  !                     элемент таблицы стра-

                  !                     ниц не доступен;

                  !                 бит 2 - предполагаемый

                  !                         доступ;

                  !                     0 - чтение;

                  !                     1 - модификация.

                  !            2. Виртуальный адрес, к кото-

                  !               рому была попытка получить

                  !               доступ

  SS$_ARTRES      ! Тип:       ловушка

                  ! Описание:  прерывание по недействительной

                  !            арифметике

                  ! Аргументы: нет

  SS$_ASTFLT      ! Тип:       ловушка

                  ! Описание:  неверный стек при попытке дос-

                  !            тавить AST

                  ! Аргументы: 1. Значение указателя стека

                  !               при сбое.

                  !            2. AST-параметр давшего ошибку

                  !               AST.




                           - 335 -

                        00152-01 97 06


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Имя кода сос-   !               Пояснение

  тояния          !

  -----------------------------------------------------------

                  !            3. Программный счетчик (PC) в

                  !               момент прерывания доставки

                  !               AST.

                  !            4. Длинное слово состояния

                  !               процессора (PSL) в момент

                  !               прерывания доставки AST.

                  !            5. PC, к которому должно быть

                  !               доставлено AST.

                  !            6. PSL, к которому должно быть

                  !               доставлено AST

  SS$_BREAK       ! Тип:       сбой

                  ! Описание:  встретилась инструкция останов

                  ! Аргументы: нет

  SS$_CMODSUPR    ! Тип:       ловушка

                  ! Описание:  встретилась инструкция изме-

                  !            нить режим на режим супервизо-

                  !            ра

                  ! Аргументы: код режима изменения. Возмож-

                  !            ные значения от минус 32768

                  !            до 32767

  SS$_CMODUSER    ! Тип:       ловушка

                  ! Описание:  встретилась инструкция изме-




                           - 336 -

                        00152-01 97 06


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Имя кода сос-   !               Пояснение

  тояния          !

  -----------------------------------------------------------

                  !            нить режим на режим пользова-

                  !            теля

                  ! Аргументы: код режима изменения. Возмож-

                  !            ные значения от минус 32768

                  !            до 32767

  SS$_COMPAT      ! Тип:       сбой

                  ! Описание:  исключительная ситуация режима

                  !            совместимости. Данное условие

                  !            исключительной ситуации может

                  !            возникнуть только при работе

                  !            в режиме совместимости

                  ! Аргументы: тип исключительной ситуации

                  !            режима совместимости. Возмож-

                  !            ные значения:

                  !               0 - исключительная ситуация

                  !               недействительной инструкции

                  !               1 - выполнялась инструкция

                  !               BPT;

                  !               2 - выполнялась инструкция

                  !               IOT;

                  !               3 - выполнялась инструкция

                  !               EMT;




                           - 337 -

                        00152-01 97 06


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Имя кода сос-   !               Пояснение

  тояния          !

  -----------------------------------------------------------

                  !               4 - выполнялась инструкция

                  !               TRAP;

                  !               5 - неверная инструкция;

                  !               6 - сбой по нечетному адре-

                  !                   су;

                  !               7 - прерывание TBIT.

  SS$_DECOVF      ! Тип:       ловушка

                  ! Описание:  десятичное переполнение

                  ! Аргументы: нет

  SS$_FLTDIV      ! Тип:       ловушка

                  ! Описание:  деление числа с плавающей

                  !            запятой или десятичного

                  !            числа на нуль

                  ! Аргументы: нет

  SS$_FLTDIV_F    ! Тип:       сбой

                  ! Описание:  сбой при делении числа с

                  !            плавающей запятой на нуль

                  ! Аргументы: нет

  SS$_FLTOVF      ! Тип:       ловушка

                  ! Описание:  переполнение числа с пла-

                  !            вающей запятой

                  ! Аргументы: нет




                           - 338 -

                        00152-01 97 06


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Имя кода сос-   !               Пояснение

  тояния          !

  -----------------------------------------------------------

  SS$_FLTOVT_F    ! Тип:       сбой

                  ! Описание:  сбой при переполнении числа

                  !            с плавающей запятой

                  ! Аргументы: нет

  SS$_FLTUND      ! Тип:       ловушка

                  ! Описание:  переполнение по нижней гра-

                  !            нице диапазона числа с

                  !            плавающей запятой

                  ! Аргументы: нет

  SS$_FLTUND_F    ! Тип:       сбой

                  ! Описание:  сбой при переполнении по

                  !            нижней границе диапазона

                  !            числа с плавающей запятой

                  ! Аргументы: нет

  SS$_INTDIV      ! Тип:       ловушка

                  ! Описание:  деление целого числа на нуль

                  ! Аргументы: нет

  SS$_INTOVF      ! Тип:       ловушка

                  ! Описание:  переполнение целого числа

                  ! Аргументы: нет

  SS$_OPCCUS      ! Тип:       сбой

                  ! Описание:  сбой на коде операции, не-




                           - 339 -

                        00152-01 97 06


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Имя кода сос-   !               Пояснение

  тояния          !

  -----------------------------------------------------------

                  !            допустимом для пользователя

                  ! Аргументы: нет

  SS$_OPCDEC      ! Тип:       сбой

                  ! Описание:  сбой на недопустимом коде

                  !            операции

                  ! Аргументы: нет

  SS$_PAGRDERR    ! Тип:       сбой

                  ! Описание:  ошибка при чтении, возник-

                  !            шая при попытке считать с

                  !            диска ошибочную страницу

                  ! Аргументы: причина, по которой невоз-

                  !            можна пересылка. Эта маска

                  !            следующего формата:

                  !                 бит 0 - 0;

                  !                 бит 1 - ссылка на элемент

                  !                         таблицы страниц;

                  !                     0 - указанный виртуа-

                  !                     льный адрес недопус-

                  !                     тим;

                  !                     1 - соответствующий

                  !                     элемент таблицы стра-

                  !                     ниц не допустим;




                           - 340 -

                        00152-01 97 06


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Имя кода сос-   !               Пояснение

  тояния          !

  -----------------------------------------------------------

                  !                 бит 2 - предполагаемый

                  !                         доступ;

                  !                     0 - чтение;

                  !                     1 - модификация

  SS$_RADRMOD     ! Тип:       сбой

                  ! Описание:  попытка использовать недо-

                  !            пустимый режим адресации

                  ! Аргументы: нет

  SS$_ROPRAND     ! Тип:       сбой

                  ! Описание:  попытка использовать недо-

                  !            пустимый операнд

                  ! Аргументы: нет

  SS$_SSFAIL      ! Тип:       сбой

                  ! Описание:  ошибка программы системного

                  !            обслуживания (если разрешен

                  !            режим исключительной ситуа-

                  !            ции по ошибке программы си-

                  !            стемного обслуживания)

                  ! Аргументы: код состояния, возвращаемый

                  !            из программы системного об-

                  !            служивания (R0)

  SS$_SUBRNG      ! Тип:       ловушка




                           - 341 -

                        00152-01 97 06


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Имя кода сос-   !               Пояснение

  тояния          !

  -----------------------------------------------------------

                  ! Описание:  ловушка по диапазону индексов

                  ! Аргументы: нет

  SS$_TBIT        ! Тип:       сбой

                  ! Описание:  бит трассировки не разрешен

                  !            следующей инструкции

                  ! Аргументы: нет


       PC и PSL, которые обычно включены в сигнальный массив,

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

  для  режима  доступа,  получившего  данную   исключительную

  ситуацию, устанавливается в его начальное значение.

       Если в пользовательском или супервизорном  режиме  при

  помощи программы $DCLCMH была об'явлена подпрограмма  обра-

  ботки режима изменения, то она получает управление при воз-

  никновении соответствующего прерывания.

       Если при помощи программы $DCLCMH была об'явлена подп-

  рограмма обработки режима совместимости,  то  она  получает

  управление при возникновении данного сбоя.













                           - 342 -

                        00152-01 97 06


       10.1.1. Программа обработки изменения режима  и

               режима совместимости


       При помощи обычного механизма обработки  кода  состоя-

  ния, описываемого в данном разделе, можно специальным обра-

  зом обрабатывать два типа аппаратных исключительных  ситуа-

  ций:

       1) прерывания, вызванные инструкциями  изменить  режим

  на режим пользователя или изменить режим на режим  суперви-

  зора;

       2) сбои режима совместимости.

       Для того, чтобы  задать  подпрограммы,  которые  будут

  получать управление при возникновении одной из этих  ситуа-

  ций, можно использовать программу  системного  обслуживания

  $DCLCMH.



       10.2. Задание обработчиков кода состояния


       Подпрограммы обработки кода состояния, которые  должны

  получать управление в случае  возникновения  исключительной

  ситуации, можно указывать двумя способами:

       1) задать адрес маски входа обработчика кода состояния

  в первом длинном слове кадра вызова;

       2) об'явить  обработчик  исключительных  ситуаций  при

  помощи программы системного обслуживания $SETEXV.

       Первый из этих методов является более предпочтительным

  при задании обработчика кода состояния для отдельного обра-

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




                           - 343 -

                        00152-01 97 06


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

  раммист, пишущий на языке макроассемблер, может при  помощи

  единственной инструкции "переслать адрес"  поместить  адрес

  обработчика кода состояния в  длинное  слово,  определяемое

  указателем текущего кадра (FP).

       Пример.

          MOVAB   HANDLER,(FP)

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

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

  LIB$ESTABLISH (см. документы [9] - [13]). Однако, некоторые

  языки обеспечивают доступ к обработке  кода  состояния  как

  часть языка.

       Каждая процедура в стеке вызовов может об'явить  обра-

  ботчик кода состояния.

       Программа системного  обслуживания  $SETEXV  позволяет

  задать адреса  для  первичного  обработчика  исключительной

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

  ции и для окончательного обработчика исключительной  ситуа-

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

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

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

  нужно предусматривать в нем обработку  всех  исключительных

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

       Адрес равный 0, в первом длинном  слове  кадра  вызова

  процедуры или в векторе исключительной  ситуации  означает,

  что для данного кадра вызова или  вектора  нет  обработчика

  кода состояния.




                           - 344 -

                        00152-01 97 06


       10.3. Диспетчер исключительных ситуаций


       При возникновении исключительной  ситуации  управление

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

  ситуаций, входящей в операционную систему МОС ВП. Диспетчер

  исключительных ситуаций организует поиск подпрограммы обра-

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

       1) первичный вектор исключительной ситуации  для  того

  режима доступа, в котором  работала  данная  программа  при

  возникновении исключительной ситуации;

       2) вторичный вектор исключительной ситуации  для  того

  режима доступа, в котором  работала  данная  программа  при

  возникновении исключительной ситуации;

       3) адрес обработчика условия, заданный в стеке  вызова

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

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

  Кадры вызова в стеке сканируются в  обратном  порядке,  при

  этом для обращения к предыдущему кадру вызова  используется

  сохраняемый в каждом кадре вызова указатель кадра;

       4) окончательный вектор  исключительной  ситуации  для

  того режима доступа, в котором  работала  данная  программа

  при возникновении исключительной ситуации.

       Поиск заканчивается, когда диспетчер находит  обработ-

  чик кода состояния. Если диспетчер не может найти  заданный

  пользователем обработчик кода  состояния,  то  он  вызывает

  обработчик кода состояния, адрес которого хранится в  окон-

  чательном векторе исключительной ситуации. Если  образ  был

  инициирован  командным  интерпретатором,  то  окончательный



                           - 345 -

                        00152-01 97 06


  вектор указывает на всеоб'емлющий обработчик кодов  состоя-

  ния. Всеоб'емлющий обработчик кодов состояния выдает  сооб-

  щение и либо продолжает выполнение программы, либо  органи-

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

  состояние соответственно предупреждающим или ошибочным сос-

  тоянием.

       Всеоб'емлющий обработчик можно вызвать двумя  способа-

  ми:

       1) если окончательный вектор  исключительной  ситуации

  возвращает управление диспетчеру, или окончательный  вектор

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

  лющий обработчик кодов состояния и  заканчивается  с  кодом

  возврата SS$_NOHANDLER;

       2) если диспетчер исключительных ситуаций обнаруживает

  нарушение доступа,  он  вызывает  всеоб'емлющий  обработчик

  кодов  состояния   и   заканчивается   с   кодом   возврата

  SS$_ACCVIO.

       На рис. 41 показана организация  диспетчером  исключи-

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

  вызовов.


















                           - 346 -

                        00152-01 97 06


                Поиск обработчику кода состояния

                         в стеке вызовов

              +----------+
              !     0    !
              !----------!               Возникает состояние
  Процедура с !     FP   !---+  <-------    исключительной
              !----------!   !                 ситуации
              !          !   !
              !          !   !
              !          !   !
              +----------+   !
                    A        !
                    !        !
                    !        !
                    !        !
              +----------+<--+
              !     0    !
              !----------!
  Процедура B !     FP   !---+
              !----------!   !
              !          !   !
              !          !   !
              !          !   !
              +----------+   !
                    A        !
                    !        !
                    !        !
              +----------+<--+
              ! HANDLERA !
              !----------!
  Процедура A !     FP   !---+            Найден
              !----------!   !  <---- обработчик кода
              !          !   !           состояния
              !          !   V
              !          !
              +----------+

                            Рис. 41

       Примечания:

       1. Изображение стека вызовов показывает последователь-

  ность вызовов: процедура A вызывает процедуру B,  процедура

  B вызывает процедуру C. В процедуре A организован  обработ-

  чик кода состояния.

       2. Исключительная ситуация  возникает  при  выполнении

  процедуры C. Диспетчер исключительных  ситуаций  организует



                           - 347 -

                        00152-01 97 06


  поиск обработчика кода состояния.

       3. После проверки наличия обработчика кода  состояния,

  об'явленного в векторах исключительной ситуации,  диспетчер

  (в предположении, что в векторах ничего не указано для дан-

  ного процесса) смотрит первое длинное слово в кадре  вызова

  процедуры C. Значение 0 указывает  на  то,  что  обработчик

  кода состояния не  задан.  Диспетчер,  используя  указатель

  кадра (FP) в кадре вызова процедуры C, находит кадр  вызова

  процедуры B. Здесь он снова не находит обработчик кода сос-

  тояния и переходит к кадру вызова процедуры A.

       4. Диспетчер   находит   обработчик   кода   состояния

  HANDLERA и передает ему управление.



       10.4. Список     аргументов,     передаваемых

             обработчику кода состояния


       Когда диспетчер находит обработчик кода состояния,  он

  передает ему управление при помощи инструкции CALLG. Список

  аргументов, передаваемых обработчику кода состояния,  имеет

  структуру стека и содержит адреса двух массивов аргументов,

  как показано на рис. 42 (пп. 10.4.1 и 10.4.2).

       При помощи макрокоманды $SHFDEF можно  определить  для

  обращения к данным аргументам следующие символические  име-

  на, приведенные в табл.37.











                           - 348 -

                        00152-01 97 06


                                                  Таблица 37

  ----------------------------------------------------------

  Символическое имя  !          Значение

  ----------------------------------------------------------

  CHF$L_SIGARGLST    ! Адрес сигнального массива

  CHF$L_MCHARGLST    ! Адрес массива механизма

  CHF$L_SIG_ARGS     ! Количество сигнальных аргументов

  CHF$L_SIG_NAME     ! Имя кода состояния

  CHF$L_SIG_ARG1     ! Первый заданный сигнальный аргумент

  CHF$L_MCH_ARGS     ! Количество аргументов механизма

  CHF$L_MCH_FRAME    ! Адрес кадра вызова, содержащего обра-

                     ! ботчик кода состояния

  CHF$L_MCH_DEPTH    ! Глубина в стеке кадра вызова, содер-

                     ! жащего обрабочик кода состояния

  CHF$L_MCH_SAVR0    ! Сохраняемый регистр R0

  CHF$L_MCH_SAVR1    ! Сохраняемый регистр R1



       10.4.1. Аргументы сигнального массива


       Сигнальный массив содержит следующие величины,  описы-

  вающие данное состояние:

       1) имя кода состояния - символьное значение, присвоен-

  ное данному коду состояния. Возможные коды состояния исклю-

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

  в табл. 36;

       2) аргументы - специальная информация,  относящаяся  к

  данному состоянию. Аргументы, обеспечиваемые каждым состоя-

  нием, также приведены в табл. 36;



                           - 349 -

                        00152-01 97 06


       3) PC - программный счетчик  на  момент  возникновения

  исключительной ситуации (сбой или ловушка) он может  содер-

  жать либо адрес инструкции (для сбоя),  вызвавшей  исключи-

  тельную ситуацию,  либо  адрес  следующей  инструкции  (для

  ловушки);

       4) PSL - длинное слово состояния процессора на  момент

  возникновения исключительной ситуации.



       10.4.2. Аргументы массива механизма


       Массив механизма описывает контекст, в котором возник-

  ла исключительная ситуация. Он обеспечивает следующие аргу-

  менты:

       1) кадр вызова, содержащий обработчик кода состояния -

  содержимое регистра (FP) указателя кадра вызова  процедуры,

  которая организовала данный обработчик кода состояния.  Это

  адрес длинного слова, содержащего  адрес  обработчика  кода

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

  41, данный аргумент указывает на кадр вызова процедуры а;

       2) глубина в стеке - номер кадра процедуры,  организо-

  вавшей данный обработчик кода состояния, относительно кадра

  процедуры, в которой возникла исключительная ситуация. Глу-

  бина определяется следующим образом:

  -3   - обработчик кода состояния был об'явлен в окончатель-

         ном векторе исключительной ситуации;

  -2   - обработчик кода состояния был об'явлен  в  первичном

         векторе исключительной ситуации;





                           - 350 -

                        00152-01 97 06


  -1   - обработчик кода состояния был об'явлен во  вторичном

         векторе исключительной ситуации;

  0    - обработчик кода  состояния  был  об'явлен  в  кадре,

         который был активным в момент возникновения исключи-

         тельной ситуации;

  1    - обработчик кода состояния был  об'явлен  вызывателем

         кадра, активного в момент возникновения исключитель-

         ной ситуации;

  2    - обработчик кода состояния был  об'явлен  вызывателем

         вызывателя того кадра, который был активным в момент

         возникновения исключительной ситуации;

       и т.д.

       Например, для стека вызовов, показанного на  рис.  41,

  аргумент "глубина" передаваемый обработчику HANDLERA, будет

  иметь значение 2.

       Обработчик кода состояния может  определять  по  этому

  аргументу, необходимо ли ему обрабатывать данное состояние.

  Например, обработчик кода состояния может ничего не  предп-

  ринимать, если исключительная ситуация, создавшая это  сос-

  тояние, возникла в кадре, не организовавшем данный обработ-

  чик;

       3) R0 - содержимое регистра R0 в момент  возникновения

  исключительной ситуации;

       4) R1 - содержимое регистра R1 в момент  возникновения

  исключительной ситуации.








                           - 351 -

                        00152-01 97 06



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

             передаваемых обработчика кода состояния


                                  Сигнальный массив
                               +-------> +------------------+
                               !         !              ! N !
                               !         !------------------!
                               !         !Имя кода состояния!
                               !         !------------------!
                               !         !  Аргументы для   !
                               !         =   обработчика    =
                               !         =  кода состояния. =
                               !         !   если они есть  !
          Список аргументов    !         !------------------!
  +------------------------+   !         !        PC        !
  !                    ! 2 !   !         !------------------!
  !------------------------!   !         !        PSL       !
  !   Адрес сигнального    ! --+         +------------------+
  !        массива         !
  !------------------------!                Массив механизма
  !     Адрес массива      !             +------------------+
  !       механизма        ! ----------> !              ! 4 !
  +------------------------+             !------------------!
                                         ! Кадр-организатор !
                                         !вызова обработчика!
                                         !  кода состояния  !
                                         !------------------!
                                         ! Глубина в стеке  !
                                         !------------------!
                                         !        R0        !
                                         !------------------!
                                         !        R1        !
                                         +------------------+

                            Рис. 42



       10.5. Возможные  действия  обработчика   кода

             состояния


       После того, как подпрограмма обработки кода  состояния

  определит природу исключительной ситуации, она может предп-

  ринять какие-либо действия в одном из трех направлений:

       1) продолжить.




                           - 352 -

                        00152-01 97 06


       Независимо от того, в  состоянии  ли  обработчик  кода

  состояния решать проблему или нет, программа может пытаться

  продолжить выполнение. Обработчик помещает в R0  возвращае-

  мый код состояния SS$_CONTINUE и при помощи инструкции  RET

  возвращает  управление  диспетчеру.   Если   исключительной

  ситуацией был сбой, то снова выполняется  инструкция,  выз-

  вавшая его, если исключительной ситуацией была ловушка,  то

  управление передается инструкции, следующей за той, которая

  дала ловушку;

       2) повторно сигнализировать.

       Обработчик не может решить данную проблему, либо  дан-

  ное условие не относится к тем, которые он обрабатывает.  В

  этом случае обработчик помещает в R0 возвращаемый код  сос-

  тояния SS$_RESIGNAL и при помощи инструкции RET  возвращает

  управление  диспетчеру  исключительной  ситуации.  Если  он

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

  управление;

       3) развернуть стек вызовов.

       Обработчик кода состояния не может решить данную проб-

  лему, и выполнение нельзя продолжить. В этом  случае  обра-

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

  программу системного обслуживания $UNWIND. После этого мож-

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

  выполнения в соответствии с аргументами программы $UNWIND.

       Первые два пути, которые может выбрать обработчик кода

  состояния приведены в следующем примере.






                           - 353 -

                        00152-01 97 06


       Пример.

          .ENTRY  PGMA,^M<>       ; маска входа процедуры а

  MOVAB   HANDLERA,(FP)           ; об'явить обработчик ко-

                                  ; да состояния

          $SETSFM_S -

                  ENBFLG=#1       ; разрешить исключительные

                                  ; ситуации по ошибке прог-

                                  ; рамм системного обслужи-

                                  ; вания

  CALLG   ARGLIST,PGMB            ; вызвать процедуру в

             .

             .

             .

   .ENTRY  HANDLERA,^M<R2,R3,R4>   ; маска входа обработчика

                                  ; HANDLERA

          MOVL    CHF$L_SIGARGLST(AP),R4  ; получить адрес

                                  ; сигнальных аргументов

          CMPL    #SS$_SSFAIL, CHF$L_SIG_NAME(R4)

                                  ; это ошибка программы

                                  ; системного обслужива-

                                  ; ния?

          BNEQ    10$             ; нет - повторно сигнали-

                                  ; зировать

                                  ; обработать исключитель-

                                  ; ную ситуацию по ошибке

                                  ; программы системного

                                  ; обслуживания




                           - 354 -

                        00152-01 97 06


          MOVZWL  #SS$_CONTINUE,R0 ; продолжить

          RET                     ; возврат в диспетчер ис-

                                  ; ключительных ситуаций

  10$:    MOVZWL  #SS$_RESIGNAL,R0 ; повторно сигнализировать

          RET                     ; возврат в диспетчер

          .ENTRY  PGMB,^M<R2,R3,R4> ; маска входа процедуры в

   MOVAB  HANDLERB,(FP)           ; об'явить обработчик ко-

                                  ; да состояния

           .                   +-- возникает ошибка прог-

           .     <--  --  -- --!   раммы системного обслу-

           .                   +-- живания

   .ENTRY  HANDLERB,^M<R2,R3,R4>   ; маска входа обработчика

                                  ; HANDLERB

          MOVL    CHF$L_SIGARGLST(AP),R4 ; получить адрес

                                  ; сигнальHых аргументов

          CMPL    #SS$_BREAK,CHF$L_SIG_NAME(R4); сбой по

                                  ; инструции останова?

          BNEQ    10$             ; нет, повторно сигнали-

           .                      ; зировать

           .                      ; да, обработать исключи-

           .                      ; тельную ситуацию

          MOVZWL  #SS$_CONTINUE,R0 ; продолжать

          RET                     ; возврат в диспетчер ис-

                                  ; ключительной ситуации

  10$:    MOVZWL  #SS$_RESIGNAL,R0 ;повторно сигнализировать

          RET                     ; возврат в диспетчер

       Примечания:




                           - 355 -

                        00152-01 97 06


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

  кода состояния HANDLERA. HANDLERA предназначен для обработ-

  ки исключительных ситуаций, возникающих при ошибках в вызо-

  вах программ системного обслуживания.

       2. Во время своего  выполнения  процедура  A  вызывает

  процедуру B.

       3. Процедура B организует  обработчик  кода  состояния

  HANDLERB. HANDLERB предназначен для обработки  исключитель-

  ных ситуаций, вызванных сбоями в инструкциях останова.

       4. Во время выполнения процедуры B возникает  исключи-

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

  обслуживания.

       5. Диспетчер  исключительных  ситуаций   просматривает

  векторы исключительных ситуаций в поиске  обработчика  кода

  состояния (предполагается, что они ничего не определяют), а

  затем просматривает  стек  вызовов.  Вызывается  обработчик

  HANDLERB, которому передается код состояния SS$_SSFAIL.

       Поскольку HANDLERB обрабатывает только сбои в инструк-

  циях останова,  он  помещает  в  R0  возвращаемое  значение

  SS$_RESIGNAL и возвращает  управление  диспетчеру  исключи-

  тельных ситуаций.

       7. Диспетчер  исключительных   ситуаций   возобнобляет

  поиск обработчика кода состония.

       8. HANDLERA обрабатывает  исключительную  ситуацию  по

  ошибке программ системного обслуживания, исправляет  ситуа-

  цию, помещает в R0  возвращаемое  значение  SS$_CONTINUE  и

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




                           - 356 -

                        00152-01 97 06


       9. Диспетчер  возвращает  управление  процедуре  B,  и

  выполнение процедуры в продолжается с команды, следующей за

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



       10.5.1. Развертывание стека вызовов


       Третий путь, который  может  выбрать  обработчик  кода

  состояния, заключается в том, чтобы развернуть стек вызовов

  процедур.  Операция  развертывания  сложна,  и  ее  следует

  использовать только в том случае, когда требуется  передать

  управление какой-либо предшествующей процедуре в последова-

  тельности вызовов. Более того, применение программы систем-

  ного обслуживания $UNWIND  требует,  чтобы  вызывающему  ее

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

  вызовов и точный адрес, которому будет передаваться  управ-

  ление.

       Программа системного  обслуживания  $UNWIND  допускает

  два необязательных аргумента:

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

  глубина равна 1, то стек вызовов разворачивается до вызыва-

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

  глубина равна 2, то стек вызовов разворачивается до вызыва-

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

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

  ществить развертывание до той процедуры, которая  организо-

  вала данный обработчик;

       2) адрес точки, в которую необходимо передать управле-

  ние, когда выполнится операция развертывания, то  есть  PC,



                           - 357 -

                        00152-01 97 06


  который должен заменить текущий PC в кадре вызова той  про-

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

  ры будут удалены из стека.

       Если служебной программе $UNWIND не передано ни одного

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

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

  ния, сделавший вызов служебной программы $UNWIND.  Управле-

  ние передается адресу, заданному в  PC  возврата  для  этой

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

  является обычным случаем.

       Другой общий случай развертывания заключается  в  раз-

  вертывании до процедуры, об'явившей данный обработчик.  Это

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

  низма исключительной ситуации (CHF$L_MCH_DEPTH) в  качестве

  аргумента глубины для $UNWIND.

       Отсюда следует, что  развертывание  по  умолчанию  (не

  задана глубина) эквивалентно заданию  CHF$L_MCH_DEPTH  плюс

  один. Однако, в некоторых случаях вложенных  исключительных

  ситуаций это не так.  Рекомендуется  не  задавать  аргумент

  глубины в тех случаях, когда  осуществляется  развертывание

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

  состояния.

       На рис. 43 показана ситуация развертывания  и  описаны

  некоторые возможные результаты.

       Непосредственно после вызова  программы  $UNWIND  стек

  находится в промежуточном состоянии. В общем случае,  обра-

  ботчики должны возвращать  управление  сразу  после  вызова




                           - 358 -

                        00152-01 97 06


  $UNWIND.

       Во  время  фактического  развертывания  стека  вызовов

  программа развертывания проверяет каждый кадр  в  стеке  на

  наличие об'явленного в нем обработчика кода состояния. Если

  обработчик был об'явлен, то программа  развертывания  вызы-

  вает обработчик, задавая в аргументе "имя  кода  состояния"

  сигнального массива значение состояния  SS$_UNWIND  (указы-

  вающее на то, что данный стек вызовов развертывается). Пос-

  ле возврата из обработчика данный кадр вызова удаляется  из

  стека.

       Таким образом обработчик HANDLERB  на  рис.  43  может

  быть вызван второй раз - во время  операции  развертывания.

  HANDLERB не предназначен для того, чтобы специальным  обра-

  зом интерпретировать код состояния SS$_UNWIND; просто инст-

  рукция RET возвращает управление  процедуре  развертывания,

  которая не проверяет никаких кодов состояния.


























                           - 359 -

                        00152-01 97 06


          Развертывание стека вызовов

              +----------+
              !     0    !
              !----------!
  Процедура D !     FP   !---+
              !----------!   !
              !          !   !
              !          !   !
              +----------+   !
                    A        !
                    !        !
              +----------+<--+
              !     0    !
              !----------!
  Процедура C !     FP   !---+
              !----------!   !
              !          !   !
              !          !   !
              +----------+   !
                    A        !
                    !        !
              +----------+<--+
              ! HANDLERB !
              !----------!
  Процедура B !     FP   !---+
              !----------!   !
              !          !   !
              !          !   !
              +----------+   !
                    A        !
                    !        !
              +----------+<--+
              !     0    !
              !----------!
  Процедура A !     FP   !---+
              !----------!   !
              !          !   !
              !          !   V
              +----------+

                            Рис. 43

       Примечания:

       1. Имеется показанный стек вызовов процедур. Предполо-

  гается, что для данного процесса не об'явлено никаких  век-

  торов исключительных ситуаций, и что исключительная  ситуа-

  ция возникла во время выполнения процедуры D.





                           - 360 -

                        00152-01 97 06


       2. Поскольку ни процедура D, ни процедура с не органи-

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

  HANDLERB.

       3. Если HANDLERB вызывает программу системного  обслу-

  живания $UNWIND без указания аргументов, то  кадры  вызовов

  для процедур B, C и D удаляются из стека (вместе  с  кадром

  вызова самого обработчика HANDLERB), и управление передает-

  ся процедуре A. Процедура а получает  управление  в  точку,

  следующую за вызовом процедуры B.

       4. Если HANDLERB вызывает программу системного  обслу-

  живания $UNWIND задавая глубину 2, то удаляются кадры вызо-

  вов для процедур C и D, и управление  передается  процедуре

  B.



       10.6. Множественные исключительные ситуации


       Возможно возникновение второй исключительной  ситуации

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

  ры, которую вызвал обработчик. В этом случае, когда диспет-

  чер исключительных ситуаций  организует  поиск  обработчика

  кода состояния, он пропускает кадры, которые были  просмот-

  рены во время поиска первого обработчика.

       Поиск второго обработчика заканчивается таким же обра-

  зом, как и начальный поиск (подраздел 10.3).

       Если второй активный обработчик кода  состояния  вызы-

  вает программу системного обслуживания $UNWIND, то  глубина

  развертывания определяется в соответствии в теми же  прави-

  лами, которые использует диспетчер исключительных  ситуаций



                           - 361 -

                        00152-01 97 06


  при поиске в стеке; все  кадры,  просмотренные  при  поиске

  первого обработчика кода состояния, пропускаются.

       С другой  стороны,  при  возникновении  исключительной

  ситуации всегда вводятся первичные  и  вторичные  векторные

  обработчики.

       Если какая-то исключительная ситуация возникла во вре-

  мя выполнения обработчика,  об'явленного  в  первичном  или

  вторичном векторе исключительной ситуации, то этот обработ-

  чик должен обрабатывать  данное  дополнительное  состояние.

  Некорректность в этом случае может привести в  рекурсивному

  циклу исключительной ситуации, в котором векторный обработ-

  чик будет повторно вызываться до тех пор,  пока  существует

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
































                           - 362 -

                        00152-01 97 06


          11. Служебные программы управления памятью



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

  вп осуществляют отображение и управление взаимосвязями меж-

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

  процессов. В большинстве случаев эти действия невидимы  для

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

  пользователь может  повысить  эффективность  программы  при

  помощи явного управления использованием  своей  виртуальной

  памяти. Имеются  следующие  системные  служебные  программы

  управления памятью:

       1) расширить область программы/управления ($EXPREG);

       2) сократить область программы/управления ($CNTREG);

       3)   создать   виртуальное    адресное    пространство

  ($CRETVA);

       4)   удалить   виртуальное    адресное    пространство

  ($DELTVA);

       5) создать и отобразить секцию ($CRMPSC);

       6) отобразить глобальную секцию ($MGBLSC);

       7) удалить глобальную секцию ($DGBLSC);

       8) обновить файл секции на диске ($UPDSEC);

       9) зафиксировать страницы в рабочем наборе ($LKWSET);

       10) освободить страницы в рабочем наборе ($ULWSET);

       11) отрегулировать размер рабочего набора ($ADJWSL);

       12) очистить рабочий набор ($PURGWS);

       13) зафиксировать страницы в памяти ($LCKPAG);

       14) освободить страницы в памяти ($ULKPAG);




                           - 363 -

                        00152-01 97 06


       15) установить защиту страниц ($SETPRT);

       16) установить режим обмена процесса ($SETSWM);

       17) установить границы стека ($SETSTK).

       Служебные программы управления памятью позволяют регу-

  лировать размер виртуального и физического адресного прост-

  ранства, доступного программе. Например, они  дают  возмож-

  ность делать следующее:

       1) увеличить или уменьшить виртуальное адресное прост-

  ранство, доступное в области программы или в области управ-

  ления процессов;

       2) управлять размером рабочего набора процесса и  осу-

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

  ройством страничного обмена;

       3) определять файлы на диске,  содержащие  данные  или

  разделяемые образы, и отображать эти файлы  на  виртуальное

  адресное пространство процесса.

       В данном разделе описаны служебные программы,  обеспе-

  чивающие такие возможности. Однако, прежде чем обратиться к

  этим служебным  программам,  пользователь  должен  получить

  представление об организации памяти в СМ 1700 и о  програм-

  мах управления памятью (документ [16]).



       11.1. Виртуальное адресное пространство


       Виртуальное адресное пространство  процесса  подразде-

  ляется на две области:

       1) область программы  (P0),  которая  содержит  образ,

  выполняемый в текущий момент времени;



                           - 364 -

                        00152-01 97 06


       2) область управления (P1), которая содержит  информа-

  цию, организуемую операционной системой МОС ВП  для  самого

  процесса. Она также содержит пользовательский стек, который

  расширяется по направлению к младшим адресам области управ-

  ления.

       На рис. 44 показана схема виртуальной памяти процесса.

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

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

       Для того, чтобы упростить защиту памяти и отображение,

  виртуальное   адресное   пространство   подразделяется   на

  512-байтовые блоки, называемые страницами.  Используя  слу-

  жебные программы управления памятью, процесс может добавить

  указанное количество страниц к концу области программы  или

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

  обеспечивает  процесс  дополнительным   пространством   для

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

  таблиц или областей памяти. Добавление  страниц  к  области

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

  обращении к новым страницам стек автоматически расширяется.

  (пользовательский стек можно также расширить при компоновке

  образа при помощи указания STACK=параметр в файле  парамет-

  ров компоновщика).

       Максимальный размер, до которого процесс может  увели-

  чивать свое адресное пространство, определяется  параметром

  VIRTUALPAGECNT обслуживающей программы SYSGEN.








                           - 365 -

                        00152-01 97 06


       11.2. Увеличение  и  уменьшение  виртуального

             адресного пространства


       Программа системного  обслуживания  $EXPREG  добавляет

  страницы к  концу  либо  области  программы,  либо  области

  управления, и, если указано, возвращает диапазон  виртуаль-

  ных адресов новых страниц. Например, если желательно  доба-

  вить к области программы процесса четыре страницы, то  сле-

  дует  написать  вызов  программы  системного   обслуживания

  $EXPREG как показано в примере 1.

       Пример 1.

  BEGSPACE:

          .BLKL   2               ; два длинных слова для

                                  ; хранения адресов начала и

                                  ; конца новых страниц

             .

             .

             .

          $EXPREG_S -             ; получить 4 страницы

                  PAGCNT=#4, -

                  RETADR=BEGSPACE, -

                  REGION=#0

       В аргументе REGION передается значение 0, которое ука-

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

  программы. Для того, чтобы  добавить  такое  же  количество

  страниц к области управления, следует  задавать  REGION=#1.

  Аргумент REGION в служебной программе $EXPREG необязателен;

  если он не указан, то страницы добаляются или удаляются  по



                           - 366 -

                        00152-01 97 06


  умолчанию из области программы.


          Виртуальное адресное пространство процесса

  Виртуальный
    адрес
  -----------     --------------------------------------+
   00000000       !                       !             !
                  ! Область программы     ! Направление !
                  !                       !             !
                  !       (P0)            ! расширения  !
                  !                       !             !
                  !           длина       V             !
                  !           --  --  --  --  --  --  --!
                  !                                     !
                  !                                     !
  3FFFFFFF        !                                     !
                  !-------------------------------------!
  40000000        !                                     !
                  ! Область управления                  !
                  !                                     !
                  !        (P1)                         !
                  !           Длина                     !
                  !           --  --  --  --  --  --  --!
                  !                       A             !
                  !                       ! Направление !
                  !                       !             !
                  !                       ! расширения  !
                  !                       !             !
  7FFFFFFF        +-------------------------------------+

                            Рис. 44


       Служебная программа $EXPREG может  добавлять  страницы

  только к концу области. Если требуется добавить страницы не

  к концу области, то можно воспользоваться  программой  сис-

  темного обслуживания $CRETVA. И  наоборот,  если  требуется

  удалить страницы, созданные либо программой  $EXPREG,  либо

  программой $CRETVA, можно использовать программу системного

  обслуживания $DELTVA. Например,  если  служебная  программа

  $EXPREG дважды использовалась  для  добавления  страниц,  и

  если теперь  требуется  удалить  первый  диапазон  страниц,

  оставляя второй, то следует использовать программу  систем-



                           - 367 -

                        00152-01 97 06


  ного обслуживания $DELTVA, как показано в примере 2.

       Пример 2.

  BEGSPACEA:

          .BLKL   2               ; начало и конец первой об-

                                  ; ласти

  BEGSPACEB:

          .BLKL   2               ; начало и конец второй об-

                                  ; ласти

            .

            .

            .

          $EXPREG_S -             ; четыре страницы

                  PAGCNT=#4, -

                  RETADR=BEGSPACEA, -

                  REGION=#0

          BSBW    ERROR

           .

           .

           .

          $EXPREG_S -             ; еще три

                  PAGCNT=#3, -

                  RETADR=BEGSPACEB, -

                  REGION=#0

          BSBW    ERROR

           .

           .

           .




                           - 368 -

                        00152-01 97 06




          $DELTVA_S -           ; удалить первые 4 страницы

                  INADR=BEGSRACEA

          BSBW    ERROR



       В примере 2 первый вызов программы  $EXPREG  добавляет

  четыре страницы к  области  программы;  виртуальные  адреса

  созданных страниц возвращаются в  массив  из  двух  длинных

  слов BEGSPACEA. Второй вызов добавляет три страницы и возв-

  ращает адреса BEGSPACEB. Вызов  программы  $DELTVA  удаляет

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

       Примечание. Не следует использовать программы  систем-

  ного обслуживания $CNTREG или $CRETVA в сочетании с другими

  написанными пользователем процедурами. Эти  программы  сис-

  темного обслуживания не имеют средств для того, чтобы сооб-

  щать изменение в виртуальном адресном  пространстве  другим

  программам. Рекомендуется использовать для получения памяти

  (там, где это проходит) либо  $EXPREG,  либо  программу  из

  исполнительной   библиотеки   LIB$GET_VM   (см.   Документы

  [9]-[13]) (распределить виртуальную память). При  использо-

  вании программы $DELTVA пользователь  должен  обеспечивать,

  чтобы удалялись только те страницы, которые  он  специально

  создавал.












                           - 369 -

                        00152-01 97 06


       11.2.1. Массивы  входных  адресов   и   массивы

               возвращаемых адресов


       Программа системного  обслуживания  $EXPREG  добавляет

  страницы к области в обычном направлении расширения  данной

  области. Массив возвращаемых адресов, если он задан, указы-

  вает порядок, в котором добавлялись страницы:

       1) если расширяется область  программы,  то  начальный

  виртуальный адрес меньше чем конечный виртуальный адрес;

       2) если расширяется область управления,  то  начальный

  виртуальный адрес больше, чем конечный виртуальный адрес.

       Сокращение, выполняемое программой системного обслужи-

  вания $CNTREG, осуществляется для области программы в  нап-

  равлении от старших адресов к младшим, а для области управ-

  ления - в направлении от младших адресов к старшим.

       Возвращаемые адреса указывают на  первый  байт  первой

  добавляемой или удаляемой страницы и на последний байт пос-

  ледней добавляемой страницы.

       Если для  системных  служебных  программ  $CRETVA  или

  $DELTVA указаны массивы входных адресов, то  эти  программы

  добавляют или удаляют страницы, начиная с адреса, заданного

  в первом длинном слове, и заканчивая адресом,  заданным  во

  втором длинном слове.

       Порядок, в котором страницы добавляются или удаляются,

  не должен обязательно совпадать с направлением  расширения,

  принятым для данной области. Более того, поскольку эти слу-

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

  цы, они игнорируют младшие  9  битов  заданных  виртуальных



                           - 370 -

                        00152-01 97 06


  адресов (младшие 9 битов содержат смещение в байтах  внутри

  страницы). Возвращаемые виртуальные адреса показывают  сме-

  щение в байтах.

       В табл.  38  приведены  примеры  виртуальных  адресов,

  которые могут быть заданы как  вход  программ  $CRETVA  или

  $DELTVA и показаны массивы возвращаемых адресов,  если  все

  страницы были успешно добавлены или удалены.


                                                  Таблица 38

  ----------------------------------------------------------

   Входной массив   !       !   Выходной массив     ! Коли-

  ------------------!Область!-----------------------! чество

   Начало ! Конец   !       ! Начало    !  Конец    ! стра-

          !         !       !           !           ! ниц

  ---------------------------------------------------------

  1010    ! 1610    !  P0   !  1000     !  17FF     !   4

  1450    ! 1451    !  P0   !  1400     !  15FF     !   1

  1200    ! 1000    !  P0   !  1000     !  13FF     !   2

  1450    ! 1450    !  P0   !  1400     !  15FF     !   1

  7FFEC010! 7FFECO10!  P1   ! 7FFEC1FF  ! 7FFEC000  !   1

  7FFEC010! 7FFEBCA0!  P1   ! 7FFEC1FF  ! 7FFEBC00  !   3


       Если входные виртуальные адреса одинаковые, как в чет-

  вертой и пятой строке табл. 38, то добавляется или удаляет-

  ся одна страница. Массив возвращаемых  адресов  показывает,

  что страница была добавлена или удалена  в  соответствии  с

  направлением расширения, принятым для данной области.





                
                           - 371 -

                        00152-01 97 06


       11.3. Владение страницами и защита страниц


       Каждая страница в  виртуальном  адресном  пространстве

  процесса принадлежит  тому  режиму  доступа,который  создал

  данную страницу. Например, страницы в области программы,  с

  самого начала обеспечиваемые для выполнения образа, принад-

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

  создает динамически,  также  принадлежат  пользовательскому

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

  ниц, содержащих пользовательский стек,  обычно  принадлежат

  более привилегированным режимам.

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

  ванный режим может удалить страницу или как-то  иначе  воз-

  действовать на нее. Владелец может также  при  помощи  кода

  защиты указать тип доступа, который разрешается для каждого

  режима доступа.

       Программа системного обслуживания $SETPRT  (установить

  защиту страниц) изменяет защиту, присвоенную  странице  или

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

  специальный тип доступа (доступ запрещен, только чтение или

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

  (режим ядра, режим управления, супервизорный или  пользова-

  тельский режим). Защиту страниц может изменять только режим

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

  па.

       При попытке образа получить доступ к странице, которая

  защищена от  предпринятого  доступа,  возникает  аппаратная

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


                           - 372 -

                        00152-01 97 06


  образ вызывает программу системного  обслуживания,  то  она

  для страниц, которые должны использоваться,  проверяет,  не

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

  или записать одну из этих страниц. Если  нарушение  доступа

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

  кодом состояния SS$_ACCVIO.

       Поскольку  служебные  программы   управления   памятью

  добавляют, удаляют  или  модифицируют  одновременно  только

  одну страницу, то до того, как обнаружится нарушение досту-

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

  Если в вызове служебной программы  указан  аргумент  RETADR

  (возвращаемый адрес),  то  служебная  программа  возвращает

  адреса  страниц,  измененных  (добавленных,  удаленных  или

  модифицированных) до появления ошибки. Если нет таких стра-

  ниц, то есть нарушение доступа возникло на первой  заданной

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

  слова массива возвращаемых адресов значение "-1".

       Если аргумент RETADR (возвращаемый адрес) не задан, то

  информация не возвращается.



       11.4. Обмен страниц рабочего набора


       Когда процесс выполняет образ, некоторое  подмножество

  его страниц постоянно находится в  физической  памяти;  эти

  страницы называются рабочим набором процесса. Рабочий набор

  включает страницы как  области  программы,  так  и  области

  управления.





                           - 373 -

                        00152-01 97 06


       При обращении образа к странице, которой нет в памяти,

  возникает страничный отказ, и данная страница переносится в

  память, замещая существующую в рабочем наборе. Если страни-

  ца, которую собираются заменить, модифицировалась во  время

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

  страниц на диск. Когда эта страница снова понадобится,  она

  переносится в память,  опять  замещая  текущую  страницу  в

  рабочем наборе. Такая передача страниц между  физической  и

  внешней памятью называется страничным обменом.

       Однако, если программа очень большая или, если  высока

  частота обмена страниц в интенсивно используемом  программ-

  ном образе, то накладные расходы, связанные  со  страничным

  обменом, снижают эффективность программы.  Некоторые  прог-

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

  возможного разрешить эти потенциальные проблемы:

       1) программа системного обслуживания $ADJWSL  (отрегу-

  лировать размер рабочего набора) увеличивает или  уменьшает

  максимальное  количество  страниц,  которое  процесс  может

  иметь в своем рабочем наборе;

       2) программа системного обслуживания  $PURGWS  удаляет

  одну или несколько страниц из рабочего набора;

       3) программа  системного  обслжвиания  $LKWSET  делает

  одну или несколько страниц в  рабочем  наборе  запрещенными

  для страничного обмена.

       Начальный размер рабочего набора процесса определяется

  принятой  по  умолчанию  квотой  рабочего  набора  процесса

  (WSDEFAULT). Поскольку некоторые программы могут  требовать




                           - 374 -

                        00152-01 97 06


  больше памяти, чем другие, то программа может вызвать прог-

  рамму системного обслуживания $ADJWSL для того, чтобы дина-

  мически увеличить размер  рабочего  набора  процесса.  Если

  дополнительные страницы в рабочем наборе больше не требуют-

  ся, программа может вызвать программу системного обслужива-

  ния $ADJWSL для того, чтобы уменьшить размер рабочего набо-

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

  в рабочем наборе, можно также вызвать программу  системного

  обслуживания $PURGWS.

       При некоторых обстоятельствах может быть  необходимым,

  чтобы определенные страницы никогда не обменивались. В этом

  случае образ может захватить эти страницы в рабочем  наборе

  при помощи программы системного обслуживания $LKWSET.  Пока

  данный рабочий набор процесса будет  находиться  в  памяти,

  эти страницы не будут выгружаться, если только они не будут

  явно освобождены при помощи программы системного обслужива-

  ния $ULWSET.



       11.5. Обмен процессов


       Операционная система МОС ВП занимается балансированием

  нужд всех процессов, выполняемых в текущий момент  времени,

  обеспечивая каждый процесс требуемыми ему системными ресур-

  сами по мере возникновения  потребности  в  них.  Программы

  управления памятью уравновешивают потребность  процессов  в

  памяти. Сумма рабочих наборов всех процессов находящихся на

  текущий момент в физической  памяти,  называется  балансным

  набором.



                           - 375 -

                        00152-01 97 06


       Когда процесс,  рабочий  набор  которого  находится  в

  памяти, становится неактивным, например, переходит  в  сос-

  тояние   спячки   или    ожидания    завершения    операции

  ввода-вывода, этот рабочий  набор,  целиком  или  частично,

  может быть удален из памяти, чтобы освободилось пространст-

  во для рабочего набора  другого  процесса,  который  начнет

  выполняться.

       Рабочий набор можно удалить двумя способами:

       1) частично - так называемой подстройкой  планировщика

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

  что количество страниц в  рабочем  наборе  уменьшается,  но

  никакие страницы не выгружаются из рабочего набора;

       2) целиком - называется обменом. Все страницы из рабо-

  чего набора выгружаются.

       Когда процесс выгружается из балансного набора,  пере-

  записываются все страницы его рабочего набора (как  модифи-

  цированные, так и немодифицированные), включая и те страни-

  цы, которые были захвачены в рабочем наборе.

       Для привилегированного процесса существует возможность

  захватить в балансном наборе весь свой рабочий набор  цели-

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

  цесс вызывает  программу  системного  обслуживания  $SETSWM

  следующим образом.

       Пример.

          $SETSWM_S       SWPFLG=#1

       Такой вызов программы $SETSWM запрещает  режим  обмена

  процесса. Кроме того,  режим  обмена  можно  запретить  при




                           - 376 -

                        00152-01 97 06


  помощи установки соответствующего бита в  аргументе  STSFLG

  программы  системного  обслуживания  $CREPRC.  Однако,  для

  того, чтобы изменить режим  обмена  процесса,  пользователь

  должен иметь привилегию PSWAPM.

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

  помощи  программы  системного  обслуживания  $LCKPAG.  Если

  страница захвачена в памяти данной служебной программой, то

  она будет оставаться в  памяти  даже  в  том  случае,  если

  остальная часть рабочего  набора  выгружена  из  балансного

  набора. Данная программа системного обслуживания может быть

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

  которые выполняют операции ввода-вывода на  медленные  уст-

  ройства или графические устройства.

       Страницы, захваченные в памяти, можно  освободить  при

  помощи программы системного обслуживания $ULKPAG. Для вызо-

  ва программы $LCKPAG или $ULKPAG требуется пользовательская

  привилегия PSWAPM.



       11.6. Секции


       Секция - это файл на диске или часть файла  на  диске,

  содержащая данные или инструкции, которые можно перенести в

  память и сделать доступными процессу для обработки и выпол-

  нения. Кроме того, секцией может быть  одна  или  несколько

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

  в пространстве ввода-вывода (п. 11.6.14).

       Секции бывают либо личные, либо глобальные  (разделяе-

  мые):



                           - 377 -

                        00152-01 97 06


       1) личные секции доступны только тому процессу,  кото-

  рый создал их. Процесс может определить дисковый файл  дан-

  ных как секцию, отобразить его в свое виртуальное  адресное

  простанство и обрабатывать;

       2) глобальные секции могут  быть  доступны  нескольким

  процессам. В физической памяти находится  одна  копия  гло-

  бальной секции, и каждый процесс,  использующий  ее,  обра-

  щается к одной и той  же  копии.  Глобальная  секция  может

  содержать  разделяемые  коды  или  данные,  которые   могут

  читаться, либо читаться и записываться несколькими  процес-

  сами. Глобальные секции бывают либо временными,  либо  пос-

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

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

  могут быть отображением файла на диске, либо созданными как

  глобальная секция физических страниц.

       Если во время выполнения образа модифицированные стра-

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

  жаются из памяти, они  перезаписываются  обратно  в  секцию

  файла, а не в файл обмена страниц, как это обычно  делается

  при работе с файлами. (однако, секция со ссылкой  на  копию

  не перезаписывается в секцию файла).

       Использование секций дисковых файлов включает две раз-

  личные операции:

       1) создание секции определяет дисковый файл как секцию

  и информирует операционную систему МОС ВП о том, какие час-

  ти файла содержит данная секция;

       2) отображение секции делает секцию доступной процессу




                           - 378 -

                        00152-01 97 06


  и устанавливает соответствие между виртуальными  блоками  в

  файле и заданными адресами в  виртуальном  адресном  прост-

  ранстве процесса.

       Программа  системного  обслуживания  $CRMPSC   создает

  и/или отображает личную или  глобальную  секцию.  Поскольку

  личная секция используется только одним процессом, то  соз-

  дание и отображение выполняется одновременно. В случае гло-

  бальной секции один процесс может создать  постоянную  гло-

  бальную секцию и не отображать ее, отображение  могут  сде-

  лать другие процессы. Глобальную секцию можно также создать

  и отобразить в одной операции.



       11.6.1. Создание секций


       Для создания секций дисковых файлов требуются  следую-

  щие шаги:

       1) открытие или создание дискового файла,  содержащего

  секцию;

       2) определение того, какие виртуальные блоки  в  файле

  составляют секцию;

       3) определение характеристик секции.



       11.6.2. Открытие дискового файла


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

  его необходимо открыть при помощи системы управления данны-

  ми СУД-32. Пример 1 показывает блок доступа к файлу $FAB  и

  макрокоманду $OPEN, используемую для открытия файла, а так-




                           - 379 -

                        00152-01 97 06


  же определение канала для программы системного обслуживания

  $CRMPSC, необходимые для чтения существующего файла.

       Пример 1.

  SECFAB: $FAB    FNM=<SECTION.TST>, ; блок доступа к файлу

                  FOP=UFO

                  RVT= -1

            .

            .

            .

          $OPEN   FAB=SECFAB

          $CRMPSC_S -

                  CHAN=SECFAB+FAB$L_SVT,...

       Параметр файла возможностей (FOP) показывает, что файл

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

  есть эта возможность требует,  чтобы  был  назначен  канал,

  используя режим доступа вызывающей программы. СУД-32  возв-

  ращает номер канала, которому доступен  данный  файл;  этот

  номер канала задается как входной параметр служебной  прог-

  раммы $CRMPSC (аргумент CHAN (канал)).  Этот  номер  канала

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

  отображения секций.

       Файл может быть временным, создаваемым  на  то  время,

  пока он используется как секция. В этом случае для открытия

  файла следует использовать макрокоманду $CREATE.

       Макрокоманду $CREATE можно использовать также для отк-

  рытия существующего файла. Если файла нет, он будет создан.

  Пример 2 показывает поля в блоке  доступа  к  файлу  (FAB),




                           - 380 -

                        00152-01 97 06


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

       Пример 2.

  GBLFAB: $FAB    FNM=<GLOBAL.TST>, -

                  ALQ=4, -

                  FAC=PUT, -

                  FOP=<UFO,CIF,CBT>, -

                  SHR=<PUT,UPI>

            .

            .

            .

          $CREATE FAB=GBLFAB

       Когда вызывается  макрокоманда  $CREATE,  она  создает

  файл GLOBAL.TST, если он еще не существует. Возможность свт

  (пытаться сделать непрерывным) запрашивает, чтобы файл  был

  по возможности непрерывным. Хотя  требование  непрерывности

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

  может дать улучшение производительности.



       11.6.3. Определение частей секции


       Сразу после успешного открытия файла программа систем-

  ного обслуживания $CRMPSC может  создать  секцию  из  всего

  файла или только из некоторорых частей  его.  Части  файла,

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

  раммы $CRMPSC:

       1) PAGCNT (счетчик страниц). Этот аргумент  обязатель-

  ный. Он задает количество отображаемых виртуальных  блоков.

  Данные блоки соответствуют страницам секции;



                           - 381 -

                        00152-01 97 06


       2) VBN (номер виртуального блока). Этот аргумент опре-

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

  нается секция. Он не  является  обязательным.  Если  данный

  аргумент не задан, то передается значение 1 (началом секции

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

  отображаемой физической страницы, то  аргумент  VBN  задает

  начальный номер физической страницы.



       11.6.4. Определение характеристик секции


       Аргумент  FLAGS  программы   системного   обслуживания

  $CRMPSC определяет следующие характеристики секции:

       1) является ли данная секция личной или глобальной (по

  умолчанию создается личная секция);

       2) как должны обрабатываться  страницы  секции,  когда

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

  щается к ним. Страницы в секции могут быть созданы:

       - для чтения/записи или только чтения;

       - как загружаемые обнуленными страницы или как страни-

         цы, со ссылкой на копию, в зависимости от того,  как

         процесс собирается использовать эту секцию и  содер-

         жит ли файл какие-либо данные (п. 11.6.9);

       3) будет  ли  секция  отображать  дисковый  файл  либо

  заданные физические страницы (см. п. 11.6.14).

       В табл. 39 показаны те биты флага, которые нужно уста-

  навливать для задания характеристик.







                           - 382 -

                        00152-01 97 06


                                                   Таблица 39

          Биты флага для задания характеристик секции

  -----------------------------------------------------------

               !          Создаваемая секция

               !---------------------------------------------

   биты флага  ! Личная !Глобаль-! PFN  !  PFN     !Разделяе-

               !        !   ная  ! Личная!Глобаль- !мая па-

               !        !        !       !  ная    !  мять

  -----------------------------------------------------------

  SEC$M_GBL    !   0    !   1    !   0    !   1    !    1

  SEC$M_CRF    !Необязат!Необязат!   0    !   0    !    0

  SEC$M_DZRO   !Необязат!Необязат!   0    !   0    !Необязат

  SEC$M_WRT    !Необязат!Необязат!Необязат!Необязат!Необязат

  SEC$M_PERM   ! Не исп.!Необязат!Необязат!    1   !     1

  SEC$M_SYSGBL ! Не исп.!Необязат! Не исп.!Необязат!Необязат

  SEC$M_PFNMAP !   0    !   0    !   1    !   1    !    0

  SEC$M_EXPREG !Необязат!Необязат!Необязат!Необязат!Необязат

  SEC$M_PAGFIL !   0    !   1    !   0    !   0    !    0


       При задании характеристик секции  необходимо  выдержи-

  вать следующие ограничения:

       1) глобальные секции не могут быть загружаемыми  обну-

  ленными, и со ссылкой на копию;

       2) загружаемые обнуленными секции должны быть  переза-

  писываемыми;

       3) не допускаются личные секции разделяемой памяти.







                           - 383 -

                        00152-01 97 06


       11.6.5. Определение  характеристик   глобальной

               секции


       Если секция является глобальной,  то  ей  должно  быть

  присвоено символьное имя (аргумент  GSDNAM),  чтобы  другие

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

  (подпункт 11.6.5.1.).

       Аргумент FLAGS здает тип глобальной секции.

       Глобальные секции могут быть:

       1) групповыми временными (по умолчанию);

       2) групповыми постоянными;

       3) системными временными;

       4) системными постоянными.

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

  процессы, которые выполняются с тем же номером группы.  Имя

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

  группы процесса, создавшего эту секцию. Если секцию отобра-

  жают другие процессы, то их номера группы должны совпадать.

       Временная глобальная секция  автоматически  удаляется,

  когда ни один процесс не отображает ее, тогда как  постоян-

  ная глобальная секция продолжает существовать даже  в  этом

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

  удаления  при  помощи  программы  системного   обслуживания

  $DGBLSC.

       Для создания постоянной  групповой  глобальной  секции

  или системной глобальной секции (временной или  постоянной)

  требуются пользовательские привилегии PRMGBL и SYSGBL соот-

  ветственно.



                           - 384 -

                        00152-01 97 06


       Системная глобальная секция доступна всем процессам  в

  операционной системе МОС ВП.

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

  задать маску защиты (аргумент PROT), запрещающую  некоторые

  или все типы доступа (запись, чтение, выполнение, удаление)

  другим процессам.



       11.6.5.1. Имя глобальной секции


       Аргумент GSDNAM задает дескриптор, указывающий на сим-

  вольную строку следующего формата:

          [имя-разделяемой-памяти:] имя-глобальной-секции

  где имя разделяемой памяти -

       указывает, что создаваемая, отображаемая или удаляемая

       глобальная секция находится в  пределах  поименованной

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

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

       мы МОС ВП. Например, строка SHRMEM$1:GSDATA  идентифи-

       цирует глобальную секцию с именем GSDATA,  расположен-

       ную в разделяемой памяти с именем SHRMEM$1.

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

       отображение или удаление данной секции, то  операцион-

       ная система МОС ВП пытается найти заданную  глобальную

       секцию сначала в локальной памяти, а  затем  в  блоках

       разделяемой памяти (в том порядке, как они соединены);

      имя глобальной секции -

       это имя присваивается глобальной секции.  Можно  выби-

       рать любое допустимое имя от 1 до 43 символов.  Однако



                           - 385 -

                        00152-01 97 06


       все процессы, отображающие одну  и  ту  же  глобальную

       секцию, должны указывать одинаковое имя.

       По желанию для глобальной секции, которая  расположена

  в памяти, разделяемой многими процессорами, можно  задавать

  и имя-разделяемой-памяти, и имя-глобальной-секции.  Однако,

  если пользователь хочет использовать существующие программы

  без повторной компиляции или компоновки, или чтобы програм-

  ма работала независимо от того, находится секция в  локаль-

  ной  или  разделяемой  памяти,  он  может  задавать  только

  имя-глобальной-секции и обеспечить, чтобы операционная сис-

  тема МОС ВП оттранслировала его для получения полной специ-

  фикации. Операционная система  МОС  ВП  пытается  выполнить

  трансляцию логического имени для строки, заданной  аргумен-

  том GSDNAM, следующим образом:

       1) осуществляется поиск двоеточия в строке имени. Если

  двоеточие найдено,  то  считается,  что  глобальная  секция

  должна находиться в разделяемой памяти, и  трансляция  про-

  должается следующим образом:

       - часть строки имени справа от двоеточия помещается  в

         буфер имени-глобальной-секции.  Часть  строки  имени

         слева от двоеточия становится новой текущей  строкой

         имени;

       - к текущей строке имени добавляется  префикс  GBL$  и

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

       - если результат содержит логическое имя, то шаги 1  и

         2 повторяются до тех пор, пока трансляция не  закон-

         чится ошибкой или пока количество выполненных транс-




                           - 386 -

                        00152-01 97 06


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

         темной генерации LNM$C_MAXDEPTH;

       - если текущая строка имени не может быть оттранслиро-

         вана, то префикс GBL$ убирается из нее. Это имя ста-

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

         Именем-глобальной-секции  является  текущая  строка,

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

       2) если  глобальная  секция  размещается  в  локальной

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

       - к текущей строке имени добавляется  префикс  GBL$  и

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

       - если результат является логическим именем, то шаг  1

         повторяется до тех пор, пока трансляция не закончит-

         ся ошибкой или пока количество выполненных  трансля-

         ций не превысит числа, заданного параметром  систем-

         ной генерации LNM$C_MAXDEPTH;

       - если текущая строка имени не может быть оттранслиро-

         вана, то префикс GBL$ убирается из нее. Эта  текущая

         строка является именем-глобальной-секции.

       Пример 1.

          $DEFINE GBL$GSDATA      SHRMEM$1:GSDATA

       Пример 2.

  NAMEDESC:

          .ASCID  /GSDATA/        ; дескриптор для логичес-

            .                     ; кого имени секции

            .

            .



          
                           - 387 -

                        00152-01 97 06


          $CRMPSC_S -

                  GSDNAM=NAMEDESC,...

       Трансляция логического имени осуществляется  следующим

  образом:

       1) к SHRMEM$1 добавляется префикс GBL$;

       2) GBL$GSDATA транслируется  в  SHRMEM$1:GSDATA.  (для

       GBL$SHRMEM$1 дальнейшая трансляция не будет  успешной.

       Когда трансляция логического  имени  заканчивается  по

       ошибке, то данная строка передается служебной програм-

       ме).

       Для метода трансляции логического имени, описанного  в

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

       1) если строка имени начинается  знаком  подчеркивания

  (_), операционная система МОС ВП убирает знак подчеркивания

  и считает  результирующую  строку  фактическим  именем  (то

  есть, дальнейшая трансляция не выполняется);

       2) если строка имени является  результатом  трансляции

  логического имени, то проверяется, имеет ли  данная  строка

  имени атрибут "TERMINAL". Если строка имени помечена  атри-

  бутом "TERMINAL", то операционная система  МОС  ВП  считает

  результирующую строку фактическим именем (то есть, дальней-

  шая трансляция не выполняется);

       3) если глобальная секция имеет имя в формате имя_NNN,

  то операционная система МОС ВП сначала удаляет знак подчер-

  кивания и цифры (NNN), затем транслирует  полученое  имя  в

  соответствии с той последовательностью, которая изложена  в

  данном подпункте, и после этого снова добавляет  знак  под-




                           - 388 -

                        00152-01 97 06


  черкивания и цифры.



       11.6.6. Отображение секций


       При вызове программы системного  обслуживания  $CRMPSC

  для создания и/или отображения секции, необходимо  передать

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

  который требуется отобразить секцию.

       Если страницы, на которые требуется отобразить секцию,

  известны, то их адреса помещают в массив  из  двух  длинных

  слов. Например, чтобы отобразить личную секцию из 10  стра-

  ниц на виртуальные страницы от 10 до 19 в области  програм-

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

       Пример 1.

  MAPRANGE:

          .LONG   ^X1400          ; адрес (шестнадцатеричный)

                                  ; страницы 10

          .LONG   ^X2300          ; адрес (шестнадцатеричный)

                                  ; страницы 19

       Однако, для того, чтобы  обеспечить  диапазон  входных

  адресов, не обязательно знать явные адреса. Если  пользова-

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

  пазон виртуальных адресов в области программы  (P0)  или  в

  области  управления  (Р1),  он  может  задать   бит   флага

  SEC$M_EXPREG в аргументе FLAGS. В этом случае адреса, зада-

  ваемые в аргументе  INADR,  управляют  тем,  что  служебная

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

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


                           - 389 -

                        00152-01 97 06


  либо принимаемое по умолчанию для аргумента PAGCNT, опреде-

  ляет количество отображаемых страниц. В примере 2  показана

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

  цию на текущий конец области программы.

       Пример 2.

  MAPRANGE:

          .LONG   ^X200           ; какой-нибудь адрес облас-

                                  ; ти программы (P0)

          .LONG   ^X200           ; какой-либо адрес P0 (мо-

                                  ; жет быть тот же самый)

  RETRANGE:

          .BLKL   2               ; здесь возвращаемый диапа-

                                  ; зон адресов

            .

            .

            .

          $CRMPSC_S -

                  INADR=MAPRANGE, -

                  RETADR=RETRENGE, -

                  FLAGS=<SEC$M_EXPREG>,...

            .

            .

            .

       Задаваемые адреса необязательно должны быть  в  данный

  момент в виртуальном адресном пространстве процесса.  Прог-

  рамма системного  обслуживания  $CRMPSC  создает  требуемое

  виртуальное адресное пространство во время отображения сек-




                           - 390 -

                        00152-01 97 06


  ции. Если задан аргумент RETADR  (возвращаемый  адрес),  то

  служебная программа возвращает диапазон фактически  отобра-

  женных адресов.

       Сразу после того, как секция успешно отображена, образ

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

  средств:

       1) базовый регистр или указатель и заранее  определен-

  ные имена символических смещений;

       2) метки, определяющие смещения абсолютной программной

  секции или структуры.

       В примере 3 показана часть программы, используемая для

  создания и отображения секции процесса.

       Пример 3.

  SECFAB: $FAB    FNM=<SECTION.TST>, -

                  FOP=UFO, -

                  FAC=PUT, -

                  SHR=<GET,PUT>

  ;

  MAPRANGE:

          .LONG   ^X1400          ; первая страница

          .LONG   ^X2300          ; последняя страница

  RETRANGE:

          .BLKL   1               ; первая отображенная

                                  ; страница

  ENDRANGE:

          .BLKL   1               ; последняя отображен-

            .                     ; ная страница




                           - 391 -

                        00152-01 97 06


            .

            .

          $OPEN   FAB=SECFAB      ; открыть файл секции

                  BSBW    ERROR

          $CRMPSC_S -

                  INADR=MAPRANGE,-; массив входных адресов

                  RETADR=RETRANGE,- ; выходной массив

                  PAGCNT=#4, -    ; отобразить 4 страницы

                  FLAGS=#SEC$M_WRT,-; секция доступна для

                                  ; чтения/записи

                  CHAN=SECFAB+FAB$L_STV    ; номер канала

                  BSBW    ERROR

                  MOVL    RETRANGE,R6  ; указать на начало

                                       ; секции

       Примечания:

       1. Макрокоманда $OPEN открывает файл  секции,  опреде-

  ленный в блоке доступа к файлу SECFAB. (параметр FOP в мак-

  рокоманде $FAB должен задавать возможность  UFO  (пользова-

  тельский ввод-вывод)).

       2. Программа системного обслуживания  $CRMPSC  исполь-

  зует адреса, заданные в MAPRANGE, для того,  чтобы  указать

  входной диапазон адресов,  на  который  будет  отображаться

  данная  секция.  Аргумент  PAGCNT  запрашивает  отображение

  только четырех страниц.

       3. Аргумент FLAGS требует,  чтобы  страницы  в  секции

  имели  доступ  "чтение/запись".  Символические  определения

  флагов  для  этого  аргумента  определены  в   макрокоманде




                           - 392 -

                        00152-01 97 06


  $SECDEF. Поле доступа к файлу (параметр FAC)  в  блоке  FAB

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

       4. После выполнения прогаммы  $CRMPSC  адреса  четырех

  отображенных страниц возвращаются в массив выходных адресов

  RETRANGE. В регистр  R6  помещается  адрес  начала  секции,

  который служит указателем секции.



       11.6.7. Отображение глобальных секций


       Процесс, создающий глобальную секцию, может при созда-

  нии и отобразить ее. Потом ее могут отобразить другие  про-

  цессы, вызывая программу  системного  обслуживания  $MGBLSC

  (отобразить глобальную секцию).

       Когда процесс отображает глобальную секцию, он  должен

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

  при ее создании, является ли она  групповой  или  системной

  глобальной  секцией,  и  тип  доступа:  только  чтение  или

  чтение/запись. Кроме того, процесс может указать:

       1) идентификацию  версии  (аргумент  IDENT),  задающую

  номер версии глобальной секции (если  существует  несколько

  версий), а также, доступны ли процессу более  поздние  вер-

  сии;

       2) относительный  номер  страницы  (аргумент  RELPAG),

  задающий номер страницы относительно начала секции, с кото-

  рого начинается отображение секции. В этом случае  процессы

  могут использовать только части секции. Процесс может отоб-

  разить часть секции на конкретный диапазон адресов, а впос-

  ледствии отобразить на этот же диапазон виртуальных адресов



                           - 393 -

                        00152-01 97 06


  другую часть секции.

       Для того, чтобы указать, что  отображаемая  глобальная

  секция размещается в физической памяти,  которую  разделяют

  многие процессоры, можно включить в символьную строку аргу-

  мента  GSDNAM  имя   разделяемой   памяти   (см.   подпункт

  11.6.5.1.).  Загружаемые  обнуленными  глобальные   секции,

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

  ми, должны отображаться во время их создания.

       Взаимосвязанные процессы оба могут  вызвать  программу

  системного обслуживания $CRMPSC для создания и  отображения

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

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

  Последующие попытки создать и отобразить данную секцию при-

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

  Возвращаемый успешный код состояния SS$_CREATED показывает,

  что при вызове программы  системного  обслуживания  $CRMPSC

  секция еще не существовала. Если  секция  существовала,  то

  возвращается код состояния SS$_NORMAL.



       11.6.8. Глобальные секции файла страниц


       Глобальные секции файла страниц используются для  хра-

  нения временных данных в глобальной секции. Глобальная сек-

  ция файла страниц - это секция виртуальной памяти,  которая

  не отображается в файл. Эту секцию можно удалить, если  все

  процессы закончили работу с ней. Общее количество  глобаль-

  ных страниц файла страниц в  операционной  системе  МОС  ВП

  ограничивается параметром GBLPAGFIL системной генерации.



                           - 394 -

                        00152-01 97 06


       Чтобы создать глобальную секцию файла страниц, пользо-

  ватель   должен   установить   биты   флага   SEC$M_GBL   и

  SEC$M_PAGFIL в аргументе FLAGS программы системного  обслу-

  живания $CRMPSC. Номер канала (аргумент CHAN)  должен  быть

  равным нулю.

       Нельзя одновременно устанавливать биты флага SEC$M_CRF

  и SEC$M_PAGFIL.



       11.6.9. Страничный обмен секций


       Когда образ, работающий в процессе, впервые обращается

  к странице, созданной во время отображения секции дискового

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

  Адрес страницы в виртуальном адресном пространстве процесса

  отображается на физическую страницу.  Во  время  выполнения

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

  страницы секции, если они выгружаются,  не  записываются  в

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

  Вместо этого они, если были модифицированы, перезаписывают-

  ся в файл секции на диск. Следующее  обращение  к  странице

  приведет к страничному отказу, и страница  будет  загружена

  из файла секции.

       Однако, если при создании секции страницы в  ней  были

  определены как загружаемые обнуленными, или как страницы со

  ссылкой на копию, то эти страницы обрабатываются  следующим

  образом:

       1) если при вызове программы $CRMPSC было указано, что

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


                           - 395 -

                        00152-01 97 06


  запросу обнуленные страницы, то при создании этих страниц в

  физической памяти  они  инициализируются  нулями.  Загрузка

  обнуленных по запросу страниц обеспечивает  удобный  способ

  инициализации страниц файла в том  случае,  если  создается

  новый файл как секция,  или  нужно  полностью  перезаписать

  сущетсвующий файл. Эти страницы снова  выгружаются  в  файл

  секции;

       2) при удалении  виртуального  адресного  пространства

  все страницы, к которым  не  было  обращений,  записываются

  обратно в файл как нулевые. Это  приводит  к  инициализации

  файла несмотря на то, что часть страниц была  модифицирова-

  на;

       3) если при вызове программы $CRMPSC было указано, что

  страницы в секции со ссылкой на копию, то  каждый  процесс,

  который отображает данную секцию, получает свою собственную

  копию секции по принципу загрузки страницы за страницей  по

  мере обращения к ним. Эти страницы никогда  не  перезаписы-

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

  ружаются в файл обмена страниц.

       Если секция является глобальной, то несколько  процес-

  сов могут отображать ее на одни и те же физические  страни-

  цы. Если требуется эти страницы выгрузить или  перезаписать

  в дисковый файл, определенный как секция, то такие операции

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

  ся в рабочем наборе какого-либо процесса.








                           - 396 -

                        00152-01 97 06


       Пример.

  Процесс ORION

  FLGCLUSTER:                     ; дескриптор для имени

          .ASCID  /FLAG_CLUSTER/  ; кластера общих флагов

                                  ; событий

  GLOBALSEC:                      ; дескриптор для имени гло-

          .ASCID  /GLOBAL_SECTION/; бальной секции

  ;

  FLGSET = 65                     ; номер флага, с которым

                                  ; нужно связаться и устано-

                                  ; вить его

  GBLFAB: $FAB    FNM=<GLOBAL.TST>, -

                  FOP=<UFO,CIF,CBT>, -

                  ALQ=4, -

                  FAC=PUT

           .

           .

           .

          $ASCEFC_S -

                  EFN=#FLGSET, -

                  NAME=FLGCLUSTER

          BSBW    ERROR

          $CRMPSC_S -             ; создать глобальную секцию

                  GSDNAM=GLOBALSEC, -

                  FLAGS=#SEC$M_WRT!SEC$M_GBL,...

          BSBW    ERROR

          $SETEF_S -               ; установить общий флаг со




                           - 397 -

                        00152-01 97 06


                  EFN=#FLGSET      ; бытия

  процесс CYGNUS

  CLUSTER:

          .ASCID  /FLAG_CLUSTER/   ; дескриптор для имени

                                   ; кластера

  SECTION:

          .ASCID  /GLOBAL_SECTION/ ; дескриптор имени секции

  FLGSET  =  65

            .

            .

            .

          $ASCEFC_S -

                  EFN=$FLGSET, -

                  NAME=CLUSTER

          BSBW    ERROR

          $WAITFR_S

                  EFN=#FLGSET

          BSBW    ERROR

          $MGBLSC_S -

                  INADR=MAPRANGE, -

                  RETADR=RETRANGE, -

                  FLAGS=#SEC$M_GBL,- ; глобальная секция

                  GSDNAM=SECTION,-   ; имя секции

          BSBW    ERROR

       Примечания:

       1. Процессы ORION и CYGNUS принадлежат к одной группе.

  Каждый процесс сначала связывается с кластером общих флагов




                           - 398 -

                        00152-01 97 06


  событий, имеющим имя FLAG_CLUSTER, для того, чтобы  исполь-

  зовать общие флаги событий для синхронизации своих  обраще-

  ний к секции.

       2. Процесс ORION создает глобальную  секцию  с  именем

  GLOBAL-SECTION, задавая флаги  секций,  которые  указывают,

  что секция является глобальной (SEC$M_GBL) и что она  имеет

  тип доступа "чтение/запись".  Массивы  входных  и  выходных

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

  канала не показаны.

       3. Процесс CYGNUS связывается с кластером общих флагов

  событий и ждет установки флага, определенного  как  FLGSET.

  Процесс ORION устанавливает этот флаг, когда он заканчивает

  создание секции. Для того,  чтобы  отобразить  эту  секцию,

  процесс CYGNUS указывает массивы входных и  выходных  адре-

  сов, флаг, определяющий, что секция является глобальной,  и

  имя глобальной секции. В данном примере отображается  такое

  же количество страниц, которое было  указано  при  создании

  секции.



       11.6.10. Секции чтения и записи данных


       Секции, допускающие чтение и запись, обеспечивают про-

  цессу или взаимосвязанным процессам способ  для  разделения

  файлов данных в физической памяти.

       Например, один процесс может  создавать  и  отображать

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

  процессы могут отображать ее только для чтения и  обрабаты-

  вать данные, записанные первым процессом. Или два  и  более



                           - 399 -

                        00152-01 97 06


  процессов могут совместно писать в секцию. (в  этом  случае

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

  ронизацию и защиту).

       Если файл уже обновлен,  процесс  или  процессы  могут

  освободить (или отобразить обратно) секцию. Тогда модифици-

  рованные страницы перезаписываются в файл на диске, опреде-

  ленный как секция.



       11.6.11. Освобождение и удаление секций


       Процесс освобождает секцию, удаляя из своего виртуаль-

  ного адресного пространства те адреса, на которые отобража-

  лась данная секция. Если для получения адресов отображенных

  страниц была указана область возвращаемых адресов,  то  эту

  область адресов можно  использовать  как  входной  параметр

  программы системного обслуживания $DELTVA.

       Пример 1.

          $DELTVA_S       INARD=RETRANGE

       Если процесс освобождает личную секцию,  то  она  уда-

  ляется, т.е. удаляется вся управляющая информация,  создан-

  ная операционной системой МОС ВП. Временная глобальная сек-

  ция удаляется, когда ее освобождают все  процессы,  которые

  отображали эту секцию. Постоянные глобальные секции не уда-

  ляются до тех пор, пока они не  будут  специально  помечены

  при помощи программы  системного  обслуживания  $DGBLSC.  В

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

  будет отображать их.





                           - 400 -

                        00152-01 97 06


       Удаление страниц, занятых  секцией,  не  удаляет  файл

  секции, а только отменяет связь процесса с  данным  файлом.

  Когда процесс удаляет страницы, на которые отображена  сек-

  ция, доступная для чтения и записи, и никакие  другие  про-

  цессы не отображают ее, то  все  модифицированные  страницы

  записываются обратно в файл секции.

       Если секция уже удалена, то присвоенный ей канал можно

  отсоединить. Процесс, создавший данную секцию, может отсое-

  динить канал (при помощи программы системного  обслуживания

  "отсоединить канал ввода-вывода").

       Пример 2.

          $DASSGN_S      CHAN=GBLFAB+FAB$L_STV



       11.6.12. Перезапись секций


       Поскольку обычно секции, доступные для чтения и  запи-

  си, не обновляются на диске до тех пор, пока не выгружаются

  страницы, которые они  занимают,  или  пока  все  процессы,

  обращающиеся к секции, не освободят ее,  -  процессу  может

  потребоваться гарантия того, что все модифицируемые страни-

  цы успешно перезаписываются обратно  в  файл  секции  через

  регулярные интервалы времени.

       Модифицированные страницы секции перезаписывает в файл

  на диске программа системного обслуживания $UPDSEC.



                                                      





!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!