Cтраница 4
Большинство средств меню Application выводит на экран собственное диалоговое окно, аналогичное представленному на рис. 26.5. В отображаемом окне указывается прикладная система, над которой будет выполняться соответствующая операция. Все эти диалоговые окна достаточно понятны и хорошо описаны в справочной системе. В некоторых присутствует поле для ввода имени сегмента отката. Это удобно, если прикладная система велика, а в результате выполнения над ней операции может быть исчерпан установленный по умолчанию объем пространства сегментов отката. [46]
В подавляющем большинстве программы состоят из некоторого числа более или менее самостоятельных единиц, таких, например, как программные блоки, отдельные подпрограммы, информационные массивы. Эти самостоятельные элементы программ называют сегментами, каждый сегмент в программе имеет свое собственное, уникальное имя и характеризуется длиной - числом содержащихся в нем единиц информации. При сегментации каждый адрес в программе состоит из двух компонентов: имени сегмента и смещения внутри него. Поскольку обращение к сегментам осуществляется по именам, при распределении можно размещать сегменты в несмежных областях памяти. Более того, всем сегментам программы не обязательно находиться в оперативной памяти одновременно. Операционная система с помощью специальных таблиц следит за размещением в памяти сегментов каждой программы и, если происходит обращение к сегменту, отсутствующему в оперативной памяти, система обеспечивает перепись сегмента из вспомогательной памяти. [47]
Список Rollback Segment в верхней части диалога показывает все доступные для редактирования сегменты отката. Кнопки New, Rename и Delete служат соответственно для создания, переименования и удаления сегментов отката. При нажатии кнопки New возникает диалог New Rollback Segment, в котором задается имя сегмента отката. [48]
Сегментом называется группа информации, которая рассматривается как единое целое. Это может быть одна программа или много программ, одиночная база данных или группа баз данных. При использовании сегментации программист представляет адресное пространство как двумерное, адресуемое двумя компонентами: именем сегмента и смещением внутри сегмента. Каждый сегмент имеет собственные связанные с ним правила доступа. Сегментация облегчает реализацию динамических связей. Во время выполнения оператора вызова механизм загрузки находит программу, загружает ее в память и связывает вызываемую программу с вызывающей в процессе выполнения. [49]
Таблица должна быть рассчитана на хранение М записей. Для каждого сегмента и каждого элемента в таблице имеется одна запись, доступ к которой осуществляется по имени сегмента или имени элемента. Имя должно состоять из четырех алфавитно-цифровых литер. Таблицу следует описать как матрицу, в каждой строке которой хранится одна запись. [50]
Для определения начала каждого из этих сегментов служит директива SEGMENT, перед которой указано имя сегмента. В строке 1 определяется начало сегмента данных с именем DATA, а в строке 4 - начало программного сегмента с именем SUMMARY. Конец каждого сегмента указывается с помощью директивы ENDS ( строки 3 и 18), перед которой записывается имя соответствующего сегмента. Сегмент данных состоит из одной строки ( строка 2), содержащей директиву DB - определение байта памяти. По этой директиве программа ассемблера резервирует под переменную с именем SUM 1 байт памяти. Директива ASSUME ( строка 5) определяет соответствие сегментов и их имен. В строке 6 записана директива EQU, которая порту ввода - вывода PORT1 ставит в соответствие его номер. [51]
В результате трансляции программы на ЯЗ описание занимает 4 ячейки. В первой ячейке размещается директива загрузки Описание сегмента, показывающая программе ЗАГРУЗЧИК, что вслед за директивой располагается описание программы для загрузки. На рис. 4.15 показана структура этой директивы. Две следующие ячейки остаются свободными, а в четвертой ячейке располагается имя сегмента. [52]
Оператор - GET UNIQUE ( GU) - получить уникальный. Результатом выполнения операторов типа ПОЛУЧИТЬ является перенесение в РО программы экземпляра некоторого сегмента. Если оператор выполнился неуспешно, то в специальном поле, доступном ПП, формируется соответствующий код состояния. Оператор GU предназначен для извлечения экземпляра сегмента независимо от значений текущих. В этом операторе всегда используется один или несколько аргументов поиска SSA. Каждый SSA определяет имя сегмента и может включать описание условий, которым должен удовлетворять извлекаемый экземпляр сегмента. Условия могут быть простыми или сложными. Сложное условие может включать от одного до восьми простых условий, соединенных логическими связками И или ИЛИ. Аргументы поиска SSA могут использоваться и в других операторах ЯМД. [53]
Переменная OvrReadBuf предназначена для перехвата операции загрузки оверлея и позволяет устанавливать собственную функцию чтения и проверки оверлейных файлов. Это может понадобиться, например, в случае необходимости проверки наличия сменного диска. Когда администратору оверлеев нужно прочитать очередной сегмент, он вызывает функцию, адрес которой хранится в переменной OvrReadFunc. Если эта функция возврагцает нуль, то считается, что операция чтения прошла успешно. Параметр OvrSeg указывает, какой сегмент должен быть загружен. Однако, в силу того что имя сегмента не явно передается в эту функцию процедурой Ovrlnil, его можно считать предопределенным. [54]
При той скорости, которой обладают современные дисплейные генераторы ( разд. Отсюда следует, что число элементов может исчисляться сотнями, а число сегментов - десятками. Просмотр и обработку программы дисплейного процессора нужно выполнять с максимальной скоростью, поскольку от этого зависит частота регенерации. С другой стороны, поиск имени элемента и / или сегмента осуществляется, когда вывод на дисплей приостановлен. В этом случае выигрыш или потеря нескольких миллисекунд не играют существенной роли. Можно применить последовательный поиск, тем более что списки, которые необходимо просматривать, можно сделать очень маленькими. Для этого процесс поиска разбивается на два этапа: на первом этапе в списке имен отыскивается имя сегмента, а затем в найденном сегменте - имя элемента. При этом, конечно, требуется, чтобы имена сегментов и имена элементов были соответствующим обра-зом помечены. Реализацию этой простой, но очень эффективной схемы мы рассмотрим более подробно. [55]